ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjE0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMTMgQEAKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitTdGFuZGFyZDogQ3BwMTEKK0FjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtMgorQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQorQ29sdW1uTGltaXQ6IDEwMAorQ29tbWVudFByYWdtYXM6IE5PTElOVDouKgorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luY2x1ZGVCbG9ja3M6IFByZXNlcnZlCitJbmRlbnRXaWR0aDogNAorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDgKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiA0CitVc2VUYWI6IE5ldmVyCmRpZmYgLS1naXQgYS9BbmRyb2lkLmJwIGIvQW5kcm9pZC5icAppbmRleCA2MGYwZmYxLi5lZTYwOWUxIDEwMDY0NAotLS0gYS9BbmRyb2lkLmJwCisrKyBiL0FuZHJvaWQuYnAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICAgICAgICAgIF0sCkBAIC04Niw3ICs4Niw3IEBACiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9NRVRBREFUQSBiL01FVEFEQVRBCmluZGV4IGFhYmRhMzYuLjE0NmJmY2IgMTAwNjQ0Ci0tLSBhL01FVEFEQVRBCisrKyBiL01FVEFEQVRBCkBAIC0yLDIyICsyLDIyIEBACiAjICAgICBDT05TVUxUIFRIRSBPV05FUlMgQU5EIG9wZW5zb3VyY2UtbGljZW5zaW5nQGdvb2dsZS5jb20gQkVGT1JFCiAjICAgICBERVBFTkRJTkcgT04gSVQgSU4gWU9VUiBQUk9KRUNULiAqKioKIHRoaXJkX3BhcnR5IHsKLSAgIyB3b3VsZCBiZSBOT1RJQ0Ugc2F2ZSBmb3IgV2lkZXZpbmUgTWFzdGVyIExpY2Vuc2UgQWdyZWVtZW50IGluOgotICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKLSAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKLSAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCi0gICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwotICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaAotICAjIGFuZCBwYXRlbnQgZGlzY2xhaW1lcnMgaW46Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvY29kZWNzL2FtcndiL2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKLSAgIyAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgbGljZW5zZV9ub3RlOiAid291bGQgYmUgTk9USUNFIHNhdmUgZm9yIFdpZGV2aW5lIE1hc3RlciBMaWNlbnNlIEFncmVlbWVudCBpbjpcbiIKKyAgIiAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwXG4iCisgICIgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwXG4iCisgICIgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaFxuIgorICAiICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG9cbiIKKyAgIiAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmhcbiIKKyAgIiBhbmQgcGF0ZW50IGRpc2NsYWltZXJzIGluOlxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0XG4iCisgICIgICBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IgogICBsaWNlbnNlX3R5cGU6IEJZX0VYQ0VQVElPTl9PTkxZCiB9CmRpZmYgLS1naXQgYS9PV05FUlMgYi9PV05FUlMKaW5kZXggMGJlMTE5Ni4uNDBjNjVlNyAxMDA2NDQKLS0tIGEvT1dORVJTCisrKyBiL09XTkVSUwpAQCAtMSw3ICsxLDYgQEAKICMgQnVnIGNvbXBvbmVudDogMTM0NAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQotaGt1YW5nQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KIAogIyBnby9hbmRyb2lkLWZ3ay1tZWRpYS1zb2x1dGlvbnMgZm9yIGluZm8gb24gYXJlYXMgb2Ygb3duZXJzaGlwLgpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkLmJwIGIvYXBleC9BbmRyb2lkLmJwCmluZGV4IGI5YWJkMTIuLjU3MGNhMDEgMTAwNjQ0Ci0tLSBhL2FwZXgvQW5kcm9pZC5icAorKysgYi9hcGV4L0FuZHJvaWQuYnAKQEAgLTIzLDcgKzIzLDYgQEAKIAogYXBleF9kZWZhdWx0cyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKLSAgICB1cGRhdGFibGU6IHRydWUsCiAgICAgYm9vdGNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtYm9vdGNsYXNzcGF0aC1mcmFnbWVudCJdLAogICAgIHN5c3RlbXNlcnZlcmNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtc3lzdGVtc2VydmVyY2xhc3NwYXRoLWZyYWdtZW50Il0sCiAgICAgbXVsdGlsaWI6IHsKQEAgLTU3LDYgKzU2LDcgQEAKICAgICBwcmVidWlsdHM6IFsKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLW1lZGlhdHJhbnNjb2RpbmcucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKICAgICAgICAgImNyYXNoX2R1bXAucG9saWN5IiwKICAgICAgICAgIm1lZGlhZXh0cmFjdG9yLnBvbGljeSIsCiAgICAgICAgICJtZWRpYS1saW5rZXItY29uZmlnIiwKQEAgLTY3LDE0ICs2NywxMyBAQAogICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCiAgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCiAKLSAgICAvLyBJTVBPUlRBTlQ6IEZvciB0aGUgQVBFWCB0byBiZSBpbnN0YWxsZWQgb24gQW5kcm9pZCAxMCAoQVBJIDI5KSwKLSAgICAvLyBtaW5fc2RrX3ZlcnNpb24gc2hvdWxkIGJlIDI5LiBUaGlzIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCisgICAgLy8gSU1QT1JUQU5UOiBxLWxhdW5jaGVkLWFwZXgtbW9kdWxlIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCiAgICAgLy8gc3VyZSB0aGUgcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAgaW4gdHdvIHdheXM6CiAgICAgLy8gLSBidWlsZCB0aGUgQVBFWCBwYWNrYWdlIGNvbXBhdGlibGUgdG8gQW5kcm9pZCAxMAogICAgIC8vICAgc28gdGhhdCB0aGUgcGFja2FnZSBjYW4gYmUgaW5zdGFsbGVkLgogICAgIC8vIC0gYnVpbGQgYXJ0aWZhY3RzIChsaWIvamF2YWxpYi9iaW4pIGFnYWluc3QgQW5kcm9pZCAxMCBTREsKICAgICAvLyAgIHNvIHRoYXQgdGhlIGFydGlmYWN0cyBjYW4gcnVuLgotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBkZWZhdWx0czogWyJxLWxhdW5jaGVkLWFwZXgtbW9kdWxlIl0sCiAgICAgLy8gSW5kaWNhdGVzIHRoYXQgcHJlLWluc3RhbGxlZCB2ZXJzaW9uIG9mIHRoaXMgYXBleCBjYW4gYmUgY29tcHJlc3NlZC4KICAgICAvLyBXaGV0aGVyIGl0IGFjdHVhbGx5IHdpbGwgYmUgY29tcHJlc3NlZCBpcyBjb250cm9sbGVkIG9uIHBlci1kZXZpY2UgYmFzaXMuCiAgICAgY29tcHJlc3NpYmxlOiB0cnVlLApAQCAtMTI2LDYgKzEyNSwyNiBAQAogICAgIC8vIG1vZGlmaWVkIGJ5IHRoZSBTb29uZyBvciBwbGF0Zm9ybSBjb21wYXQgdGVhbS4KICAgICBoaWRkZW5fYXBpOiB7CiAgICAgICAgIG1heF90YXJnZXRfb19sb3dfcHJpb3JpdHk6IFsiaGlkZGVuYXBpL2hpZGRlbmFwaS1tYXgtdGFyZ2V0LW8tbG93LXByaW9yaXR5LnR4dCJdLAorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcGFja2FnZXMgY29udGFpbiBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcyBvbiB0aGUKKyAgICAgICAgLy8gYm9vdGNsYXNzcGF0aC4gVGhhdCBtZWFucyB0aGF0IHRoZSBoaWRkZW4gQVBJIGZsYWdzIGZvciB0aGlzIG1vZHVsZQorICAgICAgICAvLyBoYXMgdG8gZXhwbGljaXRseSBsaXN0IGV2ZXJ5IHNpbmdsZSBjbGFzcyB0aGlzIG1vZHVsZSBwcm92aWRlcyBpbgorICAgICAgICAvLyB0aGF0IHBhY2thZ2UgdG8gZGlmZmVyZW50aWF0ZSB0aGVtIGZyb20gdGhlIGNsYXNzZXMgcHJvdmlkZWQgYnkgb3RoZXIKKyAgICAgICAgLy8gbW9kdWxlcy4gVGhhdCBjYW4gaW5jbHVkZSBwcml2YXRlIGNsYXNzZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCisgICAgICAgIC8vIEFQSS4KKyAgICAgICAgc3BsaXRfcGFja2FnZXM6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgXSwKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBhbGwgdGhlaXIgc3VicGFja2FnZXMgY3VycmVudGx5IG9ubHkKKyAgICAgICAgLy8gY29udGFpbiBjbGFzc2VzIGZyb20gdGhpcyBib290Y2xhc3NwYXRoX2ZyYWdtZW50LiBMaXN0aW5nIGEgcGFja2FnZQorICAgICAgICAvLyBoZXJlIHdvbid0IHByZXZlbnQgb3RoZXIgYm9vdGNsYXNzcGF0aCBtb2R1bGVzIGZyb20gYWRkaW5nIGNsYXNzZXMgaW4KKyAgICAgICAgLy8gYW55IG9mIHRob3NlIHBhY2thZ2VzIGJ1dCBpdCB3aWxsIHByZXZlbnQgdGhlbSBmcm9tIGFkZGluZyB0aG9zZQorICAgICAgICAvLyBjbGFzc2VzIGludG8gYW4gQVBJIHN1cmZhY2UsIGUuZy4gcHVibGljLCBzeXN0ZW0sIGV0Yy4uIERvaW5nIHNvIHdpbGwKKyAgICAgICAgLy8gcmVzdWx0IGluIGEgYnVpbGQgZmFpbHVyZSBkdWUgdG8gaW5jb25zaXN0ZW50IGZsYWdzLgorICAgICAgICBwYWNrYWdlX3ByZWZpeGVzOiBbCisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlcm5hbCIsCisgICAgICAgIF0sCiAgICAgfSwKIH0KIApAQCAtMTQ4LDcgKzE2Nyw2IEBACiAKIGFwZXhfZGVmYXVsdHMgewogICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIiwKLSAgICB1cGRhdGFibGU6IHRydWUsCiAgICAgYmluYXJpZXM6IFsKICAgICAgICAgIm1lZGlhc3djb2RlYyIsCiAgICAgXSwKQEAgLTE2MCw2ICsxNzgsNyBAQAogICAgIF0sCiAgICAgcHJlYnVpbHRzOiBbCiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLW1lZGlhc3djb2RlYy5yYyIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLW1lZGlhc3djb2RlYy4zMnJjIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCiAgICAgICAgICJtZWRpYXN3Y29kZWMucG9saWN5IiwKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKQEAgLTE3MiwzMCArMTkxLDQ2IEBACiAgICAgLy8gVXNlIGEgY3VzdG9tIEFuZHJvaWRNYW5pZmVzdC54bWwgdXNlZCBmb3IgQVBJIHRhcmdldGluZy4KICAgICBhbmRyb2lkTWFuaWZlc3Q6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1hbmRyb2lkTWFuaWZlc3QiLAogCi0gICAgLy8gSU1QT1JUQU5UOiBGb3IgdGhlIEFQRVggdG8gYmUgaW5zdGFsbGVkIG9uIEFuZHJvaWQgMTAgKEFQSSAyOSksCi0gICAgLy8gbWluX3Nka192ZXJzaW9uIHNob3VsZCBiZSAyOS4gVGhpcyBlbmFibGVzIHRoZSBidWlsZCBzeXN0ZW0gdG8gbWFrZQorICAgIC8vIElNUE9SVEFOVDogcS1sYXVuY2hlZC1hcGV4LW1vZHVsZSBlbmFibGVzIHRoZSBidWlsZCBzeXN0ZW0gdG8gbWFrZQogICAgIC8vIHN1cmUgdGhlIHBhY2thZ2UgY29tcGF0aWJsZSB0byBBbmRyb2lkIDEwIGluIHR3byB3YXlzOgogICAgIC8vIC0gYnVpbGQgdGhlIEFQRVggcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAKICAgICAvLyAgIHNvIHRoYXQgdGhlIHBhY2thZ2UgY2FuIGJlIGluc3RhbGxlZC4KICAgICAvLyAtIGJ1aWxkIGFydGlmYWN0cyAobGliL2phdmFsaWIvYmluKSBhZ2FpbnN0IEFuZHJvaWQgMTAgU0RLCiAgICAgLy8gICBzbyB0aGF0IHRoZSBhcnRpZmFjdHMgY2FuIHJ1bi4KLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZGVmYXVsdHM6IFsicS1sYXVuY2hlZC1hcGV4LW1vZHVsZSJdLAogICAgIC8vIEluZGljYXRlcyB0aGF0IHByZS1pbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGlzIGFwZXggY2FuIGJlIGNvbXByZXNzZWQuCiAgICAgLy8gV2hldGhlciBpdCBhY3R1YWxseSB3aWxsIGJlIGNvbXByZXNzZWQgaXMgY29udHJvbGxlZCBvbiBwZXItZGV2aWNlIGJhc2lzLgogICAgIGNvbXByZXNzaWJsZTogdHJ1ZSwKIH0KIAorLy8gaW5zdGFsbCBhcyBtZWRpYXRyYW5zY29kaW5nLiogYW5kIG1lZGlhc3djb2RlYy4qIGluc3RlYWQgb2YgaW5pdC4qCisvLyBzbyB3ZSBhcmUgcmVhZHkgZm9yIGRheSB3ZSBoYXZlIG1vcmUgdGhhbiAxICpyYyBmaWxlIHdpdGhpbiB0aGUgYXBleC4KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy5yYyIsCiAgICAgc3JjOiAibWVkaWF0cmFuc2NvZGluZy5yYyIsCi0gICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBmaWxlbmFtZTogIm1lZGlhdHJhbnNjb2RpbmcucmMiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKKyAgICBzcmM6ICJtZWRpYXRyYW5zY29kaW5nLjMycmMiLAorICAgIGZpbGVuYW1lOiAibWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKICAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbWVkaWFzd2NvZGVjLnJjIiwKICAgICBzcmM6ICJtZWRpYXN3Y29kZWMucmMiLAotICAgIGZpbGVuYW1lOiAiaW5pdC5yYyIsCisgICAgZmlsZW5hbWU6ICJtZWRpYXN3Y29kZWMucmMiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMuMzJyYyIsCisgICAgc3JjOiAibWVkaWFzd2NvZGVjLjMycmMiLAorICAgIGZpbGVuYW1lOiAibWVkaWFzd2NvZGVjLjMycmMiLAogICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKIH0KIApkaWZmIC0tZ2l0IGEvYXBleC9PV05FUlMgYi9hcGV4L09XTkVSUwppbmRleCA1NTg3ZjVmLi41NDgwMmQ0IDEwMDY0NAotLS0gYS9hcGV4L09XTkVSUworKysgYi9hcGV4L09XTkVSUwpAQCAtMSw2ICsxLDcgQEAKLWNoekBnb29nbGUuY29tCi1kd2thbmdAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KIGppeW9uZ0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCisKK2luY2x1ZGUgcGxhdGZvcm0vcGFja2FnZXMvbW9kdWxlcy9jb21tb246L01PRFVMRVNfT1dORVJTCisKZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3QuanNvbiBiL2FwZXgvbWFuaWZlc3QuanNvbgppbmRleCA1ZDcyMDMxLi40Yjc1YjA0IDEwMDY0NAotLS0gYS9hcGV4L21hbmlmZXN0Lmpzb24KKysrIGIvYXBleC9tYW5pZmVzdC5qc29uCkBAIC0xLDYgKzEsNiBAQAogewogICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCi0gICJ2ZXJzaW9uIjogMzE5OTk5OTAwLAorICAidmVyc2lvbiI6IDMzOTk5MDAwMCwKICAgInJlcXVpcmVOYXRpdmVMaWJzIjogWwogICAgICJsaWJhbmRyb2lkLnNvIiwKICAgICAibGliYmluZGVyX25kay5zbyIsCmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KaW5kZXggYjBkOTYyZC4uZmJjYmI2OSAxMDA2NDQKLS0tIGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMSw2ICsxLDYgQEAKIHsKICAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCi0gICJ2ZXJzaW9uIjogMzE5OTk5OTAwLAorICAidmVyc2lvbiI6IDMzOTk5MDAwMCwKICAgInJlcXVpcmVOYXRpdmVMaWJzIjogWwogICAgICI6c3BoYWwiCiAgIF0KZGlmZiAtLWdpdCBhL2FwZXgvbWVkaWFzd2NvZGVjLjMycmMgYi9hcGV4L21lZGlhc3djb2RlYy4zMnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGQxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy4zMnJjCkBAIC0wLDAgKzEsOCBAQAorIyMgIGZvciBTREsgcmVsZWFzZXMgPj0gMzIKKyMjCitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvYXBleC9tZWRpYXN3Y29kZWMucmMgYi9hcGV4L21lZGlhc3djb2RlYy5yYwppbmRleCAwYzliOGM4Li40Njc5OWM3IDEwMDY0NAotLS0gYS9hcGV4L21lZGlhc3djb2RlYy5yYworKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMSwzICsxLDYgQEAKKyMjICBmb3IgU0RLIHJlbGVhc2VzIDI5Li4zMQorIyMgIHdoZXJlIHdyaXRlcGlkIGhhcyBub3QgeWV0IGJlZW4gcmVwbGFjZWQgYnkgdGFza19wcm9maWxlcworIyMKIHNlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBtZWRpYWNvZGVjCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy4zMnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYwpAQCAtMCwwICsxLDE1IEBACisjIyAgZm9yIFNESyByZWxlYXNlcyA+PSAzMgorIyMKKyMKKyMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCisjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKKyMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290Lgorc2VydmljZSBtZWRpYS50cmFuc2NvZGluZyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9iaW4vbWVkaWF0cmFuc2NvZGluZworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEKKyAgICBpb3ByaW8gcnQgNAorICAgICMgUmVzdHJpY3QgdG8gbGl0dGxlIGNvcmVzIG9ubHkgd2l0aCBzeXN0ZW0tYmFja2dyb3VuZCBjcHVzZXQuCisgICAgdGFza19wcm9maWxlcyBTZXJ2aWNlQ2FwYWNpdHlMb3cKKyAgICBpbnRlcmZhY2UgYWlkbCBtZWRpYS50cmFuc2NvZGluZworICAgIGRpc2FibGVkCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhdHJhbnNjb2RpbmcucmMgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcucmMKaW5kZXggYWU5ZjhiYS4uNmU0NTNiZSAxMDA2NDQKLS0tIGEvYXBleC9tZWRpYXRyYW5zY29kaW5nLnJjCisrKyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy5yYwpAQCAtMSwzICsxLDcgQEAKKyMjICBmb3IgU0RLIHJlbGVhc2VzIDI5Li4zMQorIyMgIHdoZXJlIHdyaXRlcGlkIGhhcyBub3QgeWV0IGJlZW4gcmVwbGFjZWQgYnkgdGFza19wcm9maWxlcworIyMKKyMKICMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCiAjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKICMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290LgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQuYnAgYi9jYW1lcmEvQW5kcm9pZC5icAppbmRleCA2ODc4YzIwLi5lNDQyMDJiIDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvQW5kcm9pZC5icApAQCAtNDMsNiArNDMsMTAgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJjYW1lcmFfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnQiLAogCkBAIC0xMDksNiArMTEzLDMwIEBACiAKIH0KIAorY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnRfaG9zdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW5jbHVkZS9jYW1lcmEiCisgICAgXSwKK30KKwogLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBjYW1lcmEgY2xpZW50cyBhbmQgdGhlIGNhbWVyYSBzZXJ2aWNlLgogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudF9haWRsIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCAwMzQzOWZkLi4yNGM5MTA4IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC02OCw2ICs2OCw5IEBACiAgICAgICAgIHVuYXZhaWxhYmxlUGh5c2ljYWxJZHMxNi5wdXNoX2JhY2soU3RyaW5nMTYoaWQ4KSk7CiAgICAgfQogICAgIHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNlZlY3Rvcih1bmF2YWlsYWJsZVBoeXNpY2FsSWRzMTYpOworICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisKKyAgICByZXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoY2xpZW50UGFja2FnZSkpOwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTg2LDYgKzg5LDEyIEBACiAgICAgZm9yIChhdXRvJiBpZDE2IDogdW5hdmFpbGFibGVQaHlzaWNhbElkczE2KSB7CiAgICAgICAgIHVuYXZhaWxhYmxlUGh5c2ljYWxJZHMucHVzaF9iYWNrKFN0cmluZzgoaWQxNikpOwogICAgIH0KKworICAgIFN0cmluZzE2IHRlbXBDbGllbnRQYWNrYWdlOworICAgIHJlcyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZ0ZW1wQ2xpZW50UGFja2FnZSk7CisgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICBjbGllbnRQYWNrYWdlID0gU3RyaW5nOCh0ZW1wQ2xpZW50UGFja2FnZSk7CisKICAgICByZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmNwcCBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCmluZGV4IDI4ZTAzN2YuLmQxYWEzNmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCkBAIC01Miw2ICs1MiwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGZsb2F0IG1heFByZXZpZXdGcHMgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkRmxvYXQoJm1heFByZXZpZXdGcHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1heFByZXZpZXdGcHMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGludCBkYXRhU3BhY2UgPSAwOwogICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmRhdGFTcGFjZSkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgZGF0YVNwYWNlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKQEAgLTExMiw5ICsxMTgsMjIgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJmR5bmFtaWNSYW5nZVByb2ZpbGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0cmVhbSB1c2UgY2FzZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgbVdpZHRoID0gd2lkdGg7CiAgICAgbUhlaWdodCA9IGhlaWdodDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIG1NYXhQcmV2aWV3RnBzID0gbWF4UHJldmlld0ZwczsKICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOwogICAgIG1Vc2FnZSA9IHVzYWdlOwogICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CkBAIC0xMjUsNiArMTQ0LDggQEAKICAgICBtSGlzdG9ncmFtVHlwZSA9IGhpc3RvZ3JhbVR5cGU7CiAgICAgbUhpc3RvZ3JhbUJpbnMgPSBzdGQ6Om1vdmUoaGlzdG9ncmFtQmlucyk7CiAgICAgbUhpc3RvZ3JhbUNvdW50cyA9IHN0ZDo6bW92ZShoaXN0b2dyYW1Db3VudHMpOworICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlID0gZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICBtU3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNTIsNiArMTczLDExIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlRmxvYXQobU1heFByZXZpZXdGcHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gbWF4UHJldmlld0ZwcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1EYXRhU3BhY2UpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gZGF0YVNwYWNlISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0yMDIsNiArMjI4LDE2IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobUR5bmFtaWNSYW5nZVByb2ZpbGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBkeW5hbWljIHJhbmdlIHByb2ZpbGUgdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gdXNlIGNhc2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyMywxMSArMjU5LDEzIEBACiAgICAgICAgIG1BcGlMZXZlbCgwKSwKICAgICAgICAgbUlzTmRrKGZhbHNlKSwKICAgICAgICAgbUxhdGVuY3lNcygtMSksCisgICAgICAgIG1NYXhQcmV2aWV3RnBzKDApLAogICAgICAgICBtU2Vzc2lvblR5cGUoMCksCiAgICAgICAgIG1JbnRlcm5hbFJlY29uZmlndXJlKDApLAogICAgICAgICBtUmVxdWVzdENvdW50KDApLAogICAgICAgICBtUmVzdWx0RXJyb3JDb3VudCgwKSwKLSAgICAgICAgbURldmljZUVycm9yKGZhbHNlKSB7fQorICAgICAgICBtRGV2aWNlRXJyb3IoZmFsc2UpLAorICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSgtMSkge30KIAogQ2FtZXJhU2Vzc2lvblN0YXRzOjpDYW1lcmFTZXNzaW9uU3RhdHMoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAogICAgICAgICBpbnQgZmFjaW5nLCBpbnQgbmV3Q2FtZXJhU3RhdGUsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLApAQCAtMjM5LDExICsyNzcsMTMgQEAKICAgICAgICAgICAgICAgICBtQXBpTGV2ZWwoYXBpTGV2ZWwpLAogICAgICAgICAgICAgICAgIG1Jc05kayhpc05kayksCiAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcyhsYXRlbmN5TXMpLAorICAgICAgICAgICAgICAgIG1NYXhQcmV2aWV3RnBzKDApLAogICAgICAgICAgICAgICAgIG1TZXNzaW9uVHlwZSgwKSwKICAgICAgICAgICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSgwKSwKICAgICAgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLAogICAgICAgICAgICAgICAgIG1SZXN1bHRFcnJvckNvdW50KDApLAotICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSB7fQorICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSwKKyAgICAgICAgICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSgtMSkge30KIAogc3RhdHVzX3QgQ2FtZXJhU2Vzc2lvblN0YXRzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgewogICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgewpAQCAtMjk1LDYgKzMzNSwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGZsb2F0IG1heFByZXZpZXdGcHM7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRGbG9hdCgmbWF4UHJldmlld0ZwcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWF4UHJldmlld0ZwcyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgaW50MzJfdCBzZXNzaW9uVHlwZTsKICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzZXNzaW9uVHlwZSkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vzc2lvbiB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKQEAgLTMzMSw2ICszNzcsMTggQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBTdHJpbmcxNiB1c2VyVGFnOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJnVzZXJUYWcpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHVzZXIgdGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnZpZGVvU3RhYmlsaXphdGlvbk1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHZpZGVvIHN0YWJpbGl6YXRpb24gbW9kZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgbUNhbWVyYUlkID0gaWQ7CiAgICAgbUZhY2luZyA9IGZhY2luZzsKICAgICBtTmV3Q2FtZXJhU3RhdGUgPSBuZXdDYW1lcmFTdGF0ZTsKQEAgLTMzOCwxMiArMzk2LDE1IEBACiAgICAgbUFwaUxldmVsID0gYXBpTGV2ZWw7CiAgICAgbUlzTmRrID0gaXNOZGs7CiAgICAgbUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICBtTWF4UHJldmlld0ZwcyA9IG1heFByZXZpZXdGcHM7CiAgICAgbVNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7CiAgICAgbUludGVybmFsUmVjb25maWd1cmUgPSBpbnRlcm5hbFJlY29uZmlndXJlOwogICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CiAgICAgbVJlc3VsdEVycm9yQ291bnQgPSByZXN1bHRFcnJvckNvdW50OwogICAgIG1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOwogICAgIG1TdHJlYW1TdGF0cyA9IHN0ZDo6bW92ZShzdHJlYW1TdGF0cyk7CisgICAgbVVzZXJUYWcgPSB1c2VyVGFnOworICAgIG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlID0gdmlkZW9TdGFiaWxpemF0aW9uTW9kZTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTM5MSw2ICs0NTIsMTEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVGbG9hdChtTWF4UHJldmlld0ZwcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG1heFByZXZpZXdGcHMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2Vzc2lvblR5cGUpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzZXNzaW9uIHR5cGUhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQyMSw2ICs0ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtVXNlclRhZykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHVzZXIgdGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVZpZGVvU3RhYmlsaXphdGlvbk1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSB2aWRlbyBzdGFiaWxpemF0aW9uIG1vZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwIGIvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcAppbmRleCBhZjNjNDkyLi4zNDczNzgwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KQEAgLTMxLDcgKzMyLDcgQEAKIGNvbnN0IGNoYXIgKmtDYW1lcmFTZXJ2aWNlRGlzYWJsZWRQcm9wZXJ0eSA9ICJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIjsKIAogc3RhdHVzX3QgQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pIHsKKyAgICAgICAgaW50IG1pcnJvck1vZGUsIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgaWYgKHRyYW5zZm9ybSA9PSBOVUxMKSB7CkBAIC01NSw5ICs1NiwxOCBAQAogCiAgICAgaW50MzJfdCYgZmxhZ3MgPSAqdHJhbnNmb3JtOwogCi0gICAgYm9vbCBtaXJyb3IgPSAoZW50cnlGYWNpbmcuZGF0YS51OFswXSA9PSBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UKTsKKyAgICBpbnQzMl90IG1pcnJvciA9IDA7CisgICAgaWYgKG1pcnJvck1vZGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyAmJgorICAgICAgICAgICAgZW50cnlGYWNpbmcuZGF0YS51OFswXSA9PSBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UKSB7CisgICAgICAgIG1pcnJvciA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICB9IGVsc2UgaWYgKG1pcnJvck1vZGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfSCkgeworICAgICAgICBtaXJyb3IgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgfSBlbHNlIGlmIChtaXJyb3JNb2RlID09IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX1YpIHsKKyAgICAgICAgbWlycm9yID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9WOworICAgIH0KKwogICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgIGlmICghbWlycm9yKSB7CisgICAgaWYgKG1pcnJvciA9PSAwKSB7CiAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICBmbGFncyA9IDA7CkBAIC03NywyNSArODcsMjUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvLyBGcm9udCBjYW1lcmEgbmVlZHMgdG8gYmUgaG9yaXpvbnRhbGx5IGZsaXBwZWQgZm9yIG1pcnJvci1saWtlIGJlaGF2aW9yLgorICAgICAgICAvLyAtIEZyb250IGNhbWVyYSBuZWVkcyB0byBiZSBob3Jpem9udGFsbHkgZmxpcHBlZCBmb3IgbWlycm9yLWxpa2UgYmVoYXZpb3IuCisgICAgICAgIC8vIC0gQXBwbGljYXRpb24tc3BlY2lmaWVkIG1pcnJvcmluZyBuZWVkcyB0byBiZSBhcHBsaWVkLgogICAgICAgICAvLyBOb3RlOiBGbGlwcyBhcmUgYXBwbGllZCBiZWZvcmUgcm90YXRlczsgdXNpbmcgWE9SIGhlcmUgYXMgc29tZSBvZiB0aGVzZSBmbGFncyBhcmUKICAgICAgICAgLy8gY29tcG9zZWQgaW4gdGVybXMgb2Ygb3RoZXIgZmxpcC9yb3RhdGlvbiBmbGFncywgYW5kIGFyZSBub3QgYml0d2lzZS1PUmFibGUuCiAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICAgICAgICAgICAgICBmbGFncyA9IG1pcnJvcjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgIGZsYWdzID0gbWlycm9yIF4KICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgZmxhZ3MgPSBtaXJyb3IgXgogICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzE4MDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICBmbGFncyA9IG1pcnJvciBeCiAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfOTA7Ci0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKaW5kZXggZDZiOTVkYS4uMzg1YzE2MyAxMDA2NDQKLS0tIGEvY2FtZXJhL09XTkVSUworKysgYi9jYW1lcmEvT1dORVJTCkBAIC0xLDggKzEsNyBAQAotZXBlZXZAZ29vZ2xlLmNvbQorIyBCdWcgY29tcG9uZW50OiA0MTcyNwogZXRhbHZhbGFAZ29vZ2xlLmNvbQorYXJha2VzaEBnb29nbGUuY29tCitlcGVldkBnb29nbGUuY29tCiBqY2hvd2RoYXJ5QGdvb2dsZS5jb20KIHNodXpoZW53YW5nQGdvb2dsZS5jb20KLXlpbmNoaWF5ZWhAZ29vZ2xlLmNvbQotIyBiYWNrdXAgb3duZXIKLWN5Y2hlbkBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitydWNoYW1rQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCAyNGZhOTEyLi5iMzc4MDNhIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC03NjAsNyArNzYwLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOwogICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBWZW5kb3IgdGFnIGRlc2NyaXB0b3IgY2FjaGUgbm90IGluaXRpYWxpemVkLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBWRU5ET1JfVEFHX05BTUVfRVJSOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKICAgICB9CiAgICAgcmV0dXJuIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUtPmdldFRhZ1R5cGUodGFnLCBpZCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKaW5kZXggNzhhNzdkNC4uMWU3NDhjNyAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbApAQCAtMTczLDYgKzE3MywxMyBAQAogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIAorICAgIC8vIENoYW5nZSB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvZiB0aGUgZmxhc2ggdW5pdCBhc3NvY2lhdGVkIHdpdGggY2FtZXJhSWQgdG8gc3RyZW5ndGhMZXZlbC4KKyAgICAvLyBJZiB0aGUgdG9yY2ggaXMgaW4gT0ZGIHN0YXRlIGFuZCBzdHJlbmd0aExldmVsID4gMCB0aGVuIHRoZSB0b3JjaCB3aWxsIGFsc28gYmUgdHVybmVkIE9OLgorICAgIHZvaWQgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChTdHJpbmcgY2FtZXJhSWQsIGludCBzdHJlbmd0aExldmVsLCBJQmluZGVyIGNsaWVudEJpbmRlcik7CisKKyAgICAvLyBHZXQgdGhlIGJyaWdodG5lc3MgbGV2ZWwgb2YgdGhlIGZsYXNoIHVuaXQgYXNzb2NpYXRlZCB3aXRoIGNhbWVyYUlkLgorICAgIGludCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoU3RyaW5nIGNhbWVyYUlkKTsKKwogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2Ugb2YgYSBzeXN0ZW0gZXZlbnQuICBTaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBzeXN0ZW1fc2VydmVyLgogICAgICAqCkBAIC0xODAsNiArMTg3LDggQEAKICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7CiAgICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOyAvLyBUaGUgYXJndW1lbnQgaXMgdGhlIHNldCBvZiBuZXcgZm9yZWdyb3VuZCB1c2VyIElEcy4KKyAgICBjb25zdCBpbnQgRVZFTlRfVVNCX0RFVklDRV9BVFRBQ0hFRCA9IDI7IC8vIFRoZSBhcmd1bWVudCBpcyB0aGUgZGV2aWNlSWQgYW5kIHZlbmRvcklkCisgICAgY29uc3QgaW50IEVWRU5UX1VTQl9ERVZJQ0VfREVUQUNIRUQgPSAzOyAvLyBUaGUgYXJndW1lbnQgaXMgdGhlIGRldmljZUlkIGFuZCB2ZW5kb3JJZAogICAgIG9uZXdheSB2b2lkIG5vdGlmeVN5c3RlbUV2ZW50KGludCBldmVudElkLCBpbiBpbnRbXSBhcmdzKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAppbmRleCBjNTQ4MTNjLi41ZjE3ZjViIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbApAQCAtODMsNiArODMsOCBAQAogCiAgICAgb25ld2F5IHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoaW50IHN0YXR1cywgU3RyaW5nIGNhbWVyYUlkKTsKIAorICAgIG9uZXdheSB2b2lkIG9uVG9yY2hTdHJlbmd0aExldmVsQ2hhbmdlZChTdHJpbmcgY2FtZXJhSWQsIGludCBuZXdUb3JjaFN0cmVuZ3RoKTsKKwogICAgIC8qKgogICAgICAqIE5vdGlmeSByZWdpc3RlcmVkIGNsaWVudHMgYWJvdXQgY2FtZXJhIGFjY2VzcyBwcmlvcml0eSBjaGFuZ2VzLgogICAgICAqIENsaWVudHMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHVuYWJsZSB0byBvcGVuIGEgY2VydGFpbiBjYW1lcmEgZGV2aWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCmluZGV4IGJiYjAyODkuLjg4NzgzZmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCkBAIC0zNyw4ICszNywxNiBAQAogICAgIG9uZXdheSB2b2lkIG5vdGlmeUNhbWVyYVN0YXRlKGluIENhbWVyYVNlc3Npb25TdGF0cyBjYW1lcmFTZXNzaW9uU3RhdHMpOwogCiAgICAgLyoqCi0gICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSB0b3AgYWN0aXZpdHkgbmVlZHMgYSByb3RhdGUgYW5kIGNyb3Agb3ZlcnJpZGUuCisgICAgICogUmV0dXJucyB0aGUgbmVjZXNzYXJ5IHJvdGF0ZSBhbmQgY3JvcCBvdmVycmlkZSBmb3IgdGhlIHRvcCBhY3Rpdml0eSB3aGljaAorICAgICAqIHdpbGwgYmUgb25lIG9mICh7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfTk9ORX0sCisgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzkwfSwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMTgwfSwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMjcwfSkuCiAgICAgICovCi0gICAgYm9vbGVhbiBpc1JvdGF0ZUFuZENyb3BPdmVycmlkZU5lZWRlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBzZW5zb3JPcmllbnRhdGlvbiwKLSAgICAgICAgICAgIGludCBsZW5zRmFjaW5nKTsKKyAgICBpbnQgZ2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGxlbnNGYWNpbmcsIGludCB1c2VySWQpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBjYW1lcmEgaGFzIGJlZW4gZGlzYWJsZWQgdmlhIGRldmljZSBwb2xpY3kuCisgICAgICovCisgICAgYm9vbGVhbiBpc0NhbWVyYURpc2FibGVkKCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggZWJjMDlkNy4uN2E4YTRiYSAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcApAQCAtMTQ2LDYgKzE0NiwyMCBAQAogICAgICAgICBtU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN1cmZhY2VJZHgpOwogICAgIH0KIAorICAgIGludDMyX3QgaGFzVXNlclRhZzsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZoYXNVc2VyVGFnKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB1c2VyIHRhZyBhdmFpbGFiaWxpdHkgZmxhZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChoYXNVc2VyVGFnKSB7CisgICAgICAgIFN0cmluZzE2IHVzZXJUYWc7CisgICAgICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJnVzZXJUYWcpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB1c2VyIHRhZyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtVXNlclRhZyA9IFN0cmluZzgodXNlclRhZykuY19zdHIoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIxMyw2ICsyMjcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAobVVzZXJUYWcuZW1wdHkoKSkgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDEpOworICAgICAgICBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobVVzZXJUYWcuY19zdHIoKSkpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCAyYmNjZDg3Li4xMWQ0OTYwIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Z3VpL3ZpZXcvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTc2LDYgKzc3LDIyIEBACiAgICAgcmV0dXJuIG1TZW5zb3JQaXhlbE1vZGVzVXNlZDsKIH0KIAoraW50NjRfdCBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXREeW5hbWljUmFuZ2VQcm9maWxlKCkgY29uc3QgeworICAgIHJldHVybiBtRHluYW1pY1JhbmdlUHJvZmlsZTsKK30KKworaW50NjRfdCBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXRTdHJlYW1Vc2VDYXNlKCkgY29uc3QgeworICAgIHJldHVybiBtU3RyZWFtVXNlQ2FzZTsKK30KKworaW50IE91dHB1dENvbmZpZ3VyYXRpb246OmdldFRpbWVzdGFtcEJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UaW1lc3RhbXBCYXNlOworfQorCitpbnQgT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2V0TWlycm9yTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pcnJvck1vZGU7Cit9CisKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oKSA6CiAgICAgICAgIG1Sb3RhdGlvbihJTlZBTElEX1JPVEFUSU9OKSwKICAgICAgICAgbVN1cmZhY2VTZXRJRChJTlZBTElEX1NFVF9JRCksCkBAIC04NCw3ICsxMDEsMTEgQEAKICAgICAgICAgbUhlaWdodCgwKSwKICAgICAgICAgbUlzRGVmZXJyZWQoZmFsc2UpLAogICAgICAgICBtSXNTaGFyZWQoZmFsc2UpLAotICAgICAgICBtSXNNdWx0aVJlc29sdXRpb24oZmFsc2UpIHsKKyAgICAgICAgbUlzTXVsdGlSZXNvbHV0aW9uKGZhbHNlKSwKKyAgICAgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCksCisgICAgICAgIG1TdHJlYW1Vc2VDYXNlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpLAorICAgICAgICBtVGltZXN0YW1wQmFzZShUSU1FU1RBTVBfQkFTRV9ERUZBVUxUKSwKKyAgICAgICAgbU1pcnJvck1vZGUoTUlSUk9SX01PREVfQVVUTykgewogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCYgcGFyY2VsKSA6CkBAIC0xNjUsNiArMTg2LDMwIEBACiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vuc29yIHBpeGVsIG1vZGUocykgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KKyAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJmR5bmFtaWNQcm9maWxlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBzdXJmYWNlIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSBmbGFnIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0cmVhbSB1c2UgY2FzZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBUSU1FU1RBTVBfQkFTRV9ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnRpbWVzdGFtcEJhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHRpbWVzdGFtcCBiYXNlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgbWlycm9yTW9kZSA9IE1JUlJPUl9NT0RFX0FVVE87CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmbWlycm9yTW9kZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWlycm9yaW5nIG1vZGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIG1TdXJmYWNlU2V0SUQgPSBzZXRJRDsKICAgICBtU3VyZmFjZVR5cGUgPSBzdXJmYWNlVHlwZTsKQEAgLTE3Myw2ICsyMTgsOSBAQAogICAgIG1Jc0RlZmVycmVkID0gaXNEZWZlcnJlZCAhPSAwOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkICE9IDA7CiAgICAgbUlzTXVsdGlSZXNvbHV0aW9uID0gaXNNdWx0aVJlc29sdXRpb24gIT0gMDsKKyAgICBtU3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CisgICAgbVRpbWVzdGFtcEJhc2UgPSB0aW1lc3RhbXBCYXNlOworICAgIG1NaXJyb3JNb2RlID0gbWlycm9yTW9kZTsKICAgICBmb3IgKGF1dG8mIHN1cmZhY2UgOiBzdXJmYWNlU2hpbXMpIHsKICAgICAgICAgQUxPR1YoIiVzOiBPdXRwdXRDb25maWd1cmF0aW9uOiAlcCwgbmFtZSAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBzdXJmYWNlLmdyYXBoaWNCdWZmZXJQcm9kdWNlci5nZXQoKSwKQEAgLTE4MSwxMCArMjI5LDE0IEBACiAgICAgfQogCiAgICAgbVNlbnNvclBpeGVsTW9kZXNVc2VkID0gc3RkOjptb3ZlKHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9IGR5bmFtaWNQcm9maWxlOwogCiAgICAgQUxPR1YoIiVzOiBPdXRwdXRDb25maWd1cmF0aW9uOiByb3RhdGlvbiA9ICVkLCBzZXRJZCA9ICVkLCBzdXJmYWNlVHlwZSA9ICVkLCIKLSAgICAgICAgICAiIHBoeXNpY2FsQ2FtZXJhSWQgPSAlcywgaXNNdWx0aVJlc29sdXRpb24gPSAlZCIsIF9fRlVOQ1RJT05fXywgbVJvdGF0aW9uLAotICAgICAgICAgIG1TdXJmYWNlU2V0SUQsIG1TdXJmYWNlVHlwZSwgU3RyaW5nOChtUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCksIG1Jc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgIiBwaHlzaWNhbENhbWVyYUlkID0gJXMsIGlzTXVsdGlSZXNvbHV0aW9uID0gJWQsIHN0cmVhbVVzZUNhc2UgPSAlIiBQUklkNjQKKyAgICAgICAgICAiLCB0aW1lc3RhbXBCYXNlID0gJWQsIG1pcnJvck1vZGUgPSAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBtUm90YXRpb24sIG1TdXJmYWNlU2V0SUQsIG1TdXJmYWNlVHlwZSwKKyAgICAgICAgICBTdHJpbmc4KG1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSwgbUlzTXVsdGlSZXNvbHV0aW9uLCBtU3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgICBtTWlycm9yTW9kZSk7CiAKICAgICByZXR1cm4gZXJyOwogfQpAQCAtMTk5LDYgKzI1MSwxMCBAQAogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogICAgIG1QaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxJZDsKICAgICBtSXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKKyAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQ7CisgICAgbVN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIG1UaW1lc3RhbXBCYXNlID0gVElNRVNUQU1QX0JBU0VfREVGQVVMVDsKKyAgICBtTWlycm9yTW9kZSA9IE1JUlJPUl9NT0RFX0FVVE87CiB9CiAKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oCkBAIC0yMDcsNyArMjYzLDExIEBACiAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGlzU2hhcmVkKQogICA6IG1HYnBzKGdicHMpLCBtUm90YXRpb24ocm90YXRpb24pLCBtU3VyZmFjZVNldElEKHN1cmZhY2VTZXRJRCksIG1TdXJmYWNlVHlwZShzdXJmYWNlVHlwZSksCiAgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtSXNEZWZlcnJlZChmYWxzZSksIG1Jc1NoYXJlZChpc1NoYXJlZCksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksIG1Jc011bHRpUmVzb2x1dGlvbihmYWxzZSkgeyB9CisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksIG1Jc011bHRpUmVzb2x1dGlvbihmYWxzZSksCisgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCksCisgICAgbVN0cmVhbVVzZUNhc2UoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCksCisgICAgbVRpbWVzdGFtcEJhc2UoVElNRVNUQU1QX0JBU0VfREVGQVVMVCksCisgICAgbU1pcnJvck1vZGUoTUlSUk9SX01PREVfQVVUTykgeyB9CiAKIHN0YXR1c190IE91dHB1dENvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKIApAQCAtMjU0LDYgKzMxNCwxOCBAQAogICAgIGVyciA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKG1TZW5zb3JQaXhlbE1vZGVzVXNlZCk7CiAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKIAorICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQ2NChtRHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQ2NChtU3RyZWFtVXNlQ2FzZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtVGltZXN0YW1wQmFzZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTWlycm9yTW9kZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IDhjYTg5MjAuLjA5NGEzYzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUJhc2UuaAppbmRleCBlMTU2OTk0Li44ZTUzOTY4IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFCYXNlLmgKQEAgLTg1LDExICs4NSwxNyBAQAogICAgICAqLwogICAgIHN0ZDo6dmVjdG9yPFN0cmluZzg+IHVuYXZhaWxhYmxlUGh5c2ljYWxJZHM7CiAKKyAgICAvKioKKyAgICAgKiBDbGllbnQgcGFja2FnZSBuYW1lIGlmIGNhbWVyYSBpcyBvcGVuLCBvdGhlcndpc2Ugbm90IGFwcGxpY2FibGUKKyAgICAgKi8KKyAgICBTdHJpbmc4IGNsaWVudFBhY2thZ2U7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpOwogCi0gICAgQ2FtZXJhU3RhdHVzKFN0cmluZzggaWQsIGludDMyX3QgcywgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nOD4mIHVuYXZhaWxTdWJJZHMpIDoKLSAgICAgICAgICAgIGNhbWVyYUlkKGlkKSwgc3RhdHVzKHMpLCB1bmF2YWlsYWJsZVBoeXNpY2FsSWRzKHVuYXZhaWxTdWJJZHMpIHt9CisgICAgQ2FtZXJhU3RhdHVzKFN0cmluZzggaWQsIGludDMyX3QgcywgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nOD4mIHVuYXZhaWxTdWJJZHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnRQa2cpIDogY2FtZXJhSWQoaWQpLCBzdGF0dXMocyksCisgICAgICAgICAgICB1bmF2YWlsYWJsZVBoeXNpY2FsSWRzKHVuYXZhaWxTdWJJZHMpLCBjbGllbnRQYWNrYWdlKGNsaWVudFBrZykge30KICAgICBDYW1lcmFTdGF0dXMoKSA6IHN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCkge30KIH07CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaAppbmRleCBjMzk4YWNhLi5hYWE4OGIyIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiAKQEAgLTM1LDYgKzM3LDcgQEAKICAgICBpbnQgbVdpZHRoOwogICAgIGludCBtSGVpZ2h0OwogICAgIGludCBtRm9ybWF0OworICAgIGZsb2F0IG1NYXhQcmV2aWV3RnBzOwogICAgIGludCBtRGF0YVNwYWNlOwogICAgIGludDY0X3QgbVVzYWdlOwogCkBAIC02MCwxNiArNjMsMjYgQEAKICAgICAvLyBzaXplKG1IaXN0b2dyYW1CaW5zKSArIDEgPSBzaXplKG1IaXN0b2dyYW1Db3VudHMpCiAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUhpc3RvZ3JhbUNvdW50czsKIAorICAgIC8vIER5bmFtaWMgcmFuZ2UgcHJvZmlsZQorICAgIGludDY0X3QgbUR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgLy8gU3RyZWFtIHVzZSBjYXNlCisgICAgaW50NjRfdCBtU3RyZWFtVXNlQ2FzZTsKKwogICAgIENhbWVyYVN0cmVhbVN0YXRzKCkgOgotICAgICAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRm9ybWF0KDApLCBtRGF0YVNwYWNlKDApLCBtVXNhZ2UoMCksCisgICAgICAgICAgICBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Gb3JtYXQoMCksIG1NYXhQcmV2aWV3RnBzKDApLCBtRGF0YVNwYWNlKDApLCBtVXNhZ2UoMCksCiAgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwgbVN0YXJ0TGF0ZW5jeU1zKDApLAotICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMoMCksIG1NYXhBcHBCdWZmZXJzKDApLCBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSB7fQotICAgIENhbWVyYVN0cmVhbVN0YXRzKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgaW50IGRhdGFTcGFjZSwgaW50NjRfdCB1c2FnZSwKLSAgICAgICAgICAgIGludCBtYXhIYWxCdWZmZXJzLCBpbnQgbWF4QXBwQnVmZmVycykKLSAgICAgICAgICAgIDogbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtRm9ybWF0KGZvcm1hdCksIG1EYXRhU3BhY2UoZGF0YVNwYWNlKSwKLSAgICAgICAgICAgICAgbVVzYWdlKHVzYWdlKSwgbVJlcXVlc3RDb3VudCgwKSwgbUVycm9yQ291bnQoMCksIG1TdGFydExhdGVuY3lNcygwKSwKLSAgICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMobWF4SGFsQnVmZmVycyksIG1NYXhBcHBCdWZmZXJzKG1heEFwcEJ1ZmZlcnMpLAotICAgICAgICAgICAgICBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSB7fQorICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMoMCksIG1NYXhBcHBCdWZmZXJzKDApLCBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSwKKyAgICAgICAgICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpLAorICAgICAgICAgICAgbVN0cmVhbVVzZUNhc2UoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCkge30KKyAgICBDYW1lcmFTdHJlYW1TdGF0cyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGZsb2F0IG1heFByZXZpZXdGcHMsIGludCBkYXRhU3BhY2UsCisgICAgICAgICAgICBpbnQ2NF90IHVzYWdlLCBpbnQgbWF4SGFsQnVmZmVycywgaW50IG1heEFwcEJ1ZmZlcnMsIGludCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgaW50IHN0cmVhbVVzZUNhc2UpCisgICAgICAgICAgICA6IG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUZvcm1hdChmb3JtYXQpLCBtTWF4UHJldmlld0ZwcyhtYXhQcmV2aWV3RnBzKSwKKyAgICAgICAgICAgICAgbURhdGFTcGFjZShkYXRhU3BhY2UpLCBtVXNhZ2UodXNhZ2UpLCBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwKKyAgICAgICAgICAgICAgbVN0YXJ0TGF0ZW5jeU1zKDApLCBtTWF4SGFsQnVmZmVycyhtYXhIYWxCdWZmZXJzKSwgbU1heEFwcEJ1ZmZlcnMobWF4QXBwQnVmZmVycyksCisgICAgICAgICAgICAgIG1IaXN0b2dyYW1UeXBlKEhJU1RPR1JBTV9UWVBFX1VOS05PV04pLAorICAgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZShkeW5hbWljUmFuZ2VQcm9maWxlKSwKKyAgICAgICAgICAgICAgbVN0cmVhbVVzZUNhc2Uoc3RyZWFtVXNlQ2FzZSkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC0xMTEsNiArMTI0LDcgQEAKICAgICBib29sIG1Jc05kazsKICAgICAvLyBsYXRlbmN5IGluIG1zIGZvciBjYW1lcmEgb3BlbiwgY2xvc2UsIG9yIHNlc3Npb24gY3JlYXRpb24uCiAgICAgaW50IG1MYXRlbmN5TXM7CisgICAgZmxvYXQgbU1heFByZXZpZXdGcHM7CiAKICAgICAvLyBTZXNzaW9uIGluZm8gYW5kIHN0YXRpc3RpY3MKICAgICBpbnQgbVNlc3Npb25UeXBlOwpAQCAtMTIyLDYgKzEzNiw4IEBACiAgICAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHJ1bnMgaW50byBhbiBlcnJvciBzdGF0ZQogICAgIGJvb2wgbURldmljZUVycm9yOwogICAgIHN0ZDo6dmVjdG9yPENhbWVyYVN0cmVhbVN0YXRzPiBtU3RyZWFtU3RhdHM7CisgICAgU3RyaW5nMTYgbVVzZXJUYWc7CisgICAgaW50IG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlOwogCiAgICAgLy8gQ29uc3RydWN0b3JzCiAgICAgQ2FtZXJhU2Vzc2lvblN0YXRzKCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCmluZGV4IGEzOTdjY2QuLjMxZDI1ZTcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCkBAIC0zNywxMCArMzcsMTMgQEAKICAgICAgICAgICogbWV0YWRhdGEuICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gYW5kIGxlbnMgZmFjaW5nCiAgICAgICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbWVyYSBkZXZpY2UuCiAgICAgICAgICAqCisgICAgICAgICAqIElmIG1pcnJvck1vZGUgaXMgbm90IEFVVE8sIGl0IHdpbGwgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgbGVucworICAgICAgICAgKiBmYWNpbmcgYmFzZWQgbWlycm9yLgorICAgICAgICAgKgogICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRSb3RhdGlvblRyYW5zZm9ybShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgICAgICAgICAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSwgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrIGlmIHRoZSBpbWFnZSBkYXRhIGlzIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEsIHRoYXQgY29udGFpbnMgYSBuYXRpdmUgaGFuZGxlLgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggNTA2YWJhYi4uMjhkYmM3YyAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oCkBAIC02Myw2ICs2Myw4IEBACiAKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsgLy8gYXJiaXRyYXJ5IHVzZXIgY29udGV4dCBmcm9tIE5ESyBhcHBzLCBudWxsIGZvciBqYXZhIGFwcHMKIAorICAgIHN0ZDo6c3RyaW5nICAgICAgICAgICAgIG1Vc2VyVGFnOyAvLyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCBwYXNzZWQgaW50byBzZXRUYWcuCisKICAgICAvKioKICAgICAgKiBLZWVwIGltcGwgdXAtdG8tZGF0ZSB3aXRoIENhcHR1cmVSZXF1ZXN0LmphdmEgaW4gZnJhbWV3b3Jrcy9iYXNlCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKaW5kZXggZjgwZWQzYS4uYjg0Mjg4NSAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaApAQCAtMzgsMTYgKzM4LDM0IEBACiAgICAgICAgIFNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcgPSAwLAogICAgICAgICBTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFID0gMQogICAgIH07CisgICAgZW51bSBUaW1lc3RhbXBCYXNlVHlwZSB7CisgICAgICAgIFRJTUVTVEFNUF9CQVNFX0RFRkFVTFQgPSAwLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9TRU5TT1IgPSAxLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9NT05PVE9OSUMgPSAyLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9SRUFMVElNRSA9IDMsCisgICAgICAgIFRJTUVTVEFNUF9CQVNFX0NIT1JFT0dSQVBIRVJfU1lOQ0VEID0gNAorICAgIH07CisgICAgZW51bSBNaXJyb3JNb2RlVHlwZSB7CisgICAgICAgIE1JUlJPUl9NT0RFX0FVVE8gPSAwLAorICAgICAgICBNSVJST1JfTU9ERV9OT05FID0gMSwKKyAgICAgICAgTUlSUk9SX01PREVfSCA9IDIsCisgICAgICAgIE1JUlJPUl9NT0RFX1YgPSAzLAorICAgIH07CisKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRSb3RhdGlvbigpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VTZXRJRCgpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VUeXBlKCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBnZXREeW5hbWljUmFuZ2VQcm9maWxlKCkgY29uc3Q7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZlcnJlZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVkKCkgY29uc3Q7CiAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKCkgY29uc3Q7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtVXNlQ2FzZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFRpbWVzdGFtcEJhc2UoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRNaXJyb3JNb2RlKCkgY29uc3Q7CiAKICAgICAvLyBzZXQgb2Ygc2Vuc29yIHBpeGVsIG1vZGUgcmVzb2x1dGlvbnMgYWxsb3dlZCB7TUFYX1JFU09MVVRJT04sIERFRkFVTFRfTU9ERX07CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mICAgICAgICAgICAgZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKSBjb25zdDsKQEAgLTg5LDcgKzEwNywxMSBAQAogICAgICAgICAgICAgICAgIGdicHNFcXVhbChvdGhlcikgJiYKICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZCAmJgogICAgICAgICAgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbiA9PSBvdGhlci5tSXNNdWx0aVJlc29sdXRpb24gJiYKLSAgICAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKG90aGVyKSk7CisgICAgICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWRFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9PSBvdGhlci5tRHluYW1pY1JhbmdlUHJvZmlsZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1Vc2VDYXNlID09IG90aGVyLm1TdHJlYW1Vc2VDYXNlICYmCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcEJhc2UgPT0gb3RoZXIubVRpbWVzdGFtcEJhc2UgJiYKKyAgICAgICAgICAgICAgICBtTWlycm9yTW9kZSA9PSBvdGhlci5tTWlycm9yTW9kZSk7CiAgICAgfQogICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKQEAgLTEyNiw2ICsxNDgsMTggQEAKICAgICAgICAgaWYgKCFzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKG90aGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIHNlbnNvclBpeGVsTW9kZXNVc2VkTGVzc1RoYW4ob3RoZXIpOwogICAgICAgICB9CisgICAgICAgIGlmIChtRHluYW1pY1JhbmdlUHJvZmlsZSAhPSBvdGhlci5tRHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIG1EeW5hbWljUmFuZ2VQcm9maWxlIDwgb3RoZXIubUR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdHJlYW1Vc2VDYXNlICE9IG90aGVyLm1TdHJlYW1Vc2VDYXNlKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVVzZUNhc2UgPCBvdGhlci5tU3RyZWFtVXNlQ2FzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVzdGFtcEJhc2UgIT0gb3RoZXIubVRpbWVzdGFtcEJhc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGltZXN0YW1wQmFzZSA8IG90aGVyLm1UaW1lc3RhbXBCYXNlOworICAgICAgICB9CisgICAgICAgIGlmIChtTWlycm9yTW9kZSAhPSBvdGhlci5tTWlycm9yTW9kZSkgeworICAgICAgICAgICAgcmV0dXJuIG1NaXJyb3JNb2RlIDwgb3RoZXIubU1pcnJvck1vZGU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdicHNMZXNzVGhhbihvdGhlcik7CiAgICAgfQogCkBAIC0xNTAsNiArMTg0LDEwIEBACiAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzTXVsdGlSZXNvbHV0aW9uOwogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+ICAgICAgIG1TZW5zb3JQaXhlbE1vZGVzVXNlZDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVXNlQ2FzZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wQmFzZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtTWlycm9yTW9kZTsKIH07CiB9IC8vIG5hbWVzcGFjZSBwYXJhbXMKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggMWFjODQ4Mi4uOWM5ODc3OCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgogCiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgorI2luY2x1ZGUgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTcyLDIyICs3MywxNiBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CiAKLSAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLQotICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAotICAgICAgICAgICAgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlVjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CiB9CiAKIEVYUE9SVApAQCAtOTcsMjIgKzkyLDI2IEBACiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgfQorICAgIHJldHVybiBjYXB0dXJlVGVtcGxhdGUoc2Vzc2lvbiwgbGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CiAKLSAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9CitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlVjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoCi0gICAgICAgICAgICBsY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0VjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CiB9CiAKIEVYUE9SVApAQCAtMTIxLDIzICsxMjAsMTAgQEAKICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgewotICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2Vzc2lvbi0+c2V0UmVwZWF0aW5nUmVxdWVzdChjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIHJldHVybiBzZXRSZXBlYXRpbmdSZXF1ZXN0VGVtcGxhdGUoc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIH0KIAorCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCkBAIC0xNDUsMjEgKzEzMSwxOCBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQogCi0gICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKLSAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7Ci0gICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0VjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordGVtcGxhdGUgPGNsYXNzIENhbGxiYWNrVHlwZT4KK2NhbWVyYV9zdGF0dXNfdCBjYXB0dXJlVGVtcGxhdGUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQ2FsbGJhY2tUeXBlKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoCisgICAgICAgICAgICBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2FsbGJhY2tUeXBlPgorY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RUZW1wbGF0ZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9DYWxsYmFja1R5cGUqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+c2V0UmVwZWF0aW5nUmVxdWVzdChjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGRkNjUyYzcuLjc5OTc3NjggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCi0KIEFDYW1lcmFEZXZpY2U6On5BQ2FtZXJhRGV2aWNlKCkgewogICAgIG1EZXZpY2UtPnN0b3BMb29wZXJBbmREaXNjb25uZWN0KCk7CiB9CkBAIC05MTMsNiArOTExLDcgQEAKICAgICAgICAgY2FzZSBrV2hhdE9uRXJyb3I6CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTk4NSw2ICs5ODQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTEwMDQsNiArMTAwNCw3IEBACiAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQyOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CkBAIC0xMDU1LDYgKzEwNTYsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG9uU3RhcnQyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0Mik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBzdGFydFYyIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrVGltZVN0YW1wS2V5LCAmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCB0aW1lc3RhbXAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblN0YXJ0MikoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OwpAQCAtMTI4NSw3ICsxMzE1LDggQEAKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgogICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKICAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKLSAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSksCisgICAgICAgIG1JczJDYWxsYmFjayhmYWxzZSkgewogICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGNicyk7CiAKICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKQEAgLTEzMDEsNyArMTMzMiw4IEBACiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCiAgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCi0gICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKGZhbHNlKSB7CiAgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CiAKICAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CkBAIC0xMzEwLDYgKzEzNDIsNDAgQEAKICAgICB9CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKAogICAgIGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgewpAQCAtMTUzNiw3ICsxNjAyLDYgQEAKICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwotCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZApAQCAtMTU1MSwxMSArMTYxNiwxNCBAQAogCiAgICAgaW50IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOwogICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CiAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgYm9vbCB2MkNhbGxiYWNrID0gY2JoLm1JczJDYWxsYmFjazsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgb25TdGFydDIgPSBjYmgubU9uQ2FwdHVyZVN0YXJ0ZWQyOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTE1NjMsMTIgKzE2MzEsMTkgQEAKICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG51bGxwdHI7CisgICAgICAgIGlmICh2MkNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQyLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0Mik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCAqKW9uU3RhcnQpOworICAgICAgICB9CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRJbnQ2NChrVGltZVN0YW1wS2V5LCB0aW1lc3RhbXApOworICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgZnJhbWVOdW1iZXIpOwogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggMzQ0ZDk2NC4uMTc5ODhmZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0yMTUsNiArMjE1LDcgQEAKICAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQogICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcwogICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQyLCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAogICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCkBAIC0yOTQsMTEgKzI5NSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKTsKLQotICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiogbGNicyk7CisgICAgICAgIHZvaWQgY2xlYXJDYWxsYmFja3MoKSB7CiAgICAgICAgICAgICBtQ29udGV4dCA9IG51bGxwdHI7CiAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZDIgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CiAgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CkBAIC0zMDcsNiArMzE1LDI0IEBACiAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CiAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKFQqIGNicykgeworICAgICAgICAgICAgY2xlYXJDYWxsYmFja3MoKTsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkMiA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgY2xlYXJDYWxsYmFja3MoKTsKICAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OwogICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOwpAQCAtMzIwLDkgKzM0NiwxMSBAQAogICAgICAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gbVJlcXVlc3RzOwogICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzUmVwZWF0aW5nOwogICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzMkNhbGxiYWNrOwogCiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBtT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG1PbkNhcHR1cmVTdGFydGVkMjsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZVByb2dyZXNzZWQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVDb21wbGV0ZWQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA5NWVmMmIyLi41ODkyZjFhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTE4OSw4ICsxODksMTIgQEAKICAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKICAgICBpZiAoY20gIT0gbnVsbHB0cikgewogICAgICAgICBBdXRvTXV0ZXggbG9jayhjbS0+bUxvY2spOworICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBjYW1lcmFJZExpc3Q7CiAgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjYW1lcmFJZExpc3QucHVzaF9iYWNrKHBhaXIuZmlyc3QpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChTdHJpbmc4IGNhbWVyYUlkIDogY2FtZXJhSWRMaXN0KSB7CiAgICAgICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkTG9ja2VkKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCwgY2FtZXJhSWQpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IGNjYmZhYTkuLmQ1M2Q4MDkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC05NSw2ICs5NSw5IEBACiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0YXR1c0NoYW5nZWQoaW50MzJfdCwgY29uc3QgU3RyaW5nMTYmKSB7CiAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoY29uc3QgU3RyaW5nMTYmLCBpbnQzMl90KSB7CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYU9wZW5lZChjb25zdCBTdHJpbmcxNiYsIGNvbnN0IFN0cmluZzE2JikgewpAQCAtMTM5LDYgKzE0Miw4IEBACiAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV29yZGVyZWQtY29tcGFyZS1mdW5jdGlvbi1wb2ludGVycyIKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKICAgICAgICAgICAgIGlmIChtUGh5c2ljYWxDYW1BdmFpbGFibGUgIT0gb3RoZXIubVBoeXNpY2FsQ2FtQXZhaWxhYmxlKSB7CkBAIC0xNTIsNiArMTU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlICE9IG90aGVyLm1BdmFpbGFibGUpIHJldHVybiBtQXZhaWxhYmxlIDwgb3RoZXIubUF2YWlsYWJsZTsKICAgICAgICAgICAgIHJldHVybiBtVW5hdmFpbGFibGUgPCBvdGhlci5tVW5hdmFpbGFibGU7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAogICAgICAgICB9CiAgICAgICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyICYmICEoKnRoaXMgPCBvdGhlcikpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAppbmRleCBkYWIyZmVmLi4wNTEyNGMwIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcApAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICAgIGludDY0X3QgZm9ybWF0ID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKICAgICAgICAgaW50NjRfdCB3aWR0aCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKICAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOwotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOwogCiAgICAgICAgIC8vIExlYXZlIHRoZSB1bmZpbHRlcmVkIGZvcm1hdCBpbiBzbyBhcHBzIGRlcGVuZGluZyBvbiBwcmV2aW91cyB3cm9uZwogICAgICAgICAvLyBmaWx0ZXIgYmVoYXZpb3IgY29udGludWUgdG8gd29yawpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDJiN2YwNDAuLmIwZmQwMGMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTgxMSw2ICs4MTEsMTg0IEBACiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CiAKKy8qKgorICogVGhlIGRlZmluaXRpb24gb2YgY2FtZXJhIGNhcHR1cmUgc3RhcnQgY2FsbGJhY2suIFRoZSBzYW1lIGFzCisgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU3RhcnRlZH0sIGV4Y2VwdCB0aGF0CisgKiBpdCBoYXMgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBhcyB3ZWxsLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0IHByb3ZpZGVkIGJ5IHVzZXIgaW4KKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc30uCisgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSByZXF1ZXN0IFRoZSBjYXB0dXJlIHJlcXVlc3QgdGhhdCBpcyBzdGFydGluZy4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICBjYXB0dXJlIHJlcXVlc3Qgc2VudCBieSBhcHBsaWNhdGlvbiwgc28gdGhlIGFkZHJlc3MgaXMgZGlmZmVyZW50IHRvIHdoYXQKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlbnQgYnV0IHRoZSBjb250ZW50IHdpbGwgbWF0Y2guIFRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHRpbWVzdGFtcCBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGNhcHR1cmUgaXMgc3RhcnRlZC4gVGhpcyB0aW1lc3RhbXAgd2lsbCBtYXRjaAorICogICAgICAgICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QfSBvZiB0aGUge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gaW4KKyAqICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZUNvbXBsZXRlZH0gY2FsbGJhY2suCisgKiBAcGFyYW0gZnJhbWVOdW1iZXIgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBzdGFydGVkCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMikoCisgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50NjRfdCBmcmFtZU51bWJlcik7CisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MsCisgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBjYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBjYWxsYmFjayBpcworICogdXNlZCwgaW5zdGVhZCBvZiBjYXB0dXJlQ2FsbGJhY2tfc3RhcnQsIHRvIHN1cHBvcnQgcmV0cmlldmluZyB0aGUgZnJhbWUgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyIHsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTdGFydGVkfSwKKyAgICAgKiBleGNlcHQgdGhhdCBpdCBoYXMgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBhZGRlZCBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogbGlzdC4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgICAgICAgICBvbkNhcHR1cmVTdGFydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlUHJvZ3Jlc3NlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgICAgICAgIG9uQ2FwdHVyZVByb2dyZXNzZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVDb21wbGV0ZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0ICAgICAgICBvbkNhcHR1cmVDb21wbGV0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVGYWlsZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkICAgICAgICBvbkNhcHR1cmVGYWlsZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlQnVmZmVyTG9zdH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisKKworfSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcywKKyAqIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGFuIGNhcHR1cmVDYWxsYmFja19zdGFydFYyIGNhbGxiYWNrIGlzCisgKiB1c2VkLCBpbnN0ZWFkIG9mIGNhcHR1cmVDYWxsYmFja19zdGFydCwgdG8gc3VwcG9ydCByZXRyaWV2aW5nIGZyYW1lIG51bWJlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyIHsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTdGFydGVkfSwKKyAgICAgKiBleGNlcHQgdGhhdCBpdCBoYXMgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBhZGRlZCBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogbGlzdC4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgICAgICAgICBvbkNhcHR1cmVTdGFydGVkOworCisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVQcm9ncmVzc2VkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCAgICAgICAgb25DYXB0dXJlUHJvZ3Jlc3NlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMKKyAgICAgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyNvbkxvZ2ljYWxDYXB0dXJlQ29tcGxldGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHtAbGluayBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkfSB3aGVuIHRoZQorICAgICAqIGNhbWVyYSBkZXZpY2UgZmFpbGVkIHRvIHByb2R1Y2UgYSBjYXB0dXJlIHJlc3VsdCBmb3IgdGhlCisgICAgICogcmVxdWVzdC4KKyAgICAgKgorICAgICAqIDxwPk90aGVyIHJlcXVlc3RzIGFyZSB1bmFmZmVjdGVkLCBhbmQgc29tZSBvciBhbGwgaW1hZ2UgYnVmZmVycyBmcm9tCisgICAgICogdGhlIGNhcHR1cmUgbWF5IGhhdmUgYmVlbiBwdXNoZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBvdXRwdXQKKyAgICAgKiBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgaW4gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG1hdGNoIHdoYXQgYXBwbGljYXRpb24gaGFzCisgICAgICogc3VibWl0dGVkLCBidXQgdGhlIGNvbnRlbnRzIHRoZSBBQ2FwdHVyZVJlcXVlc3Qgd2lsbCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIHN1Ym1pdHRlZC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUKKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlQnVmZmVyTG9zdH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisKK30gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIHYyIG9mIGNhbWVyYSBjYWxsYmFja3MsIHdoZXJlIHRoZSBvbkNhcHR1cmVTdGFydGVkIGNhbGxiYWNrCisgKiBhZGRzIGZyYW1lIG51bWJlciBpbiBpdHMgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZVYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDMzKTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsX3NldFJlcGVhdGluZ1JlcXVlc3QsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIHYyIG9mIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGNhbGxiYWNrcyB3aGVyZSB0aGUgb25DYXB0dXJlU3RhcnRlZAorICogY2FsbGJhY2sgYWRkcyBmcmFtZSBudW1iZXIgaW4gaXRzIHBhcmFtZXRlciBsaXN0LgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3RWMigKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbF9jYXB0dXJlLCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciB2MiBvZiBsb2dpY2FsIG11bHRpLWNhbWVyYSAgY2FsbGJhY2tzIHdoZXJlIHRoZSBvbkNhcHR1cmVTdGFydGVkIGNhbGxiYWNrCisgKiBhZGRzIGZyYW1lIG51bWJlciBpbiBpdHMgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlVjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbF9zZXRSZXBlYXRpbmdSZXF1ZXN0LCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciB2MiBvZiBsb2dpY2FsIG11bHRpLWNhbWVyYSBjYWxsYmFja3Mgd2hlcmUgdGhlIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAqIGNhbGxiYWNrIGFkZHMgZnJhbWUgbnVtYmVyIGluIGl0cyBwYXJhbWV0ZXIgbGlzdC4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3RWMigKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDMzKTsKKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAppbmRleCA4Njc4MWU1Li5iNmY4NTUyIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKQEAgLTcyLDYgKzcyLDggQEAKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTiwKICAgICBBQ0FNRVJBX0hFSUMsCiAgICAgQUNBTUVSQV9IRUlDX0lORk8sCisgICAgQUNBTUVSQV9BVVRPTU9USVZFLAorICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TLAogICAgIEFDQU1FUkFfU0VDVElPTl9DT1VOVCwKIAogICAgIEFDQU1FUkFfVkVORE9SID0gMHg4MDAwCkBAIC0xMTUsNiArMTE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgICAgICAgICAgICAgPSBBQ0FNRVJBX0hFSUMgICAgICAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfSEVJQ19JTkZPX1NUQVJUICAgICAgICA9IEFDQU1FUkFfSEVJQ19JTkZPICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX1NUQVJUICAgICAgID0gQUNBTUVSQV9BVVRPTU9USVZFICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19TVEFSVCAgPSBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOUyAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTUxNyw2ICs1MjEsMTQgQEAKICAgICAgKiByZWdpb24gYW5kIG91dHB1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gcmVjdGFuZ2xlIGFzIHRoZSBtZXRlcmluZyByZWdpb24gaW4gdGhlIHJlc3VsdAogICAgICAqIG1ldGFkYXRhLiAgSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5XaGVuIHNldHRpbmcgdGhlIEFFIG1ldGVyaW5nIHJlZ2lvbnMsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnNpZGVyIHRoZSBhZGRpdGlvbmFsCisgICAgICogY3JvcCByZXN1bHRlZCBmcm9tIHRoZSBhc3BlY3QgcmF0aW8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcHJldmlldyBzdHJlYW0gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04uIEZvciBleGFtcGxlLCBpZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gaXMgdGhlIGZ1bGwKKyAgICAgKiBhY3RpdmUgYXJyYXkgc2l6ZSB3aXRoIDQ6MyBhc3BlY3QgcmF0aW8sIGFuZCB0aGUgcHJldmlldyBzdHJlYW0gaXMgMTY6OSwKKyAgICAgKiB0aGUgYm91bmRhcnkgb2YgQUUgcmVnaW9ucyB3aWxsIGJlIFswLCB5X2Nyb3BdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHQgLSAyICogeV9jcm9wXSByYXRoZXIgdGhhbiBbMCwgMF0gYW5kCisgICAgICogW2FjdGl2ZV93aWR0aCwgYWN0aXZlX2hlaWdodF0sIHdoZXJlIHlfY3JvcCBpcyB0aGUgYWRkaXRpb25hbCBjcm9wIGR1ZSB0byBhc3BlY3QgcmF0aW8KKyAgICAgKiBtaXNtYXRjaC48L3A+CiAgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBUEkgbGV2ZWwgMzAsIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiBhY3RpdmVBcnJheVNpemUgb3IKICAgICAgKiBwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIGlzIHVzZWQgdG8gcmVwcmVzZW50IHBvc3Qtem9vbVJhdGlvIGZpZWxkIG9mIHZpZXcsIG5vdAogICAgICAqIHByZS16b29tIGZpZWxkIG9mIHZpZXcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2FtZSBhZVJlZ2lvbnMgdmFsdWVzIGF0IGRpZmZlcmVudApAQCAtNzE4LDYgKzczMCwxNCBAQAogICAgICAqIHJlZ2lvbiBhbmQgb3V0cHV0IG9ubHkgdGhlIGludGVyc2VjdGlvbiByZWN0YW5nbGUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpbiB0aGUgcmVzdWx0CiAgICAgICogbWV0YWRhdGEuIElmIHRoZSByZWdpb24gaXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgY3JvcCByZWdpb24sIGl0IHdpbGwgYmUgaWdub3JlZCBhbmQKICAgICAgKiBub3QgcmVwb3J0ZWQgaW4gdGhlIHJlc3VsdCBtZXRhZGF0YS48L3A+CisgICAgICogPHA+V2hlbiBzZXR0aW5nIHRoZSBBRiBtZXRlcmluZyByZWdpb25zLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjb25zaWRlciB0aGUgYWRkaXRpb25hbAorICAgICAqIGNyb3AgcmVzdWx0ZWQgZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHByZXZpZXcgc3RyZWFtIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OLiBGb3IgZXhhbXBsZSwgaWYgdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIGlzIHRoZSBmdWxsCisgICAgICogYWN0aXZlIGFycmF5IHNpemUgd2l0aCA0OjMgYXNwZWN0IHJhdGlvLCBhbmQgdGhlIHByZXZpZXcgc3RyZWFtIGlzIDE2OjksCisgICAgICogdGhlIGJvdW5kYXJ5IG9mIEFGIHJlZ2lvbnMgd2lsbCBiZSBbMCwgeV9jcm9wXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0IC0gMiAqIHlfY3JvcF0gcmF0aGVyIHRoYW4gWzAsIDBdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHRdLCB3aGVyZSB5X2Nyb3AgaXMgdGhlIGFkZGl0aW9uYWwgY3JvcCBkdWUgdG8gYXNwZWN0IHJhdGlvCisgICAgICogbWlzbWF0Y2guPC9wPgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQVBJIGxldmVsIDMwLCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgYWN0aXZlQXJyYXlTaXplIG9yCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBwb3N0LXpvb21SYXRpbyBmaWVsZCBvZiB2aWV3LCBub3QKICAgICAgKiBwcmUtem9vbSBmaWVsZCBvZiB2aWV3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNhbWUgYWZSZWdpb25zIHZhbHVlcyBhdCBkaWZmZXJlbnQKQEAgLTgzOCw3ICs4NTgsNyBAQAogICAgICAqIHJvdXRpbmUgaXMgZW5hYmxlZCwgb3ZlcnJpZGluZyB0aGUgYXBwbGljYXRpb24ncyBzZWxlY3RlZAogICAgICAqIEFDQU1FUkFfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sIEFDQU1FUkFfQ09MT1JfQ09SUkVDVElPTl9HQUlOUyBhbmQKICAgICAgKiBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fTU9ERS4gTm90ZSB0aGF0IHdoZW4gQUNBTUVSQV9DT05UUk9MX0FFX01PREUKLSAgICAgKiBpcyBPRkYsIHRoZSBiZWhhdmlvciBvZiBBV0IgaXMgZGV2aWNlIGRlcGVuZGVudC4gSXQgaXMgcmVjb21tZW5lZCB0bworICAgICAqIGlzIE9GRiwgdGhlIGJlaGF2aW9yIG9mIEFXQiBpcyBkZXZpY2UgZGVwZW5kZW50LiBJdCBpcyByZWNvbW1lbmRlZCB0bwogICAgICAqIGFsc28gc2V0IEFXQiBtb2RlIHRvIE9GRiBvciBsb2NrIEFXQiBieSB1c2luZyBBQ0FNRVJBX0NPTlRST0xfQVdCX0xPQ0sgYmVmb3JlCiAgICAgICogc2V0dGluZyBBRSBtb2RlIHRvIE9GRi48L3A+CiAgICAgICogPHA+V2hlbiBzZXQgdG8gdGhlIE9GRiBtb2RlLCB0aGUgY2FtZXJhIGRldmljZSdzIGF1dG8td2hpdGUgYmFsYW5jZQpAQCAtOTEzLDYgKzkzMywxNCBAQAogICAgICAqIHJlZ2lvbiBhbmQgb3V0cHV0IG9ubHkgdGhlIGludGVyc2VjdGlvbiByZWN0YW5nbGUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpbiB0aGUgcmVzdWx0CiAgICAgICogbWV0YWRhdGEuICBJZiB0aGUgcmVnaW9uIGlzIGVudGlyZWx5IG91dHNpZGUgdGhlIGNyb3AgcmVnaW9uLCBpdCB3aWxsIGJlIGlnbm9yZWQgYW5kCiAgICAgICogbm90IHJlcG9ydGVkIGluIHRoZSByZXN1bHQgbWV0YWRhdGEuPC9wPgorICAgICAqIDxwPldoZW4gc2V0dGluZyB0aGUgQVdCIG1ldGVyaW5nIHJlZ2lvbnMsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnNpZGVyIHRoZSBhZGRpdGlvbmFsCisgICAgICogY3JvcCByZXN1bHRlZCBmcm9tIHRoZSBhc3BlY3QgcmF0aW8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcHJldmlldyBzdHJlYW0gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04uIEZvciBleGFtcGxlLCBpZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gaXMgdGhlIGZ1bGwKKyAgICAgKiBhY3RpdmUgYXJyYXkgc2l6ZSB3aXRoIDQ6MyBhc3BlY3QgcmF0aW8sIGFuZCB0aGUgcHJldmlldyBzdHJlYW0gaXMgMTY6OSwKKyAgICAgKiB0aGUgYm91bmRhcnkgb2YgQVdCIHJlZ2lvbnMgd2lsbCBiZSBbMCwgeV9jcm9wXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0IC0gMiAqIHlfY3JvcF0gcmF0aGVyIHRoYW4gWzAsIDBdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHRdLCB3aGVyZSB5X2Nyb3AgaXMgdGhlIGFkZGl0aW9uYWwgY3JvcCBkdWUgdG8gYXNwZWN0IHJhdGlvCisgICAgICogbWlzbWF0Y2guPC9wPgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQVBJIGxldmVsIDMwLCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgYWN0aXZlQXJyYXlTaXplIG9yCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBwb3N0LXpvb21SYXRpbyBmaWVsZCBvZiB2aWV3LCBub3QKICAgICAgKiBwcmUtem9vbSBmaWVsZCBvZiB2aWV3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNhbWUgYXdiUmVnaW9ucyB2YWx1ZXMgYXQgZGlmZmVyZW50CkBAIC05NjEsMTMgKzk4OSwxNSBAQAogICAgICAqCiAgICAgICogPHA+VGhpcyBjb250cm9sIChleGNlcHQgZm9yIE1BTlVBTCkgaXMgb25seSBlZmZlY3RpdmUgaWYKICAgICAgKiA8Y29kZT5BQ0FNRVJBX0NPTlRST0xfTU9ERSAhPSBPRkY8L2NvZGU+IGFuZCBhbnkgM0Egcm91dGluZSBpcyBhY3RpdmUuPC9wPgotICAgICAqIDxwPkFsbCBpbnRlbnRzIGFyZSBzdXBwb3J0ZWQgYnkgYWxsIGRldmljZXMsIGV4Y2VwdCB0aGF0OgotICAgICAqICAgKiBaRVJPX1NIVVRURVJfTEFHIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCi0gICAgICogUFJJVkFURV9SRVBST0NFU1NJTkcgb3IgWVVWX1JFUFJPQ0VTU0lORy4KLSAgICAgKiAgICogTUFOVUFMIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCi0gICAgICogTUFOVUFMX1NFTlNPUi4KLSAgICAgKiAgICogTU9USU9OX1RSQUNLSU5HIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCi0gICAgICogTU9USU9OX1RSQUNLSU5HLjwvcD4KKyAgICAgKiA8cD5BbGwgaW50ZW50cyBhcmUgc3VwcG9ydGVkIGJ5IGFsbCBkZXZpY2VzLCBleGNlcHQgdGhhdDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5aRVJPX1NIVVRURVJfTEFHIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCisgICAgICogUFJJVkFURV9SRVBST0NFU1NJTkcgb3IgWVVWX1JFUFJPQ0VTU0lORy48L2xpPgorICAgICAqIDxsaT5NQU5VQUwgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNQU5VQUxfU0VOU09SLjwvbGk+CisgICAgICogPGxpPk1PVElPTl9UUkFDS0lORyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBjb250YWlucworICAgICAqIE1PVElPTl9UUkFDS0lORy48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMTA5MCw2ICsxMTIwLDE1IEBACiAgICAgICogKEFDQU1FUkFfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERSksIHR1cm5pbmcgYm90aCBtb2RlcyBvbiBtYXkKICAgICAgKiBwcm9kdWNlIHVuZGVzaXJhYmxlIGludGVyYWN0aW9uLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gZW5hYmxlCiAgICAgICogYm90aCBhdCB0aGUgc2FtZSB0aW1lLjwvcD4KKyAgICAgKiA8cD5JZiB2aWRlbyBzdGFiaWxpemF0aW9uIGlzIHNldCB0byAiUFJFVklFV19TVEFCSUxJWkFUSU9OIiwKKyAgICAgKiBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUgaXMgb3ZlcnJpZGRlbi4gVGhlIGNhbWVyYSBzdWItc3lzdGVtIG1heSBjaG9vc2UKKyAgICAgKiB0byB0dXJuIG9uIGhhcmR3YXJlIGJhc2VkIGltYWdlIHN0YWJpbGl6YXRpb24gaW4gYWRkaXRpb24gdG8gc29mdHdhcmUgYmFzZWQgc3RhYmlsaXphdGlvbgorICAgICAqIGlmIGl0IGRlZW1zIHRoYXQgYXBwcm9wcmlhdGUuCisgICAgICogVGhpcyBrZXkgbWF5IGJlIGEgcGFydCBvZiB0aGUgYXZhaWxhYmxlIHNlc3Npb24ga2V5cywgd2hpY2ggY2FtZXJhIGNsaWVudHMgbWF5CisgICAgICogcXVlcnkgdmlhCisgICAgICoge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyB9LgorICAgICAqIElmIHRoaXMgaXMgdGhlIGNhc2UsIGNoYW5naW5nIHRoaXMga2V5IG92ZXIgdGhlIGxpZmUtdGltZSBvZiBhIGNhcHR1cmUgc2Vzc2lvbiBtYXkKKyAgICAgKiBjYXVzZSBkZWxheXMgLyBnbGl0Y2hlcy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERQpAQCAtMTQ0OSw3ICsxNDg4LDcgQEAKICAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBTVEFSVCwgc2VxdWVuY2UgZG9uZSB8IEZMQVNIX1JFUVVJUkVEIHwgQ29udmVyZ2VkIGJ1dCB0b28gZGFyayB3L28gZmxhc2ggYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCiAgICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgU1RBUlQsIHNlcXVlbmNlIGRvbmUgfCBDT05WRVJHRUQgICAgICB8IENvbnZlcmdlZCBhZnRlciBhIHByZWNhcHR1cmUgc2VxdWVuY2UsIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS4KICAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBDQU5DRUwsIGNvbnZlcmdlZCAgICB8IEZMQVNIX1JFUVVJUkVEIHwgQ29udmVyZ2VkIGJ1dCB0b28gZGFyayB3L28gZmxhc2ggYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlIGlzIGNhbmNlbGVkLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCi0gICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgQ0FOQ0VMLCBjb252ZXJnZWQgICAgfCBDT05WRVJHRUQgICAgICB8IENvbnZlcmdlZCBhZnRlciBhIHByZWNhcHR1cmUgc2VxdWVuY2VpcyBjYW5jZWxlZCwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLgorICAgICAqIEFueSBzdGF0ZSAoZXhjbHVkaW5nIExPQ0tFRCkgfCBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSIGlzIENBTkNFTCwgY29udmVyZ2VkICAgIHwgQ09OVkVSR0VEICAgICAgfCBDb252ZXJnZWQgYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlcyBjYW5jZWxlZCwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLgogICAgICAqIENPTlZFUkdFRCAgICAgIHwgQ2FtZXJhIGRldmljZSBmaW5pc2hlZCBBRSBzY2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFTSF9SRVFVSVJFRCB8IENvbnZlcmdlZCBidXQgdG9vIGRhcmsgdy9vIGZsYXNoIGFmdGVyIGEgbmV3IHNjYW4sIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS4KICAgICAgKiBGTEFTSF9SRVFVSVJFRCB8IENhbWVyYSBkZXZpY2UgZmluaXNoZWQgQUUgc2NhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ09OVkVSR0VEICAgICAgfCBDb252ZXJnZWQgYWZ0ZXIgYSBuZXcgc2NhbiwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLjwvcD4KICAgICAgKgpAQCAtMTY4NSw3ICsxNzI0LDcgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPkRldmljZXMgc3VwcG9ydCBwb3N0IFJBVyBzZW5zaXRpdml0eSBib29zdCAgd2lsbCBhZHZlcnRpc2UKLSAgICAgKiBBQ0FNRVJBX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1Qga2V5IGZvciBjb250cm9saW5nCisgICAgICogQUNBTUVSQV9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUIGtleSBmb3IgY29udHJvbGxpbmcKICAgICAgKiBwb3N0IFJBVyBzZW5zaXRpdml0eSBib29zdC48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGFueSBSQVcgZm9ybWF0CiAgICAgICogb3V0cHV0cy4gRm9yIGRldmljZXMgdGhhdCBkbyBzdXBwb3J0IFJBVyBmb3JtYXQgb3V0cHV0cywgdGhpcyBrZXkgd2lsbCBhbHdheXMKQEAgLTIxNDQsNiArMjE4Myw1MSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfRkxBU0hfSU5GT19BVkFJTEFCTEUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2ZsYXNoX2luZm9fYXZhaWxhYmxlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+TWF4aW11bSBmbGFzaGxpZ2h0IGJyaWdodG5lc3MgbGV2ZWwuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMSwgdGhlbiB0aGUgZGV2aWNlIHN1cHBvcnRzIGNvbnRyb2xsaW5nIHRoZQorICAgICAqIGZsYXNobGlnaHQgYnJpZ2h0bmVzcyBsZXZlbCB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCN0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsIj5DYW1lcmFNYW5hZ2VyI3R1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWw8L2E+LgorICAgICAqIElmIHRoaXMgdmFsdWUgaXMgZXF1YWwgdG8gMSwgZmxhc2hsaWdodCBicmlnaHRuZXNzIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBUaGUgdmFsdWUgZm9yIHRoaXMga2V5IHdpbGwgYmUgbnVsbCBmb3IgZGV2aWNlcyB3aXRoIG5vIGZsYXNoIHVuaXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMID0gICAgICAgICAgICAgICAgIC8vIGludDMyCisgICAgICAgICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RBUlQgKyAyLAorICAgIC8qKgorICAgICAqIDxwPkRlZmF1bHQgZmxhc2hsaWdodCBicmlnaHRuZXNzIGxldmVsIHRvIGJlIHNldCB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCN0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsIj5DYW1lcmFNYW5hZ2VyI3R1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWw8L2E+LjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIGZsYXNoIHVuaXQgaXMgYXZhaWxhYmxlIHRoaXMgd2lsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSBhbmQgbGVzcworICAgICAqIG9yIGVxdWFsIHRvIDxjb2RlPkFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMPC9jb2RlPi48L3A+CisgICAgICogPHA+U2V0dGluZyBmbGFzaGxpZ2h0IGJyaWdodG5lc3MgYWJvdmUgdGhlIGRlZmF1bHQgbGV2ZWwKKyAgICAgKiAoaS5lLjxjb2RlPkFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMPC9jb2RlPikgbWF5IG1ha2UgdGhlIGRldmljZSBtb3JlCisgICAgICogbGlrZWx5IHRvIHJlYWNoIHRoZXJtYWwgdGhyb3R0bGluZyBjb25kaXRpb25zIGFuZCBzbG93IGRvd24sIG9yIGRyYWluIHRoZQorICAgICAqIGJhdHRlcnkgcXVpY2tlciB0aGFuIG5vcm1hbC4gVG8gbWluaW1pemUgc3VjaCBpc3N1ZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRvCisgICAgICogc3RhcnQgdGhlIGZsYXNobGlnaHQgYXQgdGhpcyBkZWZhdWx0IGJyaWdodG5lc3MgdW50aWwgYSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdHMKKyAgICAgKiBhIGJyaWdodGVyIGxldmVsLgorICAgICAqIE5vdGUgdGhhdCB0aGUgdmFsdWUgZm9yIHRoaXMga2V5IHdpbGwgYmUgbnVsbCBmb3IgZGV2aWNlcyB3aXRoIG5vIGZsYXNoIHVuaXQuCisgICAgICogVGhlIGRlZmF1bHQgbGV2ZWwgc2hvdWxkIGFsd2F5cyBiZSAmZ3Q7IDAuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTAorICAgICAqIEBzZWUgQUNBTUVSQV9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCA9ICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9GTEFTSF9JTkZPX1NUQVJUICsgMywKICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fRU5ELAogCiAgICAgLyoqCkBAIC0yMzQxLDcgKzI0MjUsNyBAQAogICAgICAqICAgYW5kIGtlZXAganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgdW5yb3RhdGVkLjwvbGk+CiAgICAgICogPGxpPlJvdGF0ZSB0aGUganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgYW5kIG5vdCBzZXQKICAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4uIEluIHRoaXMKLSAgICAgKiAgIGNhc2UsIExJTUlURUQgb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCBkZXZpY2VzIHdpbGwgcmVwb3J0IHJvdGF0ZWQgdGh1bW5haWwgc2l6ZSBpbgorICAgICAqICAgY2FzZSwgTElNSVRFRCBvciBGVUxMIGhhcmR3YXJlIGxldmVsIGRldmljZXMgd2lsbCByZXBvcnQgcm90YXRlZCB0aHVtYm5haWwgc2l6ZSBpbgogICAgICAqICAgY2FwdHVyZSByZXN1bHQsIHNvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgaW50ZXJjaGFuZ2VkIGlmIDkwIG9yIDI3MCBkZWdyZWUKICAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbAogICAgICAqICAgc2l6ZS48L2xpPgpAQCAtMjM3MCw3ICsyNDU0LDcgQEAKICAgICAgKgogICAgICAqIDxwPlRoaXMgbGlzdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHJlc29sdXRpb24sIHBsdXMgPGNvZGU+KDAsMCk8L2NvZGU+IGZvciBpbmRpY2F0aW5nIG5vCiAgICAgICogdGh1bWJuYWlsIHNob3VsZCBiZSBnZW5lcmF0ZWQuPC9wPgotICAgICAqIDxwPkJlbG93IGNvbmRpZGl0aW9ucyB3aWxsIGJlIHNhdGlzZmllZCBmb3IgdGhpcyBzaXplIGxpc3Q6PC9wPgorICAgICAqIDxwPkJlbG93IGNvbmRpdGlvbnMgd2lsbCBiZSBzYXRpc2ZpZWQgZm9yIHRoaXMgc2l6ZSBsaXN0OjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPlRoZSBzaXplcyB3aWxsIGJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHBpeGVsIGFyZWEgKHdpZHRoIHggaGVpZ2h0KS4KICAgICAgKiBJZiBzZXZlcmFsIHJlc29sdXRpb25zIGhhdmUgdGhlIHNhbWUgYXJlYSwgdGhleSB3aWxsIGJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHdpZHRoLjwvbGk+CkBAIC0yNTI2LDEyICsyNjEwLDE4IEBACiAgICAgICogPHA+SWYgYSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIGJvdGggT0lTIGFuZCBkaWdpdGFsIGltYWdlIHN0YWJpbGl6YXRpb24KICAgICAgKiAoQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSksIHR1cm5pbmcgYm90aCBtb2RlcyBvbiBtYXkgcHJvZHVjZSB1bmRlc2lyYWJsZQogICAgICAqIGludGVyYWN0aW9uLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gZW5hYmxlIGJvdGggYXQgdGhlIHNhbWUgdGltZS48L3A+CisgICAgICogPHA+SWYgQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSBpcyBzZXQgdG8gIlBSRVZJRVdfU1RBQklMSVpBVElPTiIsCisgICAgICogQUNBTUVSQV9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFIGlzIG92ZXJyaWRkZW4uIFRoZSBjYW1lcmEgc3ViLXN5c3RlbSBtYXkgY2hvb3NlCisgICAgICogdG8gdHVybiBvbiBoYXJkd2FyZSBiYXNlZCBpbWFnZSBzdGFiaWxpemF0aW9uIGluIGFkZGl0aW9uIHRvIHNvZnR3YXJlIGJhc2VkIHN0YWJpbGl6YXRpb24KKyAgICAgKiBpZiBpdCBkZWVtcyB0aGF0IGFwcHJvcHJpYXRlLiBUaGlzIGtleSdzIHZhbHVlIGluIHRoZSBjYXB0dXJlIHJlc3VsdCB3aWxsIHJlZmxlY3Qgd2hpY2gKKyAgICAgKiBPSVMgbW9kZSB3YXMgY2hvc2VuLjwvcD4KICAgICAgKiA8cD5Ob3QgYWxsIGRldmljZXMgd2lsbCBzdXBwb3J0IE9JUzsgc2VlCiAgICAgICogQUNBTUVSQV9MRU5TX0lORk9fQVZBSUxBQkxFX09QVElDQUxfU1RBQklMSVpBVElPTiBmb3IKICAgICAgKiBhdmFpbGFibGUgY29udHJvbHMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19BVkFJTEFCTEVfT1BUSUNBTF9TVEFCSUxJWkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUKICAgICAgKi8KICAgICBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUgPSAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sZW5zX29wdGljYWxfc3RhYmlsaXphdGlvbl9tb2RlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0xFTlNfU1RBUlQgKyA0LApAQCAtMjYzNCw2ICsyNzI0LDkgQEAKICAgICAgKiB3aXRoIFBSSU1BUllfQ0FNRVJBLjwvcD4KICAgICAgKiA8cD5XaGVuIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSBpcyBVTkRFRklORUQsIHRoaXMgcG9zaXRpb24gY2Fubm90IGJlIGFjY3VyYXRlbHkKICAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgY2FtZXJhIGRldmljZSwgYW5kIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgPGNvZGU+KDAsIDAsIDApPC9jb2RlPi48L3A+CisgICAgICogPHA+V2hlbiBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgaXMgQVVUT01PVElWRSwgdGhlbiB0aGlzIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZQorICAgICAqIG9yaWdpbiBvZiB0aGUgYXV0b21vdGl2ZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW0sIHdoaWNoIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHJlYXIKKyAgICAgKiBheGxlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KQEAgLTI2NzUsNyArMjc2OCw3IEBACiAgICAgICogPHA+V2hlbiB0aGUgc3RhdGUgaXMgU1RBVElPTkFSWSwgdGhlIGxlbnMgcGFyYW1ldGVycyBhcmUgbm90IGNoYW5naW5nLiBUaGlzIGNvdWxkIGJlCiAgICAgICogZWl0aGVyIGJlY2F1c2UgdGhlIHBhcmFtZXRlcnMgYXJlIGFsbCBmaXhlZCwgb3IgYmVjYXVzZSB0aGUgbGVucyBoYXMgaGFkIGVub3VnaAogICAgICAqIHRpbWUgdG8gcmVhY2ggdGhlIG1vc3QgcmVjZW50bHktcmVxdWVzdGVkIHZhbHVlcy4KLSAgICAgKiBJZiBhbGwgdGhlc2UgbGVucyBwYXJhbWV0ZXJzIGFyZSBub3QgY2hhbmdhYmxlIGZvciBhIGNhbWVyYSBkZXZpY2UsIGFzIGxpc3RlZCBiZWxvdzo8L3A+CisgICAgICogSWYgYWxsIHRoZXNlIGxlbnMgcGFyYW1ldGVycyBhcmUgbm90IGNoYW5nZWFibGUgZm9yIGEgY2FtZXJhIGRldmljZSwgYXMgbGlzdGVkIGJlbG93OjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPkZpeGVkIGZvY3VzICg8Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFID09IDA8L2NvZGU+KSwgd2hpY2ggbWVhbnMKICAgICAgKiBBQ0FNRVJBX0xFTlNfRk9DVVNfRElTVEFOQ0UgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIDAuPC9saT4KQEAgLTMxMjcsNyArMzIyMCw3IEBACiAgICAgICogdGhlIGNhbWVyYSBkZXZpY2UuIFVzaW5nIG1vcmUgc3RyZWFtcyBzaW11bHRhbmVvdXNseSBtYXkgcmVxdWlyZSBtb3JlIGhhcmR3YXJlIGFuZAogICAgICAqIENQVSByZXNvdXJjZXMgdGhhdCB3aWxsIGNvbnN1bWUgbW9yZSBwb3dlci4gVGhlIGltYWdlIGZvcm1hdCBmb3IgYW4gb3V0cHV0IHN0cmVhbSBjYW4KICAgICAgKiBiZSBhbnkgc3VwcG9ydGVkIGZvcm1hdCBwcm92aWRlZCBieSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLgotICAgICAqIFRoZSBmb3JtYXRzIGRlZmluZWQgaW4gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyBjYW4gYmUgY2F0ZXJnb3JpemVkCisgICAgICogVGhlIGZvcm1hdHMgZGVmaW5lZCBpbiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TIGNhbiBiZSBjYXRlZ29yaXplZAogICAgICAqIGludG8gdGhlIDMgc3RyZWFtIHR5cGVzIGFzIGJlbG93OjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPlByb2Nlc3NlZCAoYnV0IHN0YWxsaW5nKTogYW55IG5vbi1SQVcgZm9ybWF0IHdpdGggYSBzdGFsbER1cmF0aW9ucyAmZ3Q7IDAuCkBAIC0zMzU0LDcgKzM0NDcsNyBAQAogICAgICAqIGJ1dCBjbGllbnRzIHNob3VsZCBiZSBhd2FyZSBhbmQgZXhwZWN0IGRlbGF5cyBkdXJpbmcgdGhlaXIgYXBwbGljYXRpb24uCiAgICAgICogQW4gZXhhbXBsZSB1c2FnZSBzY2VuYXJpbyBjb3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT5UaGUgY2FtZXJhIGNsaWVudCBzdGFydHMgYnkgcXVlcmluZyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXIga2V5IGxpc3QgdmlhCisgICAgICogPGxpPlRoZSBjYW1lcmEgY2xpZW50IHN0YXJ0cyBieSBxdWVyeWluZyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXIga2V5IGxpc3QgdmlhCiAgICAgICogICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0uPC9saT4KICAgICAgKiA8bGk+QmVmb3JlIHRyaWdnZXJpbmcgdGhlIGNhcHR1cmUgc2Vzc2lvbiBjcmVhdGUgc2VxdWVuY2UsIGEgY2FwdHVyZSByZXF1ZXN0CiAgICAgICogICBtdXN0IGJlIGJ1aWx0IHZpYQpAQCAtMzM5MywxNiArMzQ4NiwzNiBAQAogICAgICAqIDwvdWw+PC9wPgogICAgICAqCiAgICAgICogPHA+VGhpcyBpcyBhIHN1YnNldCBvZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyB3aGljaCBjb250YWlucyBhIGxpc3QKLSAgICAgKiBvZiBrZXlzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL0NhcHR1cmVSZXF1ZXN0L0J1aWxkZXIuaHRtbCNzZXRQaHlzaWNhbENhbWVyYUtleSI+QnVpbGRlciNzZXRQaHlzaWNhbENhbWVyYUtleTwvYT4uCisgICAgICogb2Yga2V5cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5CdWlsZGVyLmh0bWwjc2V0UGh5c2ljYWxDYW1lcmFLZXkiPkJ1aWxkZXIjc2V0UGh5c2ljYWxDYW1lcmFLZXk8L2E+LgogICAgICAqIFRoZSByZXNwZWN0aXZlIHZhbHVlIG9mIHN1Y2ggcmVxdWVzdCBrZXkgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvQ2FwdHVyZVJlcXVlc3QvQnVpbGRlci5odG1sI2dldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI2dldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4gQ2FwdHVyZSByZXF1ZXN0cyB0aGF0IGNvbnRhaW4KLSAgICAgKiBpbmRpdmlkdWFsIHBoeXNpY2FsIGRldmljZSByZXF1ZXN0cyBtdXN0IGJlIGJ1aWx0IHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuQnVpbGRlci5odG1sI2dldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI2dldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4KKyAgICAgKiBDYXB0dXJlIHJlcXVlc3RzIHRoYXQgY29udGFpbiBpbmRpdmlkdWFsIHBoeXNpY2FsIGRldmljZSByZXF1ZXN0cyBtdXN0IGJlIGJ1aWx0IHZpYQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhRGV2aWNlLmh0bWwjY3JlYXRlQ2FwdHVyZVJlcXVlc3QoaW50LCI+U2V0KTwvYT4uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUwogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZUyA9ICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNywKKyAgICAvKioKKyAgICAgKiA8cD5BIG1hcCBvZiBhbGwgYXZhaWxhYmxlIDEwLWJpdCBkeW5hbWljIHJhbmdlIHByb2ZpbGVzIGFsb25nIHdpdGggdGhlaXIKKyAgICAgKiBjYXB0dXJlIHJlcXVlc3QgY29uc3RyYWludHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbbiozXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfZHluYW1pY19yYW5nZV9wcm9maWxlc19tYXBfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+RGV2aWNlcyBzdXBwb3J0aW5nIHRoZSAxMC1iaXQgb3V0cHV0IGNhcGFiaWxpdHkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19EWU5BTUlDX1JBTkdFX1RFTl9CSVQiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfRFlOQU1JQ19SQU5HRV9URU5fQklUPC9hPgorICAgICAqIG11c3QgbGlzdCB0aGVpciBzdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlcy4gSW4gY2FzZSB0aGUgY2FtZXJhIGlzIG5vdCBhYmxlIHRvCisgICAgICogc3VwcG9ydCBldmVyeSBwb3NzaWJsZSBwcm9maWxlIGNvbWJpbmF0aW9uIHdpdGhpbiBhIHNpbmdsZSBjYXB0dXJlIHJlcXVlc3QsIHRoZW4gdGhlCisgICAgICogY29uc3RyYWludHMgbXVzdCBiZSBsaXN0ZWQgaGVyZSBhcyB3ZWxsLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQID0gICAgICAvLyBpbnQ2NFtuKjNdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9keW5hbWljX3JhbmdlX3Byb2ZpbGVzX21hcF90KQorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTksCiAgICAgQUNBTUVSQV9SRVFVRVNUX0VORCwKIAogICAgIC8qKgpAQCAtMzYwMCw3ICszNzEzLDggQEAKICAgICAgKiBZVVZfNDIwXzg4OCAgICB8IGFsbCBvdXRwdXQgc2l6ZXMgYXZhaWxhYmxlIGZvciBKUEVHLCB1cCB0byB0aGUgbWF4aW11bSB2aWRlbyBzaXplIHwgTElNSVRFRCAgICAgICAgfAogICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgfCBzYW1lIGFzIFlVVl80MjBfODg4ICAgICAgICAgICAgICAgICAgfCBBbnkgICAgICAgICAgICB8PC9wPgogICAgICAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIFNESyB2ZXJzaW9uIDMxIG9yIG5ld2VyLCBpZiB0aGUgbW9iaWxlIGRldmljZSBkZWNsYXJlcyB0byBiZQotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkL1ZFUlNJT05fQ0RPRVMvTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MuaHRtbCI+bWVkaWEgcGVyZm9ybWFuY2UgY2xhc3M8L2E+IFMsCisgICAgICogbWVkaWEgcGVyZm9ybWFuY2UgY2xhc3MgMTIgb3IgaGlnaGVyIGJ5IHNldHRpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC5WRVJTSU9OLmh0bWwjTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MiPlZFUlNJT04jTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1M8L2E+IHRvIGJlIDMxIG9yIGxhcmdlciwKICAgICAgKiB0aGUgcHJpbWFyeSBjYW1lcmEgZGV2aWNlcyAoZmlyc3QgcmVhci9mcm9udCBjYW1lcmEgaW4gdGhlIGNhbWVyYSBJRCBsaXN0KSB3aWxsIG5vdAogICAgICAqIHN1cHBvcnQgSlBFRyBzaXplcyBzbWFsbGVyIHRoYW4gMTA4MHAuIElmIHRoZSBhcHBsaWNhdGlvbiBjb25maWd1cmVzIGEgSlBFRyBzdHJlYW0KICAgICAgKiBzbWFsbGVyIHRoYW4gMTA4MHAsIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgcm91bmQgdXAgdGhlIEpQRUcgaW1hZ2Ugc2l6ZSB0byBhdCBsZWFzdApAQCAtMzYxOCw5ICszNzMyLDExIEBACiAgICAgICogWVVWXzQyMF84ODggICAgfCBhbGwgb3V0cHV0IHNpemVzIGF2YWlsYWJsZSBmb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCwgdXAgdG8gdGhlIG1heGltdW0gdmlkZW8gc2l6ZSB8IExJTUlURUQgICAgICAgIHwKICAgICAgKiBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIHwgc2FtZSBhcyBZVVZfNDIwXzg4OCAgICAgICAgICAgICAgICAgIHwgQW55ICAgICAgICAgICAgfDwvcD4KICAgICAgKiA8cD5Gb3IgYXBwbGljYXRpb25zIHRhcmdldGluZyBTREsgdmVyc2lvbiAzMSBvciBuZXdlciwgaWYgdGhlIG1vYmlsZSBkZXZpY2UgZG9lc24ndCBkZWNsYXJlCi0gICAgICogdG8gYmUgbWVkaWEgcGVyZm9ybWFuY2UgY2xhc3MgUywgb3IgaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXNuJ3QgYSBwcmltYXJ5IHJlYXIvZnJvbnQKLSAgICAgKiBjYW1lcmEsIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBhcHBsaWNhdGlvbnMKLSAgICAgKiB0YXJnZXRpbmcgU0RLIHZlcnNpb24gb2xkZXIgdGhhbiAzMS48L3A+CisgICAgICogdG8gYmUgbWVkaWEgcGVyZm9ybWFuY2UgY2xhc3MgMTIgb3IgYmV0dGVyIGJ5IHNldHRpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC5WRVJTSU9OLmh0bWwjTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MiPlZFUlNJT04jTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1M8L2E+IHRvIGJlIDMxIG9yIGxhcmdlciwKKyAgICAgKiBvciBpZiB0aGUgY2FtZXJhIGRldmljZSBpc24ndCBhIHByaW1hcnkgcmVhci9mcm9udCBjYW1lcmEsIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dAorICAgICAqIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgU0RLIHZlcnNpb24gb2xkZXIgdGhhbgorICAgICAqIDMxLjwvcD4KICAgICAgKiA8cD5SZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBmb3IgYWRkaXRpb25hbAogICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29uZmlndXJhdGlvbnMgb24gYSBwZXItY2FwYWJpbGl0eSBiYXNpcy48L3A+CiAgICAgICogPHA+RXhjZXB0aW9uIG9uIDE3NngxNDQgKFFDSUYpIHJlc29sdXRpb246IGNhbWVyYSBkZXZpY2VzIHVzdWFsbHkgaGF2ZSBhIGZpeGVkIGNhcGFiaWxpdHkgZm9yCkBAIC00MTExLDE5ICs0MjI3LDcwIEBACiAgICAgICogdG8gb3V0cHV0IGRpZmZlcmVudCByZXNvbHV0aW9uIGltYWdlcyBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBvcgogICAgICAqIHBpeGVsIG1vZGUuIFdpdGggbXVsdGktcmVzb2x1dGlvbiBpbnB1dCBzdHJlYW1zLCB0aGUgY2FtZXJhIGRldmljZSBjYW4gcmVwcm9jZXNzIGltYWdlcwogICAgICAqIG9mIGRpZmZlcmVudCByZXNvbHV0aW9ucyBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbCBjYW1lcmFzIG9yIHNlbnNvciBwaXhlbCBtb2Rlcy48L3A+Ci0gICAgICogPHA+V2hlbiBzZXQgdG8gVFJVRToKLSAgICAgKiAqIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGUgY2FtZXJhIGZyYW1ld29yayBkZXJpdmVzCisgICAgICogPHA+V2hlbiBzZXQgdG8gVFJVRTo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5Gb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhlIGNhbWVyYSBmcmFtZXdvcmsgZGVyaXZlcwogICAgICAqIGFuZHJvaWQuc2NhbGVyLm11bHRpUmVzb2x1dGlvblN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgYnkgY29tYmluaW5nIHRoZQogICAgICAqIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUyBmcm9tIGl0cyBwaHlzaWNhbAotICAgICAqIGNhbWVyYXMuCi0gICAgICogKiBGb3IgYW4gdWx0cmEtaGlnaCByZXNvbHV0aW9uIHNlbnNvciBjYW1lcmEsIHRoZSBjYW1lcmEgZnJhbWV3b3JrIGRpcmVjdGx5IGNvcGllcworICAgICAqIGNhbWVyYXMuPC9saT4KKyAgICAgKiA8bGk+Rm9yIGFuIHVsdHJhLWhpZ2ggcmVzb2x1dGlvbiBzZW5zb3IgY2FtZXJhLCB0aGUgY2FtZXJhIGZyYW1ld29yayBkaXJlY3RseSBjb3BpZXMKICAgICAgKiB0aGUgdmFsdWUgb2YgQUNBTUVSQV9TQ0FMRVJfUEhZU0lDQUxfQ0FNRVJBX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX0NPTkZJR1VSQVRJT05TIHRvCi0gICAgICogYW5kcm9pZC5zY2FsZXIubXVsdGlSZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcC48L3A+CisgICAgICogYW5kcm9pZC5zY2FsZXIubXVsdGlSZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcC48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUwogICAgICAqLwogICAgIEFDQU1FUkFfU0NBTEVSX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX1NVUFBPUlRFRCA9ICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9tdWx0aV9yZXNvbHV0aW9uX3N0cmVhbV9zdXBwb3J0ZWRfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMjQsCisgICAgLyoqCisgICAgICogPHA+VGhlIHN0cmVhbSB1c2UgY2FzZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY2FtZXJhIGRldmljZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fdXNlX2Nhc2VzX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzdHJlYW0gdXNlIGNhc2UgaW5kaWNhdGVzIHRoZSBwdXJwb3NlIG9mIGEgcGFydGljdWxhciBjYW1lcmEgc3RyZWFtIGZyb20KKyAgICAgKiB0aGUgZW5kLXVzZXIgcGVyc3BlY3RpdmUuIFNvbWUgZXhhbXBsZXMgb2YgY2FtZXJhIHVzZSBjYXNlcyBhcmU6IHByZXZpZXcgc3RyZWFtIGZvcgorICAgICAqIGxpdmUgdmlld2ZpbmRlciBzaG93biB0byB0aGUgdXNlciwgc3RpbGwgY2FwdHVyZSBmb3IgZ2VuZXJhdGluZyBoaWdoIHF1YWxpdHkgcGhvdG8KKyAgICAgKiBjYXB0dXJlLCB2aWRlbyByZWNvcmQgZm9yIGVuY29kaW5nIHRoZSBjYW1lcmEgb3V0cHV0IGZvciB0aGUgcHVycG9zZSBvZiBmdXR1cmUgcGxheWJhY2ssCisgICAgICogYW5kIHZpZGVvIGNhbGwgZm9yIGxpdmUgcmVhbHRpbWUgdmlkZW8gY29uZmVyZW5jaW5nLjwvcD4KKyAgICAgKiA8cD5XaXRoIHRoaXMgZmxhZywgdGhlIGNhbWVyYSBkZXZpY2UgY2FuIG9wdGltaXplIHRoZSBpbWFnZSBwcm9jZXNzaW5nIHBpcGVsaW5lCisgICAgICogcGFyYW1ldGVycywgc3VjaCBhcyB0dW5pbmcsIHNlbnNvciBtb2RlLCBhbmQgSVNQIHNldHRpbmdzLCBpbmRlcGVuZGVudCBvZgorICAgICAqIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbW1lZGlhdGUgY2FtZXJhIG91dHB1dCBzdXJmYWNlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG91dHB1dAorICAgICAqIHN1cmZhY2UgaXMgYSBTdXJmYWNlVGV4dHVyZSwgdGhlIHN0cmVhbSB1c2UgY2FzZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKKyAgICAgKiB0aGUgY2FtZXJhIGZyYW1lcyBldmVudHVhbGx5IGdvIHRvIGRpc3BsYXksIHZpZGVvIGVuY29kZXIsCisgICAgICogc3RpbGwgaW1hZ2UgY2FwdHVyZSwgb3IgYWxsIG9mIHRoZW0gY29tYmluZWQuPC9wPgorICAgICAqIDxwPlRoZSBhcHBsaWNhdGlvbiBzZXRzIHRoZSB1c2UgY2FzZSBvZiBhIGNhbWVyYSBzdHJlYW0gYnkgY2FsbGluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL091dHB1dENvbmZpZ3VyYXRpb24uaHRtbCNzZXRTdHJlYW1Vc2VDYXNlIj5PdXRwdXRDb25maWd1cmF0aW9uI3NldFN0cmVhbVVzZUNhc2U8L2E+LjwvcD4KKyAgICAgKiA8cD5BIGNhbWVyYSBkZXZpY2Ugd2l0aAorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NUUkVBTV9VU0VfQ0FTRSI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TVFJFQU1fVVNFX0NBU0U8L2E+CisgICAgICogY2FwYWJpbGl0eSBtdXN0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBzdHJlYW0gdXNlIGNhc2VzOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRFRkFVTFQ8L2xpPgorICAgICAqIDxsaT5QUkVWSUVXPC9saT4KKyAgICAgKiA8bGk+U1RJTExfQ0FQVFVSRTwvbGk+CisgICAgICogPGxpPlZJREVPX1JFQ09SRDwvbGk+CisgICAgICogPGxpPlBSRVZJRVdfVklERU9fU1RJTEw8L2xpPgorICAgICAqIDxsaT5WSURFT19DQUxMPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPlRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVsYXRlZCB0byBzdHJlYW0gdXNlIGNhc2UgZm9yIGEgY2FtZXJhIGRldmljZSB3aXRoCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU1RSRUFNX1VTRV9DQVNFIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NUUkVBTV9VU0VfQ0FTRTwvYT4KKyAgICAgKiBjYXBhYmlsaXR5IGlzIGRvY3VtZW50ZWQgaW4gdGhlIGNhbWVyYSBkZXZpY2UKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYURldmljZS5odG1sI2NyZWF0ZUNhcHR1cmVTZXNzaW9uIj5ndWlkZWxpbmU8L2E+LiBUaGUKKyAgICAgKiBhcHBsaWNhdGlvbiBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byB1c2Ugb25lIG9mIHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMuCisgICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSBzZXNzaW9uIHdpdGggYSBzdHJlYW0gY29tYmluYXRpb24gbm90IGluIHRoZSBndWFyYW50ZWVkCisgICAgICogbGlzdCwgb3Igd2l0aCBtaXhlZCBERUZBVUxUIGFuZCBub24tREVGQVVMVCB1c2UgY2FzZXMgd2l0aGluIHRoZSBzYW1lIHNlc3Npb24sCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgbWF5IGlnbm9yZSBzb21lIHN0cmVhbSB1c2UgY2FzZXMgZHVlIHRvIGhhcmR3YXJlIGNvbnN0cmFpbnRzCisgICAgICogYW5kIGltcGxlbWVudGF0aW9uIGRldGFpbHMuPC9wPgorICAgICAqIDxwPkZvciBzdHJlYW0gY29tYmluYXRpb25zIG5vdCBjb3ZlcmVkIGJ5IHRoZSBzdHJlYW0gdXNlIGNhc2UgbWFuZGF0b3J5IGxpc3RzLCBzdWNoIGFzCisgICAgICogcmVwcm9jZXNzYWJsZSBzZXNzaW9uLCBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIHNlc3Npb24sIG9yIFJBVyBzdHJlYW0gY29tYmluYXRpb25zLCB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgbGVhdmUgc3RyZWFtIHVzZSBjYXNlcyB3aXRoaW4gdGhlIHNlc3Npb24gYXMgREVGQVVMVC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMgPSAgICAgICAgICAgICAgICAgLy8gaW50NjRbbl0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX3VzZV9jYXNlc190KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAyNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTQ1NzgsNiArNDc0NSwyNSBAQAogICAgICAqCiAgICAgICogPHA+QWxzbyBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gb2Ygcm9sbGluZyBzaHV0dGVyIHJlYWRvdXQsIHdoaWNoIGlzIGZyb20gdG9wIHRvIGJvdHRvbSBpbgogICAgICAqIHRoZSBzZW5zb3IncyBjb29yZGluYXRlIHN5c3RlbS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgd2l0aCBBbmRyb2lkIEFQSSBsZXZlbCAzMiwgY2FtZXJhIGNsaWVudHMgdGhhdCBxdWVyeSB0aGUgb3JpZW50YXRpb24gdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNnZXQiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXQ8L2E+IG9uIGZvbGRhYmxlIGRldmljZXMgd2hpY2gKKyAgICAgKiBpbmNsdWRlIGxvZ2ljYWwgY2FtZXJhcyBjYW4gcmVjZWl2ZSBhIHZhbHVlIHRoYXQgY2FuIGR5bmFtaWNhbGx5IGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlCisgICAgICogZGV2aWNlL2ZvbGQgc3RhdGUuCisgICAgICogQ2xpZW50cyBhcmUgYWR2aXNlZCB0byBub3QgY2FjaGUgb3Igc3RvcmUgdGhlIG9yaWVudGF0aW9uIHZhbHVlIG9mIHN1Y2ggbG9naWNhbCBzZW5zb3JzLgorICAgICAqIEluIGNhc2UgcmVwZWF0ZWQgcXVlcmllcyB0byBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgYXJlIG5vdCBwcmVmZXJyZWQsIHRoZW4gY2xpZW50cyBjYW4KKyAgICAgKiBhbHNvIGFjY2VzcyB0aGUgZW50aXJlIG1hcHBpbmcgZnJvbSBkZXZpY2Ugc3RhdGUgdG8gc2Vuc29yIG9yaWVudGF0aW9uIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvRGV2aWNlU3RhdGVTZW5zb3JPcmllbnRhdGlvbk1hcC5odG1sIj5EZXZpY2VTdGF0ZVNlbnNvck9yaWVudGF0aW9uTWFwPC9hPi4KKyAgICAgKiBEbyBub3RlIHRoYXQgYSBkeW5hbWljYWxseSBjaGFuZ2luZyBzZW5zb3Igb3JpZW50YXRpb24gdmFsdWUgaW4gY2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgICAqIHdpbGwgbm90IGJlIHRoZSBiZXN0IHdheSB0byBlc3RhYmxpc2ggdGhlIG9yaWVudGF0aW9uIHBlciBmcmFtZS4gQ2xpZW50cyB0aGF0IHdhbnQgdG8KKyAgICAgKiBrbm93IHRoZSBzZW5zb3Igb3JpZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIGNhcHR1cmVkIGZyYW1lIHNob3VsZCBxdWVyeSB0aGUKKyAgICAgKiBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmUgcmVzdWx0IGFuZAorICAgICAqIGNoZWNrIHRoZSByZXNwZWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBvcmllbnRhdGlvbi48L3A+CisgICAgICogPHA+TmF0aXZlIGNhbWVyYSBjbGllbnRzIG11c3QgcXVlcnkgQUNBTUVSQV9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMgZm9yIHRoZSBtYXBwaW5nCisgICAgICogYmV0d2VlbiBkZXZpY2Ugc3RhdGUgYW5kIGNhbWVyYSBzZW5zb3Igb3JpZW50YXRpb24uIER5bmFtaWMgdXBkYXRlcyB0byB0aGUgc2Vuc29yCisgICAgICogb3JpZW50YXRpb24gYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb2RlIHBhdGguPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQKICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9PUklFTlRBVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxNCwKQEAgLTQ2NTgsNyArNDg0NCw3IEBACiAgICAgICogbm9pc2UgbW9kZWwgdXNlZCBoZXJlIGlzOjwvcD4KICAgICAgKiA8cD5OKHgpID0gc3FydChTeCArIE8pPC9wPgogICAgICAqIDxwPldoZXJlIHggcmVwcmVzZW50cyB0aGUgcmVjb3JkZWQgc2lnbmFsIG9mIGEgQ0ZBIGNoYW5uZWwgbm9ybWFsaXplZCB0bwotICAgICAqIHRoZSByYW5nZSBbMCwgMV0sIGFuZCBTIGFuZCBPIGFyZSB0aGUgbm9pc2UgbW9kZWwgY29lZmZpZWNpZW50cyBmb3IKKyAgICAgKiB0aGUgcmFuZ2UgWzAsIDFdLCBhbmQgUyBhbmQgTyBhcmUgdGhlIG5vaXNlIG1vZGVsIGNvZWZmaWNpZW50cyBmb3IKICAgICAgKiB0aGF0IGNoYW5uZWwuPC9wPgogICAgICAqIDxwPkEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbm9pc2UgbW9kZWwgY2FuIGJlIGZvdW5kIGluIHRoZQogICAgICAqIEFkb2JlIERORyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgTm9pc2VQcm9maWxlIHRhZy48L3A+CkBAIC00NzA3LDcgKzQ4OTMsNyBAQAogICAgICAqIDxsaT4xLjIwICZsdDs9IFIgJmd0Oz0gMS4wMyB3aWxsIHJlcXVpcmUgc29tZSBzb2Z0d2FyZQogICAgICAqIGNvcnJlY3Rpb24gdG8gYXZvaWQgZGVtb3NhaWMgZXJyb3JzICgzLTIwJSBkaXZlcmdlbmNlKS48L2xpPgogICAgICAqIDxsaT5SICZndDsgMS4yMCB3aWxsIHJlcXVpcmUgc3Ryb25nIHNvZnR3YXJlIGNvcnJlY3Rpb24gdG8gcHJvZHVjZQotICAgICAqIGEgdXN1YWJsZSBpbWFnZSAoJmd0OzIwJSBkaXZlcmdlbmNlKS48L2xpPgorICAgICAqIGEgdXNhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgogICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CkBAIC00OTY0LDcgKzUxNTAsNyBAQAogICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBpbiBkZXZpY2VzIGFkdmVydGlzdGluZyB0aGUKKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBpbiBkZXZpY2VzIGFkdmVydGlzaW5nIHRoZQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CiAgICAgICogY2FwYWJpbGl0eSB3aGljaCBhbHNvIGFkdmVydGlzZSA8Y29kZT5SRU1PU0FJQ19SRVBST0NFU1NJTkc8L2NvZGU+IGNhcGFiaWxpdHkuIE9uIGFsbCBvdGhlciBkZXZpY2VzCiAgICAgICogUkFXIHRhcmdldHMgd2lsbCBoYXZlIGEgcmVndWxhciBiYXllciBwYXR0ZXJuLjwvcD4KQEAgLTYxNDksOSArNjMzNSwxMSBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UaGUgdG9uZW1hcCBjdXJ2ZSB3aWxsIGJlIGRlZmluZWQgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgotICAgICAqICogT1VUID0gcG93KElOLCAxLjAgLyBnYW1tYSkKLSAgICAgKiB3aGVyZSBJTiBhbmQgT1VUIGlzIHRoZSBpbnB1dCBwaXhlbCB2YWx1ZSBzY2FsZWQgdG8gcmFuZ2UgWzAuMCwgMS4wXSwKKyAgICAgKiA8cD5UaGUgdG9uZW1hcCBjdXJ2ZSB3aWxsIGJlIGRlZmluZWQgdGhlIGZvbGxvd2luZyBmb3JtdWxhOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPk9VVCA9IHBvdyhJTiwgMS4wIC8gZ2FtbWEpPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPndoZXJlIElOIGFuZCBPVVQgaXMgdGhlIGlucHV0IHBpeGVsIHZhbHVlIHNjYWxlZCB0byByYW5nZSBbMC4wLCAxLjBdLAogICAgICAqIHBvdyBpcyB0aGUgcG93ZXIgZnVuY3Rpb24gYW5kIGdhbW1hIGlzIHRoZSBnYW1tYSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhpcwogICAgICAqIGtleS48L3A+CiAgICAgICogPHA+VGhlIHNhbWUgY3VydmUgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBjb2xvciBjaGFubmVscy4gVGhlIGNhbWVyYSBkZXZpY2UKQEAgLTYyODQsNiArNjQ3MiwyMSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfSU5GT19WRVJTSU9OID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSU5GT19TVEFSVCArIDEsCisgICAgLyoqCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFsyKm5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkhBTCBtdXN0IHBvcHVsYXRlIHRoZSBhcnJheSB3aXRoCisgICAgICogKGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZSwgc2Vuc29yT3JpZW50YXRpb24pIHBhaXJzIGZvciBlYWNoCisgICAgICogc3VwcG9ydGVkIGRldmljZSBzdGF0ZSBiaXR3aXNlIGNvbWJpbmF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NFsyKm5dCisgICAgICAgICAgICBBQ0FNRVJBX0lORk9fU1RBUlQgKyAzLAogICAgIEFDQU1FUkFfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTcwMzQsNiArNzIzNyw4NyBAQAogICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgNSwKICAgICBBQ0FNRVJBX0hFSUNfRU5ELAogCisgICAgLyoqCisgICAgICogPHA+TG9jYXRpb24gb2YgdGhlIGNhbWVyYXMgb24gdGhlIGF1dG9tb3RpdmUgZGV2aWNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZW51bSBkZWZpbmVzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGNhbWVyYXMgcmVsYXRpdmUgdG8gdGhlIHZlaGljbGUgYm9keSBmcmFtZSBvbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvc2Vuc29ycy9zZW5zb3ItdHlwZXMjYXV0b19heGVzIj50aGUgYXV0b21vdGl2ZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW08L2E+LgorICAgICAqIElmIHRoZSBzeXN0ZW0gaGFzIEZFQVRVUkVfQVVUT01PVElWRSwgdGhlIGNhbWVyYSB3aWxsIGhhdmUgdGhpcyBlbnRyeSBpbiBpdHMgc3RhdGljCisgICAgICogbWV0YWRhdGEuPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SU5URVJJT1IgaXMgdGhlIGluc2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIChvciB0aGUgcGFzc2VuZ2VyIGNhYmluKS48L2xpPgorICAgICAqIDxsaT5FWFRFUklPUiBpcyB0aGUgb3V0c2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvbGk+CisgICAgICogPGxpPkVYVFJBIGlzIHRoZSBleHRyYSB2ZWhpY2xlIHN1Y2ggYXMgYSB0cmFpbGVyLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5FYWNoIHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBvbiB0aGlzIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGRlZmluZWQgYXMgYmVsb3c6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+RlJPTlQgaXMgd2hlcmUgdGhlIFktYXhpcyBpbmNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPGxpPlJFQVIgaXMgd2hlcmUgdGhlIFktYXhpcyBkZWNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPGxpPkxFRlQgaXMgd2hlcmUgdGhlIFgtYXhpcyBkZWNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPGxpPlJJR0hUIGlzIHdoZXJlIHRoZSBYLWF4aXMgaW5jcmVhc2VzIHRvd2FyZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+SWYgdGhlIGNhbWVyYSBoYXMgZWl0aGVyIEVYVEVSSU9SX09USEVSIG9yIEVYVFJBX09USEVSLCBpdHMgc3RhdGljIG1ldGFkYXRhIHdpbGwgbGlzdAorICAgICAqIHRoZSBmb2xsb3dpbmcgZW50cmllcywgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGRldGVybWluZSB0aGUgY2FtZXJhJ3MgZXhhY3QgbG9jYXRpb246PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfU1RBUlQsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0VORCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBkaXJlY3Rpb24gb2YgdGhlIGNhbWVyYSBmYWNlcyByZWxhdGl2ZSB0byB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIGFuZCB0aGUKKyAgICAgKiBwYXNzZW5nZXIgc2VhdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGVudW0gZGVmaW5lcyB0aGUgbGVucyBmYWNpbmcgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGNhbWVyYXMgb24gdGhlIGF1dG9tb3RpdmUKKyAgICAgKiBkZXZpY2VzIHdpdGggbG9jYXRpb25zIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTiBkZWZpbmVzLiAgSWYgdGhlIHN5c3RlbSBoYXMKKyAgICAgKiBGRUFUVVJFX0FVVE9NT1RJVkUsIHRoZSBjYW1lcmEgd2lsbCBoYXZlIHRoaXMgZW50cnkgaW4gaXRzIHN0YXRpYyBtZXRhZGF0YS48L3A+CisgICAgICogPHA+V2hlbiBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04gaXMgSU5URVJJT1IsIHRoaXMgaGFzIG9uZSBvciBtb3JlIElOVEVSSU9SXyoKKyAgICAgKiB2YWx1ZXMgb3IgYSBzaW5nbGUgRVhURVJJT1JfKiB2YWx1ZS4gIFdoZW4gdGhpcyBoYXMgbW9yZSB0aGFuIG9uZSBJTlRFUklPUl8qLAorICAgICAqIHRoZSBmaXJzdCB2YWx1ZSBtdXN0IGJlIHRoZSBvbmUgZm9yIHRoZSBzZWF0IGNsb3Nlc3QgdG8gdGhlIG9wdGljYWwgYXhpcy4gSWYgdGhpcworICAgICAqIGNvbnRhaW5zIElOVEVSSU9SX09USEVSLCBhbGwgb3RoZXIgdmFsdWVzIHdpbGwgYmUgaW5lZmZlY3RpdmUuPC9wPgorICAgICAqIDxwPldoZW4gQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OIGlzIEVYVEVSSU9SXyogb3IgRVhUUkEsIHRoaXMgaGFzIGEgc2luZ2xlCisgICAgICogRVhURVJJT1JfKiB2YWx1ZS48L3A+CisgICAgICogPHA+SWYgYSBjYW1lcmEgaGFzIElOVEVSSU9SX09USEVSIG9yIEVYVEVSSU9SX09USEVSLCBvciBtb3JlIHRoYW4gb25lIGNhbWVyYSBpcyBhdCB0aGUKKyAgICAgKiBzYW1lIGxvY2F0aW9uIGFuZCBmYWNpbmcgdGhlIHNhbWUgZGlyZWN0aW9uLCB0aGVpciBzdGF0aWMgbWV0YWRhdGEgd2lsbCBsaXN0IHRoZQorICAgICAqIGZvbGxvd2luZyBlbnRyaWVzLCBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHRoZWlyIGxlbnNlcycgZXhhY3QgZmFjaW5nCisgICAgICogZGlyZWN0aW9uczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZVtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190KQorICAgICAgICAgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfU1RBUlQsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNzkzNSw2ICs4MjE5LDE3IEBACiAgICAgICovCiAgICAgQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICA9IDEsCiAKKyAgICAvKioKKyAgICAgKiA8cD5QcmV2aWV3IHN0YWJpbGl6YXRpb24sIHdoZXJlIHRoZSBwcmV2aWV3IGluIGFkZGl0aW9uIHRvIGFsbCBvdGhlciBub24tUkFXIHN0cmVhbXMgYXJlCisgICAgICogc3RhYmlsaXplZCB3aXRoIHRoZSBzYW1lIHF1YWxpdHkgb2Ygc3RhYmlsaXphdGlvbiwgaXMgZW5hYmxlZC4gVGhpcyBtb2RlIGFpbXMgdG8gZ2l2ZQorICAgICAqIGNsaWVudHMgYSAnd2hhdCB5b3Ugc2VlIGlzIHdoYXQgeW91IGdldCcgZWZmZWN0LiBJbiB0aGlzIG1vZGUsIHRoZSBGb1YgcmVkdWN0aW9uIHdpbGwKKyAgICAgKiBiZSBhIG1heGltdW0gb2YgMjAgJSBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseQorICAgICAqICgxMCUgZnJvbSBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pIGZvciB0aGUgZ2l2ZW4gem9vbSByYXRpbyAvIGNyb3AgcmVnaW9uLgorICAgICAqIFRoZSByZXN1bHRhbnQgRm9WIHdpbGwgYWxzbyBiZSB0aGUgc2FtZSBhY3Jvc3MgYWxsIHByb2Nlc3NlZCBzdHJlYW1zCisgICAgICogKHRoYXQgaGF2ZSB0aGUgc2FtZSBhc3BlY3QgcmF0aW8pLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFX1BSRVZJRVdfU1RBQklMSVpBVElPTiAgID0gMiwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX3ZpZGVvX3N0YWJpbGl6YXRpb25fbW9kZV90OwogCiAvLyBBQ0FNRVJBX0NPTlRST0xfQUVfU1RBVEUKQEAgLTg0MTUsNiArODcxMCwxNCBAQAogICAgICAqLwogICAgIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAogCisgICAgLyoqCisgICAgICogPHA+VGhlIHZhbHVlIG9mIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OIGlzIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gb2YgdGhlCisgICAgICogYXV0b21vdGl2ZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW0sIHdoaWNoIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHJlYXIgYXhsZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFX0FVVE9NT1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbGVuc19wb3NlX3JlZmVyZW5jZV90OwogCiAKQEAgLTg3MjgsNyArOTAzMSw3IEBACiAgICAgICogZm9yIHRoZSBsYXJnZXN0IFlVVl80MjBfODg4IHNpemUuPC9wPgogICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+Ci0gICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKKyAgICAgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIEFDQU1FUkFfU1lOQ19NQVhfTEFURU5DWSBmaWVsZCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKICAgICAgKiBhcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIDxjb2RlPnRydWU8L2NvZGU+IHNvIGJ1cnN0IGNhcHR1cmUgd2l0aCB0aGVzZSB0d28gbG9ja3MgT04geWllbGRzCiAgICAgICogY29uc2lzdGVudCBpbWFnZSBvdXRwdXQuPC9wPgpAQCAtODg5NCw3ICs5MTk3LDcgQEAKICAgICAgKiBub24tYWN0aXZlIHBoeXNpY2FsIGNhbWVyYXMuIEZvciBleGFtcGxlLCBpZiB0aGUgbG9naWNhbCBjYW1lcmEgaGFzIGEgd2lkZS11bHRyYXdpZGUKICAgICAgKiBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSB3aWRlIGxlbnMgaXMgdGhlIGRlZmF1bHQsIHdoZW4gdGhlIGNyb3AgcmVnaW9uIGlzIHNldCB0byB0aGUKICAgICAgKiBsb2dpY2FsIGNhbWVyYSdzIGFjdGl2ZSBhcnJheSBzaXplLCAoYW5kIHRoZSB6b29tIHJhdGlvIHNldCB0byAxLjAgc3RhcnRpbmcgZnJvbQotICAgICAqIEFuZHJvaWQgMTEpLCBhIHBoeXNpY2FsIHN0cmVhbSBmb3IgdGhlIHVsdHJhd2lkZSBjYW1lcmEgbWF5IHByZWZlciBvdXRwdXRpbmcgaW1hZ2VzCisgICAgICogQW5kcm9pZCAxMSksIGEgcGh5c2ljYWwgc3RyZWFtIGZvciB0aGUgdWx0cmF3aWRlIGNhbWVyYSBtYXkgcHJlZmVyIG91dHB1dHRpbmcgaW1hZ2VzCiAgICAgICogd2l0aCBsYXJnZXIgZmllbGQtb2YtdmlldyB0aGFuIHRoYXQgb2YgdGhlIHdpZGUgY2FtZXJhIGZvciBiZXR0ZXIgc3RlcmVvIG1hdGNoaW5nCiAgICAgICogbWFyZ2luIG9yIG1vcmUgcm9idXN0IG1vdGlvbiB0cmFja2luZy4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIHBoeXNpY2FsIG5vbi1SQVcgc3RyZWFtcycKICAgICAgKiBmaWVsZCBvZiB2aWV3IG11c3Qgbm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNyb3AgcmVnaW9uIGFuZCB6b29tIHJhdGlvLCBhcwpAQCAtOTAxNSw4ICs5MzE4LDEzMiBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgc2VsZWN0aW5nIGEgcGVyLXN0cmVhbSB1c2UgY2FzZSB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9PdXRwdXRDb25maWd1cmF0aW9uLmh0bWwjc2V0U3RyZWFtVXNlQ2FzZSI+T3V0cHV0Q29uZmlndXJhdGlvbiNzZXRTdHJlYW1Vc2VDYXNlPC9hPgorICAgICAqIHNvIHRoYXQgdGhlIGRldmljZSBjYW4gb3B0aW1pemUgY2FtZXJhIHBpcGVsaW5lIHBhcmFtZXRlcnMgc3VjaCBhcyB0dW5pbmcsIHNlbnNvcgorICAgICAqIG1vZGUsIG9yIElTUCBzZXR0aW5ncyBmb3IgYSBzcGVjaWZpYyB1c2VyIHNjZW5hcmlvLgorICAgICAqIFNvbWUgc2FtcGxlIHVzYWdlcyBvZiB0aGlzIGNhcGFiaWxpdHkgYXJlOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRpc3Rpbmd1aXNoIGhpZ2ggcXVhbGl0eSBZVVYgY2FwdHVyZXMgZnJvbSBhIHJlZ3VsYXIgWVVWIHN0cmVhbSB3aGVyZQorICAgICAqICAgdGhlIGltYWdlIHF1YWxpdHkgbWF5IG5vdCBiZSBhcyBnb29kIGFzIHRoZSBKUEVHIHN0cmVhbSwgb3I8L2xpPgorICAgICAqIDxsaT5Vc2Ugb25lIHN0cmVhbSB0byBzZXJ2ZSBtdWx0aXBsZSBwdXJwb3Nlczogdmlld2ZpbmRlciwgdmlkZW8gcmVjb3JkaW5nIGFuZAorICAgICAqICAgc3RpbGwgY2FwdHVyZS4gVGhpcyBpcyBjb21tb24gd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIGFwcGx5IGVkaXRzIGVxdWFsbHkKKyAgICAgKiAgIHRvIHByZXZpZXcsIHNhdmVkIGltYWdlcywgYW5kIHNhdmVkIHZpZGVvcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+VGhpcyBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSBjYW1lcmEgZGV2aWNlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZworICAgICAqIHN0cmVhbSB1c2UgY2FzZXM6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+REVGQVVMVCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVyZSB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBzZXQKKyAgICAgKiAgIGEgc3RyZWFtIHVzZSBjYXNlPC9saT4KKyAgICAgKiA8bGk+UFJFVklFVyBmb3IgbGl2ZSB2aWV3ZmluZGVyIGFuZCBpbi1hcHAgaW1hZ2UgYW5hbHlzaXM8L2xpPgorICAgICAqIDxsaT5TVElMTF9DQVBUVVJFIGZvciBzdGlsbCBwaG90byBjYXB0dXJlPC9saT4KKyAgICAgKiA8bGk+VklERU9fUkVDT1JEIGZvciByZWNvcmRpbmcgdmlkZW8gY2xpcHM8L2xpPgorICAgICAqIDxsaT5QUkVWSUVXX1ZJREVPX1NUSUxMIGZvciBvbmUgc2luZ2xlIHN0cmVhbSB1c2VkIGZvciB2aWV3ZmluZGVyLCB2aWRlbworICAgICAqICAgcmVjb3JkaW5nLCBhbmQgc3RpbGwgY2FwdHVyZS48L2xpPgorICAgICAqIDxsaT5WSURFT19DQUxMIGZvciBsb25nIHJ1bm5pbmcgdmlkZW8gY2FsbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+PGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNTQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVM8L2E+CisgICAgICogbGlzdHMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgc3RyZWFtIHVzZSBjYXNlcy48L3A+CisgICAgICogPHA+UmVmZXIgdG8gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFEZXZpY2UuaHRtbCNjcmVhdGVDYXB0dXJlU2Vzc2lvbiI+Q2FtZXJhRGV2aWNlI2NyZWF0ZUNhcHR1cmVTZXNzaW9uPC9hPiBmb3IgdGhlCisgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgaW52b2x2aW5nIHN0cmVhbSB1c2UgY2FzZXMsIHdoaWNoIGNhbiBhbHNvIGJlIHF1ZXJpZWQKKyAgICAgKiB2aWEgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvTWFuZGF0b3J5U3RyZWFtQ29tYmluYXRpb24uaHRtbCI+TWFuZGF0b3J5U3RyZWFtQ29tYmluYXRpb248L2E+LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TVFJFQU1fVVNFX0NBU0UgICAgICAgICAgID0gMTksCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKKy8vIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVAKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9yZXF1ZXN0X2F2YWlsYWJsZV9keW5hbWljX3JhbmdlX3Byb2ZpbGVzX21hcCB7CisgICAgLyoqCisgICAgICogPHA+OC1iaXQgU0RSIHByb2ZpbGUgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBub24gMTAtYml0IG91dHB1dCBjYXBhYmxlIGRldmljZXMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQgICAgPSAweDEsCisKKyAgICAvKioKKyAgICAgKiA8cD4xMC1iaXQgcGl4ZWwgc2FtcGxlcyBlbmNvZGVkIHVzaW5nIHRoZSBIeWJyaWQgbG9nLWdhbW1hIHRyYW5zZmVyIGZ1bmN0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hMRzEwICAgICAgID0gMHgyLAorCisgICAgLyoqCisgICAgICogPHA+MTAtYml0IHBpeGVsIHNhbXBsZXMgZW5jb2RlZCB1c2luZyB0aGUgU01QVEUgU1QgMjA4NCB0cmFuc2ZlciBmdW5jdGlvbi4KKyAgICAgKiBUaGlzIHByb2ZpbGUgdXRpbGl6ZXMgaW50ZXJuYWwgc3RhdGljIG1ldGFkYXRhIHRvIGluY3JlYXNlIHRoZSBxdWFsaXR5CisgICAgICogb2YgdGhlIGNhcHR1cmUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTAgICAgICAgPSAweDQsCisKKyAgICAvKioKKyAgICAgKiA8cD4xMC1iaXQgcGl4ZWwgc2FtcGxlcyBlbmNvZGVkIHVzaW5nIHRoZSBTTVBURSBTVCAyMDg0IHRyYW5zZmVyIGZ1bmN0aW9uLgorICAgICAqIEluIGNvbnRyYXN0IHRvIEhEUjEwLCB0aGlzIHByb2ZpbGUgdXNlcyBpbnRlcm5hbCBwZXItZnJhbWUgbWV0YWRhdGEKKyAgICAgKiB0byBmdXJ0aGVyIGVuaGFuY2UgdGhlIHF1YWxpdHkgb2YgdGhlIGNhcHR1cmUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTBfUExVUyAgPSAweDgsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIGEgY2FtZXJhIG1vZGUgZm9yIERvbGJ5IFZpc2lvbiBjYXB0dXJlIG9wdGltaXplZCBmb3IgYSBtb3JlIHNjZW5lCisgICAgICogYWNjdXJhdGUgY2FwdHVyZS4gVGhpcyB3b3VsZCB0eXBpY2FsbHkgZGlmZmVyIGZyb20gd2hhdCBhIHNwZWNpZmljIGRldmljZQorICAgICAqIG1pZ2h0IHdhbnQgdG8gdHVuZSBmb3IgYSBjb25zdW1lciBvcHRpbWl6ZWQgRG9sYnkgVmlzaW9uIGdlbmVyYWwgY2FwdHVyZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIHRoZSBwb3dlciBvcHRpbWl6ZWQgbW9kZSBmb3IgMTAtYml0IERvbGJ5IFZpc2lvbiBIRFIgUmVmZXJlbmNlIE1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfUkVGX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgY2FtZXJhIG1vZGUgZm9yIHRoZSBkZWZhdWx0IERvbGJ5IFZpc2lvbiBjYXB0dXJlIG1vZGUgZm9yIHRoZQorICAgICAqIHNwZWNpZmljIGRldmljZS4gVGhpcyB3b3VsZCBiZSB0dW5lZCBieSBlYWNoIHNwZWNpZmljIGRldmljZSBmb3IgY29uc3VtZXIKKyAgICAgKiBwbGVhc2luZyByZXN1bHRzIHRoYXQgcmVzb25hdGUgd2l0aCB0aGVpciBwYXJ0aWN1bGFyIGF1ZGllbmNlLiBXZSBleHBlY3QKKyAgICAgKiB0aGF0IGVhY2ggc3BlY2lmaWMgZGV2aWNlIHdvdWxkIGhhdmUgYSBkaWZmZXJlbnQgbG9vayBmb3IgdGhlaXIgZGVmYXVsdAorICAgICAqIERvbGJ5IFZpc2lvbiBjYXB0dXJlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX09FTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciAxMC1iaXQgRG9sYnkgVmlzaW9uIEhEUiBkZXZpY2Ugc3BlY2lmaWMKKyAgICAgKiBjYXB0dXJlIE1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgOC1iaXQgdmVyc2lvbiBvZiB0aGUgRG9sYnkgVmlzaW9uIHJlZmVyZW5jZSBjYXB0dXJlIG1vZGUgb3B0aW1pemVkCisgICAgICogZm9yIHNjZW5lIGFjY3VyYWN5LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfUkVGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEwMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciA4LWJpdCBEb2xieSBWaXNpb24gSERSIFJlZmVyZW5jZSBNb2RlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfUkVGX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIwMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIDgtYml0IHZlcnNpb24gb2YgZGV2aWNlIHNwZWNpZmljIHR1bmVkIGFuZCBvcHRpbWl6ZWQgRG9sYnkgVmlzaW9uCisgICAgICogY2FwdHVyZSBtb2RlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfT0VNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciA4LWJpdCBEb2xieSBWaXNpb24gSERSIGRldmljZSBzcGVjaWZpYworICAgICAqIGNhcHR1cmUgTW9kZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX09FTV9QTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDAsCisKKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfTUFYICAgICAgICAgPSAweDEwMDAsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfZHluYW1pY19yYW5nZV9wcm9maWxlc19tYXBfdDsKKwogCiAvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fY29uZmlndXJhdGlvbnMgewpAQCAtOTEwOCw2ICs5NTM1LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcsCiAKICAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHRoZSByZWNvbW1lbmRlZCAxMC1iaXQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGluY2x1ZGUKKyAgICAgKiBhIHN1YnNldCBvZiB0aGUgYWR2ZXJ0aXNlZCA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lDQkNSX1AwMTAiPkltYWdlRm9ybWF0I1lDQkNSX1AwMTA8L2E+IGFuZAorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjUFJJVkFURSI+SW1hZ2VGb3JtYXQjUFJJVkFURTwvYT4gb3V0cHV0cyB0aGF0IGFyZSBvcHRpbWl6ZWQgZm9yIHBvd2VyCisgICAgICogYW5kIHBlcmZvcm1hbmNlIHdoZW4gcmVnaXN0ZXJlZCBhbG9uZyB3aXRoIGEgc3VwcG9ydGVkIDEwLWJpdCBkeW5hbWljIHJhbmdlIHByb2ZpbGUuCisgICAgICogc2VlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbiNzZXREeW5hbWljUmFuZ2VQcm9maWxlIGZvcgorICAgICAqIGRldGFpbHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfMTBCSVRfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgsCisKKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BVQkxJQ19FTkRfM184CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDksCisKKyAgICAvKioKICAgICAgKiA8cD5WZW5kb3IgZGVmaW5lZCB1c2UgY2FzZXMuIFRoZXNlIGRlcGVuZCBvbiB0aGUgdmVuZG9yIGltcGxlbWVudGF0aW9uLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZFTkRPUl9TVEFSVApAQCAtOTE4OCw2ICs5NjI5LDc2IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX211bHRpX3Jlc29sdXRpb25fc3RyZWFtX3N1cHBvcnRlZF90OwogCisvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX3VzZV9jYXNlcyB7CisgICAgLyoqCisgICAgICogPHA+RGVmYXVsdCBzdHJlYW0gdXNlIGNhc2UuPC9wPgorICAgICAqIDxwPlRoaXMgdXNlIGNhc2UgaXMgdGhlIHNhbWUgYXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBzZXQgYW55IHVzZSBjYXNlIGZvcgorICAgICAqIHRoZSBzdHJlYW0uIFRoZSBjYW1lcmEgZGV2aWNlIHVzZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG91dHB1dCB0YXJnZXQsIHN1Y2ggYXMKKyAgICAgKiBmb3JtYXQsIGRhdGFTcGFjZSwgb3Igc3VyZmFjZSBjbGFzcyB0eXBlLCB0byBvcHRpbWl6ZSB0aGUgaW1hZ2UgcHJvY2Vzc2luZyBwaXBlbGluZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCAgICAgICAgICAgICAgICA9IDB4MCwKKworICAgIC8qKgorICAgICAqIDxwPkxpdmUgc3RyZWFtIHNob3duIHRvIHRoZSB1c2VyLjwvcD4KKyAgICAgKiA8cD5PcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlIGFuZCB1c2FiaWxpdHkgYXMgYSB2aWV3ZmluZGVyLCBidXQgbm90IG5lY2Vzc2FyaWx5IGZvcgorICAgICAqIGltYWdlIHF1YWxpdHkuIFRoZSBvdXRwdXQgaXMgbm90IG1lYW50IHRvIGJlIHBlcnNpc3RlZCBhcyBzYXZlZCBpbWFnZXMgb3IgdmlkZW8uPC9wPgorICAgICAqIDxwPk5vIHN0YWxsIGlmIEFDQU1FUkFfQ09OVFJPTF8qIGFyZSBzZXQgdG8gRkFTVC4gVGhlcmUgbWF5IGJlIHN0YWxsIGlmCisgICAgICogdGhleSBhcmUgc2V0IHRvIEhJR0hfUVVBTElUWS4gVGhpcyB1c2UgY2FzZSBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlCisgICAgICogZGVmYXVsdCBTdXJmYWNlVmlldyBhbmQgU3VyZmFjZVRleHR1cmUgdGFyZ2V0cy4gQWRkaXRpb25hbGx5LCB0aGlzIHVzZSBjYXNlIGNhbiBiZQorICAgICAqIHVzZWQgZm9yIGluLWFwcCBpbWFnZSBhbmFseXNpcy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfUFJFVklFVyAgICAgICAgICAgICAgICA9IDB4MSwKKworICAgIC8qKgorICAgICAqIDxwPlN0aWxsIHBob3RvIGNhcHR1cmUuPC9wPgorICAgICAqIDxwPk9wdGltaXplZCBmb3IgaGlnaC1xdWFsaXR5IGhpZ2gtcmVzb2x1dGlvbiBjYXB0dXJlLCBhbmQgbm90IGV4cGVjdGVkIHRvIG1haW50YWluCisgICAgICogcHJldmlldy1saWtlIGZyYW1lIHJhdGVzLjwvcD4KKyAgICAgKiA8cD5UaGUgc3RyZWFtIG1heSBoYXZlIHN0YWxscyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgQUNBTUVSQV9DT05UUk9MXyogaXMgSElHSF9RVUFMSVRZLgorICAgICAqIFRoaXMgdXNlIGNhc2UgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBkZWZhdWx0IEpQRUcgYW5kIFJBVyByZWxhdGVkIGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX1NUSUxMX0NBUFRVUkUgICAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvcmRpbmcgdmlkZW8gY2xpcHMuPC9wPgorICAgICAqIDxwPk9wdGltaXplZCBmb3IgaGlnaC1xdWFsaXR5IHZpZGVvIGNhcHR1cmUsIGluY2x1ZGluZyBoaWdoLXF1YWxpdHkgaW1hZ2Ugc3RhYmlsaXphdGlvbgorICAgICAqIGlmIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFuZCBlbmFibGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gQXMgYSByZXN1bHQsIG1heSBwcm9kdWNlCisgICAgICogb3V0cHV0IGZyYW1lcyB3aXRoIGEgc3Vic3RhbnRpYWwgbGFnIGZyb20gcmVhbCB0aW1lLCB0byBhbGxvdyBmb3IgaGlnaGVzdC1xdWFsaXR5CisgICAgICogc3RhYmlsaXphdGlvbiBvciBvdGhlciBwcm9jZXNzaW5nLiBBcyBzdWNoLCBzdWNoIGFuIG91dHB1dCBpcyBub3Qgc3VpdGFibGUgZm9yIGRyYXdpbmcKKyAgICAgKiB0byBzY3JlZW4gZGlyZWN0bHksIGFuZCBpcyBleHBlY3RlZCB0byBiZSBwZXJzaXN0ZWQgdG8gZGlzayBvciBzaW1pbGFyIGZvciBsYXRlcgorICAgICAqIHBsYXliYWNrIG9yIHByb2Nlc3NpbmcuIE9ubHkgc3RyZWFtcyB0aGF0IHNldCB0aGUgVklERU9fUkVDT1JEIHVzZSBjYXNlIGFyZSBndWFyYW50ZWVkCisgICAgICogdG8gaGF2ZSB2aWRlbyBzdGFiaWxpemF0aW9uIGFwcGxpZWQgd2hlbiB0aGUgdmlkZW8gc3RhYmlsaXphdGlvbiBjb250cm9sIGlzIHNldAorICAgICAqIHRvIE9OLCBhcyBvcHBvc2VkIHRvIFBSRVZJRVdfU1RBQklMSVpBVElPTi48L3A+CisgICAgICogPHA+VGhpcyB1c2UgY2FzZSBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIGRlZmF1bHQgTWVkaWFSZWNvcmRlciBhbmQgTWVkaWFDb2RlYworICAgICAqIHRhcmdldHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX1ZJREVPX1JFQ09SRCAgICAgICAgICAgPSAweDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5PbmUgc2luZ2xlIHN0cmVhbSB1c2VkIGZvciBjb21iaW5lZCBwdXJwb3NlcyBvZiBwcmV2aWV3LCB2aWRlbywgYW5kIHN0aWxsIGNhcHR1cmUuPC9wPgorICAgICAqIDxwPkZvciBzdWNoIG11bHRpLXB1cnBvc2Ugc3RyZWFtcywgdGhlIGNhbWVyYSBkZXZpY2UgYWltcyB0byBtYWtlIHRoZSBiZXN0IHRyYWRlb2ZmCisgICAgICogYmV0d2VlbiB0aGUgaW5kaXZpZHVhbCB1c2UgY2FzZXMuIEZvciBleGFtcGxlLCB0aGUgU1RJTExfQ0FQVFVSRSB1c2UgY2FzZSBieSBpdHNlbGYKKyAgICAgKiBtYXkgaGF2ZSBzdGFsbHMgZm9yIGFjaGlldmluZyBiZXN0IGltYWdlIHF1YWxpdHkuIEJ1dCBpZiBjb21iaW5lZCB3aXRoIFBSRVZJRVcgYW5kCisgICAgICogVklERU9fUkVDT1JELCB0aGUgY2FtZXJhIGRldmljZSBuZWVkcyB0byB0cmFkZSBvZmYgdGhlIGFkZGl0aW9uYWwgaW1hZ2UgcHJvY2Vzc2luZworICAgICAqIGZvciBzcGVlZCBzbyB0aGF0IHByZXZpZXcgYW5kIHZpZGVvIHJlY29yZGluZyBhcmVuJ3Qgc2xvd2VkIGRvd24uPC9wPgorICAgICAqIDxwPlNpbWlsYXJseSwgVklERU9fUkVDT1JEIG1heSBwcm9kdWNlIGZyYW1lcyB3aXRoIGEgc3Vic3RhbnRpYWwgbGFnLCBidXQKKyAgICAgKiBQUkVWSUVXX1ZJREVPX1NUSUxMIG11c3QgaGF2ZSBtaW5pbWFsIG91dHB1dCBkZWxheS4gVGhpcyBtZWFucyB0aGF0IHRvIGVuYWJsZSB2aWRlbworICAgICAqIHN0YWJpbGl6YXRpb24gd2l0aCB0aGlzIHVzZSBjYXNlLCB0aGUgZGV2aWNlIG11c3Qgc3VwcG9ydCBhbmQgdGhlIGFwcCBtdXN0IHNlbGVjdCB0aGUKKyAgICAgKiBQUkVWSUVXX1NUQUJJTElaQVRJT04gbW9kZSBmb3IgdmlkZW8gc3RhYmlsaXphdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfUFJFVklFV19WSURFT19TVElMTCAgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPkxvbmctcnVubmluZyB2aWRlbyBjYWxsIG9wdGltaXplZCBmb3IgYm90aCBwb3dlciBlZmZpY2llbmN5IGFuZCB2aWRlbyBxdWFsaXR5LjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIHNlbnNvciBtYXkgcnVuIGluIGEgbG93ZXItcmVzb2x1dGlvbiBtb2RlIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbgorICAgICAqIGF0IHRoZSBjb3N0IG9mIHNvbWUgaW1hZ2UgYW5kIGRpZ2l0YWwgem9vbSBxdWFsaXR5LiBVbmxpa2UgVklERU9fUkVDT1JELCBWSURFT19DQUxMCisgICAgICogb3V0cHV0cyBhcmUgZXhwZWN0ZWQgdG8gd29yayBpbiBkYXJrIGNvbmRpdGlvbnMsIHNvIGFyZSB1c3VhbGx5IGFjY29tcGFuaWVkIHdpdGgKKyAgICAgKiB2YXJpYWJsZSBmcmFtZSByYXRlIHNldHRpbmdzIHRvIGFsbG93IHN1ZmZpY2llbnQgZXhwb3N1cmUgdGltZSBpbiBsb3cgbGlnaHQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX1ZJREVPX0NBTEwgICAgICAgICAgICAgPSAweDUsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fdXNlX2Nhc2VzX3Q7CisKIAogLy8gQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX3JlZmVyZW5jZV9pbGx1bWluYW50MSB7CkBAIC05NjA1LDcgKzEwMTE2LDcgQEAKICAgICBBQ0FNRVJBX1RPTkVNQVBfTU9ERV9ISUdIX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKIAogICAgIC8qKgotICAgICAqIDxwPlVzZSB0aGUgZ2FtbWEgdmFsdWUgc3BlY2lmaWVkIGluIEFDQU1FUkFfVE9ORU1BUF9HQU1NQSB0byBwZWZvcm0KKyAgICAgKiA8cD5Vc2UgdGhlIGdhbW1hIHZhbHVlIHNwZWNpZmllZCBpbiBBQ0FNRVJBX1RPTkVNQVBfR0FNTUEgdG8gcGVyZm9ybQogICAgICAqIHRvbmVtYXBwaW5nLjwvcD4KICAgICAgKiA8cD5BbGwgY29sb3IgZW5oYW5jZW1lbnQgYW5kIHRvbmVtYXBwaW5nIG11c3QgYmUgZGlzYWJsZWQsIGV4Y2VwdAogICAgICAqIGZvciBhcHBseWluZyB0aGUgdG9uZW1hcHBpbmcgY3VydmUgc3BlY2lmaWVkIGJ5IEFDQU1FUkFfVE9ORU1BUF9HQU1NQS48L3A+CkBAIC05NjE3LDcgKzEwMTI4LDcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPlVzZSB0aGUgcHJlc2V0IHRvbmVtYXBwaW5nIGN1cnZlIHNwZWNpZmllZCBpbgotICAgICAqIEFDQU1FUkFfVE9ORU1BUF9QUkVTRVRfQ1VSVkUgdG8gcGVmb3JtIHRvbmVtYXBwaW5nLjwvcD4KKyAgICAgKiBBQ0FNRVJBX1RPTkVNQVBfUFJFU0VUX0NVUlZFIHRvIHBlcmZvcm0gdG9uZW1hcHBpbmcuPC9wPgogICAgICAqIDxwPkFsbCBjb2xvciBlbmhhbmNlbWVudCBhbmQgdG9uZW1hcHBpbmcgbXVzdCBiZSBkaXNhYmxlZCwgZXhjZXB0CiAgICAgICogZm9yIGFwcGx5aW5nIHRoZSB0b25lbWFwcGluZyBjdXJ2ZSBzcGVjaWZpZWQgYnkKICAgICAgKiBBQ0FNRVJBX1RPTkVNQVBfUFJFU0VUX0NVUlZFLjwvcD4KQEAgLTk3MTUsNyArMTAyMjYsNyBAQAogICAgICAqIGZpcmUgdGhlIGZsYXNoIGZvciBmbGFzaCBwb3dlciBtZXRlcmluZyBkdXJpbmcgcHJlY2FwdHVyZSwgYW5kIHRoZW4gZmlyZSB0aGUgZmxhc2gKICAgICAgKiBmb3IgdGhlIGZpbmFsIGNhcHR1cmUsIGlmIGEgZmxhc2ggaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgYW5kIHRoZSBBRSBtb2RlIGlzIHNldCB0bwogICAgICAqIGVuYWJsZSB0aGUgZmxhc2guPC9wPgotICAgICAqIDxwPkRldmljZXMgdGhhdCBpbml0aWFsbHkgc2hpcHBlZCB3aXRoIEFuZHJvaWQgdmVyc2lvbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC9WRVJTSU9OX0NPREVTLmh0bWwjUSI+UTwvYT4gb3IgbmV3ZXIgd2lsbCBub3QgaW5jbHVkZSBhbnkgTEVHQUNZLWxldmVsIGRldmljZXMuPC9wPgorICAgICAqIDxwPkRldmljZXMgdGhhdCBpbml0aWFsbHkgc2hpcHBlZCB3aXRoIEFuZHJvaWQgdmVyc2lvbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC5WRVJTSU9OX0NPREVTLmh0bWwjUSI+UTwvYT4gb3IgbmV3ZXIgd2lsbCBub3QgaW5jbHVkZSBhbnkgTEVHQUNZLWxldmVsIGRldmljZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtOTk0OSw2ICsxMDQ2MCwxNjcgQEAKIAogCiAKKy8vIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTgordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2F1dG9tb3RpdmVfbG9jYXRpb24geworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGV4aXN0cyBpbnNpZGUgb2YgdGhlIHZlaGljbGUgY2FiaW4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9JTlRFUklPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIGJ1dCBub3QgZXhhY3RseSBvbiBvbmUgb2YgdGhlCisgICAgICogZXh0ZXJpb3IgbG9jYXRpb25zIHRoaXMgZW51bSBkZWZpbmVzLiAgVGhlIGFwcGxpY2F0aW9ucyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBleGFjdAorICAgICAqIGxvY2F0aW9uIGZyb20gQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBhbmQgb24gaXRzIGZyb250IHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBhbmQgb24gaXRzIHJlYXIgc2lkZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVEVSSU9SX1JFQVIgICAgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb3V0c2lkZSBhbmQgb24gbGVmdCBzaWRlIG9mIHRoZSB2ZWhpY2xlIGJvZHkgZnJhbWUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgPSA0LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgYW5kIG9uIHJpZ2h0IHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVEVSSU9SX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICA9IDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb24gYW4gZXh0cmEgdmVoaWNsZSwgc3VjaCBhcyB0aGUgdHJhaWxlciwgYnV0IG5vdCBleGFjdGx5CisgICAgICogb24gb25lIG9mIGZyb250LCByZWFyLCBsZWZ0LCBvciByaWdodCBzaWRlLiAgQXBwbGljYXRpb25zIHNob3VsZCBkZXRlcm1pbmUgdGhlIGV4YWN0CisgICAgICogbG9jYXRpb24gZnJvbSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVFJBX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgZXh0cmEgdmVoaWNsZSdzIGJvZHkgZnJhbWUgYW5kIG9uIGl0cyBmcm9udAorICAgICAqIHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIGV4dHJhIHZlaGljbGUncyBib2R5IGZyYW1lIGFuZCBvbiBpdHMgcmVhcgorICAgICAqIHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9SRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgYW5kIG9uIGxlZnQgc2lkZSBvZiB0aGUgZXh0cmEgdmVoaWNsZSBib2R5LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT05fRVhUUkFfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGV4aXN0cyBvdXRzaWRlIGFuZCBvbiByaWdodCBzaWRlIG9mIHRoZSBleHRyYSB2ZWhpY2xlIGJvZHkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3Q7CisKKworLy8gQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZyB7CisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBidXQgbm90IGV4YWN0bHkKKyAgICAgKiBvbmUgb2YgdGhlIGV4dGVyaW9yIHNpZGVzIGRlZmluZWQgYnkgdGhpcyBlbnVtLiAgQXBwbGljYXRpb25zIHNob3VsZCBkZXRlcm1pbmUKKyAgICAgKiB0aGUgZXhhY3QgZmFjaW5nIGRpcmVjdGlvbiBmcm9tIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OIGFuZAorICAgICAqIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX09USEVSICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgZnJvbnQgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX0ZST05UICAgICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmVhciBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfRVhURVJJT1JfUkVBUiAgICAgICAgICAgICAgICAgICAgID0gMiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX0xFRlQgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfRVhURVJJT1JfUklHSFQgICAgICAgICAgICAgICAgICAgID0gNCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBpbnNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBidXQgbm90IGV4YWN0bHkKKyAgICAgKiBvbmUgb2Ygc2VhdHMgZGVzY3JpYmVkIGJ5IHRoaXMgZW51bS4gIEFwcGxpY2F0aW9ucyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBleGFjdAorICAgICAqIGZhY2luZyBkaXJlY3Rpb24gZnJvbSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTiBhbmQgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfT1RIRVIgICAgICAgICAgICAgICAgICAgID0gNSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBsZWZ0IHNpZGUgc2VhdCBvZiB0aGUgZmlyc3Qgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMV9MRUZUICAgICAgICAgID0gNiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgZmlyc3Qgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMV9DRU5URVIgICAgICAgID0gNywKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSByaWdodCBzZWF0IG9mIHRoZSBmaXJzdCByb3cuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TX0ZBQ0lOR19JTlRFUklPUl9TRUFUX1JPV18xX1JJR0hUICAgICAgICAgPSA4LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIGxlZnQgc2lkZSBzZWF0IG9mIHRoZSBzZWNvbmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMl9MRUZUICAgICAgICAgID0gOSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgc2Vjb25kIHJvdy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0lOVEVSSU9SX1NFQVRfUk9XXzJfQ0VOVEVSICAgICAgICA9IDEwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIHJpZ2h0IHNpZGUgc2VhdCBvZiB0aGUgc2Vjb25kIHJvdy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0lOVEVSSU9SX1NFQVRfUk9XXzJfUklHSFQgICAgICAgICA9IDExLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIGxlZnQgc2lkZSBzZWF0IG9mIHRoZSB0aGlyZCByb3cuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TX0ZBQ0lOR19JTlRFUklPUl9TRUFUX1JPV18zX0xFRlQgICAgICAgICAgPSAxMiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgdGhpcmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfM19DRU5URVIgICAgICAgID0gMTMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmlnaHQgc2VhdCBvZiB0aGUgdGhpcmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfM19SSUdIVCAgICAgICAgID0gMTQsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190OworCisKIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCAyYjYzMGRiLi5iMzk3N2ZmIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiwxMSArMiwxNSBAQAogICBnbG9iYWw6CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXM7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmU7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVWMjsgIyBpbnRyb2R1Y2VkPTMzCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZTsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZVYyOyAjIGludHJvZHVjZWQ9MzMKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2dldERldmljZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdFYyOyAjIGludHJvZHVjZWQ9MzMKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0OyAjIGludHJvZHVjZWQ9MjkKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0VjI7ICMgaW50cm9kdWNlZD0zMwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDlmNjMwOTkuLjBhNTc1OTAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQUNhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKIAotI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCi0KICNkZWZpbmUgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZW1vdGVSZXQsIHN0YXR1cywgY2FsbE5hbWUpIFwKICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsgXAogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGR1cmluZyAlcyBjYWxsICVzIiwgX19GVU5DVElPTl9fLCBjYWxsTmFtZSwgXApAQCAtMzMyLDcgKzMzMCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0KKyAgICAgICAgICAgIHN0ZDo6bW92ZShzdGQ6Om1ha2VfcGFpcihzdGQ6Om1vdmUob3V0cHV0LT5tV2luZG93KSwgc3RkOjptb3ZlKG91dENvbmZpZ1cpKSk7CiAKICAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KQEAgLTQ5Miw2ICs0OTEsNyBAQAogICAgIH0KIAogICAgIGlmIChtUmVtb3RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBiaW5kZXIgZGlzY29ubmVjdCByZWFjaGVkIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5kaXNjb25uZWN0KCk7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSBkaXNjb25uZWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywKQEAgLTYyNSw3ICs2MjUsOCBAQAogICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlc1swXSA9IGFudzsKICAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQ7CiAgICAgICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgd3JhcChhbncpOwotICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFudywgb3V0Q29uZmlnSW5zZXJ0VykpOworCisgICAgICAgIG91dHB1dFNldC5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShhbncpLCBzdGQ6Om1vdmUob3V0Q29uZmlnSW5zZXJ0VykpKTsKICAgICB9CiAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gYWRkU2V0ID0gb3V0cHV0U2V0OwogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlbGV0ZUxpc3Q7CkBAIC02ODIsNyArNjgzLDcgQEAKICAgICB9CiAKICAgICAvLyBhZGQgbmV3IHN0cmVhbXMKLSAgICBmb3IgKGF1dG8gb3V0cHV0UGFpciA6IGFkZFNldCkgeworICAgIGZvciAoY29uc3QgYXV0byAmb3V0cHV0UGFpciA6IGFkZFNldCkgewogICAgICAgICBpbnQgc3RyZWFtSWQ7CiAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OlVOS05PV05fRVJST1I7CiAgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dFBhaXIuc2Vjb25kLApAQCAtODQ3LDEyICs4NDgsMzIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOwotICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gd2luZG93SGFuZGxlc1t3aW5kb3dJZF0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIC8vIEdldCB0aGUgc3VyZmFjZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZXJyb3Igc3RyZWFtIGlkLCBnbyB0aHJvdWdoCisgICAgICAgIC8vIHRoZW0gYW5kIHRyeSB0byBtYXRjaCB0aGUgc3VyZmFjZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgLy8gQ2FwdHVyZVJlcXVlc3QuCisgICAgICAgIGNvbnN0IGF1dG8mIGVycm9yV2luZG93SGFuZGxlcyA9CisgICAgICAgICAgICAgICAgb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZXJyb3JXaW5kb3dIYW5kbGUgOiBlcnJvcldpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdXJmYWNlcyBpbiB0aGUgY2FwdHVyZSByZXF1ZXN0IGFuZCBzZWUgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBvbmVzIG1hdGNoIHRoZSBzdXJmYWNlcyBpbiB0aGUgZXJyb3Igc3RyZWFtLgorICAgICAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdFdpbmRvd0lkID0gcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGF1dG8gcmVxdWVzdFN1cmZhY2VQYWlySXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQocmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1cmZhY2VQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3Qgc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZyZXF1ZXN0V2luZG93SGFuZGxlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3VyZmFjZVBhaXJJdC0+c2Vjb25kLnNlY29uZC5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXaW5kb3dIYW5kbGVzW3JlcXVlc3RXaW5kb3dJZF0sIGVycm9yV2luZG93SGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdpbmRvd0hhbmRsZXNbcmVxdWVzdFdpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CiAKQEAgLTkxMCw2ICs5MzEsNyBAQAogICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtOTgyLDYgKzEwMDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTEwMDIsNiArMTAyNSw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICppZF9jc3RyID0gbUlkLmNfc3RyKCk7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtMTA1Myw2ICsxMDc3LDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBvblN0YXJ0MjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgc3RhcnRWMiBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0MiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa1RpbWVTdGFtcEtleSwgJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGlkX2NzdHIpOworICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQyKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCB0aW1lc3RhbXAsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CkBAIC0xMjgxLDYgKzEzMzQsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpLAogICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKICAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOwogCkBAIC0xMjk3LDYgKzEzNTEsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpLAogICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgewogICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOwogCkBAIC0xMzA2LDYgKzEzNjEsNDAgQEAKICAgICB9CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1JczJDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKAogICAgIGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgewpAQCAtMTU0MiwxMSArMTYzMSwxNCBAQAogCiAgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKICAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwogCiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG9uU3RhcnQyID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkMjsKKyAgICAgICAgYm9vbCB2MkNhbGxiYWNrID0gY2JoLm1JczJDYWxsYmFjazsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNTU0LDEyICsxNjQ2LDE5IEBACiAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOwogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBudWxscHRyOworICAgICAgICBpZiAodjJDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0MiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKKyAgICAgICAgfQogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAwYjZjN2M4Li5jMzA2MjA2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0yNDUsNiArMjQ1LDcgQEAKICAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQogICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcwogICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQyLCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZDIKICAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZApAQCAtMzA5LDExICszMTAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4mICByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7Ci0KLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3MoVCogY2JzKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpOworICAgICAgICB2b2lkIGNsZWFyQ2FsbGJhY2tzKCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQyID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwpAQCAtMzIyLDYgKzMzMCwyNCBAQAogICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3NWMihUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZDIgPSBjYnMtPm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBjYnMtPm9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKICAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKQEAgLTMzNSwxMCArMzYxLDEyIEBACiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1JczJDYWxsYmFjazsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKIAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBtT25DYXB0dXJlU3RhcnRlZDI7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggODM1OWJiMS4uNDY2MzUyOSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0xMzYsNiArMTM2LDggQEAKICAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKICAgICAgICAgfQogICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xb3JkZXJlZC1jb21wYXJlLWZ1bmN0aW9uLXBvaW50ZXJzIgogICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OwogICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOwpAQCAtMTQ2LDYgKzE0OCw3IEBACiAgICAgICAgICAgICBpZiAobVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUgIT0gb3RoZXIubVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGh5c2ljYWxDYW1VbmF2YWlsYWJsZSA8IG90aGVyLm1QaHlzaWNhbENhbVVuYXZhaWxhYmxlOwogICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaAppbmRleCA2ZjU4MjBlLi42Mjc3OWE0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTEwOSw4ICsxMDksMzAgQEAKICAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93R3JvdXBJZCA9IC0xOwogICAgIH07CiAKLSAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcihPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgOiBtT3V0cHV0Q29uZmlndXJhdGlvbigob3V0cHV0Q29uZmlndXJhdGlvbikpIHsgfQorICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyICZvdGhlcikgeworICAgICAgICAqdGhpcyA9IG90aGVyOworICAgIH0KKworICAgIC8vIE5lZWRlZCB0byBtYWtlIHN1cmUgdGhhdCBPdXRwdXRDb25maWd1cmF0aW9uIGluCisgICAgLy8gT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIsIHdoZW4gY29waWVkIGRvZXNuJ3QgY2FsbCBoaWRsX2hhbmRsZSdzCisgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvciAvIGNvcHkgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgbGVhZCB0byBuYXRpdmUgaGFuZGxlCisgICAgLy8gY2xvbmluZywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudCBmb3IgYXBwIGNhbGxiYWNrcyB3aGljaCBoYXZlIHRoZSBuYXRpdmUKKyAgICAvLyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyICZvcGVyYXRvcj0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgJm90aGVyKSB7CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24gPSBvdGhlci5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24gPSBvdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aWR0aCA9IG91dHB1dENvbmZpZ3VyYXRpb24ud2lkdGg7CisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLmhlaWdodCA9IG91dHB1dENvbmZpZ3VyYXRpb24uaGVpZ2h0OworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkID0gb3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXMuc2l6ZSgpKTsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmhhbmRsZSA6IG91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlcykgeworICAgICAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlc1tpKytdID0gaGFuZGxlLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CiAKICAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CiAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcAppbmRleCBiYTE0YzVjLi42M2NkYjc2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCkBAIC0yMzYsNiArMjM2LDExIEBACiAgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CiAgICAgfQorICAgIGludCB0YWtlUGljdHVyZTIoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlVjIobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrc1YyLCAxLAorICAgICAgICAgICAgICAgICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KIAogICAgIGludCB0YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKSB7CiAgICAgICAgIGludCBzZXFJZDsKQEAgLTI0MywxNSArMjQ4LDMxIEBACiAgICAgICAgICAgICAgICAgMSwgJm1TdGlsbFJlcXVlc3QsICZzZXFJZCk7CiAgICAgfQogCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZTIoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVWMihtU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAmbUxvZ2ljYWxDYXB0dXJlQ2FsbGJhY2tzVjIsIDEsICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KKwogICAgIGJvb2wgY2hlY2tDYWxsYmFja3MoaW50IHBpY3R1cmVDb3VudCkgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwogICAgICAgICBpZiAobUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ICE9IHBpY3R1cmVDb3VudCkgewotICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRlZCBjYXB0dXJlIGNhbGxhYmFjayBjb3VudCBub3QgYXMgZXhwZWN0ZWQuIGV4cGVjdGVkICVkIGFjdHVhbCAlZCIsCisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGVkIGNhcHR1cmUgY2FsbGJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAogICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzVjIoaW50IHBpY3R1cmVDb3VudCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUNhcHR1cmVTdGFydGVkQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHN0YXJ0ZWQgY2FsbGJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ2FwdHVyZVN0YXJ0ZWRDYWxsYmFja0NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKIAogICAgcHJpdmF0ZToKICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1EZXZpY2VDYnt0aGlzLCBudWxscHRyLCBudWxscHRyfTsKQEAgLTI3Niw2ICsyOTcsNyBAQAogICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKICAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXI7CiAgICAgaW50IG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCA9IDA7CisgICAgaW50IG1DYXB0dXJlU3RhcnRlZENhbGxiYWNrQ291bnQgPSAwOwogICAgIHN0ZDo6bXV0ZXggbU11dGV4OwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYXB0dXJlQ2FsbGJhY2tzID0gewogICAgICAgICAvLyBUT0RPOiBBZGQgdGVzdHMgZm9yIG90aGVyIGNhbGxiYWNrcwpAQCAtMjkzLDggKzMxNSwyNSBAQAogICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKICAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAogICAgIH07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiBtQ2FwdHVyZUNhbGxiYWNrc1YyID0geworICAgICAgICB0aGlzLCAvLyBjb250ZXh0CisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLGNvbnN0IEFDYXB0dXJlUmVxdWVzdCAqLCBpbnQ2NF90LAorICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyICkgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZnJhbWVOdW1iZXIgPj0gMCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ2FwdHVyZVN0YXJ0ZWRDYWxsYmFja0NvdW50Kys7CisgICAgICAgIH0sCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgIH07CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsQ2FtZXJhSWRzOworCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyBtTG9naWNhbENhcHR1cmVDYWxsYmFja3MgPSB7CiAgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCiAgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKQEAgLTMzNiw2ICszNzUsMjMgQEAKICAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCiAgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKICAgICB9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiBtTG9naWNhbENhcHR1cmVDYWxsYmFja3NWMiA9IHsKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBbXSh2b2lkKiBjdHggLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gKixjb25zdCBBQ2FwdHVyZVJlcXVlc3QgKiwgaW50NjRfdCwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmcmFtZU51bWJlciA+PSAwKTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1DYXB0dXJlU3RhcnRlZENhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZAorICAgICAgICBudWxscHRyLCAvL29uTG9naWNhbENhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy9vbkxvZ2ljYWxDcGF0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKKwogfTsKIAogY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CkBAIC01NzAsNyArNjI2LDcgQEAKICAgICB9CiAKICAgICBib29sIHRha2VQaWN0dXJlcyhjb25zdCBjaGFyKiBpZCwgdWludDY0X3QgcmVhZGVyVXNhZ2UsIGludCByZWFkZXJNYXhJbWFnZXMsCi0gICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50LCBib29sIHYyID0gZmFsc2UpIHsKICAgICAgICAgaW50IHJldCA9IDA7CiAKICAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKQEAgLTYwMCw3ICs2NTYsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHYyKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlMigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02MTcsNyArNjc3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50ICYmCi0gICAgICAgICAgICAgICAgY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICB2MiA/IGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrc1YyKHBpY3R1cmVDb3VudCkgOgorICAgICAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKICAgICB9CiAKICAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKQEAgLTYyNiwxMiArNjg3LDE0IEBACiAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlck1heEltYWdlcyA6IHsxLCA0LCA4fSkgewogICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyQXN5bmMgOiB7dHJ1ZSwgZmFsc2V9KSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcGljdHVyZUNvdW50IDogezEsIDQsIDh9KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRha2VQaWN0dXJlcyhpZCwgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVGVzdCB0YWtlUGljdHVyZXMgZmFpbGVkIGZvciB0ZXN0IGNhc2UgdXNhZ2U9JSIgUFJJdTY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWF4SW1hZ2VzPSVkLCBhc3luYz0lZCwgcGljdHVyZUNvdW50PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBhdXRvICYgdjIgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMoaWQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50LCB2MikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRlc3QgdGFrZVBpY3R1cmVzIGZhaWxlZCBmb3IgdGVzdCBjYXNlIHVzYWdlPSUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTcyNSw3ICs3ODgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdm9pZCB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGJvb2wgdXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgIHZvaWQgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MsIGJvb2wgdjIpIHsKICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBudWxscHRyOwogICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRzOwpAQCAtNzcyLDcgKzgzNSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHYyKSB7CisgICAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlTG9naWNhbENhbWVyYVBpY3R1cmUyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CiAgICAgICAgIH0KIApAQCAtNzkzLDggKzg2MSwxMSBAQAogICAgICAgICAgICAgQUxPR0koIlRlc3Rpbmcgd2luZG93ICVwIiwgdGVzdENhc2UtPmdldE5hdGl2ZVdpbmRvdygpKTsKICAgICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CiAgICAgICAgIH0KLQotICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisgICAgICAgIGlmICh2MikgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzVjIocGljdHVyZUNvdW50KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisgICAgICAgIH0KIAogICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShzdGF0aWNNZXRhZGF0YSk7CiAgICAgfQpAQCAtODM0LDggKzkwNSwxMCBAQAogfQogCiBURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7Ci0gICAgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShmYWxzZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKLSAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7CisgICAgZm9yIChhdXRvICYgdjIgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0oZmFsc2UvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLywgdjIpOworICAgICAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLywgdjIpOworICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCA5ZjJmNDMwLi4xN2VhNTEyIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTk2LDYgKzk2LDEyIEBACiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9OwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoY29uc3QgU3RyaW5nMTYmIC8qY2FtZXJhSWQqLywKKyAgICAgICAgICAgIGludDMyX3QgLyp0b3JjaFN0cmVuZ3RoKi8pIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKICAgICAgICAgLy8gTm8gb3AKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwpkaWZmIC0tZ2l0IGEvY21kcy9PV05FUlMgYi9jbWRzL09XTkVSUwppbmRleCAwZDMyYWFjLi5hNDhjMzdhIDEwMDY0NAotLS0gYS9jbWRzL09XTkVSUworKysgYi9jbWRzL09XTkVSUwpAQCAtMSwzICsxLDMgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCmluZGV4IDM1OWE4MzUuLmQwYjNjZTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icApAQCAtNTUsMTIgKzU1LDYgQEAKICAgICAgICAgImxpYkdMRVN2MiIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGU2ZTM0NzMuLjJlMGI2NzggMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNzAxLDcgKzcwMSw3IEBACiAgICAgICAgIHByaW50ZigiRGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXMpLCBsYXllclN0YWNrPSV1XG4iLAogICAgICAgICAgICAgICAgIGxheWVyU3RhY2tTcGFjZVJlY3QuZ2V0V2lkdGgoKSwgbGF5ZXJTdGFja1NwYWNlUmVjdC5nZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZS5yZWZyZXNoUmF0ZSwgdG9DU3RyaW5nKGRpc3BsYXlTdGF0ZS5vcmllbnRhdGlvbiksCi0gICAgICAgICAgICAgICAgZGlzcGxheVN0YXRlLmxheWVyU3RhY2spOworICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0ZS5sYXllclN0YWNrLmlkKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCiAgICAgc3RkOjpvcHRpb25hbDxQaHlzaWNhbERpc3BsYXlJZD4gZGlzcGxheUlkID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlJZCgpOwogICAgIGlmICghZGlzcGxheUlkKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCB0b2tlbiBmb3IgaW50ZXJuYWwgZGlzcGxheVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBJRCBmb3IgaW50ZXJuYWwgZGlzcGxheVxuIik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtMTE2OCwxNyArMTE2OCwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gUGh5c2ljYWxEaXNwbGF5SWQoYXRvbGwob3B0YXJnKSk7Ci0gICAgICAgICAgICBpZiAoZ1BoeXNpY2FsRGlzcGxheUlkLnZhbHVlID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgcGh5c2ljYWwgZGlzcGxheSBpZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Ci0gICAgICAgICAgICAgICAgICAgIGdldFBoeXNpY2FsRGlzcGxheVRva2VuKGdQaHlzaWNhbERpc3BsYXlJZCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IGlkOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhnUGh5c2ljYWxEaXNwbGF5SWQpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgaWYgKGNvbnN0IGF1dG8gaWQgPSBhbmRyb2lkOjpEaXNwbGF5SWQ6OmZyb21WYWx1ZTxQaHlzaWNhbERpc3BsYXlJZD4oYXRvbGwob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgaWQgJiYgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRQaHlzaWNhbERpc3BsYXlUb2tlbigqaWQpKSB7CisgICAgICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gKmlkOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IElEXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmZTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMCwwICsxLDI3NiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfY21kc19zdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2NtZHNfc3RhZ2VmcmlnaHRfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAic3RhZ2VmcmlnaHQiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgInN0YWdlZnJpZ2h0LmNwcCIsCisgICAgICAgICJqcGVnLmNwcCIsCisgICAgICAgICJTaW5lU291cmNlLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCisKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJyZWNvcmQiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICAgICAgInJlY29yZC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJjYW1lcmFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInJlY29yZHZpZGVvIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCisgICAgICAgICJyZWNvcmR2aWRlby5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhdWRpb2xvb3AiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICAgICAgImF1ZGlvbG9vcC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJzdHJlYW0iLAorCisgICAgc3JjczogWyJzdHJlYW0uY3BwIl0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMiLAorCisgICAgc3JjczogWworICAgICAgICAiY29kZWMuY3BwIiwKKyAgICAgICAgIlNpbXBsZVBsYXllci5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhZmlsdGVyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImZpbHRlcnMvYXJnYnRvcmdiYS5yc2NyaXB0IiwKKyAgICAgICAgImZpbHRlcnMvbmlnaHR2aXNpb24ucnNjcmlwdCIsCisgICAgICAgICJmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCIsCisgICAgICAgICJtZWRpYWZpbHRlci5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgInJzLWhlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliUlNjcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtdXhlciIsCisKKyAgICBzcmNzOiBbIm11eGVyLmNwcCJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzYzRhNC4uMDAwMDAwMAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCi0gICAgICAgIEF1ZGlvUGxheWVyLmNwcCBcCi0gICAgICAgIHN0YWdlZnJpZ2h0LmNwcCBcCi0gICAgICAgIGpwZWcuY3BwICAgICAgICBcCi0gICAgICAgIFNpbmVTb3VyY2UuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9jb2RlY2xpc3QgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKLSAgICAgICAgbGliaGlkbGJhc2UgbGliZGF0YXNvdXJjZSBsaWJhdWRpb2NsaWVudCBcCi0gICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCi0gICAgICAgIGZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFOj0gdHJ1ZQotTE9DQUxfTU9EVUxFOj0gc3RhZ2VmcmlnaHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICAgICAgU2luZVNvdXJjZS5jcHAgICAgXAotICAgICAgICByZWNvcmQuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJkYXRhc291cmNlIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX01PRFVMRTo9IHJlY29yZAotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICByZWNvcmR2aWRlby5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50Ci0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gcmVjb3JkdmlkZW8KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCi0gICAgICAgIGF1ZGlvbG9vcC5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBhdWRpb2xvb3AKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgc3RyZWFtLmNwcCAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnVpIGxpYmd1aSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzIGxpYmRhdGFzb3VyY2UKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBzdHJlYW0KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29kZWMuY3BwICAgICAgICAgICAgICAgXAotICAgICAgICBTaW1wbGVQbGF5ZXIuY3BwICAgICAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYmF1ZGlvY2xpZW50IGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBjb2RlYwotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICAgICAgZmlsdGVycy9hcmdidG9yZ2JhLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCBcCi0gICAgICAgIG1lZGlhZmlsdGVyLmNwcCBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJtZWRpYV9vbXggXAotICAgICAgICBsaWJ1aSBcCi0gICAgICAgIGxpYmd1aSBcCi0gICAgICAgIGxpYlJTY3BwIFwKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgIGZyYW1ld29ya3MvcnMvY3BwIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9ycyBcCi0KLWludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixTVEFUSUNfTElCUkFSSUVTLGxpYlJTLFRBUkdFVCwpCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoaW50ZXJtZWRpYXRlcykKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUzo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgICAgIG11eGVyLmNwcCAgICAgICAgICAgIFwKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmN1dGlscyBsaWJjCi0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbXV4ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IDU1NDI3Y2EuLjZjZGRmNDcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0yNDksNyArMjQ5LDggQEAKIAogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCisgICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPjo6ZnJvbUV4aXN0aW5nKHRoaXMpLAogICAgICAgICAgICAgICAgIDAgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CkBAIC0zOTcsMTAgKzM5OCw2IEBACiAgICAgbVN0YXJ0UG9zVXMgPSAwOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgQXVkaW9QbGF5ZXI6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7Ci0gICAgc3RhdGljX2Nhc3Q8QXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQogCiBib29sIEF1ZGlvUGxheWVyOjpyZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cykgewogICAgICpmaW5hbFN0YXR1cyA9IE9LOwpAQCAtNDU1LDIwICs0NTIsMTIgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6Ci0gICAgICAgIHsKLSAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZpbGxCdWZmZXIoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKK3NpemVfdCBBdWRpb1BsYXllcjo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeworICAgIHJldHVybiBmaWxsQnVmZmVyKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpOworfQogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgotICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KK3ZvaWQgQXVkaW9QbGF5ZXI6Om9uU3RyZWFtRW5kKCkgeworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKIH0KIAogc2l6ZV90IEF1ZGlvUGxheWVyOjpmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmggYi9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKaW5kZXggNDM1NTBlYS4uNjA4ZjU0YiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBVURJT19QTEFZRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMjYsMTAgKzI3LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb1RyYWNrOwogc3RydWN0IEF3ZXNvbWVQbGF5ZXI7CiAKLWNsYXNzIEF1ZGlvUGxheWVyIHsKK2NsYXNzIEF1ZGlvUGxheWVyIDogQXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjayB7CiBwdWJsaWM6CiAgICAgZW51bSB7CiAgICAgICAgIFJFQUNIRURfRU9TLApAQCAtNjYsNiArNjYsOSBAQAogICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKIAogcHJpdmF0ZToKKyAgICBmcmllbmQgc3A8QXVkaW9QbGF5ZXI+OworICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uU3RyZWFtRW5kKCkgb3ZlcnJpZGU7CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CiAKQEAgLTk5LDkgKzEwMiw2IEBACiAgICAgaW50NjRfdCBtU3RhcnRQb3NVczsKICAgICBjb25zdCB1aW50MzJfdCBtQ3JlYXRlRmxhZ3M7CiAKLSAgICBzdGF0aWMgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbyk7Ci0gICAgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbyk7Ci0KICAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAogICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCA0YjQxZmY4Li44M2Y4ZmU5IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xNjYsOSArMTY2LDkgQEAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKGVuY29kZXIpOwogCiAgICAgICAgIGlmIChwbGF5VG9TcGVha2VyKSB7Ci0gICAgICAgICAgICBBdWRpb1BsYXllciBwbGF5ZXIoTlVMTCk7Ci0gICAgICAgICAgICBwbGF5ZXIuc2V0U291cmNlKGRlY29kZXIpOwotICAgICAgICAgICAgcGxheWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBzcDxBdWRpb1BsYXllcj4gcGxheWVyID0gc3A8QXVkaW9QbGF5ZXI+OjptYWtlKG51bGxwdHIpOworICAgICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UoZGVjb2Rlcik7CisgICAgICAgICAgICBwbGF5ZXItPnN0YXJ0KCk7CiAgICAgICAgICAgICBzbGVlcChkdXJhdGlvbik7CiAKIEFMT0dJKCJMaW5lOiAlZCIsIF9fTElORV9fKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAppbmRleCAwOThjMjc4Li41NzQzYWQ2IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogCi0jaW5jbHVkZSAiQXVkaW9QbGF5ZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTI3NCwxNyArMjczLDYgQEAKICAgICBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDI7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvU291cmNlID0gbmV3IFNpbmVTb3VyY2Uoa1NhbXBsZVJhdGUsIGtOdW1DaGFubmVscyk7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IGF1ZGlvU2luazsKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGF1ZGlvU2luayk7Ci0gICAgcGxheWVyLT5zZXRTb3VyY2UoYXVkaW9Tb3VyY2UpOwotICAgIHBsYXllci0+c3RhcnQoKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIHBsYXllci0+c3RvcCgpOwotI2VuZGlmCi0KICAgICBzcDxBTWVzc2FnZT4gZW5jTWV0YSA9IG5ldyBBTWVzc2FnZTsKICAgICBlbmNNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLAogICAgICAgICAgICAgMCA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IGM0MzBmMDUuLjk3ODM4NTUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC03MCw2ICs3MCwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorbmFtZXNwYWNlIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBQSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyX0FTXzg4ODggPSAtSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7Cit9CisKIHN0YXRpYyBsb25nIGdOdW1SZXBldGl0aW9uczsKIHN0YXRpYyBsb25nIGdNYXhOdW1GcmFtZXM7ICAvLyAwIG1lYW5zIGRlY29kZSBhbGwgYXZhaWxhYmxlLgogc3RhdGljIGxvbmcgZ1JlcHJvZHVjZUJ1ZzsgIC8vIGlmIG5vdCAtMS4KQEAgLTIyMCw3ICsyMjQsNyBAQAogICAgIH0KIAogICAgIGlmIChnUGxheWJhY2tBdWRpbykgewotICAgICAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOworICAgICAgICBzcDxBdWRpb1BsYXllcj4gcGxheWVyID0gc3A8QXVkaW9QbGF5ZXI+OjptYWtlKG51bGxwdHIpOwogICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShyYXdTb3VyY2UpOwogICAgICAgICByYXdTb3VyY2UuY2xlYXIoKTsKIApAQCAtMjM1LDkgKzIzOSw2IEBACiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBwbGF5YmFjayBlcnI9JWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIGRlbGV0ZSBwbGF5ZXI7Ci0gICAgICAgIHBsYXllciA9IE5VTEw7Ci0KICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAoZ1JlcHJvZHVjZUJ1ZyA+PSAzICYmIGdSZXByb2R1Y2VCdWcgPD0gNSkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CkBAIC02MjksNyArNjMwLDE0IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW0gbWF4LW51bWJlci1vZi1mcmFtZXMtdG8tZGVjb2RlIGluIGVhY2ggcGFzc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWIgYnVnIHRvIHJlcHJvZHVjZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkobmZvKSBkdW1wIGNvZGVjIGluZm8gKHByb2ZpbGVzIGFuZCBjb2xvciBmb3JtYXRzIHN1cHBvcnRlZCwgZGV0YWlscylcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnQgKC9zZGNhcmQvb3V0LmpwZylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1QKGl4ZWxGb3JtYXQpIHBpeGVsIGZvcm1hdCB0byB1c2UgZm9yIHJhdyB0aHVtYm5haWwgIgorICAgICAgICAgICAgICAgICAgICAiKC9zZGNhcmQvb3V0LnJhdylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICVkOiBSR0JBXzU2NVxuIiwgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAlZDogUkdCQV84ODg4XG4iLCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgJWQ6IEJHUkFfODg4OFxuIiwgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICVkOiBSR0JBXzEwMTAxMDJcbiIsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAlZDogUkdCQV8xMDEwMTAyIGFzIFJHQkFfODg4OFxuIiwgUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl9BU184ODg4KTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKQEAgLTc4Nyw2ICs3OTUsNyBAQAogICAgIGJvb2wgdXNlU3VyZmFjZVRleEFsbG9jID0gZmFsc2U7CiAgICAgYm9vbCBkdW1wU3RyZWFtID0gZmFsc2U7CiAgICAgYm9vbCBkdW1wUENNU3RyZWFtID0gZmFsc2U7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdCA9IDA7ICAgICAgICAvLyB0aHVtYm5haWwgcGl4ZWwgZm9ybWF0CiAgICAgU3RyaW5nOCBkdW1wU3RyZWFtRmlsZW5hbWU7CiAgICAgZ051bVJlcGV0aXRpb25zID0gMTsKICAgICBnTWF4TnVtRnJhbWVzID0gMDsKQEAgLTgwMCw3ICs4MDksNyBAQAogICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlcjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgInZoYXFuOmxtOmI6aXRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgeworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2aGFxbjpsbTpiOml0c3JvdzprTjp4U1RkOkQ6UDoiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC04NDEsNiArODUwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgY2FzZSAnYic6CkBAIC04NTYsNiArODY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgZ051bVJlcGV0aXRpb25zID0geDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAnbScpIHsKICAgICAgICAgICAgICAgICAgICAgZ01heE51bUZyYW1lcyA9IHg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gJ1AnKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0geDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShyZXMsICdiJyk7CiAgICAgICAgICAgICAgICAgICAgIGdSZXByb2R1Y2VCdWcgPSB4OwpAQCAtOTc4LDI0ICs5OTAsNzEgQEAKICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIGZkID0gLTE7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IHJldHJpZXZlclBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgICAgICAgICAgaWYgKHBpeGVsRm9ybWF0ID09IFBJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDJfQVNfODg4OCkgeworICAgICAgICAgICAgICAgIHJldHJpZXZlclBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgcmV0cmlldmVyUGl4ZWxGb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CiAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVyUGl4ZWxGb3JtYXQsIGZhbHNlIC8qbWV0YU9ubHkqLyk7CiAKICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0RnJhbWVBdFRpbWUoJXMpID0+IE9LXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXRGcmFtZUF0VGltZSglcykgZm9ybWF0PSVkID0+IE9LXG4iLCBmaWxlbmFtZSwgcmV0cmlldmVyUGl4ZWxGb3JtYXQpOwogCiAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSAoVmlkZW9GcmFtZSAqKW1lbS0+dW5zZWN1cmVQb2ludGVyKCk7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQpLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJwcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl9BU184ODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBSR0JBXzEwMTAxMDIgdG8gUkdCQV84ODg4CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplbmQgPSBkYXRhICsgZnJhbWUtPm1XaWR0aCAqIGZyYW1lLT5tSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBkYXRhIDwgZW5kOyArK2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBvdXQgOC1iaXQgUiwgRywgQiB2YWx1ZXMgYW5kIG1vdmUgdGhlbSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCpkYXRhICYgICAgICAweDNmYykgPj4gMikgfCAvLyBSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgqZGF0YSAmICAgIDB4ZmYwMDApID4+IDQpIHwgLy8gRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKmRhdGEgJiAweDNmYzAwMDAwKSA+PiA2KSB8IC8vIEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgb3V0IDItYml0IEEgYW5kIGV4cGFuZCB0byA4LWJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCpkYXRhICYgMHhjMDAwMDAwMCkgPj4gNikgKiAweDU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqb3V0ID0gZm9wZW4oIi9zZGNhcmQvb3V0LnJhdyIsICJ3YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksIGJwcCAqIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgb3V0ICVkIHggJWQgeCAlZGJwcFxuIiwgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQsIGJwcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInVua25vd24gcGl4ZWwgZm9ybWF0LlxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCksIDApOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwaXhlbEZvcm1hdCkgewogICAgICAgICAgICAgICAgIG1lbSA9IHJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CiAKICAgICAgICAgICAgICAgICBpZiAobWVtICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RybS9PV05FUlMgYi9kcm0vT1dORVJTCmluZGV4IGU3ODg3NTQuLjA5MGMwMjEgMTAwNjQ0Ci0tLSBhL2RybS9PV05FUlMKKysrIGIvZHJtL09XTkVSUwpAQCAtMSArMSwzIEBACiBqdGlua2VyQGdvb2dsZS5jb20KK2tlbHpoYW5AZ29vZ2xlLmNvbQorcm9iZXJ0c2hpaEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCA3NGUzMjIzLi5mNzk4OWJkIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTIwOCw3ICsyMDgsMTEgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6bG9hZFBsdWdJbnMoKSB7CisjaWYgX19MUDY0X18KKyAgICBTdHJpbmc4IHBsdWdpbkRpclBhdGgoIi9zeXN0ZW0vbGliNjQvZHJtIik7CisjZWxzZQogICAgIFN0cmluZzggcGx1Z2luRGlyUGF0aCgiL3N5c3RlbS9saWIvZHJtIik7CisjZW5kaWYKICAgICBsb2FkUGx1Z0lucyhwbHVnaW5EaXJQYXRoKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9kcm1zZXJ2ZXIucmMgYi9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYwppbmRleCBlYjE3NmMxLi4wMzE5ZmY5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYworKysgYi9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYwpAQCAtMyw3ICszLDcgQEAKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBkcm0KICAgICBncm91cCBkcm0gc3lzdGVtIGluZXQgZHJtcnBjIHJlYWRwcm9jCi0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaAogCiBvbiBwcm9wZXJ0eTpkcm0uc2VydmljZS5lbmFibGVkPXRydWUKICAgICBzdGFydCBkcm0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggMGZmZTYyNi4uNDA4ZDIxNiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTI4LDggKzI4LDEzIEBACiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiU2hhcmVkTGlicmFyeS5jcHAiLAogICAgICAgICAiRHJtSGFsLmNwcCIsCisgICAgICAgICJEcm1IYWxIaWRsLmNwcCIsCisgICAgICAgICJEcm1IYWxBaWRsLmNwcCIsCiAgICAgICAgICJDcnlwdG9IYWwuY3BwIiwKKyAgICAgICAgIkNyeXB0b0hhbEhpZGwuY3BwIiwKKyAgICAgICAgIkNyeXB0b0hhbEFpZGwuY3BwIiwKICAgICAgICAgIkRybVV0aWxzLmNwcCIsCisgICAgICAgICJEcm1IYWxMaXN0ZW5lci5jcHAiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKQEAgLTYzLDEwICs2OCwxMiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40IiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKKyAgICAgICAgImxpYmFpZGxjb21tb25zdXBwb3J0IiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTYyLDEwICsxNjksNiBAQAogICAgICAgICAiRHJtTWV0cmljc0NvbnN1bWVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIgotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCkBAIC0xODEsNSArMTg0LDYgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCmluZGV4IGUwZGIxYzQuLmY5NWQ1MjcgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCkBAIC0xNiwzODkgKzE2LDEwMCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNyeXB0b0hhbCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWxIaWRsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CiAKLXVzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKLXVzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Ci11c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpNb2RlOwotdXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwotdXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Ci11c2luZyBkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwotCi11c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjp0b1N0YXR1c1Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpIaWRsTWVtb3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXR5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgewotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKLSAgICB2ZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKLSAgICByZXR1cm4gdmVjOworQ3J5cHRvSGFsOjpDcnlwdG9IYWwoKSB7CisgICAgbUNyeXB0b0hhbEFpZGwgPSBzcDxDcnlwdG9IYWxBaWRsPjo6bWFrZSgpOworICAgIG1DcnlwdG9IYWxIaWRsID0gc3A8Q3J5cHRvSGFsSGlkbD46Om1ha2UoKTsKIH0KIAotc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwotICAgIHZlYy5yZXNpemUoc2l6ZSk7Ci0gICAgbWVtY3B5KHZlYy5kYXRhKCksIHB0ciwgc2l6ZSk7Ci0gICAgcmV0dXJuIHZlYzsKLX0KLQotc3RhdGljIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHRvSGlkbEFycmF5MTYoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgaWYgKCFwdHIpIHsKLSAgICAgICAgcmV0dXJuIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+KCk7Ci0gICAgfQotICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PihwdHIpOwotfQotCi0KLXN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChoaWRsX3N0cmluZyBoU3RyaW5nKSB7Ci0gICAgcmV0dXJuIFN0cmluZzgoaFN0cmluZy5jX3N0cigpKTsKLX0KLQotCi1DcnlwdG9IYWw6OkNyeXB0b0hhbCgpCi0gICAgOiBtRmFjdG9yaWVzKG1ha2VDcnlwdG9GYWN0b3JpZXMoKSksCi0gICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCksCi0gICAgICBtSGVhcFNlcU51bSgwKSB7Ci19Ci0KLUNyeXB0b0hhbDo6fkNyeXB0b0hhbCgpIHsKLX0KLQotVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gQ3J5cHRvSGFsOjptYWtlQ3J5cHRvRmFjdG9yaWVzKCkgewotICAgIFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IGZhY3RvcmllczsKLQotICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKLSAgICBpZiAobWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSUNyeXB0b0ZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTo6ZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJQ3J5cHRvRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKLSAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKLSAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcmllczsKLX0KLQotc3A8SUNyeXB0b1BsdWdpbj4gQ3J5cHRvSGFsOjptYWtlQ3J5cHRvUGx1Z2luKGNvbnN0IHNwPElDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpIHsKLQotICAgIHNwPElDcnlwdG9QbHVnaW4+IHBsdWdpbjsKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKGluaXREYXRhLCBpbml0RGF0YVNpemUpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBjcnlwdG8gcGx1Z2luIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGx1Z2luID0gaFBsdWdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHBsdWdpbjsKLX0KLQorQ3J5cHRvSGFsOjp+Q3J5cHRvSGFsKCkge30KIAogc3RhdHVzX3QgQ3J5cHRvSGFsOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSyB8fCBtQ3J5cHRvSGFsSGlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBPSzsKKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmluaXRDaGVjaygpID09IE5PX0lOSVQgfHwgbUNyeXB0b0hhbEhpZGwtPmluaXRDaGVjaygpID09IE5PX0lOSVQpCisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+aW5pdENoZWNrKCk7CiB9CiAKLQogYm9vbCBDcnlwdG9IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkgfHwKKyAgICAgICAgICAgbUNyeXB0b0hhbEhpZGwtPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOwogfQogCi1zdGF0dXNfdCBDcnlwdG9IYWw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLAotICAgICAgICBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOwotICAgIH0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOworc3RhdHVzX3QgQ3J5cHRvSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmNyZWF0ZVBsdWdpbih1dWlkLCBkYXRhLCBzaXplKSAhPSBPSykKKyAgICAgICAgcmV0dXJuIG1DcnlwdG9IYWxIaWRsLT5jcmVhdGVQbHVnaW4odXVpZCwgZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDcnlwdG9IYWw6OmRlc3Ryb3lQbHVnaW4oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIG1QbHVnaW4uY2xlYXIoKTsKLSAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwotICAgIHJldHVybiBPSzsKKyAgICAvLyBUaGlzIHJlcXVpcmVzIHBsdWdpbiB0byBiZSBjcmVhdGVkLgorICAgIGlmIChtQ3J5cHRvSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+ZGVzdHJveVBsdWdpbigpOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+ZGVzdHJveVBsdWdpbigpOwogfQogCi1ib29sIENyeXB0b0hhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGhSZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBJZiB0aGUgaGVhcCBiYXNlIGlzbid0IHNldCwgZ2V0IHRoZSBoZWFwIGJhc2UgZnJvbSB0aGUgSGlkbE1lbW9yeQotICogYW5kIHNlbmQgaXQgdG8gdGhlIEhBTCBzbyBpdCBjYW4gbWFwIGEgcmVtb3RlIGhlYXAgb2YgdGhlIHNhbWUKLSAqIHNpemUuICBPbmNlIHRoZSBoZWFwIGJhc2UgaXMgZXN0YWJsaXNoZWQsIHNoYXJlZCBtZW1vcnkgYnVmZmVycwotICogYXJlIHNlbnQgYnkgcHJvdmlkaW5nIGFuIG9mZnNldCBpbnRvIHRoZSBoZWFwIGFuZCBhIGJ1ZmZlciBzaXplLgotICovCi1pbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcEJhc2UoY29uc3Qgc3A8SGlkbE1lbW9yeT4mIGhlYXApIHsKLSAgICBpZiAoaGVhcCA9PSBOVUxMIHx8IG1IZWFwU2VxTnVtIDwgMCkgewotICAgICAgICBBTE9HRSgic2V0SGVhcEJhc2UoKTogaGVhcCAlcCBtSGVhcFNlcU51bSAlZCIsIGhlYXAuZ2V0KCksIG1IZWFwU2VxTnVtKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7Ci0gICAgdWludDMyX3QgYnVmZmVySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VxTnVtKTsKLSAgICBtSGVhcFNpemVzLmFkZChzZXFOdW0sIGhlYXAtPnNpemUoKSk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoZWFwLCBidWZmZXJJZCk7Ci0gICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKLSAgICByZXR1cm4gc2VxTnVtOwotfQotCi12b2lkIENyeXB0b0hhbDo6Y2xlYXJIZWFwQmFzZShpbnQzMl90IHNlcU51bSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvKgotICAgICAqIENsZWFyIHRoZSByZW1vdGUgc2hhcmVkIG1lbW9yeSBtYXBwaW5nIGJ5IHNldHRpbmcgdGhlIHNoYXJlZAotICAgICAqIGJ1ZmZlciBiYXNlIHRvIGEgbnVsbCBoaWRsX21lbW9yeS4KLSAgICAgKgotICAgICAqIFRPRE86IEFkZCBhIHJlbGVhc2VTaGFyZWRCdWZmZXIgbWV0aG9kIGluIGEgZnV0dXJlIERSTSBIQUwKLSAgICAgKiBBUEkgdmVyc2lvbiB0byBtYWtlIHRoaXMgZXhwbGljaXQuCi0gICAgICovCi0gICAgc3NpemVfdCBpbmRleCA9IG1IZWFwU2l6ZXMuaW5kZXhPZktleShzZXFOdW0pOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcU51bSk7Ci0gICAgICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UoaGlkbF9tZW1vcnkoKSwgYnVmZmVySWQpOwotICAgICAgICAgICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtSGVhcFNpemVzLnJlbW92ZUl0ZW0oc2VxTnVtKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENyeXB0b0hhbDo6Y2hlY2tTaGFyZWRCdWZmZXIoY29uc3QgOjpTaGFyZWRCdWZmZXIgJmJ1ZmZlcikgewotICAgIGludDMyX3Qgc2VxTnVtID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVmZmVyLmJ1ZmZlcklkKTsKLSAgICAvLyBtZW1vcnkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIGhlYXBzIHRoYXQgaGF2ZSBiZWVuIHNldAotICAgIGlmIChtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gbWVtb3J5IG11c3QgYmUgd2l0aGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBoZWFwCi0gICAgc2l6ZV90IGhlYXBTaXplID0gbUhlYXBTaXplcy52YWx1ZUZvcihzZXFOdW0pOwotICAgIGlmIChoZWFwU2l6ZSA8IGJ1ZmZlci5vZmZzZXQgKyBidWZmZXIuc2l6ZSB8fAotICAgICAgICAgICAgU0laRV9NQVggLSBidWZmZXIub2Zmc2V0IDwgYnVmZmVyLnNpemUpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NjIyMTEyMyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNzaXplX3QgQ3J5cHRvSGFsOjpkZWNyeXB0KGNvbnN0IHVpbnQ4X3Qga2V5SWRbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKLSAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiAmcGF0dGVybiwKLSAgICAgICAgY29uc3QgOjpTaGFyZWRCdWZmZXIgJmhTb3VyY2UsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgY29uc3QgOjpEZXN0aW5hdGlvbkJ1ZmZlciAmaERlc3RpbmF0aW9uLCBBU3RyaW5nICplcnJvckRldGFpbE1zZykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBNb2RlIGhNb2RlOwotICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOgotICAgICAgICBoTW9kZSA9IE1vZGU6OlVORU5DUllQVEVEIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6Ci0gICAgICAgIGhNb2RlID0gTW9kZTo6QUVTX0NUUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjoKLSAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ0JDX0NUUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM6Ci0gICAgICAgIGhNb2RlID0gTW9kZTo6QUVTX0NCQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgUGF0dGVybiBoUGF0dGVybjsKLSAgICBoUGF0dGVybi5lbmNyeXB0QmxvY2tzID0gcGF0dGVybi5tRW5jcnlwdEJsb2NrczsKLSAgICBoUGF0dGVybi5za2lwQmxvY2tzID0gcGF0dGVybi5tU2tpcEJsb2NrczsKLQotICAgIHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3RkU3ViU2FtcGxlczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBTdWJTYW1wbGUgc3ViU2FtcGxlOwotICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGE7Ci0gICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhOwotICAgICAgICBzdGRTdWJTYW1wbGVzLnB1c2hfYmFjayhzdWJTYW1wbGUpOwotICAgIH0KLSAgICBhdXRvIGhTdWJTYW1wbGVzID0gaGlkbF92ZWM8U3ViU2FtcGxlPihzdGRTdWJTYW1wbGVzKTsKLQotICAgIGJvb2wgc2VjdXJlOwotICAgIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNoZWNrU2hhcmVkQnVmZmVyKGhEZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHNlY3VyZSA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoaERlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRSkgewotICAgICAgICBzZWN1cmUgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA1MjY3MDIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaFNvdXJjZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0gICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5kZWNyeXB0XzFfMihzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKLSAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKLSAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gYnl0ZXNXcml0dGVuOwotICAgIH0KLSAgICByZXR1cm4gZXJyOworYm9vbCBDcnlwdG9IYWw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgLy8gVGhpcyByZXF1aXJlcyBwbHVnaW4gdG8gYmUgY3JlYXRlZC4KKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbUNyeXB0b0hhbEFpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKIH0KIAogdm9pZCBDcnlwdG9IYWw6Om5vdGlmeVJlc29sdXRpb24odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICBtQ3J5cHRvSGFsQWlkbC0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW4tPm5vdGlmeVJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7Ci0gICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAibm90aWZ5UmVzb2x1dGlvbiB0eG4gZmFpbGVkICVzIiwgaFJlc3VsdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIG1DcnlwdG9IYWxIaWRsLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOwogfQogCi1zdGF0dXNfdCBDcnlwdG9IYWw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBDcnlwdG9IYWw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5zZXRNZWRpYURybVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPnNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOworfQogCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Citzc2l6ZV90IENyeXB0b0hhbDo6ZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiYgcGF0dGVybiwgY29uc3QgOjpTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyogZXJyb3JEZXRhaWxNc2cpIHsKKyAgICAvLyBUaGlzIHJlcXVpcmVzIHBsdWdpbiB0byBiZSBjcmVhdGVkLgorICAgIGlmIChtQ3J5cHRvSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+ZGVjcnlwdChrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2UsIG9mZnNldCwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgcmV0dXJuIG1DcnlwdG9IYWxIaWRsLT5kZWNyeXB0KGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sIHNvdXJjZSwgb2Zmc2V0LCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOworfQorCitpbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5zZXRIZWFwKGhlYXApOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+c2V0SGVhcChoZWFwKTsKK30KKwordm9pZCBDcnlwdG9IYWw6OnVuc2V0SGVhcChpbnQzMl90IHNlcU51bSkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICBtQ3J5cHRvSGFsQWlkbC0+dW5zZXRIZWFwKHNlcU51bSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7Ci0gICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworICAgIG1DcnlwdG9IYWxIaWRsLT51bnNldEhlYXAoc2VxTnVtKTsKIH0KIAotc3RhdHVzX3QgQ3J5cHRvSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworc3RhdHVzX3QgQ3J5cHRvSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPmdldExvZ01lc3NhZ2VzKGxvZ3MpOwogfQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZDFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWxBaWRsLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ3J5cHRvSGFsQWlkbCIKKworI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1VdGlscy5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkNyeXB0b1NjaGVtZXM7Cit1c2luZyBEZXN0aW5hdGlvbkJ1ZmZlckFpZGwgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQYXR0ZXJuOwordXNpbmcgU2hhcmVkQnVmZmVyQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2hhcmVkQnVmZmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN1YlNhbXBsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIE5hdGl2ZUhhbmRsZUFpZGxDb21tb24gPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RGVjcnlwdEFyZ3M7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjpzdGF0dXNBaWRsVG9TdGF0dXNUOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKKy8vIC0tLS0tLS1IaWRsIGludGVyZmFjZSByZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRPRE86IHJlcGxhY2UgYmVmb3JlIHJlbW92aW5nIGhpZGwgaW50ZXJmYWNlCisKK3VzaW5nIEJ1ZmZlclR5cGVIaWRsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgU2hhcmVkQnVmZmVySGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgRGVzdGluYXRpb25CdWZmZXJIaWRsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCeXRlID0gdWludDhfdD4KK3N0YXRpYyBzdGQ6OnZlY3RvcjxCeXRlPiB0b1N0ZFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgeworICAgIGF1dG8gdiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnl0ZSo+KHZlY3Rvci5hcnJheSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxCeXRlPiB2ZWModiwgdiArIHZlY3Rvci5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKKy8vIC0tLS0tLS1IaWRsIGludGVyZmFjZSByZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRPRE86IHJlcGxhY2UgYmVmb3JlIHJlbW92aW5nIGhpZGwgaW50ZXJmYWNlCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjpjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCBTaGFyZWRCdWZmZXJIaWRsJiBidWZmZXIpIHsKKyAgICBpbnQzMl90IHNlcU51bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlci5idWZmZXJJZCk7CisgICAgLy8gbWVtb3J5IG11c3QgYmUgaW4gb25lIG9mIHRoZSBoZWFwcyB0aGF0IGhhdmUgYmVlbiBzZXQKKyAgICBpZiAobUhlYXBTaXplcy5pbmRleE9mS2V5KHNlcU51bSkgPCAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIG1lbW9yeSBtdXN0IGJlIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgaGVhcAorICAgIHNpemVfdCBoZWFwU2l6ZSA9IG1IZWFwU2l6ZXMudmFsdWVGb3Ioc2VxTnVtKTsKKyAgICBpZiAoaGVhcFNpemUgPCBidWZmZXIub2Zmc2V0ICsgYnVmZmVyLnNpemUgfHwgU0laRV9NQVggLSBidWZmZXIub2Zmc2V0IDwgYnVmZmVyLnNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NjIyMTEyMyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBTaGFyZWRCdWZmZXJBaWRsIGhpZGxTaGFyZWRCdWZmZXJUb0FpZGxTaGFyZWRCdWZmZXIoY29uc3QgU2hhcmVkQnVmZmVySGlkbCYgYnVmZmVyKSB7CisgICAgU2hhcmVkQnVmZmVyQWlkbCBhaWRsc2I7CisgICAgYWlkbHNiLmJ1ZmZlcklkID0gYnVmZmVyLmJ1ZmZlcklkOworICAgIGFpZGxzYi5vZmZzZXQgPSBidWZmZXIub2Zmc2V0OworICAgIGFpZGxzYi5zaXplID0gYnVmZmVyLnNpemU7CisgICAgcmV0dXJuIGFpZGxzYjsKK30KKworc3RhdGljIERlc3RpbmF0aW9uQnVmZmVyQWlkbCBoaWRsRGVzdGluYXRpb25CdWZmZXJUb0FpZGxEZXN0aW5hdGlvbkJ1ZmZlcigKKyAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXJIaWRsJiBidWZmZXIpIHsKKyAgICBEZXN0aW5hdGlvbkJ1ZmZlckFpZGwgYWlkbGRiOworICAgIC8vIHNraXAgbmVnYXRpdmUgY29udmVydCBjaGVjayBhcyBjb3VudCBvZiBlbnVtIGVsZW1lbnRzIGFyZSAyCisgICAgc3dpdGNoKGJ1ZmZlci50eXBlKSB7CisgICAgICAgIGNhc2UgQnVmZmVyVHlwZUhpZGw6OlNIQVJFRF9NRU1PUlk6CisgICAgICAgICAgICBhaWRsZGIuc2V0PERlc3RpbmF0aW9uQnVmZmVyQWlkbDo6VGFnOjpub25zZWN1cmVNZW1vcnk+KAorICAgICAgICAgICAgICAgIGhpZGxTaGFyZWRCdWZmZXJUb0FpZGxTaGFyZWRCdWZmZXIoYnVmZmVyLm5vbnNlY3VyZU1lbW9yeSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdXRvIGhhbmRsZSA9IGJ1ZmZlci5zZWN1cmVNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgYWlkbGRiLnNldDxEZXN0aW5hdGlvbkJ1ZmZlckFpZGw6OlRhZzo6c2VjdXJlTWVtb3J5PigKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpkdXBUb0FpZGwoaGFuZGxlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE5hdGl2ZUhhbmRsZUFpZGxDb21tb24gZW1wdHloYW5kbGU7CisgICAgICAgICAgICAgICAgYWlkbGRiLnNldDxEZXN0aW5hdGlvbkJ1ZmZlckFpZGw6OlRhZzo6c2VjdXJlTWVtb3J5PigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGVtcHR5aGFuZGxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYWlkbGRiOworfQorCitzdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnJlc2l6ZShzaXplKTsKKyAgICBtZW1jcHkodmVjLmRhdGEoKSwgcHRyLCBzaXplKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IHRvVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2ZWMpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gdmVjdG9yOworICAgIHZlY3Rvci5hcHBlbmRBcnJheSh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+Kj4oJnZlY3Rvcik7Cit9CisKK3N0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKSB7CisgICAgcmV0dXJuIFN0cmluZzgoc3RyaW5nLmNfc3RyKCkpOworfQorCitzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9TdGRWZWMoY29uc3QgdWludDhfdCogcHRyLCBzaXplX3QgbikgeworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4ocHRyLCBwdHIgKyBuKTsKK30KKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLS0KKworYm9vbCBDcnlwdG9IYWxBaWRsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZEludGVybmFsKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGludCogZmFjdG9yeUlkeCkgeworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ3J5cHRvU2NoZW1lcyBzY2hlbWVze307CisgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCZzY2hlbWVzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmNvdW50KHNjaGVtZXMudXVpZHMuYmVnaW4oKSwgc2NoZW1lcy51dWlkcy5lbmQoKSwgdXVpZEFpZGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlJZHggIT0gTlVMTCkgKmZhY3RvcnlJZHggPSBpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitDcnlwdG9IYWxBaWRsOjpDcnlwdG9IYWxBaWRsKCkKKyAgICA6IG1GYWN0b3JpZXMoRHJtVXRpbHM6Om1ha2VEcm1GYWN0b3JpZXNBaWRsKCkpLAorICAgICAgbUluaXRDaGVjaygobUZhY3Rvcmllcy5zaXplKCkgPT0gMCkgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE5PX0lOSVQpLAorICAgICAgbUhlYXBTZXFOdW0oMCkge30KKworQ3J5cHRvSGFsQWlkbDo6fkNyeXB0b0hhbEFpZGwoKSB7fQorCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsQWlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRJbnRlcm5hbCh1dWlkLCBOVUxMKTsKK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsQWlkbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhQWlkbCA9IHRvU3RkVmVjKHRvVmVjdG9yKHRvSGlkbFZlYyhkYXRhLCBzaXplKSkpOworICAgIGludCBpID0gMDsKKyAgICBpZiAoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRJbnRlcm5hbCh1dWlkLCAmaSkpIHsKKyAgICAgICAgbVBsdWdpbiA9IG1ha2VDcnlwdG9QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZEFpZGwsIGRhdGFBaWRsKTsKKyAgICB9CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOworICAgIH0KKworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SUNyeXB0b1BsdWdpbkFpZGw+IENyeXB0b0hhbEFpZGw6Om1ha2VDcnlwdG9QbHVnaW4oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+JiBmYWN0b3J5LCBjb25zdCBVdWlkJiB1dWlkQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5pdERhdGEpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUNyeXB0b1BsdWdpbkFpZGw+IHBsdWdpbkFpZGw7CisgICAgaWYgKGZhY3RvcnktPmNyZWF0ZUNyeXB0b1BsdWdpbih1dWlkQWlkbCwgaW5pdERhdGEsICZwbHVnaW5BaWRsKS5pc09rKCkpIHsKKyAgICAgICAgQUxPR0koIkNyZWF0ZSBJQ3J5cHRvUGx1Z2luQWlkbC4gVVVJRDpbJXNdIiwgdXVpZEFpZGwudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIElDcnlwdG9QbHVnaW5BaWRsLiBVVUlEOlslc10iLCB1dWlkQWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBwbHVnaW5BaWRsOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjpkZXN0cm95UGx1Z2luKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBtUGx1Z2luLnJlc2V0KCk7CisgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENyeXB0b0hhbEFpZGw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lU3RyID0gc3RkOjpzdHJpbmcobWltZSk7CisgICAgYm9vbCByZXN1bHQ7CisgICAgaWYgKCFtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZVN0ciwgJnJlc3VsdCkuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50LiBtaW1lOlslc10iLCBtaW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ3J5cHRvSGFsQWlkbDo6bm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IGFmdGVyIHR5cGUgY29udmVyc2lvbgorICAgIC8vIExvZyBlcnJvciBhbmQgcmV0dXJuIGlmIGFueSBpcyBuZWdhdGl2ZQorICAgIGlmICgoaW50MzJfdCl3aWR0aCA8IDAgfHwgKGludDMyX3QpaGVpZ2h0IDwgMCkgeworICAgICAgICBBTE9HRSgiTmVnYXRpdmUgd2lkdGg6ICVkIG9yIGhlaWdodCAlZCBpbiBub3RpZnlSZXNvbHV0aW9uIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgibm90aWZ5UmVzb2x1dGlvbiB0eG4gZmFpbGVkIHN0YXR1cyBjb2RlOiAlZCIsIHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEFpZGw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b1N0ZFZlYyhzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChlcnIpOworfQorCitzc2l6ZV90IENyeXB0b0hhbEFpZGw6OmRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlJZFsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVySGlkbCYgaFNvdXJjZSwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXJIaWRsJiBoRGVzdGluYXRpb24sIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIE1vZGUgYU1vZGU7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDoKKyAgICAgICAgICAgIGFNb2RlID0gTW9kZTo6VU5FTkNSWVBURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6CisgICAgICAgICAgICBhTW9kZSA9IE1vZGU6OkFFU19DVFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjoKKyAgICAgICAgICAgIGFNb2RlID0gTW9kZTo6QUVTX0NCQ19DVFM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM6CisgICAgICAgICAgICBhTW9kZSA9IE1vZGU6OkFFU19DQkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFBhdHRlcm4gYVBhdHRlcm47CisgICAgYVBhdHRlcm4uZW5jcnlwdEJsb2NrcyA9IHBhdHRlcm4ubUVuY3J5cHRCbG9ja3M7CisgICAgYVBhdHRlcm4uc2tpcEJsb2NrcyA9IHBhdHRlcm4ubVNraXBCbG9ja3M7CisKKyAgICBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN0ZFN1YlNhbXBsZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgU3ViU2FtcGxlIHN1YlNhbXBsZTsKKyAgICAgICAgc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgc3RkU3ViU2FtcGxlcy5wdXNoX2JhY2soc3ViU2FtcGxlKTsKKyAgICB9CisKKyAgICBib29sIHNlY3VyZTsKKyAgICBpZiAoaERlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZUhpZGw6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaERlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2VjdXJlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlSGlkbDo6TkFUSVZFX0hBTkRMRSkgeworICAgICAgICBzZWN1cmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA1MjY3MDIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaFNvdXJjZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZEFpZGwodG9TdGRWZWMoa2V5SWQsIDE2KSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaXZBaWRsKHRvU3RkVmVjKGl2LCAxNikpOworCisgICAgRGVjcnlwdEFyZ3MgYXJnczsKKyAgICBhcmdzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICBhcmdzLmtleUlkID0ga2V5SWRBaWRsOworICAgIGFyZ3MuaXYgPSBpdkFpZGw7CisgICAgYXJncy5tb2RlID0gYU1vZGU7CisgICAgYXJncy5wYXR0ZXJuID0gYVBhdHRlcm47CisgICAgYXJncy5zdWJTYW1wbGVzID0gc3RkOjptb3ZlKHN0ZFN1YlNhbXBsZXMpOworICAgIGFyZ3Muc291cmNlID0gaGlkbFNoYXJlZEJ1ZmZlclRvQWlkbFNoYXJlZEJ1ZmZlcihoU291cmNlKTsKKyAgICBhcmdzLm9mZnNldCA9IG9mZnNldDsKKyAgICBhcmdzLmRlc3RpbmF0aW9uID0gaGlkbERlc3RpbmF0aW9uQnVmZmVyVG9BaWRsRGVzdGluYXRpb25CdWZmZXIoaERlc3RpbmF0aW9uKTsKKworCisgICAgaW50MzJfdCByZXN1bHQgPSAwOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1c0FpZGwgPSBtUGx1Z2luLT5kZWNyeXB0KGFyZ3MsICZyZXN1bHQpOworCisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXNBaWRsKTsKKyAgICBzdGQ6OnN0cmluZyBtc2dTdHIoc3RhdHVzQWlkbC5nZXRNZXNzYWdlKCkpOworICAgIGlmIChlcnJvckRldGFpbE1zZyAhPSBudWxscHRyKSB7CisgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChtc2dTdHIpOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgb24gZGVjcnlwdCwgZXJyb3IgZGVzY3JpcHRpb246JXMiLCBzdGF0dXNBaWRsLmdldERlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50MzJfdCBDcnlwdG9IYWxBaWRsOjpzZXRIZWFwKGNvbnN0IHNwPEhpZGxNZW1vcnk+JiBoZWFwKSB7CisgICAgaWYgKGhlYXAgPT0gTlVMTCB8fCBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgQUxPR0UoInNldEhlYXAoKTogaGVhcCAlcCBtSGVhcFNlcU51bSAlZCIsIGhlYXAuZ2V0KCksIG1IZWFwU2VxTnVtKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50MzJfdCBzZXFOdW0gPSBtSGVhcFNlcU51bSsrOworICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcU51bSk7CisgICAgbUhlYXBTaXplcy5hZGQoc2VxTnVtLCBoZWFwLT5zaXplKCkpOworCisgICAgU2hhcmVkQnVmZmVyQWlkbCBtZW1BaWRsOworICAgIG1lbUFpZGwuaGFuZGxlID0gOjphbmRyb2lkOjpkdXBUb0FpZGwoaGVhcC0+aGFuZGxlKCkpOworICAgIG1lbUFpZGwuc2l6ZSA9IGhlYXAtPnNpemUoKTsKKyAgICBtZW1BaWRsLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisKKyAgICBhdXRvIHN0YXR1cyA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtQWlkbCk7CisgICAgICAgQUxPR0VfSUYoIXN0YXR1cy5pc09rKCksCisgICAgICAgICAgICAgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgcmV0dXJuIHNlcU51bTsKK30KKwordm9pZCBDcnlwdG9IYWxBaWRsOjp1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgcmVtb3RlIHNoYXJlZCBtZW1vcnkgbWFwcGluZyBieSBzZXR0aW5nIHRoZSBzaGFyZWQKKyAgICAgKiBidWZmZXIgYmFzZSB0byBhIG51bGwgaGlkbF9tZW1vcnkuCisgICAgICoKKyAgICAgKiBUT0RPOiBBZGQgYSByZWxlYXNlU2hhcmVkQnVmZmVyIG1ldGhvZCBpbiBhIGZ1dHVyZSBEUk0gSEFMCisgICAgICogQVBJIHZlcnNpb24gdG8gbWFrZSB0aGlzIGV4cGxpY2l0LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXFOdW0pOworICAgICAgICAgICAgU2hhcmVkQnVmZmVyQWlkbCBtZW1BaWRse307CisgICAgICAgICAgICBtZW1BaWRsLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBhdXRvIHN0YXR1cyA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtQWlkbCk7CisgICAgICAgICAgICBBTE9HRV9JRighc3RhdHVzLmlzT2soKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZXRTaGFyZWRCdWZmZXJCYXNlKCk6IHJlbW90ZSBjYWxsIGZhaWxlZCIpOworICAgICAgICB9CisgICAgICAgIG1IZWFwU2l6ZXMucmVtb3ZlSXRlbShzZXFOdW0pOworICAgIH0KK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsQWlkbDo6Z2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4mIGxvZ3MpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIC8vIE5lZWQgdG8gY29udmVydCBsb2dtZXNzYWdlCisKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzQWlkbDxJQ3J5cHRvUGx1Z2luQWlkbD4obVBsdWdpbiwgbG9ncyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbEhpZGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNyeXB0b0hhbEhpZGwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CisKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6dG9TdGF0dXNUOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgeworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICB2ZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPih2ZWN0b3IuYXJyYXkoKSksIHZlY3Rvci5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3Qgdm9pZCogcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICB2ZWMucmVzaXplKHNpemUpOworICAgIG1lbWNweSh2ZWMuZGF0YSgpLCBwdHIsIHNpemUpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3N0YXRpYyBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiB0b0hpZGxBcnJheTE2KGNvbnN0IHVpbnQ4X3QqIHB0cikgeworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PigpOworICAgIH0KKyAgICByZXR1cm4gaGlkbF9hcnJheTx1aW50OF90LCAxNj4ocHRyKTsKK30KKworc3RhdGljIFN0cmluZzggdG9TdHJpbmc4KGhpZGxfc3RyaW5nIGhTdHJpbmcpIHsKKyAgICByZXR1cm4gU3RyaW5nOChoU3RyaW5nLmNfc3RyKCkpOworfQorCitDcnlwdG9IYWxIaWRsOjpDcnlwdG9IYWxIaWRsKCkKKyAgICA6IG1GYWN0b3JpZXMobWFrZUNyeXB0b0ZhY3RvcmllcygpKSwKKyAgICAgIG1Jbml0Q2hlY2soKG1GYWN0b3JpZXMuc2l6ZSgpID09IDApID8gRVJST1JfVU5TVVBQT1JURUQgOiBOT19JTklUKSwKKyAgICAgIG1IZWFwU2VxTnVtKDApIHt9CisKK0NyeXB0b0hhbEhpZGw6On5DcnlwdG9IYWxIaWRsKCkge30KKworVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gQ3J5cHRvSGFsSGlkbDo6bWFrZUNyeXB0b0ZhY3RvcmllcygpIHsKKyAgICBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBmYWN0b3JpZXM7CisKKyAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CisgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgeworICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElDcnlwdG9GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElDcnlwdG9GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKKyAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhY3RvcmllczsKK30KKworc3A8SUNyeXB0b1BsdWdpbj4gQ3J5cHRvSGFsSGlkbDo6bWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDxJQ3J5cHRvRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgc3A8SUNyeXB0b1BsdWdpbj4gcGx1Z2luOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0KKyAgICAgICAgICAgIGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYWtlIGNyeXB0byBwbHVnaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gcGx1Z2luOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsSGlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEhpZGw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOworICAgIH0KKworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjpkZXN0cm95UGx1Z2luKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsSGlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGhSZXN1bHQ7Cit9CisKKy8qKgorICogSWYgdGhlIGhlYXAgYmFzZSBpc24ndCBzZXQsIGdldCB0aGUgaGVhcCBiYXNlIGZyb20gdGhlIEhpZGxNZW1vcnkKKyAqIGFuZCBzZW5kIGl0IHRvIHRoZSBIQUwgc28gaXQgY2FuIG1hcCBhIHJlbW90ZSBoZWFwIG9mIHRoZSBzYW1lCisgKiBzaXplLiAgT25jZSB0aGUgaGVhcCBiYXNlIGlzIGVzdGFibGlzaGVkLCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMKKyAqIGFyZSBzZW50IGJ5IHByb3ZpZGluZyBhbiBvZmZzZXQgaW50byB0aGUgaGVhcCBhbmQgYSBidWZmZXIgc2l6ZS4KKyAqLworaW50MzJfdCBDcnlwdG9IYWxIaWRsOjpzZXRIZWFwQmFzZShjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgIGlmIChoZWFwID09IE5VTEwgfHwgbUhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZWFwQmFzZSgpOiBoZWFwICVwIG1IZWFwU2VxTnVtICVkIiwgaGVhcC5nZXQoKSwgbUhlYXBTZXFOdW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7CisgICAgdWludDMyX3QgYnVmZmVySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VxTnVtKTsKKyAgICBtSGVhcFNpemVzLmFkZChzZXFOdW0sIGhlYXAtPnNpemUoKSk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoZWFwLCBidWZmZXJJZCk7CisgICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKKyAgICByZXR1cm4gc2VxTnVtOworfQorCit2b2lkIENyeXB0b0hhbEhpZGw6OmNsZWFySGVhcEJhc2UoaW50MzJfdCBzZXFOdW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgcmVtb3RlIHNoYXJlZCBtZW1vcnkgbWFwcGluZyBieSBzZXR0aW5nIHRoZSBzaGFyZWQKKyAgICAgKiBidWZmZXIgYmFzZSB0byBhIG51bGwgaGlkbF9tZW1vcnkuCisgICAgICoKKyAgICAgKiBUT0RPOiBBZGQgYSByZWxlYXNlU2hhcmVkQnVmZmVyIG1ldGhvZCBpbiBhIGZ1dHVyZSBEUk0gSEFMCisgICAgICogQVBJIHZlcnNpb24gdG8gbWFrZSB0aGlzIGV4cGxpY2l0LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXFOdW0pOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKGhpZGxfbWVtb3J5KCksIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgbUhlYXBTaXplcy5yZW1vdmVJdGVtKHNlcU51bSk7CisgICAgfQorfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjpjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCA6OlNoYXJlZEJ1ZmZlciYgYnVmZmVyKSB7CisgICAgaW50MzJfdCBzZXFOdW0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihidWZmZXIuYnVmZmVySWQpOworICAgIC8vIG1lbW9yeSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgaGVhcHMgdGhhdCBoYXZlIGJlZW4gc2V0CisgICAgaWYgKG1IZWFwU2l6ZXMuaW5kZXhPZktleShzZXFOdW0pIDwgMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBtZW1vcnkgbXVzdCBiZSB3aXRoaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGhlYXAKKyAgICBzaXplX3QgaGVhcFNpemUgPSBtSGVhcFNpemVzLnZhbHVlRm9yKHNlcU51bSk7CisgICAgaWYgKGhlYXBTaXplIDwgYnVmZmVyLm9mZnNldCArIGJ1ZmZlci5zaXplIHx8IFNJWkVfTUFYIC0gYnVmZmVyLm9mZnNldCA8IGJ1ZmZlci5zaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzYyMjExMjMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IENyeXB0b0hhbEhpZGw6OmRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlJZFsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXImIGhTb3VyY2UsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXImIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nKiBlcnJvckRldGFpbE1zZykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBNb2RlIGhNb2RlOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIENyeXB0b1BsdWdpbjo6a01vZGVfVW5lbmNyeXB0ZWQ6CisgICAgICAgICAgICBoTW9kZSA9IE1vZGU6OlVORU5DUllQVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOgorICAgICAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ1RSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1Y6CisgICAgICAgICAgICBoTW9kZSA9IE1vZGU6OkFFU19DQkNfQ1RTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDOgorICAgICAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ0JDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBQYXR0ZXJuIGhQYXR0ZXJuOworICAgIGhQYXR0ZXJuLmVuY3J5cHRCbG9ja3MgPSBwYXR0ZXJuLm1FbmNyeXB0QmxvY2tzOworICAgIGhQYXR0ZXJuLnNraXBCbG9ja3MgPSBwYXR0ZXJuLm1Ta2lwQmxvY2tzOworCisgICAgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdGRTdWJTYW1wbGVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7CisgICAgICAgIFN1YlNhbXBsZSBzdWJTYW1wbGU7CisgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhID0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIHN0ZFN1YlNhbXBsZXMucHVzaF9iYWNrKHN1YlNhbXBsZSk7CisgICAgfQorICAgIGF1dG8gaFN1YlNhbXBsZXMgPSBoaWRsX3ZlYzxTdWJTYW1wbGU+KHN0ZFN1YlNhbXBsZXMpOworCisgICAgYm9vbCBzZWN1cmU7CisgICAgaWYgKGhEZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaERlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2VjdXJlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFKSB7CisgICAgICAgIHNlY3VyZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDUyNjcwMiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjaGVja1NoYXJlZEJ1ZmZlcihoU291cmNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmRlY3J5cHRfMV8yKAorICAgICAgICAgICAgICAgIHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yRGV0YWlsTXNnICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JEZXRhaWxNc2cgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ3J5cHRvSGFsSGlkbDo6bm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGhSZXN1bHQgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgIm5vdGlmeVJlc29sdXRpb24gdHhuIGZhaWxlZCAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsSGlkbDo6c2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbVBsdWdpbi0+c2V0TWVkaWFEcm1TZXNzaW9uKHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gZXJyLmlzT2soKSA/IHRvU3RhdHVzVChlcnIpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEhpZGw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+JiBsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzPGRybTo6VjFfNDo6SUNyeXB0b1BsdWdpbj4obVBsdWdpbiwgbG9ncyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCA0MGQxZTBjLi5jMzk0ZDVhIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMTcsMTU1NyArMTcsMjgwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkRybUhhbCIKIAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgotI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWwuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsQWlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbEhpZGwuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLXVzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Ci11c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwotdXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Ci11c2luZyBkcm06OlYxXzI6OktleVNldElkOwotdXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6dG9TdGF0dXNUOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Ci10eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwotdHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKLQotbmFtZXNwYWNlIHsKLQotLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudAotLy8gaW4gdGhlIE1lZGlhRHJtIEFQSS4KLWNvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOwotY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCi0gICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCi0gICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KLSAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7Ci0gICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOwotICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCi0gICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotI2RlZmluZSBJTklUX0NIRUNLKCkge2lmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazt9Ci0KLXN0YXRpYyBjb25zdCBWZWN0b3I8dWludDhfdD4gdG9WZWN0b3IoY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgewotICAgIFZlY3Rvcjx1aW50OF90PiB2ZWN0b3I7Ci0gICAgdmVjdG9yLmFwcGVuZEFycmF5KHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOwotICAgIHJldHVybiAqY29uc3RfY2FzdDxjb25zdCBWZWN0b3I8dWludDhfdD4gKj4oJnZlY3Rvcik7CitEcm1IYWw6OkRybUhhbCgpIHsKKyAgICBtRHJtSGFsSGlkbCA9IHNwPERybUhhbEhpZGw+OjptYWtlKCk7CisgICAgbURybUhhbEFpZGwgPSBzcDxEcm1IYWxBaWRsPjo6bWFrZSgpOwogfQogCi1zdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwotICAgIHZlYy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPih2ZWN0b3IuYXJyYXkoKSksIHZlY3Rvci5zaXplKCkpOwotICAgIHJldHVybiB2ZWM7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChjb25zdCBoaWRsX3N0cmluZyAmc3RyaW5nKSB7Ci0gICAgcmV0dXJuIFN0cmluZzgoc3RyaW5nLmNfc3RyKCkpOwotfQotCi1zdGF0aWMgaGlkbF9zdHJpbmcgdG9IaWRsU3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZykgewotICAgIHJldHVybiBoaWRsX3N0cmluZyhzdHJpbmcuc3RyaW5nKCkpOwotfQotCi1zdGF0aWMgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHRvU2VjdXJpdHlMZXZlbChTZWN1cml0eUxldmVsIGxldmVsKSB7Ci0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKLSAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE86Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG87Ci0gICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247Ci0gICAgfQotfQotCi1zdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0hpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgewotICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgotICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86Ci0gICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgotICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047Ci0gICAgfQotfQotCi1zdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKLSAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKLSAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7Ci0gICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOwotICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlUmVsZWFzZWQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOwotICAgIH0KLX0KLQotc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7Ci0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7Ci0gICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMTsKLSAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMjoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8yOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8zOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwotICAgIH0KLX0KLXN0YXRpYyA6OktleWVkVmVjdG9yIHRvSGlkbEtleWVkVmVjdG9yKGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JgotICAgICAgICBrZXllZFZlY3RvcikgewotICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBzdGRLZXllZFZlY3RvcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleWVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEtleVZhbHVlIGtleVZhbHVlOwotICAgICAgICBrZXlWYWx1ZS5rZXkgPSB0b0hpZGxTdHJpbmcoa2V5ZWRWZWN0b3Iua2V5QXQoaSkpOwotICAgICAgICBrZXlWYWx1ZS52YWx1ZSA9IHRvSGlkbFN0cmluZyhrZXllZFZlY3Rvci52YWx1ZUF0KGkpKTsKLSAgICAgICAgc3RkS2V5ZWRWZWN0b3IucHVzaF9iYWNrKGtleVZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6S2V5ZWRWZWN0b3Ioc3RkS2V5ZWRWZWN0b3IpOwotfQotCi1zdGF0aWMgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gdG9LZXllZFZlY3Rvcihjb25zdCA6OktleWVkVmVjdG9yJgotICAgICAgICBoS2V5ZWRWZWN0b3IpIHsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBrZXllZFZlY3RvcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXllZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICBrZXllZFZlY3Rvci5hZGQodG9TdHJpbmc4KGhLZXllZFZlY3RvcltpXS5rZXkpLAotICAgICAgICAgICAgICAgIHRvU3RyaW5nOChoS2V5ZWRWZWN0b3JbaV0udmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGtleWVkVmVjdG9yOwotfQotCi1zdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mCi0gICAgICAgIGhTZWN1cmVTdG9wcykgewotICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgewotICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlY3VyZVN0b3BzOwotfQotCi1zdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+JgotICAgICAgICBoU2VjdXJlU3RvcElkcykgewotICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaFNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BJZHNbaV0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7Ci19Ci0KLXN0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgotICAgICAgICBoS2V5U2V0SWRzKSB7Ci0gICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBrZXlTZXRJZHM7Ci19Ci0KLU11dGV4IERybUhhbDo6bUxvY2s7Ci0KLXN0cnVjdCBEcm1IYWw6OkRybVNlc3Npb25DbGllbnQgOiBwdWJsaWMgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKLSAgICBleHBsaWNpdCBEcm1TZXNzaW9uQ2xpZW50KERybUhhbCogZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKLSAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLAotICAgICAgICBtRHJtKGRybSkge30KLQotICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkOwotCi0gICAgdmlydHVhbCB+RHJtU2Vzc2lvbkNsaWVudCgpOwotCi1wcml2YXRlOgotICAgIHdwPERybUhhbD4gbURybTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVNlc3Npb25DbGllbnQpOwotfTsKLQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsOjpEcm1TZXNzaW9uQ2xpZW50OjpyZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXV0byBzZXNzaW9uSWQgPSBtU2Vzc2lvbklkOwotICAgIHNwPERybUhhbD4gZHJtID0gbURybS5wcm9tb3RlKCk7Ci0gICAgaWYgKGRybSA9PSBOVUxMKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgZHJtLT5zZW5kRXZlbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci19Ci0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6Z2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgc3A8RHJtSGFsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKLSAgICBpZiAoZHJtID09IE5VTEwpIHsKLSAgICAgICAgbmFtZS5hcHBlbmQoIjxkZWxldGVkPiIpOwotICAgIH0gZWxzZSBpZiAoZHJtLT5nZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCBuYW1lKSAhPSBPSwotICAgICAgICB8fCBuYW1lLmlzRW1wdHkoKSkgewotICAgICAgbmFtZS5hcHBlbmQoIjxHZXQgdmVuZG9yIGZhaWxlZCBvciBpcyBlbXB0eT4iKTsKLSAgICB9Ci0gICAgbmFtZS5hcHBlbmQoIlsiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uSWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbmFtZS5hcHBlbmRGb3JtYXQoIiUwMngiLCBtU2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgbmFtZS5hcHBlbmQoIl0iKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gbmFtZTsKLSAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci19Ci0KLURybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7Ci0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Ci19Ci0KLURybUhhbDo6RHJtSGFsKCkKLSAgIDogbUZhY3RvcmllcyhtYWtlRHJtRmFjdG9yaWVzKCkpLAotICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkgewotfQotCi12b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0tPm1TZXNzaW9uSWQpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKLX0KLQotRHJtSGFsOjp+RHJtSGFsKCkgewotfQotCi12b2lkIERybUhhbDo6Y2xlYW51cCgpIHsKLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7Ci0KLSAgICBzZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLSAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVBsdWdpbi5jbGVhcigpOwotICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7Ci0gICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKLSAgICBtUGx1Z2luVjFfNC5jbGVhcigpOwotfQotCi1zdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKLSAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBmYWN0b3JpZXMoRHJtVXRpbHM6Ok1ha2VEcm1GYWN0b3JpZXMoKSk7Ci0gICAgaWYgKGZhY3Rvcmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBtdXN0IGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQotICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKLSAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7Ci0gICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUoIkZhaWxlZCB0byBmaW5kIGFueSBkcm0gZmFjdG9yaWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcmllczsKLX0KLQotc3A8SURybVBsdWdpbj4gRHJtSGFsOjptYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKLSAgICBtQXBwUGFja2FnZU5hbWUgPSBhcHBQYWNrYWdlTmFtZTsKLSAgICBtTWV0cmljcy5TZXRBcHBQYWNrYWdlTmFtZShhcHBQYWNrYWdlTmFtZSk7Ci0gICAgbU1ldHJpY3MuU2V0QXBwVWlkKEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7Ci0KLSAgICBzcDxJRHJtUGx1Z2luPiBwbHVnaW47Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8SURybVBsdWdpbj4mIGhQbHVnaW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBsdWdpbiA9IGhQbHVnaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBsdWdpbjsKLX0KK0RybUhhbDo6fkRybUhhbCgpIHt9CiAKIHN0YXR1c190IERybUhhbDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0sgfHwgbURybUhhbEhpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gT0s7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBOT19JTklUIHx8IG1Ecm1IYWxIaWRsLT5pbml0Q2hlY2soKSA9PSBOT19JTklUKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmluaXRDaGVjaygpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRXZlbnRMb2NrKTsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICByZXR1cm4gTk9fRVJST1I7CitzdGF0dXNfdCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwgYm9vbCogcmVzdWx0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0OworICAgIHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSwgc2VjdXJpdHlMZXZlbCwgcmVzdWx0KTsKKyAgICBpZiAoKnJlc3VsdCkgcmV0dXJuIHN0YXR1c1Jlc3VsdDsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlLCBzZWN1cml0eUxldmVsLCByZXN1bHQpOwogfQogCi1SZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kRXZlbnQoRXZlbnRUeXBlIGhFdmVudFR5cGUsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgbU1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoaEV2ZW50VHlwZSk7Ci0KLSAgICBtRXZlbnRMb2NrLmxvY2soKTsKLSAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKLSAgICBtRXZlbnRMb2NrLnVubG9jaygpOwotCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOwotICAgICAgICBEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGU7Ci0gICAgICAgIHN3aXRjaChoRXZlbnRUeXBlKSB7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpLRVlfTkVFREVEOgotICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlOZWVkZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFdmVudFR5cGU6OktFWV9FWFBJUkVEOgotICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlFeHBpcmVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRDoKLSAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQ6Ci0gICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25SZWNsYWltZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRFeHBpcmF0aW9uVXBkYXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzX1YxXzA+JiBrZXlTdGF0dXNMaXN0X1YxXzAsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7Ci0gICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlTdGF0dXNWZWM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZrZXlTdGF0dXNfVjFfMCA6IGtleVN0YXR1c0xpc3RfVjFfMCkgewotICAgICAgICBrZXlTdGF0dXNWZWMucHVzaF9iYWNrKHtrZXlTdGF0dXNfVjFfMC5rZXlJZCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxLZXlTdGF0dXNUeXBlPihrZXlTdGF0dXNfVjFfMC50eXBlKX0pOwotICAgIH0KLSAgICBoaWRsX3ZlYzxLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3RfVjFfMihrZXlTdGF0dXNWZWMpOwotICAgIHJldHVybiBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0X1YxXzIsIGhhc05ld1VzYWJsZUtleSk7Ci19Ci0KLVJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBoS2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7Ci0gICAgICAgIHNpemVfdCBuS2V5cyA9IGhLZXlTdGF0dXNMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBLZXlTdGF0dXMgJmtleVN0YXR1cyA9IGhLZXlTdGF0dXNMaXN0W2ldOwotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIHN3aXRjaChrZXlTdGF0dXMudHlwZSkgewotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEU6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOgotICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0V4cGlyZWQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQ6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfT3V0cHV0Tm90QWxsb3dlZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKLSAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKLSAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9Vc2FibGVJbkZ1dHVyZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfSW50ZXJuYWxFcnJvcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleVN0YXR1c0xpc3QucHVzaF9iYWNrKHt0eXBlLCBrZXlTdGF0dXMua2V5SWR9KTsKLSAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChrZXlTdGF0dXMudHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBsaXN0ZW5lci4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gY291bnQgdGhlIGtleSBjaGFuZ2UKLSAgICAgICAgLy8gZXZlbnRzLgotICAgICAgICBzaXplX3QgbktleXMgPSBoS2V5U3RhdHVzTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7IGkrKykgewotICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGhLZXlTdGF0dXNMaXN0W2ldLnR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOwotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1zdGF0dXNfdCBEcm1IYWw6Om1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLQotICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCi0gICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSA9PSAiIikgewotICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeT4gZmFjdG9yeVYxXzIgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpjYXN0RnJvbShmYWN0b3J5KTsKLSAgICBpZiAoZmFjdG9yeVYxXzIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeVYxXzItPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLAotICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLAotICAgICAgICAgICAgICAgICAgICB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBhdXRvIGhSZXN1bHQgPSBtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKLSAgICAgICAgaWYgKGhSZXN1bHQuaXNPaygpICYmIGhSZXN1bHQpIHsKLSAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwotICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKLSAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7Ci0gICAgICAgICAgICAgICAgbVBsdWdpblYxXzQgPSBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgewotICAgICAgICBEcm1VdGlsczo6TE9HMkJFKHV1aWQsICJObyBzdXBwb3J0ZWQgaGFsIGluc3RhbmNlIGZvdW5kIik7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgICAgICBtUGx1Z2luLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOwotICAgICAgICAgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbHVnaW5WMV80LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOworc3RhdHVzX3QgRHJtSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXNSZXN1bHQ7CisgICAgc3RhdHVzUmVzdWx0ID0gbURybUhhbEFpZGwtPmNyZWF0ZVBsdWdpbih1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgaWYgKHN0YXR1c1Jlc3VsdCAhPSBPSykgcmV0dXJuIG1Ecm1IYWxIaWRsLT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgIHJldHVybiBzdGF0dXNSZXN1bHQ7CiB9CiAKIHN0YXR1c190IERybUhhbDo6ZGVzdHJveVBsdWdpbigpIHsKLSAgICBjbGVhbnVwKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIHN0YXR1c190IHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5kZXN0cm95UGx1Z2luKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0SGlkbCA9IG1Ecm1IYWxIaWRsLT5kZXN0cm95UGx1Z2luKCk7CisgICAgaWYgKHN0YXR1c1Jlc3VsdCAhPSBPSykgcmV0dXJuIHN0YXR1c1Jlc3VsdDsKKyAgICByZXR1cm4gc3RhdHVzUmVzdWx0SGlkbDsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsID0gdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCk7Ci0gICAgYm9vbCBzZXRTZWN1cml0eUxldmVsID0gdHJ1ZTsKLQotICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4KSB7Ci0gICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoaFNlY3VyaXR5TGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgIGVyciA9IFVOS05PV05fRVJST1I7Ci0gICAgYm9vbCByZXRyeSA9IHRydWU7Ci0gICAgZG8gewotICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOwotCi0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotICAgICAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCB8fCAhc2V0U2VjdXJpdHlMZXZlbCkgewotICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cyxjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+b3BlblNlc3Npb25fMV8xKGhTZWN1cml0eUxldmVsLAotICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSB0b1ZlY3RvcihpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlcnIgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfRFJNX1JFU09VUkNFX0JVU1kgJiYgcmV0cnkpIHsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgLy8gcmVjbGFpbVNlc3Npb24gbWF5IGNhbGwgYmFjayB0byBjbG9zZVNlc3Npb24sIHNpbmNlIG1Mb2NrIGlzCi0gICAgICAgICAgICAvLyBzaGFyZWQgYmV0d2VlbiBEcm0gaW5zdGFuY2VzLCB3ZSBzaG91bGQgdW5sb2NrIGhlcmUgdG8gYXZvaWQKLSAgICAgICAgICAgIC8vIGRlYWRsb2NrLgotICAgICAgICAgICAgcmV0cnkgPSBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVjbGFpbVNlc3Npb24oQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHJ5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXRyeSk7Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxEcm1TZXNzaW9uQ2xpZW50Pih0aGlzLCBzZXNzaW9uSWQpOwotICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+YWRkU2Vzc2lvbihBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KGNsaWVudCksIHNlc3Npb25JZCk7Ci0gICAgICAgIG1PcGVuU2Vzc2lvbnMucHVzaF9iYWNrKGNsaWVudCk7Ci0gICAgICAgIG1NZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQpOwotICAgIH0KLQotICAgIG1NZXRyaWNzLm1PcGVuU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6b3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsIFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5vcGVuU2Vzc2lvbihzZWN1cml0eUxldmVsLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+b3BlblNlc3Npb24oc2VjdXJpdHlMZXZlbCwgc2Vzc2lvbklkKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7Ci0gICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBtT3BlblNlc3Npb25zLmJlZ2luKCk7IGkgIT0gbU9wZW5TZXNzaW9ucy5lbmQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLmVyYXNlKGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOwotICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiB9CiAKLXN0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGUoCi0gICAgICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7Ci0gICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CitzdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCYgbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUqIGtleVJlcXVlc3RUeXBlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzLCByZXF1ZXN0LCBkZWZhdWx0VXJsLCBrZXlSZXF1ZXN0VHlwZSk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIGRlZmF1bHRVcmwsIGtleVJlcXVlc3RUeXBlKTsKIH0KIAotc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV8xXzEoCi0gICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKLSAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKLSAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CitzdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnByb3ZpZGVLZXlSZXNwb25zZShzZXNzaW9uSWQsIHJlc3BvbnNlLCBrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5wcm92aWRlS2V5UmVzcG9uc2Uoc2Vzc2lvbklkLCByZXNwb25zZSwga2V5U2V0SWQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLAotICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwgS2V5ZWRWZWN0b3I8U3RyaW5nOCwKLSAgICAgICAgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsLCBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEtleVR5cGUgaEtleVR5cGU7Ci0gICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKLSAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7Ci0gICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgewotICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7Ci0gICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgewotICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KAotICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAotICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZW1vdmVLZXlzKGtleVNldElkKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbW92ZUtleXMoa2V5U2V0SWQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnByb3ZpZGVLZXlSZXNwb25zZSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhyZXNwb25zZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhLZXlTZXRJZCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCA9IHRvVmVjdG9yKGhLZXlTZXRJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAga2V5UmVzcG9uc2VUaW1lci5TZXRBdHRyaWJ1dGUoZXJyKTsKLSAgICByZXR1cm4gZXJyOworc3RhdHVzX3QgRHJtSGFsOjpyZXN0b3JlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+cmVzdG9yZUtleXMoc2Vzc2lvbklkLCBrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZXN0b3JlS2V5cyhzZXNzaW9uSWQsIGtleVNldElkKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpxdWVyeUtleVN0YXR1cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPnF1ZXJ5S2V5U3RhdHVzKHNlc3Npb25JZCwgaW5mb01hcCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5xdWVyeUtleVN0YXR1cyhzZXNzaW9uSWQsIGluZm9NYXApOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+cmVzdG9yZUtleXModG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKLSAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCYgY2VydFR5cGUsIFN0cmluZzggY29uc3QmIGNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRQcm92aXNpb25SZXF1ZXN0KGNlcnRUeXBlLCBjZXJ0QXV0aG9yaXR5LCByZXF1ZXN0LCBkZWZhdWx0VXJsKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3Zpc2lvblJlcXVlc3QoY2VydFR5cGUsIGNlcnRBdXRob3JpdHksIHJlcXVlc3QsIGRlZmF1bHRVcmwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIDo6S2V5ZWRWZWN0b3IgaEluZm9NYXA7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5xdWVyeUtleVN0YXR1cyh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG1hcCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBpbmZvTWFwID0gdG9LZXllZFZlY3RvcihtYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShyZXNwb25zZSwgY2VydGlmaWNhdGUsIHdyYXBwZWRLZXkpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0ICZjZXJ0VHlwZSwKLSAgICAgICAgU3RyaW5nOCBjb25zdCAmY2VydEF1dGhvcml0eSwgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgbU1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChlcnIpOwotICAgIHJldHVybiBlcnI7CitzdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UodG9IaWRsVmVjKHJlc3BvbnNlKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaENlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFdyYXBwZWRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgPSB0b1ZlY3RvcihoQ2VydGlmaWNhdGUpOwotICAgICAgICAgICAgICAgICAgICB3cmFwcGVkS2V5ID0gdG9WZWN0b3IoaFdyYXBwZWRLZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgbU1ldHJpY3MubVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIuSW5jcmVtZW50KGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BJZHMpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyZVN0b3BJZHMoc2VjdXJlU3RvcElkcyk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTZWN1cmVTdG9wSWRzKHNlY3VyZVN0b3BJZHMpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFNlY3VyZVN0b3BzKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3A+JiBoU2VjdXJlU3RvcHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcHMgPSB0b1NlY3VyZVN0b3BzKGhTZWN1cmVTdG9wcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0U2VjdXJlU3RvcChzc2lkLCBzZWN1cmVTdG9wKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFNlY3VyZVN0b3Aoc3NpZCwgc2VjdXJlU3RvcCk7CiB9CiAKLQotc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyZVN0b3BJZHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiYgaFNlY3VyZVN0b3BJZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhoU2VjdXJlU3RvcElkcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NSZWxlYXNlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZWxlYXNlU2VjdXJlU3RvcHMoc3NSZWxlYXNlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbGVhc2VTZWN1cmVTdG9wcyhzc1JlbGVhc2UpOwogfQogCi0KLXN0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcCh0b0hpZGxWZWMoc3NpZCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgU2VjdXJlU3RvcCYgaFNlY3VyZVN0b3ApIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcCA9IHRvVmVjdG9yKGhTZWN1cmVTdG9wLm9wYXF1ZURhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7Ci0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgU2VjdXJlU3RvcFJlbGVhc2Ugc2VjdXJlU3RvcFJlbGVhc2U7Ci0gICAgICAgIHNlY3VyZVN0b3BSZWxlYXNlLm9wYXF1ZURhdGEgPSB0b0hpZGxWZWMoc3NSZWxlYXNlKTsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpblYxXzEtPnJlbGVhc2VTZWN1cmVTdG9wcyhzZWN1cmVTdG9wUmVsZWFzZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpbi0+cmVsZWFzZVNlY3VyZVN0b3AodG9IaWRsVmVjKHNzUmVsZWFzZSkpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NpZCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbW92ZVNlY3VyZVN0b3Aoc3NpZCk7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7Ci0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpblYxXzEtPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpbi0+cmVsZWFzZUFsbFNlY3VyZVN0b3BzKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZW1vdmVBbGxTZWN1cmVTdG9wcygpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZCwKLSAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247Ci0gICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKLSAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwqIGNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXhMZXZlbCkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0SGRjcExldmVscyhjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0SGRjcExldmVscyhjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKm9wZW4sIHVpbnQzMl90ICptYXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIGlmIChvcGVuID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgICpvcGVuID0gMDsKLSAgICAqbWF4ID0gMDsKLQotICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXROdW1iZXJPZlNlc3Npb25zKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhPcGVuLCB1aW50MzJfdCBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvcGVuID0gaE9wZW47Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSBoTWF4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QqIGN1cnJlbnRTZXNzaW9ucywgdWludDMyX3QqIG1heFNlc3Npb25zKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXROdW1iZXJPZlNlc3Npb25zKGN1cnJlbnRTZXNzaW9ucywgbWF4U2Vzc2lvbnMpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0TnVtYmVyT2ZTZXNzaW9ucyhjdXJyZW50U2Vzc2lvbnMsIG1heFNlc3Npb25zKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBpZiAobGV2ZWwgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgICpsZXZlbCA9IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0U2VjdXJpdHlMZXZlbCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBTZWN1cml0eUxldmVsIGhMZXZlbCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwoaExldmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKLQotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCogbGV2ZWwpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBsZXZlbCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgbGV2ZWwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleVNldElkcyA9IHRvS2V5U2V0SWRzKGhLZXlTZXRJZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYga2V5U2V0SWRzKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhrZXlTZXRJZHMpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAotICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKHRvSGlkbFZlYyhrZXlTZXRJZCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoaExpY2Vuc2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCBsaWNlbnNlU3RhdGUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZCwgbGljZW5zZVN0YXRlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKK3N0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFByb3BlcnR5U3RyaW5nKG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3BlcnR5U3RyaW5nKG5hbWUsIHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQotICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eVN0cmluZyh0b0hpZGxTdHJpbmcobmFtZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcmIGhWYWx1ZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvU3RyaW5nOChoVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFByb3BlcnR5Qnl0ZUFycmF5KG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3BlcnR5Qnl0ZUFycmF5KG5hbWUsIHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwobmFtZSwgdmFsdWUpOworc3RhdHVzX3QgRHJtSGFsOjpzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0UHJvcGVydHlTdHJpbmcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0UHJvcGVydHlTdHJpbmcobmFtZSwgdmFsdWUpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCi0gICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9WZWN0b3IoaFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKG5hbWUgPT0ga1Byb3BlcnR5RGV2aWNlVW5pcXVlSWQpIHsKLSAgICAgICAgbU1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0UHJvcGVydHlCeXRlQXJyYXkobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0UHJvcGVydHlCeXRlQXJyYXkobmFtZSwgdmFsdWUpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlTdHJpbmcodG9IaWRsU3RyaW5nKG5hbWUpLAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKHZhbHVlKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0TWV0cmljcyhjb25zdW1lcik7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRNZXRyaWNzKGNvbnN1bWVyKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlCeXRlQXJyYXkodG9IaWRsU3RyaW5nKG5hbWUpLAotICAgICAgICAgICAgdG9IaWRsVmVjKHZhbHVlKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0Q2lwaGVyQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnNldENpcGhlckFsZ29yaXRobShzZXNzaW9uSWQsIGFsZ29yaXRobSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0TWV0cmljcyhjb25zdCBzcDxJRHJtTWV0cmljc0NvbnN1bWVyPiAmY29uc3VtZXIpIHsKLSAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMOwotICAgIH0KLSAgICBjb25zdW1lci0+Y29uc3VtZUZyYW1ld29ya01ldHJpY3MobU1ldHJpY3MpOwotCi0gICAgLy8gQXBwZW5kIHZlbmRvciBtZXRyaWNzIGlmIHRoZXkgYXJlIHN1cHBvcnRlZC4KLSAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBTdHJpbmc4IHZlbmRvcjsKLSAgICAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKLSAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgIT0gT0sKLSAgICAgICAgICAgIHx8IHZlbmRvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKLSAgICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pICE9IE9LCi0gICAgICAgICAgICB8fCBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBBTE9HRSgiR2V0IGRlc2NyaXB0aW9uIGZhaWxlZCBvciBpcyBlbXB0eS4iKTsKLSAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKLSAgICAgICAgfQotICAgICAgICB2ZW5kb3IgKz0gIi4iOwotICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5nZXRNZXRyaWNzKAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gcGx1Z2luTWV0cmljcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRXJyb3IgZ2V0dGluZyBwbHVnaW4gbWV0cmljczogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5jb25zdW1lSGlkbE1ldHJpY3ModmVuZG9yLCBwbHVnaW5NZXRyaWNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CitzdGF0dXNfdCBEcm1IYWw6OnNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zZXRNYWNBbGdvcml0aG0oc2Vzc2lvbklkLCBhbGdvcml0aG0pOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0TWFjQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luLT5zZXRDaXBoZXJBbGdvcml0aG0odG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxTdHJpbmcoYWxnb3JpdGhtKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjplbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPmVuY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+ZW5jcnlwdChzZXNzaW9uSWQsIGtleUlkLCBpbnB1dCwgaXYsIG91dHB1dCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6c2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOwotICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6ZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGlucHV0LCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5kZWNyeXB0KHNlc3Npb25JZCwga2V5SWQsIGlucHV0LCBpdiwgb3V0cHV0KTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmRlY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZW5jcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhrZXlJZCksIHRvSGlkbFZlYyhpbnB1dCksIHRvSGlkbFZlYyhpdiksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG9WZWN0b3IoaE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6c2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6ZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBzdGF0dXNfdCAgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhrZXlJZCksIHRvSGlkbFZlYyhpbnB1dCksIHRvSGlkbFZlYyhpdiksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG9WZWN0b3IoaE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBtZXNzYWdlLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIG1hdGNoKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6c2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNpZ24odG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhTaWduYXR1cmUpICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRvVmVjdG9yKGhTaWduYXR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtRHJtSGFsQWlkbC0+c2lnblJTQShzZXNzaW9uSWQsIGFsZ29yaXRobSwgbWVzc2FnZSwgd3JhcHBlZEtleSwgc2lnbmF0dXJlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnNpZ25SU0Eoc2Vzc2lvbklkLCBhbGdvcml0aG0sIG1lc3NhZ2UsIHdyYXBwZWRLZXksIHNpZ25hdHVyZSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLCBib29sICZtYXRjaCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnZlcmlmeSh0b0hpZGxWZWMoc2Vzc2lvbklkKSx0b0hpZGxWZWMoa2V5SWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKG1lc3NhZ2UpLCB0b0hpZGxWZWMoc2lnbmF0dXJlKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBib29sIGhNYXRjaCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGhNYXRjaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+c2lnblJTQSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFN0cmluZyhhbGdvcml0aG0pLCB0b0hpZGxWZWMobWVzc2FnZSksIHRvSGlkbFZlYyh3cmFwcGVkS2V5KSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFNpZ25hdHVyZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihoU2lnbmF0dXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZSwgcmVxdWlyZWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyKG1pbWUsIHJlcXVpcmVkKTsKIH0KIAotc3RkOjpzdHJpbmcgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwbHVnaW5NZXRyaWNzKSBjb25zdAotewotICAgIG1lZGlhbWV0cmljc19oYW5kbGVfdCBpdGVtKG1lZGlhbWV0cmljc19jcmVhdGUoIm1lZGlhZHJtIikpOwotICAgIG1lZGlhbWV0cmljc19zZXRVaWQoaXRlbSwgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOwotICAgIFN0cmluZzggdmVuZG9yOwotICAgIFN0cmluZzggZGVzY3JpcHRpb247Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHZlbmRvciBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwotICAgIHJlc3VsdCA9IG1NZXRyaWNzLkdldFNlcmlhbGl6ZWRNZXRyaWNzKCZzZXJpYWxpemVkTWV0cmljcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBmcmFtZXdvcmsgbWV0cmljczogJWQiLCByZXN1bHQpOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwotICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAic2VyaWFsaXplZF9tZXRyaWNzIiwgYjY0RW5jb2RlZE1ldHJpY3MuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmICghcGx1Z2luTWV0cmljcy5lbXB0eSgpKSB7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJwbHVnaW5fbWV0cmljcyIsIHBsdWdpbk1ldHJpY3MuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmICghbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQoaXRlbSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZWxmIHJlY29yZCBmcmFtZXdvcmsgbWV0cmljcyIpOwotICAgIH0KLSAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKGl0ZW0pOwotICAgIHJldHVybiBzZXJpYWxpemVkTWV0cmljczsKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcihtaW1lLCBzZWN1cml0eUxldmVsLCByZXF1aXJlZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZSwgc2VjdXJpdHlMZXZlbCwgcmVxdWlyZWQpOwogfQogCi1zdGQ6OnN0cmluZyBEcm1IYWw6OnJlcG9ydFBsdWdpbk1ldHJpY3MoKSBjb25zdAotewotICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOwotICAgIFN0cmluZzggdmVuZG9yOwotICAgIFN0cmluZzggZGVzY3JpcHRpb247Ci0gICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKLSAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgotICAgICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKLSAgICAgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCgibWV0cmljcyIpLCBtZXRyaWNzVmVjdG9yKSA9PSBPSykgewotICAgICAgICBtZXRyaWNzU3RyaW5nID0gdG9CYXNlNjRTdHJpbmdOb1BhZChtZXRyaWNzVmVjdG9yLmFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NWZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYW5kcm9pZDo6cmVwb3J0RHJtUGx1Z2luTWV0cmljcyhtZXRyaWNzU3RyaW5nLCB2ZW5kb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWQiLCByZXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXRyaWNzU3RyaW5nOworc3RhdHVzX3QgRHJtSGFsOjpzZXRQbGF5YmFja0lkKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBjb25zdCBjaGFyKiBwbGF5YmFja0lkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zZXRQbGF5YmFja0lkKHNlc3Npb25JZCwgcGxheWJhY2tJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5zZXRQbGF5YmFja0lkKHNlc3Npb25JZCwgcGxheWJhY2tJZCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOworc3RhdHVzX3QgRHJtSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0TG9nTWVzc2FnZXMobG9ncyk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXF1aXJlZCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIGhMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwoc2VjdXJpdHlMZXZlbCk7Ci0gICAgYXV0byBoUmVzdWx0ID0gbVBsdWdpblYxXzQtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcihoaWRsX3N0cmluZyhtaW1lKSwgaExldmVsKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEcm1IYWw6OnNldFBsYXliYWNrSWQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsIGNvbnN0IGNoYXIgKnBsYXliYWNrSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtUGx1Z2luVjFfNCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0gICAgYXV0byBlcnIgPSBtUGx1Z2luVjFfNC0+c2V0UGxheWJhY2tJZCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF9zdHJpbmcocGxheWJhY2tJZCkpOwotICAgIHJldHVybiBlcnIuaXNPaygpID8gdG9TdGF0dXNUKGVycikgOiBERUFEX09CSkVDVDsKLX0KLQotc3RhdHVzX3QgRHJtSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklEcm1QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworc3RhdHVzX3QgRHJtSGFsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0OworICAgIHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5nZXRTdXBwb3J0ZWRTY2hlbWVzKHNjaGVtZXMpOworICAgIGlmIChzdGF0dXNSZXN1bHQgPT0gT0spIHJldHVybiBzdGF0dXNSZXN1bHQ7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTdXBwb3J0ZWRTY2hlbWVzKHNjaGVtZXMpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEFpZGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEFpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDgzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsQWlkbC5jcHAKQEAgLTAsMCArMSwxMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1IYWxBaWRsIgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsQWlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKwordXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6c3RhdHVzQWlkbFRvU3RhdHVzVDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Q3J5cHRvU2NoZW1lczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljTmFtZWRWYWx1ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljVmFsdWU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkhkY3BMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVsczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPcGFxdWVEYXRhOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlByb3Zpc2lvblJlcXVlc3Q7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdXBwb3J0ZWRDb250ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIERybU1ldHJpY0dyb3VwQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyBEcm1NZXRyaWNHcm91cEhpZGwgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgRHJtTWV0cmljQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljOwordXNpbmcgRHJtTWV0cmljSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6Ok1ldHJpYzsKK3VzaW5nIFZhbHVlSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6OlZhbHVlOwordXNpbmcgQXR0cmlidXRlSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6OkF0dHJpYnV0ZTsKK3VzaW5nIElEcm1QbHVnaW5BaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpJRHJtUGx1Z2luOwordXNpbmcgRXZlbnRUeXBlQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOworY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b0Jhc2U2NFN0cmluZ05vUGFkKGNvbnN0IFQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgLy8gTm90ZSB0aGF0IHRoZSBiYXNlIDY0IGNvbnZlcnNpb24gb25seSB3b3JrcyB3aXRoIGFycmF5cyBvZiBzaW5nbGUtYnl0ZQorICAgIC8vIHZhbHVlcy4gSWYgdGhlIHNvdXJjZSBpcyBlbXB0eSBvciBpcyBub3QgYW4gYXJyYXkgb2Ygc2luZ2xlLWJ5dGUgdmFsdWVzLAorICAgIC8vIHJldHVybiBlbXB0eSBzdHJpbmcuCisgICAgaWYgKHNpemUgPT0gMCB8fCBzaXplb2YoZGF0YVswXSkgIT0gMSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7CisgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOworICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCisgICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKKyAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBJTklUX0NIRUNLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazsgXAorICAgIH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJ5dGUgPSB1aW50OF90Pgorc3RhdGljIHN0ZDo6dmVjdG9yPEJ5dGU+IHRvU3RkVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmVjdG9yKSB7CisgICAgYXV0byB2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCeXRlKj4odmVjdG9yLmFycmF5KCkpOworICAgIHN0ZDo6dmVjdG9yPEJ5dGU+IHZlYyh2LCB2ICsgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworc3RhdGljIGNvbnN0IFZlY3Rvcjx1aW50OF90PiB0b1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZlY3RvcjsKKyAgICB2ZWN0b3IuYXBwZW5kQXJyYXkodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgcmV0dXJuICpjb25zdF9jYXN0PGNvbnN0IFZlY3Rvcjx1aW50OF90Pio+KCZ2ZWN0b3IpOworfQorCitzdGF0aWMgU3RyaW5nOCB0b1N0cmluZzgoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZykgeworICAgIHJldHVybiBTdHJpbmc4KHN0cmluZy5jX3N0cigpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RkU3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZzgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoc3RyaW5nOC5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gdG9LZXlWYWx1ZVZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYga2V5ZWRWZWN0b3IpIHsKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gc3RkS2V5ZWRWZWN0b3I7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXllZFZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICBLZXlWYWx1ZSBrZXlWYWx1ZTsKKyAgICAgICAga2V5VmFsdWUua2V5ID0gdG9TdGRTdHJpbmcoa2V5ZWRWZWN0b3Iua2V5QXQoaSkpOworICAgICAgICBrZXlWYWx1ZS52YWx1ZSA9IHRvU3RkU3RyaW5nKGtleWVkVmVjdG9yLnZhbHVlQXQoaSkpOworICAgICAgICBzdGRLZXllZFZlY3Rvci5wdXNoX2JhY2soa2V5VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gc3RkS2V5ZWRWZWN0b3I7Cit9CisKK3N0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0b0tleWVkVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPEtleVZhbHVlPiYga2V5VmFsdWVWZWMpIHsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBrZXllZFZlY3RvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleVZhbHVlVmVjLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleWVkVmVjdG9yLmFkZCh0b1N0cmluZzgoa2V5VmFsdWVWZWNbaV0ua2V5KSwgdG9TdHJpbmc4KGtleVZhbHVlVmVjW2ldLnZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBrZXllZFZlY3RvcjsKK30KKworc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZShLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSkgeworICAgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlVQREFURToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3Qgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4mIGFTZWN1cmVTdG9wcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoYVNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BzOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wSWQ+JiBhU2VjdXJlU3RvcElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYVNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoYVNlY3VyZVN0b3BJZHNbaV0uc2VjdXJlU3RvcElkKSk7CisgICAgfQorICAgIHJldHVybiBzZWN1cmVTdG9wSWRzOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT05FOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOworICAgICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjE7CisgICAgICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMjoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMzoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb091dHB1dDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCB0b1NlY3VyaXR5TGV2ZWwoU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgfQorfQorCitzdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0FpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4OgorICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkRFRkFVTFQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldLmtleVNldElkKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaCAobGljZW5zZVN0YXRlKSB7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworTXV0ZXggRHJtSGFsQWlkbDo6bUxvY2s7CisKK3N0YXRpYyBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cEhpZGw+IHRvRHJtTWV0cmljR3JvdXBIaWRsKHN0ZDo6dmVjdG9yPERybU1ldHJpY0dyb3VwQWlkbD4gcmVzdWx0KSB7CisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXBIaWRsPiByZXN1bHRIaWRsOworICAgIGZvciAoYXV0byByIDogcmVzdWx0KSB7CisgICAgICAgIERybU1ldHJpY0dyb3VwSGlkbCByZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljSGlkbD4gdG1wTWV0cmljOworICAgICAgICBmb3IgKGF1dG8gbSA6IHIubWV0cmljcykgeworICAgICAgICAgICAgRHJtTWV0cmljSGlkbCBtZTsKKyAgICAgICAgICAgIG1lLm5hbWUgPSBtLm5hbWU7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVIaWRsPiBhVG1wOworICAgICAgICAgICAgZm9yIChhdXRvIGF0dHIgOiBtLmF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVIaWRsIGF0dHJIaWRsOworICAgICAgICAgICAgICAgIGF0dHJIaWRsLm5hbWUgPSBhdHRyLm5hbWU7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHIudmFsdWUuZ2V0VGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcm1NZXRyaWNWYWx1ZTo6VGFnOjppbnQ2NFZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwudHlwZSA9IERybU1ldHJpY0dyb3VwSGlkbDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwuaW50NjRWYWx1ZSA9IGF0dHIudmFsdWUuZ2V0PERybU1ldHJpY1ZhbHVlOjpUYWc6OmludDY0VmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcm1NZXRyaWNWYWx1ZTo6VGFnOjpkb3VibGVWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJIaWRsLnR5cGUgPSBEcm1NZXRyaWNHcm91cEhpZGw6OlZhbHVlVHlwZTo6RE9VQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRySGlkbC5kb3VibGVWYWx1ZSA9IGF0dHIudmFsdWUuZ2V0PERybU1ldHJpY1ZhbHVlOjpUYWc6OmRvdWJsZVZhbHVlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6c3RyaW5nVmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRySGlkbC50eXBlID0gRHJtTWV0cmljR3JvdXBIaWRsOjpWYWx1ZVR5cGU6OlNUUklOR19UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwuc3RyaW5nVmFsdWUgPSBhdHRyLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjpzdHJpbmdWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYVRtcC5wdXNoX2JhY2soYXR0ckhpZGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZS5hdHRyaWJ1dGVzID0gYVRtcDsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWVIaWRsPiB2VG1wOworICAgICAgICAgICAgZm9yIChhdXRvIHZhbHVlIDogbS52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBWYWx1ZUhpZGwgdmFsdWVIaWRsOworICAgICAgICAgICAgICAgIHZhbHVlSGlkbC5jb21wb25lbnROYW1lID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLnZhbHVlLmdldFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6aW50NjRWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSGlkbC50eXBlID0gRHJtTWV0cmljR3JvdXBIaWRsOjpWYWx1ZVR5cGU6OklOVDY0X1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwuaW50NjRWYWx1ZSA9IHZhbHVlLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjppbnQ2NFZhbHVlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6ZG91YmxlVmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwudHlwZSA9IERybU1ldHJpY0dyb3VwSGlkbDo6VmFsdWVUeXBlOjpET1VCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSGlkbC5kb3VibGVWYWx1ZSA9IHZhbHVlLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjpkb3VibGVWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERybU1ldHJpY1ZhbHVlOjpUYWc6OnN0cmluZ1ZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVIaWRsLnR5cGUgPSBEcm1NZXRyaWNHcm91cEhpZGw6OlZhbHVlVHlwZTo6U1RSSU5HX1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwuc3RyaW5nVmFsdWUgPSB2YWx1ZS52YWx1ZS5nZXQ8RHJtTWV0cmljVmFsdWU6OlRhZzo6c3RyaW5nVmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZUbXAucHVzaF9iYWNrKHZhbHVlSGlkbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lLnZhbHVlcyA9IHZUbXA7CisgICAgICAgICAgICB0bXBNZXRyaWMucHVzaF9iYWNrKG1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlLm1ldHJpY3MgPSB0bXBNZXRyaWM7CisgICAgICAgIHJlc3VsdEhpZGwucHVzaF9iYWNrKHJlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0SGlkbDsKK30KKworLy8gRHJtU2Vzc2lvbkNsaWVudCBEZWZpbml0aW9uCisKK3N0cnVjdCBEcm1IYWxBaWRsOjpEcm1TZXNzaW9uQ2xpZW50IDogcHVibGljIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgZXhwbGljaXQgRHJtU2Vzc2lvbkNsaWVudChEcm1IYWxBaWRsKiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbURybShkcm0pIHt9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKworICAgIHZpcnR1YWwgfkRybVNlc3Npb25DbGllbnQoKTsKKworICBwcml2YXRlOgorICAgIHdwPERybUhhbEFpZGw+IG1Ecm07CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1TZXNzaW9uQ2xpZW50KTsKK307CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbEFpZGw6OkRybVNlc3Npb25DbGllbnQ6OnJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdXRvIHNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisgICAgc3A8RHJtSGFsQWlkbD4gZHJtID0gbURybS5wcm9tb3RlKCk7CisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgZHJtLT5vbkV2ZW50KEV2ZW50VHlwZUFpZGw6OlNFU1NJT05fUkVDTEFJTUVELCB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgKl9haWRsX3JldHVybiA9IHRydWU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpEcm1TZXNzaW9uQ2xpZW50OjpnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgIFN0cmluZzggbmFtZTsKKyAgICBzcDxEcm1IYWxBaWRsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgbmFtZS5hcHBlbmQoIjxkZWxldGVkPiIpOworICAgIH0gZWxzZSBpZiAoZHJtLT5nZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCBuYW1lKSAhPSBPSyB8fCBuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPEdldCB2ZW5kb3IgZmFpbGVkIG9yIGlzIGVtcHR5PiIpOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiWyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25JZC5zaXplKCk7ICsraSkgeworICAgICAgICBuYW1lLmFwcGVuZEZvcm1hdCgiJTAyeCIsIG1TZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiXSIpOworICAgICpfYWlkbF9yZXR1cm4gPSBuYW1lOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworRHJtSGFsQWlkbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7CisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Cit9CisKKy8vIERybUhhbEFpZGwgbWV0aG9kcworRHJtSGFsQWlkbDo6RHJtSGFsQWlkbCgpCisgICAgOiBtTGlzdGVuZXIoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RHJtSGFsTGlzdGVuZXI+KCZtTWV0cmljcykpLAorICAgICAgbUZhY3RvcmllcyhEcm1VdGlsczo6bWFrZURybUZhY3Rvcmllc0FpZGwoKSksCisgICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkge30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitEcm1IYWxBaWRsOjp+RHJtSGFsQWlkbCgpIHt9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsIGJvb2wqIGlzU3VwcG9ydGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBVdWlkIHV1aWRBaWRsID0gRHJtVXRpbHM6OnRvQWlkbFV1aWQodXVpZCk7CisgICAgU2VjdXJpdHlMZXZlbCBsZXZlbEFpZGwgPSB0b0FpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZVN0ciA9IG1pbWVUeXBlLnN0cmluZygpOworCisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIENyeXB0b1NjaGVtZXMgc2NoZW1lc3t9OworICAgICAgICBhdXRvIGVyciA9IG1GYWN0b3JpZXNbaV0tPmdldFN1cHBvcnRlZENyeXB0b1NjaGVtZXMoJnNjaGVtZXMpOworICAgICAgICBpZiAoIWVyci5pc09rKCkgfHwgIXN0ZDo6Y291bnQoc2NoZW1lcy51dWlkcy5iZWdpbigpLCBzY2hlbWVzLnV1aWRzLmVuZCgpLCB1dWlkQWlkbCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoInN1cHBvcnRlZCBzY2hlbWVzOiAlczsgcXVlcnk6IGxldmVsICVkIG1pbWUgJXMiLAorICAgICAgICAgICAgICBzY2hlbWVzLnRvU3RyaW5nKCkuY19zdHIoKSwgbGV2ZWxBaWRsLCBtaW1lVHlwZS5jX3N0cigpKTsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFN1cHBvcnRlZENvbnRlbnRUeXBlPiBjb250ZW50VHlwZXM7CisgICAgICAgIGZvciAoYXV0byBjdCA6IHNjaGVtZXMubWltZVR5cGVzKSB7CisgICAgICAgICAgICBjb250ZW50VHlwZXNbY3QubWltZV0gPSBjdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCisgICAgICAgIGlmIChsZXZlbEFpZGwgPT0gU2VjdXJpdHlMZXZlbDo6REVGQVVMVCB8fCBsZXZlbEFpZGwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgeworICAgICAgICAgICAgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKKyAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKKyAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBjb250ZW50VHlwZXMuY291bnQobWltZVR5cGVTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBjdCA9IGNvbnRlbnRUeXBlc1ttaW1lVHlwZVN0cl07CisgICAgICAgIGlmIChsZXZlbEFpZGwgPiBjdC5tYXhMZXZlbCB8fCBsZXZlbEFpZGwgPCBjdC5taW5MZXZlbCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBzdGQ6OnN0cmluZyBhcHBQYWNrYWdlTmFtZUFpZGwgPSB0b1N0ZFN0cmluZyhhcHBQYWNrYWdlTmFtZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPElEcm1QbHVnaW5BaWRsPiBwbHVnaW5BaWRsOworICAgIG1NZXRyaWNzLlNldEFwcFBhY2thZ2VOYW1lKGFwcFBhY2thZ2VOYW1lKTsKKyAgICBtTWV0cmljcy5TZXRBcHBVaWQoQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBtRmFjdG9yaWVzW2ldLT5jcmVhdGVEcm1QbHVnaW4odXVpZEFpZGwsIGFwcFBhY2thZ2VOYW1lQWlkbCwgJnBsdWdpbkFpZGwpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgaWYgKHBsdWdpbkFpZGwgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW4gPSBwbHVnaW5BaWRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgIk5vIHN1cHBvcnRlZCBoYWwgaW5zdGFuY2UgZm91bmQiKTsKKyAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgLy8gU3RvcmVkIHBvaW50ZXIgbUxpc3RlbmVyIHVwY2FzdCB0byBiYXNlIEJuRHJtUGx1Z2luTGlzdGVuZXIKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbgorICAgICAgICAgICAgLT5zZXRMaXN0ZW5lcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Qm5Ecm1QbHVnaW5MaXN0ZW5lcj4obUxpc3RlbmVyKSk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgQUxPR0UoInNldExpc3RlbmVyIGZhaWxlZDogZXggJWQgc3ZjIGVyciAlZCIsCisgICAgICAgICAgICAgICAgc3RhdHVzLmdldEV4Y2VwdGlvbkNvZGUoKSwKKyAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5yZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6Om9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFNlY3VyaXR5TGV2ZWwgYVNlY3VyaXR5TGV2ZWwgPSB0b0FpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKKworICAgIGlmIChhU2VjdXJpdHlMZXZlbCA9PSBTZWN1cml0eUxldmVsOjpVTktOT1dOKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIGJvb2wgcmV0cnkgPSB0cnVlOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYVNlc3Npb25JZDsKKworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5vcGVuU2Vzc2lvbihhU2VjdXJpdHlMZXZlbCwgJmFTZXNzaW9uSWQpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgc2Vzc2lvbklkID0gdG9WZWN0b3IoYVNlc3Npb25JZCk7CisgICAgICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICYmIHJldHJ5KSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIHJlY2xhaW1TZXNzaW9uIG1heSBjYWxsIGJhY2sgdG8gY2xvc2VTZXNzaW9uLCBzaW5jZSBtTG9jayBpcworICAgICAgICAgICAgLy8gc2hhcmVkIGJldHdlZW4gRHJtIGluc3RhbmNlcywgd2Ugc2hvdWxkIHVubG9jayBoZXJlIHRvIGF2b2lkCisgICAgICAgICAgICAvLyBkZWFkbG9jay4KKyAgICAgICAgICAgIHJldHJ5ID0gRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlY2xhaW1TZXNzaW9uKEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXRyeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmV0cnkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RHJtU2Vzc2lvbkNsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICBuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RHJtU2Vzc2lvbkNsaWVudD4odGhpcywgc2Vzc2lvbklkKTsKKyAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpLCBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SVJlc291cmNlTWFuYWdlckNsaWVudD4oY2xpZW50KSwKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICBtT3BlblNlc3Npb25zLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uU3RhcnQoc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICBtTWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkQWlkbCA9IHRvU3RkVmVjKHNlc3Npb25JZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZEFpZGwpOworICAgIHN0YXR1c190IHJlc3BvbnNlID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGZvciAoYXV0byBpID0gbU9wZW5TZXNzaW9ucy5iZWdpbigpOyBpICE9IG1PcGVuU2Vzc2lvbnMuZW5kKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMuZXJhc2UoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZCk7CisgICAgfQorCisgICAgbU1ldHJpY3MubUNsb3NlU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KHJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzcG9uc2U7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsIFN0cmluZzggY29uc3QmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QmIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlKiBrZXlSZXF1ZXN0VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIEtleVR5cGUgYUtleVR5cGU7CisgICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgYUtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgeworICAgICAgICBhS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgeworICAgICAgICBhS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWRBaWRsID0gdG9TdGRWZWMoc2Vzc2lvbklkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbml0RGF0YUFpZGwgPSB0b1N0ZFZlYyhpbml0RGF0YSk7CisgICAgS2V5UmVxdWVzdCBrZXlSZXF1ZXN0OworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1QbHVnaW4tPmdldEtleVJlcXVlc3Qoc2Vzc2lvbklkQWlkbCwgaW5pdERhdGFBaWRsLCB0b1N0ZFN0cmluZyhtaW1lVHlwZSksIGFLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0tleVZhbHVlVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyksICZrZXlSZXF1ZXN0KTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3Ioa2V5UmVxdWVzdC5yZXF1ZXN0KTsKKyAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChrZXlSZXF1ZXN0LmRlZmF1bHRVcmwpOworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGtleVJlcXVlc3QucmVxdWVzdFR5cGUpOworICAgIH0KKworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWRBaWRsID0gdG9TdGRWZWMoc2Vzc2lvbklkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZUFpZGwgPSB0b1N0ZFZlYyhyZXNwb25zZSk7CisgICAgS2V5U2V0SWQga2V5U2V0SWRzQWlkbDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+cHJvdmlkZUtleVJlc3BvbnNlKHNlc3Npb25JZEFpZGwsIHJlc3BvbnNlQWlkbCwgJmtleVNldElkc0FpZGwpOworCisgICAgaWYgKHN0YXR1cy5pc09rKCkpIGtleVNldElkID0gdG9WZWN0b3Ioa2V5U2V0SWRzQWlkbC5rZXlTZXRJZCk7CisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGtleVJlc3BvbnNlVGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZW1vdmVLZXlzKHRvU3RkVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgS2V5U2V0SWQga2V5U2V0SWRzQWlkbDsKKyAgICBrZXlTZXRJZHNBaWRsLmtleVNldElkID0gdG9TdGRWZWMoa2V5U2V0SWQpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvU3RkVmVjKHNlc3Npb25JZCksIGtleVNldElkc0FpZGwpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcEFpZGw7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXModG9TdGRWZWMoc2Vzc2lvbklkKSwgJmluZm9NYXBBaWRsKTsKKworICAgIGluZm9NYXAgPSB0b0tleWVkVmVjdG9yKGluZm9NYXBBaWRsKTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCYgY2VydFR5cGUsIFN0cmluZzggY29uc3QmIGNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFByb3Zpc2lvblJlcXVlc3QgcmVxdWVzdEFpZGw7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIHRvU3RkU3RyaW5nKGNlcnRUeXBlKSwgdG9TdGRTdHJpbmcoY2VydEF1dGhvcml0eSksICZyZXF1ZXN0QWlkbCk7CisKKyAgICByZXF1ZXN0ID0gdG9WZWN0b3IocmVxdWVzdEFpZGwucmVxdWVzdCk7CisgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChyZXF1ZXN0QWlkbC5kZWZhdWx0VXJsKTsKKworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlUmVzdWx0IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UodG9TdGRWZWMocmVzcG9uc2UpLCAmcmVzdWx0KTsKKworICAgIGNlcnRpZmljYXRlID0gdG9WZWN0b3IocmVzdWx0LmNlcnRpZmljYXRlKTsKKyAgICB3cmFwcGVkS2V5ID0gdG9WZWN0b3IocmVzdWx0LndyYXBwZWRLZXkpOworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBtTWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wPiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcHMoJnJlc3VsdCk7CisKKyAgICBzZWN1cmVTdG9wcyA9IHRvU2VjdXJlU3RvcHMocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+JiBzZWN1cmVTdG9wSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wSWQ+IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wSWRzKCZyZXN1bHQpOworCisgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgU2VjdXJlU3RvcElkIHNzaWRBaWRsOworICAgIHNzaWRBaWRsLnNlY3VyZVN0b3BJZCA9IHRvU3RkVmVjKHNzaWQpOworCisgICAgU2VjdXJlU3RvcCByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcChzc2lkQWlkbCwgJnJlc3VsdCk7CisKKyAgICBzZWN1cmVTdG9wID0gdG9WZWN0b3IocmVzdWx0Lm9wYXF1ZURhdGEpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NSZWxlYXNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBPcGFxdWVEYXRhIHNzSWQ7CisgICAgc3NJZC5vcGFxdWVEYXRhID0gdG9TdGRWZWMoc3NSZWxlYXNlKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlU2VjdXJlU3RvcHMoc3NJZCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpyZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBTZWN1cmVTdG9wSWQgc3NpZEFpZGw7CisgICAgc3NpZEFpZGwuc2VjdXJlU3RvcElkID0gdG9TdGRWZWMoc3NpZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkQWlkbCk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsKiBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworCisgICAgSGRjcExldmVscyBsdmxzQWlkbDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRIZGNwTGV2ZWxzKCZsdmxzQWlkbCk7CisKKyAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwobHZsc0FpZGwuY29ubmVjdGVkTGV2ZWwpOworICAgICptYXggPSB0b0hkY3BMZXZlbChsdmxzQWlkbC5tYXhMZXZlbCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90KiBvcGVuLCB1aW50MzJfdCogbWF4KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBpZiAob3BlbiA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKm9wZW4gPSAwOworICAgICptYXggPSAwOworCisgICAgTnVtYmVyT2ZTZXNzaW9ucyByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0TnVtYmVyT2ZTZXNzaW9ucygmcmVzdWx0KTsKKworICAgICpvcGVuID0gcmVzdWx0LmN1cnJlbnRTZXNzaW9uczsKKyAgICAqbWF4ID0gcmVzdWx0Lm1heFNlc3Npb25zOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGxldmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqbGV2ZWwgPSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKworICAgIFNlY3VyaXR5TGV2ZWwgcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldFNlY3VyaXR5TGV2ZWwodG9TdGRWZWMoc2Vzc2lvbklkKSwgJnJlc3VsdCk7CisKKyAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYga2V5U2V0SWRzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKCZyZXN1bHQpOworCisgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5U2V0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIEtleVNldElkIGtleVNldElkQWlkbDsKKyAgICBrZXlTZXRJZEFpZGwua2V5U2V0SWQgPSB0b1N0ZFZlYyhrZXlTZXRJZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2Uoa2V5U2V0SWRBaWRsKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5U2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIElOSVRfQ0hFQ0soKTsKKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBLZXlTZXRJZCBrZXlTZXRJZEFpZGw7CisgICAga2V5U2V0SWRBaWRsLmtleVNldElkID0gdG9TdGRWZWMoa2V5U2V0SWQpOworCisgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZEFpZGwsICZyZXN1bHQpOworCisgICAgKmxpY2Vuc2VTdGF0ZSA9IHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldFByb3BlcnR5U3RyaW5nKHRvU3RkU3RyaW5nKG5hbWUpLCAmcmVzdWx0KTsKKworICAgIHZhbHVlID0gdG9TdHJpbmc4KHJlc3VsdCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSh0b1N0ZFN0cmluZyhuYW1lKSwgJnJlc3VsdCk7CisKKyAgICB2YWx1ZSA9IHRvVmVjdG9yKHJlc3VsdCk7CisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChuYW1lID09IGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkKSB7CisgICAgICAgIG1NZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QmIG5hbWUsIFN0cmluZzggY29uc3QmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eVN0cmluZyh0b1N0ZFN0cmluZyhuYW1lKSwgdG9TdGRTdHJpbmcodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eUJ5dGVBcnJheSh0b1N0ZFN0cmluZyhuYW1lKSwgdG9TdGRWZWModmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGNvbnN1bWVyLT5jb25zdW1lRnJhbWV3b3JrTWV0cmljcyhtTWV0cmljcyk7CisKKyAgICAvLyBBcHBlbmQgdmVuZG9yIG1ldHJpY3MgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgorCisgICAgU3RyaW5nOCB2ZW5kb3I7CisgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSAhPSBPSyB8fCB2ZW5kb3IuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJHZXQgdmVuZG9yIGZhaWxlZCBvciBpcyBlbXB0eSIpOworICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7CisgICAgfQorICAgIGlmIChnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSAhPSBPSyB8fAorICAgICAgICBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkdldCBkZXNjcmlwdGlvbiBmYWlsZWQgb3IgaXMgZW1wdHkuIik7CisgICAgICAgIGRlc2NyaXB0aW9uID0gIk5PTkUiOworICAgIH0KKyAgICB2ZW5kb3IgKz0gIi4iOworICAgIHZlbmRvciArPSBkZXNjcmlwdGlvbjsKKworICAgIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwSGlkbD4gcGx1Z2luTWV0cmljczsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXBBaWRsPiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0TWV0cmljcygmcmVzdWx0KTsKKworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHBsdWdpbk1ldHJpY3MgPSB0b0RybU1ldHJpY0dyb3VwSGlkbChyZXN1bHQpOworICAgICAgICBjb25zdW1lci0+Y29uc3VtZUhpZGxNZXRyaWNzKHZlbmRvciwgcGx1Z2luTWV0cmljcyk7CisgICAgfQorCisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBtUGx1Z2luLT5zZXRDaXBoZXJBbGdvcml0aG0odG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRTdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvU3RkVmVjKHNlc3Npb25JZCksIHRvU3RkU3RyaW5nKGFsZ29yaXRobSkpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmVuY3J5cHQodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdGRWZWMoaW5wdXQpLCB0b1N0ZFZlYyhpdiksICZyZXN1bHQpOworCisgICAgb3V0cHV0ID0gdG9WZWN0b3IocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmRlY3J5cHQodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdGRWZWMoaW5wdXQpLCB0b1N0ZFZlYyhpdiksICZyZXN1bHQpOworCisgICAgb3V0cHV0ID0gdG9WZWN0b3IocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1QbHVnaW4tPnNpZ24odG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLCB0b1N0ZFZlYyhtZXNzYWdlKSwgJnJlc3VsdCk7CisKKyAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT52ZXJpZnkodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0ZFZlYyhtZXNzYWdlKSwgdG9TdGRWZWMoc2lnbmF0dXJlKSwgJm1hdGNoKTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBtZXNzYWdlLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHdyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBtUGx1Z2luLT5zaWduUlNBKHRvU3RkVmVjKHNlc3Npb25JZCksIHRvU3RkU3RyaW5nKGFsZ29yaXRobSksIHRvU3RkVmVjKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0ZFZlYyh3cmFwcGVkS2V5KSwgJnJlc3VsdCk7CisKKyAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lQWlkbChtaW1lKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZUFpZGwsIFNlY3VyaXR5TGV2ZWw6OkRFRkFVTFQsIHJlcXVpcmVkKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSgicmVxdWlyZXNTZWN1cmVEZWNvZGVyIHR4biBmYWlsZWQ6ICVkIiwgc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGF1dG8gYUxldmVsID0gdG9BaWRsU2VjdXJpdHlMZXZlbChzZWN1cml0eUxldmVsKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lQWlkbChtaW1lKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZUFpZGwsIGFMZXZlbCwgcmVxdWlyZWQpOworCisgICAgc3RhdHVzX3QgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKCJyZXF1aXJlc1NlY3VyZURlY29kZXIgdHhuIGZhaWxlZDogJWQiLCBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIHN0ZDo6c3RyaW5nIHBsYXliYWNrSWRBaWRsKHBsYXliYWNrSWQpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPnNldFBsYXliYWNrSWQodG9TdGRWZWMoc2Vzc2lvbklkKSwgcGxheWJhY2tJZEFpZGwpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+JiBsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzQWlkbDxJRHJtUGx1Z2luQWlkbD4obVBsdWdpbiwgbG9ncyk7Cit9CisKK3ZvaWQgRHJtSGFsQWlkbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0tPm1TZXNzaW9uSWQpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKK30KKworc3RkOjpzdHJpbmcgRHJtSGFsQWlkbDo6cmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0IHsKKyAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljc1ZlY3RvcjsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0ZDo6c3RyaW5nIG1ldHJpY3NTdHJpbmc7CisgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgPT0gT0sgJiYKKyAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKKyAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3NWZWN0b3IpID09IE9LKSB7CisgICAgICAgIG1ldHJpY3NTdHJpbmcgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKG1ldHJpY3NWZWN0b3IuYXJyYXkoKSwgbWV0cmljc1ZlY3Rvci5zaXplKCkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKG1ldHJpY3NTdHJpbmcsIHZlbmRvciwgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljcyB3ZXJlIHJldHJpZXZlZCBidXQgY291bGQgbm90IGJlIHJlcG9ydGVkOiAlZCIsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1ldHJpY3NTdHJpbmc7Cit9CisKK3N0ZDo6c3RyaW5nIERybUhhbEFpZGw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0IHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbShtZWRpYW1ldHJpY3NfY3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKGl0ZW0sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPQorICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CisgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBDcnlwdG9TY2hlbWVzIGN1clNjaGVtZXN7fTsKKyAgICAgICAgYXV0byBlcnIgPSBtRmFjdG9yaWVzW2ldLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCZjdXJTY2hlbWVzKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byB1dWlkT2JqIDogY3VyU2NoZW1lcy51dWlkcykgeworICAgICAgICAgICAgc2NoZW1lcy5pbnNlcnQoc2NoZW1lcy5lbmQoKSwgdXVpZE9iai51dWlkLmJlZ2luKCksIHV1aWRPYmoudXVpZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgRHJtSGFsQWlkbDo6Y2xlYW51cCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7CisKKyAgICBzZXRMaXN0ZW5lcihOVUxMKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUGx1Z2luLnJlc2V0KCk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmRlc3Ryb3lQbHVnaW4oKSB7CisgICAgY2xlYW51cCgpOworICAgIHJldHVybiBPSzsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsQWlkbDo6b25FdmVudChFdmVudFR5cGVBaWRsIGV2ZW50VHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgcmV0dXJuIG1MaXN0ZW5lci0+b25FdmVudChldmVudFR5cGVBaWRsLCBzZXNzaW9uSWQsIGRhdGEpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvbkV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgcmV0dXJuIG1MaXN0ZW5lci0+b25FeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHJldHVybiBtTGlzdGVuZXItPm9uS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RBaWRsLCBoYXNOZXdVc2FibGVLZXkpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHJldHVybiBtTGlzdGVuZXItPm9uU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWxIaWRsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhkYmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtSGFsSGlkbCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjMvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CisjaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgorI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWxIaWRsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6RHJtVXRpbHM6OnRvU3RhdHVzVDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOworCit0eXBlZGVmIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgS2V5UmVxdWVzdFR5cGVfVjFfMTsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCituYW1lc3BhY2UgeworCisvLyBUaGlzIGNvbnN0YW50IGNvcnJlc3BvbmRzIHRvIHRoZSBQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEIGNvbnN0YW50CisvLyBpbiB0aGUgTWVkaWFEcm0gQVBJLgorY29uc3RleHByIGNoYXIga1Byb3BlcnR5RGV2aWNlVW5pcXVlSWRbXSA9ICJkZXZpY2VVbmlxdWVJZCI7Citjb25zdGV4cHIgY2hhciBrRXF1YWxzU2lnbltdID0gIj0iOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCisgICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCisgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KKyAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpBU3RyaW5nIG91dHB1dFN0cmluZzsKKyAgICBlbmNvZGVCYXNlNjQoZGF0YSwgc2l6ZSwgJm91dHB1dFN0cmluZyk7CisgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGVxdWFscyBwYWRkaW5nIGlmIGl0IGV4aXN0cy4KKyAgICB3aGlsZSAob3V0cHV0U3RyaW5nLnNpemUoKSA+IDAgJiYgb3V0cHV0U3RyaW5nLmVuZHNXaXRoKGtFcXVhbHNTaWduKSkgeworICAgICAgICBvdXRwdXRTdHJpbmcuZXJhc2Uob3V0cHV0U3RyaW5nLnNpemUoKSAtIDEsIDEpOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnN0cmluZyhvdXRwdXRTdHJpbmcuY19zdHIoKSwgb3V0cHV0U3RyaW5nLnNpemUoKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIElOSVRfQ0hFQ0soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHJldHVybiBtSW5pdENoZWNrOyBcCisgICAgfQorCitzdGF0aWMgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IHRvVmVjdG9yKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiB2ZWMpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gdmVjdG9yOworICAgIHZlY3Rvci5hcHBlbmRBcnJheSh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+Kj4oJnZlY3Rvcik7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgU3RyaW5nOCB0b1N0cmluZzgoY29uc3QgaGlkbF9zdHJpbmcmIHN0cmluZykgeworICAgIHJldHVybiBTdHJpbmc4KHN0cmluZy5jX3N0cigpKTsKK30KKworc3RhdGljIGhpZGxfc3RyaW5nIHRvSGlkbFN0cmluZyhjb25zdCBTdHJpbmc4JiBzdHJpbmcpIHsKKyAgICByZXR1cm4gaGlkbF9zdHJpbmcoc3RyaW5nLnN0cmluZygpKTsKK30KKworc3RhdGljIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCB0b1NlY3VyaXR5TGV2ZWwoU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBTZWN1cml0eUxldmVsIHRvSGlkbFNlY3VyaXR5TGV2ZWwoRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaCAobGljZW5zZVN0YXRlKSB7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PTkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7CisgICAgICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjE6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8xOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzI6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7CisgICAgICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgfQorfQorc3RhdGljIDo6S2V5ZWRWZWN0b3IgdG9IaWRsS2V5ZWRWZWN0b3IoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGtleWVkVmVjdG9yKSB7CisgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IHN0ZEtleWVkVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5ZWRWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgS2V5VmFsdWUga2V5VmFsdWU7CisgICAgICAgIGtleVZhbHVlLmtleSA9IHRvSGlkbFN0cmluZyhrZXllZFZlY3Rvci5rZXlBdChpKSk7CisgICAgICAgIGtleVZhbHVlLnZhbHVlID0gdG9IaWRsU3RyaW5nKGtleWVkVmVjdG9yLnZhbHVlQXQoaSkpOworICAgICAgICBzdGRLZXllZFZlY3Rvci5wdXNoX2JhY2soa2V5VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gOjpLZXllZFZlY3RvcihzdGRLZXllZFZlY3Rvcik7Cit9CisKK3N0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0b0tleWVkVmVjdG9yKGNvbnN0IDo6S2V5ZWRWZWN0b3ImIGhLZXllZFZlY3RvcikgeworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGtleWVkVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaEtleWVkVmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleWVkVmVjdG9yLmFkZCh0b1N0cmluZzgoaEtleWVkVmVjdG9yW2ldLmtleSksIHRvU3RyaW5nOChoS2V5ZWRWZWN0b3JbaV0udmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIGtleWVkVmVjdG9yOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mIGhTZWN1cmVTdG9wcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BzOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+JiBoU2VjdXJlU3RvcElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaFNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BJZHNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7Cit9CisKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKK011dGV4IERybUhhbEhpZGw6Om1Mb2NrOworCitzdHJ1Y3QgRHJtSGFsSGlkbDo6RHJtU2Vzc2lvbkNsaWVudCA6IHB1YmxpYyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIGV4cGxpY2l0IERybVNlc3Npb25DbGllbnQoRHJtSGFsSGlkbCogZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKKyAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1Ecm0oZHJtKSB7fQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CisKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50KCk7CisKKyAgcHJpdmF0ZToKKyAgICB3cDxEcm1IYWxIaWRsPiBtRHJtOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbkNsaWVudCk7Cit9OworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxIaWRsOjpEcm1TZXNzaW9uQ2xpZW50OjpyZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXV0byBzZXNzaW9uSWQgPSBtU2Vzc2lvbklkOworICAgIHNwPERybUhhbEhpZGw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGZhbHNlOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIGRybS0+c2VuZEV2ZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQsIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbEhpZGw6OkRybVNlc3Npb25DbGllbnQ6OmdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgU3RyaW5nOCBuYW1lOworICAgIHNwPERybUhhbEhpZGw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPGRlbGV0ZWQ+Iik7CisgICAgfSBlbHNlIGlmIChkcm0tPmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIG5hbWUpICE9IE9LIHx8IG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kKCI8R2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHk+Iik7CisgICAgfQorICAgIG5hbWUuYXBwZW5kKCJbIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbklkLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgbVNlc3Npb25JZFtpXSk7CisgICAgfQorICAgIG5hbWUuYXBwZW5kKCJdIik7CisgICAgKl9haWRsX3JldHVybiA9IG5hbWU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCitEcm1IYWxIaWRsOjpEcm1TZXNzaW9uQ2xpZW50Ojp+RHJtU2Vzc2lvbkNsaWVudCgpIHsKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkKTsKK30KKworRHJtSGFsSGlkbDo6RHJtSGFsSGlkbCgpCisgICAgOiBtRmFjdG9yaWVzKG1ha2VEcm1GYWN0b3JpZXMoKSksCisgICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkge30KKwordm9pZCBEcm1IYWxIaWRsOjpjbG9zZU9wZW5TZXNzaW9ucygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGF1dG8gb3BlblNlc3Npb25zID0gbU9wZW5TZXNzaW9uczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5TZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgY2xvc2VTZXNzaW9uKG9wZW5TZXNzaW9uc1tpXS0+bVNlc3Npb25JZCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICB9CisgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOworfQorCitEcm1IYWxIaWRsOjp+RHJtSGFsSGlkbCgpIHt9CisKK3ZvaWQgRHJtSGFsSGlkbDo6Y2xlYW51cCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7CisKKyAgICBzZXRMaXN0ZW5lcihOVUxMKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBsdWdpbi5jbGVhcigpOworICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfNC5jbGVhcigpOworfQorCitzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbEhpZGw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzKERybVV0aWxzOjpNYWtlRHJtRmFjdG9yaWVzKCkpOworICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCSSgiTm8gaGlkbCBkcm0gZmFjdG9yaWVzIGZvdW5kIik7CisgICAgICAgIC8vIGNvdWxkIGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQorICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7CisgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUoIkZhaWxlZCB0byBmaW5kIHBhc3N0aHJvdWdoIGRybSBmYWN0b3JpZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFjdG9yaWVzOworfQorCitzcDxJRHJtUGx1Z2luPiBEcm1IYWxIaWRsOjptYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBtQXBwUGFja2FnZU5hbWUgPSBhcHBQYWNrYWdlTmFtZTsKKyAgICBtTWV0cmljcy5TZXRBcHBQYWNrYWdlTmFtZShhcHBQYWNrYWdlTmFtZSk7CisgICAgbU1ldHJpY3MuU2V0QXBwVWlkKEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisKKyAgICBzcDxJRHJtUGx1Z2luPiBwbHVnaW47CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4oCisgICAgICAgICAgICB1dWlkLCBhcHBQYWNrYWdlTmFtZS5zdHJpbmcoKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElEcm1QbHVnaW4+JiBoUGx1Z2luKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgIkZhaWxlZCB0byBtYWtlIGRybSBwbHVnaW46ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBsdWdpbjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRXZlbnRMb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1JldHVybjx2b2lkPiBEcm1IYWxIaWRsOjpzZW5kRXZlbnQoRXZlbnRUeXBlIGhFdmVudFR5cGUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgbU1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KWhFdmVudFR5cGUpOworCisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlOworICAgICAgICBzd2l0Y2ggKGhFdmVudFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRQcm92aXNpb25SZXF1aXJlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpLRVlfTkVFREVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGU6OktFWV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5RXhwaXJlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3RfVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5U3RhdHVzVmVjOworICAgIGZvciAoY29uc3QgYXV0byYga2V5U3RhdHVzX1YxXzAgOiBrZXlTdGF0dXNMaXN0X1YxXzApIHsKKyAgICAgICAga2V5U3RhdHVzVmVjLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7a2V5U3RhdHVzX1YxXzAua2V5SWQsIHN0YXRpY19jYXN0PEtleVN0YXR1c1R5cGU+KGtleVN0YXR1c19WMV8wLnR5cGUpfSk7CisgICAgfQorICAgIGhpZGxfdmVjPEtleVN0YXR1cz4ga2V5U3RhdHVzTGlzdF9WMV8yKGtleVN0YXR1c1ZlYyk7CisgICAgcmV0dXJuIHNlbmRLZXlzQ2hhbmdlXzFfMihzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RfVjFfMiwgaGFzTmV3VXNhYmxlS2V5KTsKK30KKworUmV0dXJuPHZvaWQ+IERybUhhbEhpZGw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBoS2V5U3RhdHVzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RHJtS2V5U3RhdHVzPiBrZXlTdGF0dXNMaXN0OworICAgICAgICBzaXplX3QgbktleXMgPSBoS2V5U3RhdHVzTGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgS2V5U3RhdHVzJiBrZXlTdGF0dXMgPSBoS2V5U3RhdHVzTGlzdFtpXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGtleVN0YXR1cy50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEU6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9FeHBpcmVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX091dHB1dE5vdEFsbG93ZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfU3RhdHVzUGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlSW5GdXR1cmU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9JbnRlcm5hbEVycm9yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleVN0YXR1c0xpc3QucHVzaF9iYWNrKHt0eXBlLCBrZXlTdGF0dXMua2V5SWR9KTsKKyAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3Qpa2V5U3RhdHVzLnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gbGlzdGVuZXIuIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIGNvdW50IHRoZSBrZXkgY2hhbmdlCisgICAgICAgIC8vIGV2ZW50cy4KKyAgICAgICAgc2l6ZV90IG5LZXlzID0gaEtleVN0YXR1c0xpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5LZXlzOyBpKyspIHsKKyAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpaEtleVN0YXR1c0xpc3RbaV0udHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjptYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzU3VwcG9ydGVkKSB7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZSBjYXNlcworICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bikgeworICAgICAgICBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPGRybTo6VjFfMjo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8yID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnlWMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnlWMV8yLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwgbWltZVR5cGUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgYm9vbCogaXNTdXBwb3J0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLCB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYXV0byBoUmVzdWx0ID0gbUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7CisgICAgICAgIGlmIChoUmVzdWx0LmlzT2soKSAmJiBoUmVzdWx0KSB7CisgICAgICAgICAgICBhdXRvIHBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpbiA9IHBsdWdpbjsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV80ID0gZHJtOjpWMV80OjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiTm8gc3VwcG9ydGVkIGhhbCBpbnN0YW5jZSBmb3VuZCIpOworICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfNC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmRlc3Ryb3lQbHVnaW4oKSB7CisgICAgY2xlYW51cCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6b3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpOworICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CisKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heCkgeworICAgICAgICBzZXRTZWN1cml0eUxldmVsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhTZWN1cml0eUxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgYm9vbCByZXRyeSA9IHRydWU7CisgICAgZG8geworICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOworCisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworICAgICAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCB8fCAhc2V0U2VjdXJpdHlMZXZlbCkgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gdG9WZWN0b3IoaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5vcGVuU2Vzc2lvbl8xXzEoaFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IERFQURfT0JKRUNUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAmJiByZXRyeSkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyByZWNsYWltU2Vzc2lvbiBtYXkgY2FsbCBiYWNrIHRvIGNsb3NlU2Vzc2lvbiwgc2luY2UgbUxvY2sgaXMKKyAgICAgICAgICAgIC8vIHNoYXJlZCBiZXR3ZWVuIERybSBpbnN0YW5jZXMsIHdlIHNob3VsZCB1bmxvY2sgaGVyZSB0byBhdm9pZAorICAgICAgICAgICAgLy8gZGVhZGxvY2suCisgICAgICAgICAgICByZXRyeSA9IERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZWNsYWltU2Vzc2lvbihBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0cnkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldHJ5KTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERybVNlc3Npb25DbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPERybVNlc3Npb25DbGllbnQ+KHRoaXMsIHNlc3Npb25JZCk7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5hZGRTZXNzaW9uKAorICAgICAgICAgICAgICAgIEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSwgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KGNsaWVudCksCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgbU9wZW5TZXNzaW9ucy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZCk7CisgICAgfQorCisgICAgbU1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBtT3BlblNlc3Npb25zLmJlZ2luKCk7IGkgIT0gbU9wZW5TZXNzaW9ucy5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLmVyYXNlKGkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOworICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7CisgICAgcmV0dXJuIERFQURfT0JKRUNUOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSB0b0tleVJlcXVlc3RUeXBlKEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfMV8xKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsIFN0cmluZzggY29uc3QmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QmIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlKiBrZXlSZXF1ZXN0VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIEtleVR5cGUgaEtleVR5cGU7CisgICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgeworICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgeworICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsCisgICAgICAgICAgICAgICAgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLAorICAgICAgICAgICAgICAgIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLAorICAgICAgICAgICAgICAgIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5wcm92aWRlS2V5UmVzcG9uc2UodG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhyZXNwb25zZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoS2V5U2V0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCA9IHRvVmVjdG9yKGhLZXlTZXRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXNwb25zZVRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlS2V5cyh0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6OktleWVkVmVjdG9yIGhJbmZvTWFwOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXMoCisgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgbWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm9NYXAgPSB0b0tleWVkVmVjdG9yKG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0JiBjZXJ0VHlwZSwgU3RyaW5nOCBjb25zdCYgY2VydEF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCh0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKKyAgICAgICAgICAgIHRvSGlkbFZlYyhyZXNwb25zZSksIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaENlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoV3JhcHBlZEtleSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSA9IHRvVmVjdG9yKGhDZXJ0aWZpY2F0ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRLZXkgPSB0b1ZlY3RvcihoV3JhcHBlZEtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wcyhbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mIGhTZWN1cmVTdG9wcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBzZWN1cmVTdG9wcyA9IHRvU2VjdXJlU3RvcHMoaFNlY3VyZVN0b3BzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcElkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiYgaFNlY3VyZVN0b3BJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhoU2VjdXJlU3RvcElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcCgKKyAgICAgICAgICAgIHRvSGlkbFZlYyhzc2lkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IFNlY3VyZVN0b3AmIGhTZWN1cmVTdG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZVN0b3AgPSB0b1ZlY3RvcihoU2VjdXJlU3RvcC5vcGFxdWVEYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzc1JlbGVhc2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOKTsKKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBTZWN1cmVTdG9wUmVsZWFzZSBzZWN1cmVTdG9wUmVsZWFzZTsKKyAgICAgICAgc2VjdXJlU3RvcFJlbGVhc2Uub3BhcXVlRGF0YSA9IHRvSGlkbFZlYyhzc1JlbGVhc2UpOworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luVjFfMS0+cmVsZWFzZVNlY3VyZVN0b3BzKHNlY3VyZVN0b3BSZWxlYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlU2VjdXJlU3RvcCh0b0hpZGxWZWMoc3NSZWxlYXNlKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZW1vdmVBbGxTZWN1cmVTdG9wcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOKTsKKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luVjFfMS0+cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsKiBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7CisgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QqIG9wZW4sIHVpbnQzMl90KiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChvcGVuID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgICpvcGVuID0gMDsKKyAgICAqbWF4ID0gMDsKKworICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luVjFfMS0+Z2V0TnVtYmVyT2ZTZXNzaW9ucyhbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaE9wZW4sIHVpbnQzMl90IGhNYXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm9wZW4gPSBoT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IGhNYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGxldmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAqbGV2ZWwgPSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyaXR5TGV2ZWwodG9IaWRsVmVjKHNlc3Npb25JZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgU2VjdXJpdHlMZXZlbCBoTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxldmVsID0gdG9TZWN1cml0eUxldmVsKGhMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+JiBrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpblYxXzItPnJlbW92ZU9mZmxpbmVMaWNlbnNlKHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUqIGxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgorICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG5hbWUpLCBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcmIGhWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvU3RyaW5nOChoVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQorICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIHRvSGlkbFN0cmluZyhuYW1lKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b1ZlY3RvcihoVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBpZiAobmFtZSA9PSBrUHJvcGVydHlEZXZpY2VVbmlxdWVJZCkgeworICAgICAgICBtTWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlTdHJpbmcodG9IaWRsU3RyaW5nKG5hbWUpLCB0b0hpZGxTdHJpbmcodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwgdG9IaWRsVmVjKHZhbHVlKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGNvbnN1bWVyLT5jb25zdW1lRnJhbWV3b3JrTWV0cmljcyhtTWV0cmljcyk7CisKKyAgICAvLyBBcHBlbmQgdmVuZG9yIG1ldHJpY3MgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgorICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIFN0cmluZzggdmVuZG9yOworICAgICAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSAhPSBPSyB8fCB2ZW5kb3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgIHZlbmRvciA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgIT0gT0sgfHwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIkdldCBkZXNjcmlwdGlvbiBmYWlsZWQgb3IgaXMgZW1wdHkuIik7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICB2ZW5kb3IgKz0gIi4iOworICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247CisKKyAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7CisgICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEtPmdldE1ldHJpY3MoWyZdKFN0YXR1cyBzdGF0dXMsIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiBwbHVnaW5NZXRyaWNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkVycm9yIGdldHRpbmcgcGx1Z2luIG1ldHJpY3M6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5jb25zdW1lSGlkbE1ldHJpY3ModmVuZG9yLCBwbHVnaW5NZXRyaWNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+c2V0Q2lwaGVyQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxTdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRNYWNBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldE1hY0FsZ29yaXRobSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6ZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBpbnB1dCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpbi0+ZW5jcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGtleUlkKSwgdG9IaWRsVmVjKGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKGl2KSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB0b1ZlY3RvcihoT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpkZWNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGlucHV0LCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5kZWNyeXB0KHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hpZGxWZWMoaXYpLCBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHRvVmVjdG9yKGhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zaWduKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFNpZ25hdHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gdG9WZWN0b3IoaFNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpbi0+dmVyaWZ5KHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNpZ25hdHVyZSksIFsmXShTdGF0dXMgc3RhdHVzLCBib29sIGhNYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gaE1hdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzaWduUlNBKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiB3cmFwcGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNpZ25SU0EoCisgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSksIHRvSGlkbFZlYyhtZXNzYWdlKSwKKyAgICAgICAgICAgIHRvSGlkbFZlYyh3cmFwcGVkS2V5KSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoU2lnbmF0dXJlKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRvVmVjdG9yKGhTaWduYXR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0ZDo6c3RyaW5nIERybUhhbEhpZGw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0IHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbShtZWRpYW1ldHJpY3NfY3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKGl0ZW0sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPQorICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CisgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOworfQorCitzdGQ6OnN0cmluZyBEcm1IYWxIaWRsOjpyZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3QgeworICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOworICAgIFN0cmluZzggdmVuZG9yOworICAgIFN0cmluZzggZGVzY3JpcHRpb247CisgICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKKyAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgorICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSA9PSBPSyAmJgorICAgICAgICBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzgoIm1ldHJpY3MiKSwgbWV0cmljc1ZlY3RvcikgPT0gT0spIHsKKyAgICAgICAgbWV0cmljc1N0cmluZyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQobWV0cmljc1ZlY3Rvci5hcnJheSgpLCBtZXRyaWNzVmVjdG9yLnNpemUoKSk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFuZHJvaWQ6OnJlcG9ydERybVBsdWdpbk1ldHJpY3MobWV0cmljc1N0cmluZywgdmVuZG9yLCBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0cmljcy5HZXRBcHBVaWQoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWNzIHdlcmUgcmV0cmlldmVkIGJ1dCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQ6ICVkIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWV0cmljc1N0cmluZzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtUGx1Z2luVjFfNCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBoTGV2ZWwgPSB0b0hpZGxTZWN1cml0eUxldmVsKHNlY3VyaXR5TGV2ZWwpOworICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXIoaGlkbF9zdHJpbmcobWltZSksIGhMZXZlbCk7CisgICAgaWYgKCFoUmVzdWx0LmlzT2soKSkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKCJyZXF1aXJlc1NlY3VyZURlY29kZXIgdHhuIGZhaWxlZDogJXMiLCBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHJlcXVpcmVkKSB7CisgICAgICAgICpyZXF1aXJlZCA9IGhSZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1QbHVnaW5WMV80LT5zZXRQbGF5YmFja0lkKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3N0cmluZyhwbGF5YmFja0lkKSk7CisgICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklEcm1QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gJmZhY3RvcnkgOiBtRmFjdG9yaWVzKSB7CisgICAgICAgIHNwPGRybTo6VjFfMzo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8zID0gZHJtOjpWMV8zOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgICAgIGlmIChmYWN0b3J5VjFfMyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZhY3RvcnlWMV8zLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKAorICAgICAgICAgICAgWyZdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9hcnJheTx1aW50OF90LCAxNj4+JiBzY2hlbWVzX2hpZGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnNjaGVtZSA6IHNjaGVtZXNfaGlkbCkgeworICAgICAgICAgICAgICAgICAgICBzY2hlbWVzLmluc2VydChzY2hlbWVzLmVuZCgpLCBzY2hlbWUuZGF0YSgpLCBzY2hlbWUuZGF0YSgpICsgc2NoZW1lLnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbExpc3RlbmVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZjQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybUhhbExpc3RlbmVyIgorCisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsTGlzdGVuZXIuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFZlY3Rvcjx1aW50OF90PiB0b1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZlY3RvcjsKKyAgICB2ZWN0b3IuYXBwZW5kQXJyYXkodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgcmV0dXJuICpjb25zdF9jYXN0PGNvbnN0IFZlY3Rvcjx1aW50OF90Pio+KCZ2ZWN0b3IpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IHVpbnQ4X3Q+CitzdGF0aWMgaGlkbF92ZWM8VD4gdG9IaWRsVmVjKGNvbnN0IFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgaGlkbF92ZWM8VD4gdmVjOworICAgIHZlYy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8VCo+KHZlY3Rvci5hcnJheSgpKSwgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworRHJtSGFsTGlzdGVuZXI6OkRybUhhbExpc3RlbmVyKE1lZGlhRHJtTWV0cmljcyogbWV0cmljcykKKyAgICA6IG1NZXRyaWNzKG1ldHJpY3MpIHt9CisKK0RybUhhbExpc3RlbmVyOjp+RHJtSGFsTGlzdGVuZXIoKSB7fQorCit2b2lkIERybUhhbExpc3RlbmVyOjpzZXRMaXN0ZW5lcihzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1FdmVudExvY2spOworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxMaXN0ZW5lcjo6b25FdmVudChFdmVudFR5cGVBaWRsIGV2ZW50VHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgbU1ldHJpY3MtPm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClldmVudFR5cGVBaWRsKTsKKworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZTsKKyAgICAgICAgc3dpdGNoIChldmVudFR5cGVBaWRsKSB7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUFpZGw6OlBST1ZJU0lPTl9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVBaWRsOjpLRVlfTkVFREVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVBaWRsOjpLRVlfRVhQSVJFRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleUV4cGlyZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUFpZGw6OlZFTkRPUl9ERUZJTkVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQWlkbDo6U0VTU0lPTl9SRUNMQUlNRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgdG9IaWRsVmVjKHRvVmVjdG9yKHNlc3Npb25JZCkpLCB0b0hpZGxWZWModG9WZWN0b3IoZGF0YSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbExpc3RlbmVyOjpvbkV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHRvSGlkbFZlYyh0b1ZlY3RvcihzZXNzaW9uSWQpKSwgZXhwaXJ5VGltZUluTVMpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsTGlzdGVuZXI6Om9uS2V5c0NoYW5nZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEtleVN0YXR1c0FpZGw+JiBrZXlTdGF0dXNMaXN0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7CisgICAgICAgIHNpemVfdCBuS2V5cyA9IGtleVN0YXR1c0xpc3RBaWRsLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBLZXlTdGF0dXNBaWRsIGtleVN0YXR1cyA9IGtleVN0YXR1c0xpc3RBaWRsW2ldOworICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5U3RhdHVzLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OkVYUElSRUQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0V4cGlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6T1VUUFVUX05PVF9BTExPV0VEOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9PdXRwdXROb3RBbGxvd2VkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlNUQVRVU19QRU5ESU5HOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRV9JTl9GVVRVUkU6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZUluRnV0dXJlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0ludGVybmFsRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5wdXNoX2JhY2soe3R5cGUsIHRvSGlkbFZlYyh0b1ZlY3RvcihrZXlTdGF0dXMua2V5SWQpKX0pOworICAgICAgICAgICAgbU1ldHJpY3MtPm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3Qpa2V5U3RhdHVzLnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2UodG9IaWRsVmVjKHRvVmVjdG9yKHNlc3Npb25JZCkpLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUncyBubyBsaXN0ZW5lci4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gY291bnQgdGhlIGtleSBjaGFuZ2UKKyAgICAgICAgLy8gZXZlbnRzLgorICAgICAgICBzaXplX3QgbktleXMgPSBrZXlTdGF0dXNMaXN0QWlkbC5zaXplKCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgaSsrKSB7CisgICAgICAgICAgICBtTWV0cmljcy0+bUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClrZXlTdGF0dXNMaXN0QWlkbFtpXS50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsTGlzdGVuZXI6Om9uU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZSh0b0hpZGxWZWModG9WZWN0b3Ioc2Vzc2lvbklkKSkpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKaW5kZXggOTk2ZmQxOS4uNzdiNTM0MyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzLmNwcApAQCAtMTIzLDIwICsxMjMsMTkgQEAKICAgICAgICAgfSk7CiAKICAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5FeHBvcnRWYWx1ZXMoCi0gICAgICAgIFsmXShjb25zdCBLZXlTdGF0dXNUeXBlIGtleV9zdGF0dXNfdHlwZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICBbJl0oY29uc3QgdWludDMyX3Qga2V5X3N0YXR1c190eXBlLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KICAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9rZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyKCk7CiAgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOwotICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9rZXlfc3RhdHVzX3R5cGUoCi0gICAgICAgICAgICAgICAgKHVpbnQzMl90KWtleV9zdGF0dXNfdHlwZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2tleV9zdGF0dXNfdHlwZShrZXlfc3RhdHVzX3R5cGUpOwogICAgICAgICB9KTsKIAogICAgIG1FdmVudENvdW50ZXIuRXhwb3J0VmFsdWVzKAotICAgICAgICBbJl0oY29uc3QgRXZlbnRUeXBlIGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgWyZdKGNvbnN0IHVpbnQzMl90IGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKICAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQogICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX2V2ZW50X2NhbGxiYWNrX2NvdW50ZXIoKTsKICAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7Ci0gICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2V2ZW50X3R5cGUoKHVpbnQzMl90KWV2ZW50X3R5cGUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9ldmVudF90eXBlKGV2ZW50X3R5cGUpOwogICAgICAgICB9KTsKIAogICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuRXhwb3J0VmFsdWVzKApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3NDb25zdW1lci5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcAppbmRleCA1ZjBiMjZlLi5jMDZmMDliIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcApAQCAtMzIsMjYgKzMyLDI0IEBACiAKIG5hbWVzcGFjZSB7CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lKFQgdHlwZSk7Ci0KLXRlbXBsYXRlIDw+IHN0ZDo6c3RyaW5nIEdldEF0dHJpYnV0ZU5hbWU8S2V5U3RhdHVzVHlwZT4oS2V5U3RhdHVzVHlwZSB0eXBlKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiVVNBQkxFIiwgIkVYUElSRUQiLAorc3RkOjpzdHJpbmcgR2V0QXR0cmlidXRlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIHVpbnQzMl90IGF0dHJpYnV0ZSkgeworICAgIGlmICh0eXBlTmFtZSA9PSAiS2V5U3RhdHVzQ2hhbmdlIikgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lc1tdID0geyJVU0FCTEUiLCAiRVhQSVJFRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1VUUFVUX05PVF9BTExPV0VEIiwgIlNUQVRVU19QRU5ESU5HIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlRFUk5BTF9FUlJPUiIsICJVU0FCTEVfSU5fRlVUVVJFIn07Ci0gICAgaWYgKCgoc2l6ZV90KXR5cGUpID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewotICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisgICAgICAgIGlmIChhdHRyaWJ1dGUgPj0gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVfbmFtZXNbYXR0cmlidXRlXTsKICAgICB9Ci0gICAgcmV0dXJuIHR5cGVfbmFtZXNbKHNpemVfdCl0eXBlXTsKLX0KLQotdGVtcGxhdGUgPD4gc3RkOjpzdHJpbmcgR2V0QXR0cmlidXRlTmFtZTxFdmVudFR5cGU+KEV2ZW50VHlwZSB0eXBlKSB7CisgICAgCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiUFJPVklTSU9OX1JFUVVJUkVEIiwgIktFWV9ORUVERUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktFWV9FWFBJUkVEIiwgIlZFTkRPUl9ERUZJTkVEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRVNTSU9OX1JFQ0xBSU1FRCJ9OwotICAgIGlmICgoKHNpemVfdCl0eXBlKSA+PSBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICBpZiAoYXR0cmlidXRlID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewogICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CiAgICAgfQotICAgIHJldHVybiB0eXBlX25hbWVzWyhzaXplX3QpdHlwZV07CisgICAgcmV0dXJuIHR5cGVfbmFtZXNbYXR0cmlidXRlXTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkBAIC04NywxNCArODUsMTQgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMoCi0gICAgY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwgUGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpIHsKKyAgICBjb25zdCBhbmRyb2lkOjpDb3VudGVyTWV0cmljPFQ+ICZjb3VudGVyLCBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CiAgICAgaWYgKCFtZXRyaWNzKSB7CiAgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb3VudGVyLkV4cG9ydFZhbHVlcyhbJl0oY29uc3QgVCAmYXR0cmlidXRlLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgY291bnRlci5FeHBvcnRWYWx1ZXMoWyZdKGNvbnN0IHVpbnQzMl90IGF0dHJpYnV0ZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgewogICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gY291bnRlci5tZXRyaWNfbmFtZSgpICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlKSArICIuY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QXR0cmlidXRlTmFtZSh0eXBlTmFtZSwgYXR0cmlidXRlKSArICIuY291bnQiOwogICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KG5hbWUuY19zdHIoKSksIHZhbHVlKTsKICAgICB9KTsKIH0KQEAgLTE5Niw4ICsxOTQsOCBAQAogICAgIEV4cG9ydEV2ZW50TWV0cmljKG1ldHJpY3MubVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVcywgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlciwgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLCBtQnVuZGxlKTsKLSAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIsIG1CdW5kbGUpOwotICAgIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMobWV0cmljcy5tRXZlbnRDb3VudGVyLCBtQnVuZGxlKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIsICJLZXlTdGF0dXNDaGFuZ2UiLCBtQnVuZGxlKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUV2ZW50Q291bnRlciwgIkV2ZW50IiwgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIsIG1CdW5kbGUpOwogICAgIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMobWV0cmljcy5HZXRTZXNzaW9uTGlmZXNwYW5zKCksIG1CdW5kbGUpOwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtVXRpbHMuY3BwCmluZGV4IDBiMTE3YTMuLmJlMGNkNGIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVV0aWxzLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1VdGlscyIKIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgpAQCAtMzIsMTAgKzMzLDEwIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CkBAIC01NywxMCArNTgsMTAgQEAKIAogbmFtZXNwYWNlIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgSGFsPgotSGFsICpNYWtlT2JqZWN0KHN0YXR1c190ICpwc3RhdHVzKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsPgorSGFsKiBNYWtlT2JqZWN0KHN0YXR1c190KiBwc3RhdHVzKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RhdHVzX3QgJnN0YXR1cyA9IHBzdGF0dXMgPyAqcHN0YXR1cyA6IGVycjsKKyAgICBzdGF0dXNfdCYgc3RhdHVzID0gcHN0YXR1cyA/ICpwc3RhdHVzIDogZXJyOwogICAgIGF1dG8gb2JqID0gbmV3IEhhbCgpOwogICAgIHN0YXR1cyA9IG9iai0+aW5pdENoZWNrKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gTk9fSU5JVCkgewpAQCAtNzAsNDMgKzcxLDQ0IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBIYWwsIHR5cGVuYW1lIFYsIHR5cGVuYW1lIE0+Ci12b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYgJmZhY3RvcmllcywgTSYgaW5zdGFuY2VzKSB7Cit2b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYmIGZhY3RvcmllcywgTSYgaW5zdGFuY2VzKSB7CiAgICAgc3A8SFNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWFuYWdlciA9IEhTZXJ2aWNlTWFuYWdlcjo6Z2V0U2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlTWFuYWdlciA9PSBudWxscHRyKSB7CiAgICAgICAgIExPRzJCRSgiRmFpbGVkIHRvIGdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNlcnZpY2VNYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IEhhbDo6Z2V0U2VydmljZShpbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2VzW2luc3RhbmNlLmNfc3RyKCldID0gSGFsOjpkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIGlmICghdXVpZCkgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICBzZXJ2aWNlTWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoCisgICAgICAgICAgICBIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBIYWw6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2UuY19zdHIoKV0gPSBIYWw6OmRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VwcG9ydGVkLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQgdHhuIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1dG8gc3VwcG9ydGVkID0gZmFjdG9yeS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdXBwb3J0ZWQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQgdHhuIGZhaWxlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSk7CisgICAgICAgICAgICB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEhhbCwgdHlwZW5hbWUgVj4KLXZvaWQgTWFrZUhpZGxGYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgViAmZmFjdG9yaWVzKSB7Cit2b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYmIGZhY3RvcmllcykgewogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gaW5zdGFuY2VzOwogICAgIE1ha2VIaWRsRmFjdG9yaWVzPEhhbD4odXVpZCwgZmFjdG9yaWVzLCBpbnN0YW5jZXMpOwogfQogCi1oaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWMoc2l6ZSk7CiAgICAgaWYgKHB0ciAhPSBudWxscHRyKSB7CiAgICAgICAgIG1lbWNweSh2ZWMuZGF0YSgpLCBwdHIsIHNpemUpOwpAQCAtMTE0LDE5ICsxMTYsMTkgQEAKICAgICByZXR1cm4gdmVjOwogfQogCi1oaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiB0b0hpZGxBcnJheTE2KGNvbnN0IHVpbnQ4X3QgKnB0cikgeworaGlkbF9hcnJheTx1aW50OF90LCAxNj4gdG9IaWRsQXJyYXkxNihjb25zdCB1aW50OF90KiBwdHIpIHsKICAgICBpZiAocHRyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+KCk7CiAgICAgfQogICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PihwdHIpOwogfQogCi1zcDw6OlYxXzA6OklEcm1QbHVnaW4+IE1ha2VEcm1QbHVnaW4oY29uc3Qgc3A8OjpWMV8wOjpJRHJtRmFjdG9yeT4gJmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgY2hhciAqYXBwUGFja2FnZU5hbWUpIHsKK3NwPDo6VjFfMDo6SURybVBsdWdpbj4gTWFrZURybVBsdWdpbihjb25zdCBzcDw6OlYxXzA6OklEcm1GYWN0b3J5PiYgZmFjdG9yeSwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcHBQYWNrYWdlTmFtZSkgewogICAgIHNwPDo6VjFfMDo6SURybVBsdWdpbj4gcGx1Z2luOwogICAgIGF1dG8gZXJyID0gZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKAogICAgICAgICAgICAgdG9IaWRsQXJyYXkxNih1dWlkKSwgaGlkbF9zdHJpbmcoYXBwUGFja2FnZU5hbWUpLAotICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiAmaFBsdWdpbikgeworICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiYgaFBsdWdpbikgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gOjpWMV8wOjpTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiTWFrZURybVBsdWdpbiBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTQxLDEzICsxNDMsMTMgQEAKICAgICB9CiB9CiAKLXNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gTWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9GYWN0b3J5PiAmZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwKK3NwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gTWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkKiBpbml0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CiAgICAgc3A8OjpWMV8wOjpJQ3J5cHRvUGx1Z2luPiBwbHVnaW47CiAgICAgYXV0byBlcnIgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4oCiAgICAgICAgICAgICB0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCi0gICAgICAgICAgICBbJl0oOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+ICZoUGx1Z2luKSB7CisgICAgICAgICAgICBbJl0oOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSA6OlYxXzA6OlN0YXR1czo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgTE9HMkJFKHV1aWQsICJNYWtlQ3J5cHRvUGx1Z2luIGZhaWxlZDogJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xNjIsMTcgKzE2NCwzOCBAQAogICAgIH0KIH0KIAotfSAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZQogCiBib29sIFVzZURybVNlcnZpY2UoKSB7CiAgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYWRybS51c2VfbWVkaWFkcm1zZXJ2ZXIiLCB0cnVlKTsKIH0KIAotc3A8SURybT4gTWFrZURybShzdGF0dXNfdCAqcHN0YXR1cykgeworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4+IG1ha2VEcm1GYWN0b3JpZXNBaWRsKCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+PiBmYWN0b3JpZXM7CisgICAgQVNlcnZpY2VNYW5hZ2VyX2ZvckVhY2hEZWNsYXJlZEluc3RhbmNlKAorICAgICAgICBJRHJtRmFjdG9yeUFpZGw6OmRlc2NyaXB0b3IsIHN0YXRpY19jYXN0PHZvaWQqPigmZmFjdG9yaWVzKSwKKyAgICAgICAgW10oY29uc3QgY2hhciogaW5zdGFuY2UsIHZvaWQqIGNvbnRleHQpIHsKKyAgICAgICAgICAgIGF1dG8gZnVsbE5hbWUgPSBzdGQ6OnN0cmluZyhJRHJtRmFjdG9yeUFpZGw6OmRlc2NyaXB0b3IpICsgIi8iICsgc3RkOjpzdHJpbmcoaW5zdGFuY2UpOworICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gSURybUZhY3RvcnlBaWRsOjpmcm9tQmluZGVyKAorICAgICAgICAgICAgICAgICAgICA6Om5kazo6U3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoZnVsbE5hbWUuY19zdHIoKSkpKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGZvdW5kIElEcm1GYWN0b3J5LiBJbnN0YW5jZSBuYW1lOlslc10iLCBmdWxsTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBJRHJtRmFjdG9yeS4gSW5zdGFuY2UgbmFtZTpbJXNdIiwgZnVsbE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SURybUZhY3RvcnlBaWRsPj4qPihjb250ZXh0KS0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKKyAgICAgICAgfSk7CisKKyAgICByZXR1cm4gZmFjdG9yaWVzOworfQorCitzcDxJRHJtPiBNYWtlRHJtKHN0YXR1c190KiBwc3RhdHVzKSB7CiAgICAgcmV0dXJuIE1ha2VPYmplY3Q8RHJtSGFsPihwc3RhdHVzKTsKIH0KIAotc3A8SUNyeXB0bz4gTWFrZUNyeXB0byhzdGF0dXNfdCAqcHN0YXR1cykgeworc3A8SUNyeXB0bz4gTWFrZUNyeXB0byhzdGF0dXNfdCogcHN0YXR1cykgewogICAgIHJldHVybiBNYWtlT2JqZWN0PENyeXB0b0hhbD4ocHN0YXR1cyk7CiB9CiAKQEAgLTE5MSw5ICsyMTQsOSBAQAogfQogCiBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1QbHVnaW4+PiBNYWtlRHJtUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwcFBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcHBQYWNrYWdlTmFtZSkgewogICAgIHN0ZDo6dmVjdG9yPHNwPDo6VjFfMDo6SURybVBsdWdpbj4+IHBsdWdpbnM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZmYWN0b3J5IDogTWFrZURybUZhY3Rvcmllcyh1dWlkKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IE1ha2VEcm1GYWN0b3JpZXModXVpZCkpIHsKICAgICAgICAgcGx1Z2lucy5wdXNoX2JhY2soTWFrZURybVBsdWdpbihmYWN0b3J5LCB1dWlkLCBhcHBQYWNrYWdlTmFtZSkpOwogICAgIH0KICAgICByZXR1cm4gcGx1Z2luczsKQEAgLTIwOSwxMCArMjMyLDExIEBACiAgICAgcmV0dXJuIGNyeXB0b0ZhY3RvcmllczsKIH0KIAotc3RkOjp2ZWN0b3I8c3A8SUNyeXB0b1BsdWdpbj4+IE1ha2VDcnlwdG9QbHVnaW5zKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmluaXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0RGF0YVNpemUpIHsKLSAgICBzdGQ6OnZlY3RvcjxzcDxJQ3J5cHRvUGx1Z2luPj4gcGx1Z2luczsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmZhY3RvcnkgOiBNYWtlQ3J5cHRvRmFjdG9yaWVzKHV1aWQpKSB7CitzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+PiBNYWtlQ3J5cHRvUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8OjpWMV8wOjpJQ3J5cHRvUGx1Z2luPj4gcGx1Z2luczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBNYWtlQ3J5cHRvRmFjdG9yaWVzKHV1aWQpKSB7CiAgICAgICAgIHBsdWdpbnMucHVzaF9iYWNrKE1ha2VDcnlwdG9QbHVnaW4oZmFjdG9yeSwgdXVpZCwgaW5pdERhdGEsIGluaXREYXRhU2l6ZSkpOwogICAgIH0KICAgICByZXR1cm4gcGx1Z2luczsKQEAgLTIyMCw5MCArMjQ0LDkwIEBACiAKIHN0YXR1c190IHRvU3RhdHVzVF8xXzQoOjpWMV80OjpTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpPSzoKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkJBRF9WQUxVRToKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERUNSWVBUOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOVkFMSURfU1RBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpCQURfVkFMVUU6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAKLSAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q0FOTk9UX0RFQ1JZUFRfWkVST19TVUJTQU1QTEVTOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1pFUk9fU1VCU0FNUExFUzsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpDUllQVE9fTElCUkFSWV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DUllQVE9fTElCUkFSWTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX09FTV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX09FTTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX1BMVUdJTl9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX1BMVUdJTjsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpJTklUX0RBVEFfSU5WQUxJRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTklUX0RBVEE7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6S0VZX05PVF9MT0FERUQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fS0VZX05PVF9MT0FERUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QQVJTRV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BBUlNFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUE9MSUNZX0VSUk9SOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVMRUFTRV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFTEVBU0U7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVRVUVTVF9SRUpFQ1RFRDsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFU1RPUkVfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVNUT1JFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfU1RBVEVfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9TVEFURTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNQUxGT1JNRURfQ0VSVElGSUNBVEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0VSVElGSUNBVEVfTUFMRk9STUVEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1FRElBX0ZSQU1FV09SS19FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUks7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUlTU0lOR19DRVJUSUZJQ0FURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NSVNTSU5HOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DRVJUSUZJQ0FURV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfQ0VSVElGSUNBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX0NPTkZJR1VSQVRJT05fRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NPTkZJRzsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfUEFSU0VfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlJFVFJZQUJMRV9QUk9WSVNJT05JTkdfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFVFJZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlNFQ1VSRV9TVE9QX1JFTEVBU0VfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VDVVJFX1NUT1BfUkVMRUFTRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1JFQURfRkFJTFVSRToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1JFQUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6U1RPUkFHRV9XUklURV9GQUlMVVJFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfV1JJVEU7CisgICAgICAgIC8vIE5ldyBpbiBTIC8gZHJtQDEuNDoKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q0FOTk9UX0RFQ1JZUFRfWkVST19TVUJTQU1QTEVTOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9aRVJPX1NVQlNBTVBMRVM7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkNSWVBUT19MSUJSQVJZX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DUllQVE9fTElCUkFSWTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6R0VORVJBTF9PRU1fRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0dFTkVSSUNfT0VNOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX1BMVUdJTl9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fR0VORVJJQ19QTFVHSU47CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OklOSVRfREFUQV9JTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTklUX0RBVEE7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OktFWV9OT1RfTE9BREVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9LRVlfTk9UX0xPQURFRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QQVJTRV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9QQVJTRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QT0xJQ1lfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFTEVBU0VfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVMRUFTRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVTVE9SRV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVNUT1JFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1NUQVRFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNQUxGT1JNRURfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01BTEZPUk1FRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUVESUFfRlJBTUVXT1JLX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUks7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1JU1NJTkdfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01JU1NJTkc7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DRVJUSUZJQ0FURV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NFUlRJRklDQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfQ09ORklHVVJBVElPTl9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NPTkZJRzsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX1BBUlNFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUEFSU0U7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUkVRVUVTVF9SRUpFQ1RFRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UkVUUllBQkxFX1BST1ZJU0lPTklOR19FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFVFJZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTRUNVUkVfU1RPUF9SRUxFQVNFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRUNVUkVfU1RPUF9SRUxFQVNFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1JFQURfRkFJTFVSRToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU1RPUkFHRV9SRUFEOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1dSSVRFX0ZBSUxVUkU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfV1JJVEU7CiAKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwogICAgIH0KICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CiB9CkBAIC0zMTIsMjAgKzMzNiwzNCBAQAogY2hhciBsb2dQcmlvcml0eVRvQ2hhcig6OlYxXzQ6OkxvZ1ByaW9yaXR5IHByaW9yaXR5KSB7CiAgICAgY2hhciBwID0gJ1UnOwogICAgIHN3aXRjaCAocHJpb3JpdHkpIHsKLSAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpWRVJCT1NFOiAgcCA9ICdWJzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6REVCVUc6ICAgIHAgPSAnRCc7IGJyZWFrOwotICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OklORk86ICAgICBwID0gJ0knOyBicmVhazsKLSAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpXQVJOOiAgICAgcCA9ICdXJzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RVJST1I6ICAgIHAgPSAnRSc7IGJyZWFrOwotICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OkZBVEFMOiAgICBwID0gJ0YnOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogcCA9ICdVJzsgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6VkVSQk9TRToKKyAgICAgICAgICAgIHAgPSAnVic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpERUJVRzoKKyAgICAgICAgICAgIHAgPSAnRCc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpJTkZPOgorICAgICAgICAgICAgcCA9ICdJJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OldBUk46CisgICAgICAgICAgICBwID0gJ1cnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RVJST1I6CisgICAgICAgICAgICBwID0gJ0UnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RkFUQUw6CisgICAgICAgICAgICBwID0gJ0YnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwID0gJ1UnOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBwOwogfQogfSAgLy8gbmFtZXNwYWNlCiAKLXN0ZDo6c3RyaW5nIEdldEV4Y2VwdGlvbk1lc3NhZ2Uoc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICptc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CitzdGQ6OnN0cmluZyBHZXRFeGNlcHRpb25NZXNzYWdlKHN0YXR1c190IGVyciwgY29uc3QgY2hhciogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgewogICAgIHN0ZDo6c3RyaW5nIHJ1bGVyKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICBzdGQ6OnN0cmluZyBoZWFkZXIoIkJlZ2lubmluZyBvZiBEUk0gUGx1Z2luIExvZyIpOwogICAgIHN0ZDo6c3RyaW5nIGZvb3RlcigiRW5kIG9mIERSTSBQbHVnaW4gTG9nIik7CkBAIC0zNTUsNyArMzkzLDcgQEAKICAgICByZXR1cm4gbXNnOC5jX3N0cigpOwogfQogCi12b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSAmbG9nKSB7Cit2b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSYgbG9nKSB7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CiAgICAgbUJ1ZmZlci5wdXNoX2JhY2sobG9nKTsKICAgICB3aGlsZSAobUJ1ZmZlci5zaXplKCkgPiBNQVhfQ0FQQUNJVFkpIHsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCA3MjgxMDY2Li5hODVlM2NmIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwCkBAIC0zNSw3ICszNSw4IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAibGliYWlkbGNvbW1vbnN1cHBvcnQiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLApAQCAtNTksNiArNjAsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40IiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAgICAgZnV6el9jb25maWc6IHsKICAgICAgICAgY2M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcAppbmRleCA4ZGYwNDc3Li41OTdiNzJkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL21lZGlhZHJtX2Z1enplci5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9tZWRpYWRybV9mdXp6ZXIuY3BwCkBAIC0yMCwxMCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KIAogI2RlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgogI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkKQEAgLTMzLDYgKzM2LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKIAogZW51bSB7CiAgICAgSU5WQUxJRF9VVUlEID0gMCwKQEAgLTM5OCw3ICs0MDIsNyBAQAogICAgICAgICAuc2VjdXJlTWVtb3J5ID0gbnVsbHB0cn07CiAKICAgICBjb25zdCB1aW50NjRfdCBvZmZzZXQgPSAwOwotICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnID0gbnVsbHB0cjsKKyAgICBBU3RyaW5nIGVycm9yRGV0YWlsTXNnOwogICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlOwogICAgIGJvb2wgc2hvdWxkUGFzc1JhbmRvbUNyeXB0b01vZGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOwogICAgIGlmIChzaG91bGRQYXNzUmFuZG9tQ3J5cHRvTW9kZSkgewpAQCAtNDA4LDcgKzQxMiw3IEBACiAgICAgICAgICAgICBrQ3J5cHRvTW9kZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bUNyeXB0b01vZGUgLSAxKV07CiAgICAgfQogICAgIG1DcnlwdG8tPmRlY3J5cHQoa2V5SWQsIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2VCdWZmZXIsIG9mZnNldCwgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsIGVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsICZlcnJvckRldGFpbE1zZyk7CiAKICAgICBpZiAoaGVhcFNlcU51bSA+PSAwKSB7CiAgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChoZWFwU2VxTnVtKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKaW5kZXggNWZkMzllNi4uMzJhNjc0MSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKQEAgLTE1LDI1ICsxNSwxMiBAQAogICovCiAKICNpZm5kZWYgQ1JZUFRPX0hBTF9IXwotCiAjZGVmaW5lIENSWVBUT19IQUxfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSUNyeXB0b1BsdWdpbi5oPgotCiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLQogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKIAogY2xhc3MgSU1lbW9yeUhlYXA7CkBAIC00Myw2NyArMzAsMzAgQEAKIHN0cnVjdCBDcnlwdG9IYWwgOiBwdWJsaWMgSUNyeXB0byB7CiAgICAgQ3J5cHRvSGFsKCk7CiAgICAgdmlydHVhbCB+Q3J5cHRvSGFsKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCiAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKLQogICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKLQogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCi0gICAgICAgICAgICBjb25zdCA6OlNoYXJlZEJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXIgJnNvdXJjZSwgc2l6ZV90IG9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXIgJmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sCiAgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7Ci0KLSAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgewotICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9Ci0KKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3Q7Ci0KIHByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIGNvbnN0IFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1GYWN0b3JpZXM7Ci0gICAgc3A8SUNyeXB0b1BsdWdpbj4gbVBsdWdpbjsKLSAgICBzcDxkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4+IG1QbHVnaW5WMV8yOwotCi0gICAgLyoqCi0gICAgICogbUluaXRDaGVjayBpczoKLSAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKLSAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCi0gICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCi0gICAgICovCi0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLQotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNpemVfdD4gbUhlYXBTaXplczsKLSAgICBpbnQzMl90IG1IZWFwU2VxTnVtOwotCi0gICAgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbWFrZUNyeXB0b0ZhY3RvcmllcygpOwotICAgIHNwPElDcnlwdG9QbHVnaW4+IG1ha2VDcnlwdG9QbHVnaW4oY29uc3Qgc3A8SUNyeXB0b0ZhY3Rvcnk+JiBmYWN0b3J5LAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGludDMyX3Qgc2V0SGVhcEJhc2UoY29uc3Qgc3A8SGlkbE1lbW9yeT4mIGhlYXApOwotICAgIHZvaWQgY2xlYXJIZWFwQmFzZShpbnQzMl90IHNlcU51bSk7Ci0KLSAgICBzdGF0dXNfdCBjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCA6OlNoYXJlZEJ1ZmZlciYgYnVmZmVyKTsKLQorICAgIHNwPElDcnlwdG8+IG1DcnlwdG9IYWxIaWRsOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG9IYWxBaWRsOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENyeXB0b0hhbCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KKyNlbmRpZiAgLy8gQ1JZUFRPX0hBTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg3OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENSWVBUT19IQUxfQUlETF9IXworI2RlZmluZSBDUllQVE9fSEFMX0FJRExfSF8KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7Cit1c2luZyBJQ3J5cHRvUGx1Z2luQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLQorLy8gVE9ETzogcmVwbGFjZSBiZWZvcmUgcmVtb3ZpbmcgaGlkbCBpbnRlcmZhY2UKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLQorCitjbGFzcyBJTWVtb3J5SGVhcDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ3J5cHRvSGFsQWlkbCA6IHB1YmxpYyBJQ3J5cHRvIHsKKyAgICBDcnlwdG9IYWxBaWRsKCk7CisgICAgdmlydHVhbCB+Q3J5cHRvSGFsQWlkbCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sIGNvbnN0IDo6U2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4+IG1GYWN0b3JpZXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPElDcnlwdG9QbHVnaW5BaWRsPiBtUGx1Z2luOworCisgICAgLyoqCisgICAgICogbUluaXRDaGVjayBpczoKKyAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKKyAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCisgICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCisgICAgICovCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNpemVfdD4gbUhlYXBTaXplczsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElDcnlwdG9QbHVnaW5BaWRsPiBtYWtlQ3J5cHRvUGx1Z2luKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4mIGZhY3RvcnksIGNvbnN0IFV1aWQmIHV1aWRBaWRsLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5pdERhdGEpOworCisgICAgc3RhdHVzX3QgY2hlY2tTaGFyZWRCdWZmZXIoY29uc3QgOjpTaGFyZWRCdWZmZXImIGJ1ZmZlcik7CisgICAgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZEludGVybmFsKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGludCogZmFjdG9yeUlkeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9IYWxBaWRsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDUllQVE9fSEFMX0FJRExfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEhpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGIxZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDUllQVE9fSEFMX0hJRExfSF8KKyNkZWZpbmUgQ1JZUFRPX0hBTF9ISURMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L0lDcnlwdG9QbHVnaW4uaD4KKworI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkhpZGxNZW1vcnk7CisKK2NsYXNzIElNZW1vcnlIZWFwOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDcnlwdG9IYWxIaWRsIDogcHVibGljIElDcnlwdG8geworICAgIENyeXB0b0hhbEhpZGwoKTsKKyAgICB2aXJ0dWFsIH5DcnlwdG9IYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCA6OlNoYXJlZEJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgOjpEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sCisgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7CisKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3QgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbUZhY3RvcmllczsKKyAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luOworICAgIHNwPGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbj4gbVBsdWdpblYxXzI7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc2l6ZV90PiBtSGVhcFNpemVzOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBtYWtlQ3J5cHRvRmFjdG9yaWVzKCk7CisgICAgc3A8SUNyeXB0b1BsdWdpbj4gbWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDxJQ3J5cHRvRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50MzJfdCBzZXRIZWFwQmFzZShjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdm9pZCBjbGVhckhlYXBCYXNlKGludDMyX3Qgc2VxTnVtKTsKKworICAgIHN0YXR1c190IGNoZWNrU2hhcmVkQnVmZmVyKGNvbnN0IDo6U2hhcmVkQnVmZmVyJiBidWZmZXIpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvSGFsSGlkbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKaW5kZXggN2ViMWRlYy4uZWFiNTk3YiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKQEAgLTE0LDc3ICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBEUk1fSEFMX0hfCi0KLSNkZWZpbmUgRFJNX0hBTF9IXwotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Ci11c2luZyBkcm06OlYxXzI6OktleVN0YXR1czsKLXVzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLQotdHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKLXR5cGVkZWYgZHJtOjpWMV8wOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzA7CisjaWZuZGVmIERSTV9IQUxfSF8KKyNkZWZpbmUgRFJNX0hBTF9IXwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7Ci0gICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Ci19Ci0KLXN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgSURybSwKLSAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgewotCi0gICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7Ci0KK3N0cnVjdCBEcm1IYWwgOiBwdWJsaWMgSURybSB7CiAgICAgRHJtSGFsKCk7CiAgICAgdmlydHVhbCB+RHJtSGFsKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXN1bHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdAogICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCkBAIC05MiwxNjggKzQyLDg5IEBACiAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCAmY2VydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmNlcnRBdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsVXJsKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKICAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhjb25zdCBzcDxJRHJtTWV0cmljc0NvbnN1bWVyPiAmY29uc3VtZXIpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm1hdGNoKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja0lkKAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF5YmFja0lkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIGNvbnN0OwotCi0gICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7Ci0KLSAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOwotCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFNjaGVtZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNjaGVtZXMpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0YXRpYyBNdXRleCBtTG9jazsKLQotICAgIHNwPElEcm1DbGllbnQ+IG1MaXN0ZW5lcjsKLSAgICBtdXRhYmxlIE11dGV4IG1FdmVudExvY2s7Ci0gICAgbXV0YWJsZSBNdXRleCBtTm90aWZ5TG9jazsKLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKLSAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwotICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7Ci0gICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKLSAgICBzcDxkcm06OlYxXzQ6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV80OwotICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwotCi0gICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgotICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERybVNlc3Npb25DbGllbnQ+PiBtT3BlblNlc3Npb25zOwotICAgIHZvaWQgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKLSAgICB2b2lkIGNsZWFudXAoKTsKLQotICAgIC8qKgotICAgICAqIG1Jbml0Q2hlY2sgaXM6Ci0gICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICogICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBhIHBsdWdpbiBjYW4ndCBiZSBjcmVhdGVkIGZvciB0aGUgdXVpZAotICAgICAqICAgT0sgYWZ0ZXIgYSBwbHVnaW4gaGFzIGJlZW4gY3JlYXRlZCBhbmQgbVBsdWdpbiBpcyB2YWxpZAotICAgICAqLwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1ha2VEcm1GYWN0b3JpZXMoKTsKLSAgICBzcDxJRHJtUGx1Z2luPiBtYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKTsKLQotICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBhcnJheSk7Ci0KLSAgICBzdGQ6OnN0cmluZyByZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3Q7Ci0gICAgc3RkOjpzdHJpbmcgcmVwb3J0RnJhbWV3b3JrTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGx1Z2luTWV0cmljcykgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgbWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwoY29uc3Qgc3A8SURybUZhY3Rvcnk+ICZmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKTsKLQorICAgIHNwPElEcm0+IG1Ecm1IYWxIaWRsOworICAgIHNwPElEcm0+IG1Ecm1IYWxBaWRsOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybUhhbCk7CiB9OwogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIERSTV9IQUxfSF8KKyNlbmRpZiAgLy8gRFJNX0hBTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbEFpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbEFpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjUxY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsQWlkbC5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUk1fSEFMX0FJRExfSF8KKyNkZWZpbmUgRFJNX0hBTF9BSURMX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbExpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorCit1c2luZyBJRHJtUGx1Z2luQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbjsKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7Cit1c2luZyBFdmVudFR5cGVBaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpFdmVudFR5cGU7Cit1c2luZyBLZXlTdGF0dXNBaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlV1aWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK3N0cnVjdCBEcm1IYWxBaWRsIDogcHVibGljIElEcm17CisgICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7CisgICAgRHJtSGFsQWlkbCgpOworICAgIHZpcnR1YWwgfkRybUhhbEFpZGwoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwgYm9vbCogcmVzdWx0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGluaXREYXRhLCBTdHJpbmc4IGNvbnN0JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwgU3RyaW5nOCYgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSoga2V5UmVxdWVzdFR5cGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0JiBjZXJ0VHlwZSwgU3RyaW5nOCBjb25zdCYgY2VydEF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BJZHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzc1JlbGVhc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwqIGNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCogbWF4TGV2ZWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCogY3VycmVudFNlc3Npb25zLCB1aW50MzJfdCogbWF4U2Vzc2lvbnMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIGtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBsaWNlbnNlU3RhdGUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHZhbHVlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY29uc3Qgc3A8SURybU1ldHJpY3NDb25zdW1lcj4mIGNvbnN1bWVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVpcmVzU2VjdXJlRGVjb2Rlcihjb25zdCBjaGFyKiBtaW1lLCBib29sKiByZXF1aXJlZCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdDsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRXZlbnRUeXBlQWlkbCBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzQWlkbD4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faGFzTmV3VXNhYmxlS2V5KTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIE11dGV4IG1Mb2NrOworICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1IYWxMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+PiBtRmFjdG9yaWVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJRHJtUGx1Z2luQWlkbD4gbVBsdWdpbjsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsZWFudXAoKTsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsQWlkbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gRFJNX0hBTF9BSURMX0hfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsSGlkbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjA2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxIaWRsLmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9IQUxfSElETF9IXworI2RlZmluZSBEUk1fSEFMX0hJRExfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8wOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnIpIHsKKyAgICBpZiAobC5zaXplKCkgIT0gci5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbWVtY21wKGwuYXJyYXkoKSwgci5hcnJheSgpLCBsLnNpemUoKSkgPT0gMDsKK30KKworc3RydWN0IERybUhhbEhpZGwgOiBwdWJsaWMgSURybSwKKyAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgeworCisgICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7CisKKyAgICBEcm1IYWxIaWRsKCk7CisgICAgdmlydHVhbCB+RHJtSGFsSGlkbCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdAorICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmluZm9NYXApIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJmNlcnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggJmRlZmF1bHRVcmwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBbGxTZWN1cmVTdG9wcygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXhMZXZlbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90ICpjdXJyZW50U2Vzc2lvbnMsCisgICAgICAgICAgICB1aW50MzJfdCAqbWF4U2Vzc2lvbnMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY29uc3Qgc3A8SURybU1ldHJpY3NDb25zdW1lcj4gJmNvbnN1bWVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZtYXRjaCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlcXVpcmVkKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZCgKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgY2hhciAqcGxheWJhY2tJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFNjaGVtZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNjaGVtZXMpIGNvbnN0OworCisgICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CisgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOworICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CisgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CisgICAgc3A8ZHJtOjpWMV80OjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfNDsKKyAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKKworICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KKyAgICBtdXRhYmxlIE1lZGlhRHJtTWV0cmljcyBtTWV0cmljczsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtYWtlRHJtRmFjdG9yaWVzKCk7CisgICAgc3A8SURybVBsdWdpbj4gbWFrZURybVBsdWdpbihjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOworCisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWxIaWRsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBEUk1fSEFMX0hJRExfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbExpc3RlbmVyLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzYxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9IQUxfTElTVEVORVJfSF8KKyNkZWZpbmUgRFJNX0hBTF9MSVNURU5FUl9IXworCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KKwordXNpbmcgRXZlbnRUeXBlQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlOwordXNpbmcgS2V5U3RhdHVzQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U3RhdHVzOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Qm5Ecm1QbHVnaW5MaXN0ZW5lcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworc3RydWN0IERybUhhbExpc3RlbmVyIDogcHVibGljIEJuRHJtUGx1Z2luTGlzdGVuZXIgeworICAgIGV4cGxpY2l0IERybUhhbExpc3RlbmVyKE1lZGlhRHJtTWV0cmljcyogbU1ldHJpY3MpOworICAgIH5Ecm1IYWxMaXN0ZW5lcigpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRXZlbnRUeXBlQWlkbCBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzQWlkbD4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faGFzTmV3VXNhYmxlS2V5KTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisgICAgdm9pZCBzZXRMaXN0ZW5lcihzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lcik7Citwcml2YXRlOgorICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzKiBtTWV0cmljczsKKyAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CisgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOworICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7Cit9OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9IQUxfTElTVEVORVJfSF8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKaW5kZXggMTAwYjhmNy4uZTE3NzVjNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybU1ldHJpY3MuaApAQCAtNTAsMTIgKzUwLDEwIEBACiAgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlcjsKICAgLy8gQ291bnQgb2YgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlIGNhbGxzLgogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlcjsKLQogICAvLyBDb3VudCBvZiBrZXkgc3RhdHVzIGV2ZW50cyBicm9rZW4gb3V0IGJ5IHN0YXR1cyB0eXBlLgotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZT4KLSAgICAgIG1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyOworICBDb3VudGVyTWV0cmljPHVpbnQzMl90PiBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlcjsKICAgLy8gQ291bnQgb2YgZXZlbnRzIGJyb2tlbiBvdXQgYnkgZXZlbnQgdHlwZQotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlPiBtRXZlbnRDb3VudGVyOworICBDb3VudGVyTWV0cmljPHVpbnQzMl90PiBtRXZlbnRDb3VudGVyOwogCiAgIC8vIENvdW50IGdldFByb3BlcnR5Qnl0ZUFycmF5IGNhbGxzIHRvIHJldHJpZXZlIHRoZSBkZXZpY2UgdW5pcXVlIGlkLgogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCmluZGV4IGE4ODc4NGQuLmVlMmJlNmEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9JRHJtLmgKQEAgLTE2NSw2ICsxNjUsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCA9IDA7CisKIHByb3RlY3RlZDoKICAgICBJRHJtKCkge30KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oIGIvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oCmluZGV4IGVjMGI4NzguLjk4MGNlNTUgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbnRlcmZhY2UvbWVkaWFkcm0vRHJtVXRpbHMuaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0RybVV0aWxzLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8Y3RpbWU+CiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8ZW5kaWFuLmg+CkBAIC0zOCwxMiArMzksMjAgQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgotCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9Mb2dNZXNzYWdlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9TdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0lEcm1GYWN0b3J5Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dQcmlvcml0eTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nTWVzc2FnZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIFN0YXR1c0FpZGwgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IElDcnlwdG87CkBAIC05Miw3ICsxMDEsOCBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KIHZvaWQgTG9nVG9CdWZmZXIoYW5kcm9pZF9Mb2dQcmlvcml0eSBsZXZlbCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgY2hhciAqZm10LCBBcmdzLi4uIGFyZ3MpIHsKLSAgICBjb25zdCB1aW50NjRfdCogdXVpZDIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4odXVpZCk7CisgICAgdWludDY0X3QgdXVpZDJbMl0gPSB7fTsKKyAgICBzdGQ6Om1lbWNweSh1dWlkMiwgdXVpZCwgc2l6ZW9mKHV1aWQyKSk7CiAgICAgc3RkOjpzdHJpbmcgdXVpZEZtdCgidXVpZD1bJWx4ICVseF0gIik7CiAgICAgdXVpZEZtdCArPSBmbXQ7CiAgICAgTG9nVG9CdWZmZXIobGV2ZWwsIHV1aWRGbXQuY19zdHIoKSwgaHRvYmU2NCh1dWlkMlswXSksIGh0b2JlNjQodXVpZDJbMV0pLCBhcmdzLi4uKTsKQEAgLTE1NSw2ICsxNjUsMTQgQEAKICAgICBvYmoud3JpdGVJbnQzMihoYXNOZXdVc2FibGVLZXkpOwogfQogCitpbmxpbmUgVXVpZCB0b0FpZGxVdWlkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICBVdWlkIHV1aWRBaWRsOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgdXVpZEFpZGwudXVpZFtpXSA9IHV1aWRbaV07CisgICAgcmV0dXJuIHV1aWRBaWRsOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SURybUZhY3RvcnlBaWRsPj4gbWFrZURybUZhY3Rvcmllc0FpZGwoKTsKKwogc3RkOjp2ZWN0b3I8c3A8OjpWMV8wOjpJRHJtRmFjdG9yeT4+IE1ha2VEcm1GYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSA9IG51bGxwdHIpOwogCiBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1QbHVnaW4+PiBNYWtlRHJtUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLApAQCAtMTgwLDYgKzE5OCwxMzggQEAKICAgICByZXR1cm4gdG9TdGF0dXNUXzFfNChlcnIpOwogfQogCitpbmxpbmUgc3RhdHVzX3Qgc3RhdHVzQWlkbFRvU3RhdHVzVCg6Om5kazo6U2NvcGVkQVN0YXR1cyAmc3RhdHVzQWlkbCkgeworICAgIGlmIChzdGF0dXNBaWRsLmlzT2soKSkgcmV0dXJuIE9LOworICAgIGlmIChzdGF0dXNBaWRsLmdldEV4Y2VwdGlvbkNvZGUoKSAhPSBFWF9TRVJWSUNFX1NQRUNJRklDKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgYXV0byBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXNBaWRsPihzdGF0dXNBaWRsLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpPSzoKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGNhc2UgU3RhdHVzQWlkbDo6QkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9ERUNSWVBUOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fTk9fTElDRU5TRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisKKyAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6CisgICAgY2FzZSBTdGF0dXNBaWRsOjpDQU5OT1RfREVDUllQVF9aRVJPX1NVQlNBTVBMRVM6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fWkVST19TVUJTQU1QTEVTOworICAgIGNhc2UgU3RhdHVzQWlkbDo6Q1JZUFRPX0xJQlJBUllfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ1JZUFRPX0xJQlJBUlk7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpHRU5FUkFMX09FTV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX09FTTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkdFTkVSQUxfUExVR0lOX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0dFTkVSSUNfUExVR0lOOworICAgIGNhc2UgU3RhdHVzQWlkbDo6SU5JVF9EQVRBX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5JVF9EQVRBOworICAgIGNhc2UgU3RhdHVzQWlkbDo6S0VZX05PVF9MT0FERUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fS0VZX05PVF9MT0FERUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1BBUlNFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUEFSU0U7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1BPTElDWV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BPTElDWTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkxJQ0VOU0VfUkVMRUFTRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFTEVBU0U7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOworICAgIGNhc2UgU3RhdHVzQWlkbDo6TElDRU5TRV9SRVNUT1JFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVTVE9SRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkxJQ0VOU0VfU1RBVEVfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9TVEFURTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6Ok1BTEZPUk1FRF9DRVJUSUZJQ0FURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NQUxGT1JNRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpNRURJQV9GUkFNRVdPUktfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTUVESUFfRlJBTUVXT1JLOworICAgIGNhc2UgU3RhdHVzQWlkbDo6TUlTU0lOR19DRVJUSUZJQ0FURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NSVNTSU5HOworICAgIGNhc2UgU3RhdHVzQWlkbDo6UFJPVklTSU9OSU5HX0NFUlRJRklDQVRFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DRVJUSUZJQ0FURTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlBST1ZJU0lPTklOR19DT05GSUdVUkFUSU9OX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DT05GSUc7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpQUk9WSVNJT05JTkdfUEFSU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6UFJPVklTSU9OSU5HX1JFUVVFU1RfUkVKRUNURUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpSRVRSWUFCTEVfUFJPVklTSU9OSU5HX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVRSWTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNFQ1VSRV9TVE9QX1JFTEVBU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VDVVJFX1NUT1BfUkVMRUFTRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNUT1JBR0VfUkVBRF9GQUlMVVJFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfUkVBRDsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNUT1JBR0VfV1JJVEVfRkFJTFVSRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1dSSVRFOworCisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CisgICAgfQorICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXR1c190IEdldExvZ01lc3NhZ2VzQWlkbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VT4gJm9iaiwgVmVjdG9yPDo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcGx1Z2luID0gb2JqOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBMT0cyQlcoIiVzIG9iaiBpcyBudWxsIiwgVTo6ZGVzY3JpcHRvcik7CisgICAgfSBlbHNlIGlmIChwbHVnaW4gPT0gTlVMTCkgeworICAgICAgICBMT0cyQlcoIkNhbm5vdCBjYXN0ICVzIG9iaiB0byAlcyBwbHVnaW4iLCBVOjpkZXNjcmlwdG9yLCBUOjpkZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzQWlkbDsKKyAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgaWYoIXBsdWdpbi0+Z2V0TG9nTWVzc2FnZXMoJnBsdWdpbkxvZ3NBaWRsKS5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRzJCVygiJXM6OmdldExvZ01lc3NhZ2VzIHJlbW90ZSBjYWxsIGZhaWxlZCIsIFQ6OmRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzOworICAgIGZvciAoTG9nTWVzc2FnZSBsb2cgOiBwbHVnaW5Mb2dzQWlkbCkgeworICAgICAgICA6OlYxXzQ6OkxvZ01lc3NhZ2UgbG9nSGlkbDsKKyAgICAgICAgbG9nSGlkbC50aW1lTXMgPSBsb2cudGltZU1zOworICAgICAgICAvLyBza2lwIG5lZ2F0aXZlIGNvbnZlcnQgY2hlY2sgYXMgY291bnQgb2YgZW51bSBlbGVtZW50cyBpcyA3CisgICAgICAgIGxvZ0hpZGwucHJpb3JpdHkgPSAgc3RhdGljX2Nhc3Q8OjpWMV80OjpMb2dQcmlvcml0eT4oKGludDMyX3QpbG9nLnByaW9yaXR5KTsKKyAgICAgICAgbG9nSGlkbC5tZXNzYWdlID0gbG9nLm1lc3NhZ2U7CisgICAgICAgIHBsdWdpbkxvZ3MucHVzaF9iYWNrKGxvZ0hpZGwpOworICAgIH0KKworICAgIGF1dG8gYWxsTG9ncyhnTG9nQnVmLmdldExvZ3MoKSk7CisgICAgTE9HMkJEKCJmcmFtZXdvcmsgbG9ncyBzaXplICV6dTsgcGx1Z2luIGxvZ3Mgc2l6ZSAlenUiLAorICAgICAgICAgICBhbGxMb2dzLnNpemUoKSwgcGx1Z2luTG9ncy5zaXplKCkpOworICAgIHN0ZDo6Y29weShwbHVnaW5Mb2dzLmJlZ2luKCksIHBsdWdpbkxvZ3MuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihhbGxMb2dzKSk7CisgICAgc3RkOjpzb3J0KGFsbExvZ3MuYmVnaW4oKSwgYWxsTG9ncy5lbmQoKSwKKyAgICAgICAgICAgICAgW10oY29uc3QgOjpWMV80OjpMb2dNZXNzYWdlICZhLCBjb25zdCA6OlYxXzQ6OkxvZ01lc3NhZ2UgJmIpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBhLnRpbWVNcyA8IGIudGltZU1zOworICAgICAgICAgICAgICB9KTsKKworICAgIGxvZ3MuYXBwZW5kVmVjdG9yKGFsbExvZ3MpOworICAgIHJldHVybiBPSzsKK30KKwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KIHN0YXR1c190IEdldExvZ01lc3NhZ2VzKGNvbnN0IHNwPFU+ICZvYmosIFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CiAgICAgc3A8VD4gcGx1Z2luID0gVDo6Y2FzdEZyb20ob2JqKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKaW5kZXggZjM2MmQ2MC4uMjM3YTg4YiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKQEAgLTgzLDggKzgzLDggQEAKICAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOwogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKIAotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OlVTQUJMRSk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKIAogICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGU7CiAgIERybU1ldHJpY3NDb25zdW1lciBjb25zdW1lcigmYnVuZGxlKTsKQEAgLTE1MSwxNiArMTUxLDE2IEBACiAgIG1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoT0spOwogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CiAKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQpOwotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX05FRURFRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OlNUQVRVU1BFTkRJTkcpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpLRVlfTkVFREVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlNFU1NJT05fUkVDTEFJTUVEKTsKIAogICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkMTsKICAgc2Vzc2lvbklkMS5wdXNoX2JhY2soMSk7CkBAIC0yODQsMTYgKzI4NCwxNiBAQAogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKICAgbWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOwogCi0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OlVTQUJMRSk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OkVYUElSRUQpOwotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORyk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKLSAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChFdmVudFR5cGU6OktFWV9ORUVERUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OkVYUElSRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6T1VUUFVUTk9UQUxMT1dFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlBST1ZJU0lPTl9SRVFVSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6S0VZX05FRURFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlZFTkRPUl9ERUZJTkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CiAKICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZE1ldHJpY3M7CiAgIEFTU0VSVF9FUShPSywgbWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL1RFU1RfTUFQUElORyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL1RFU1RfTUFQUElORwppbmRleCA3YmQxNTY4Li45OTE5ZTkwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9URVNUX01BUFBJTkcKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvVEVTVF9NQVBQSU5HCkBAIC0xLDE2ICsxLDEwIEBACiB7CiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFEcm1GcmFtZXdvcmtUZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiIDogWwogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhRHJtQ2xlYXJrZXlUZXN0IgotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhRHJtTWV0cmljc1Rlc3QiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxZjc0MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiaGFyZHdhcmVfaW50ZXJmYWNlc19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWlkbF9jbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIiwKKyAgICAgICAgIkNyeXB0b1BsdWdpbi5jcHAiLAorICAgICAgICAiRHJtRmFjdG9yeS5jcHAiLAorICAgICAgICAiRHJtUGx1Z2luLmNwcCIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIiwgIi1XdGhyZWFkLXNhZmV0eSJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtLVYxLW5kayIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMi1uZGsiLAorICAgICAgICAibGliY2xlYXJrZXliYXNlIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleSIsCisgICAgZGVmYXVsdHM6IFsiYWlkbF9jbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlLmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS5yYyJdLAorICAgIHZpbnRmX2ZyYWdtZW50czogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAorICAgIGRlZmF1bHRzOiBbImFpZGxfY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5Il0sCisgICAgc3JjczogWyJTZXJ2aWNlTGF6eS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyJdLAorICAgIHZpbnRmX2ZyYWdtZW50czogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorfQorCitwaG9ueSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQGxhdGVzdC1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTZmZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGQ6OnNoYXJlZF9wdHI8RHJtRmFjdG9yeT4gY3JlYXRlRHJtRmFjdG9yeSgpIHsKKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPERybUZhY3Rvcnk+KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3J5cHRvUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFjZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9DcnlwdG9QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktQ3J5cHRvUGx1Z2luIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIkFpZGxVdGlscy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KGNvbnN0IERlY3J5cHRBcmdzJiBpbl9hcmdzLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBjb25zdCBjaGFyKiBkZXRhaWxlZEVycm9yID0gIiI7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gMDsKKyAgICBpZiAoaW5fYXJncy5zZWN1cmUpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJzZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQ2xlYXJLZXkiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzaGFyZWRfYnVmZmVyX2xvY2sobVNoYXJlZEJ1ZmZlckxvY2spOworICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoaW5fYXJncy5zb3VyY2UuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJzb3VyY2UgZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0IjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBkZXRhaWxlZEVycm9yKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIE5PTl9TRUNVUkUgPSBEZXN0aW5hdGlvbkJ1ZmZlcjo6VGFnOjpub25zZWN1cmVNZW1vcnk7CisgICAgaWYgKGluX2FyZ3MuZGVzdGluYXRpb24uZ2V0VGFnKCkgIT0gTk9OX1NFQ1VSRSkgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gImRlc3RpbmF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgZGV0YWlsZWRFcnJvcik7CisgICAgfQorCisgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gaW5fYXJncy5kZXN0aW5hdGlvbi5nZXQ8Tk9OX1NFQ1VSRT4oKTsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKGRlc3RCdWZmZXIuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIGF1dG8gc3JjID0gbVNoYXJlZEJ1ZmZlck1hcFtpbl9hcmdzLnNvdXJjZS5idWZmZXJJZF07CisgICAgaWYgKHNyYy0+bUJhc2UgPT0gbnVsbHB0cikgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gInNvdXJjZSBpcyBhIG51bGxwdHIiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGluX2FyZ3Muc291cmNlLm9mZnNldCwgaW5fYXJncy5vZmZzZXQsICZ0b3RhbFNpemUpIHx8CisgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3codG90YWxTaXplLCBpbl9hcmdzLnNvdXJjZS5zaXplLCAmdG90YWxTaXplKSB8fAorICAgICAgICB0b3RhbFNpemUgPiBzcmMtPm1TaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc2NDk2MTYwIik7CisgICAgICAgIGRldGFpbGVkRXJyb3IgPSAiaW52YWxpZCBidWZmZXIgc2l6ZSI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgZGV0YWlsZWRFcnJvcik7CisgICAgfQorCisgICAgLy8gZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIG5vbi1zZWN1cmUgc2hhcmVkIG1lbW9yeQorICAgIGF1dG8gZGVzdCA9IG1TaGFyZWRCdWZmZXJNYXBbZGVzdEJ1ZmZlci5idWZmZXJJZF07CisgICAgaWYgKGRlc3QtPm1CYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHRvdGFsU2l6ZSA9IDA7CisgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVzdEJ1ZmZlci5vZmZzZXQsIGRlc3RCdWZmZXIuc2l6ZSwgJnRvdGFsU2l6ZSkgfHwKKyAgICAgICAgdG90YWxTaXplID4gZGVzdC0+bVNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNzY0NDQ2MjIiKTsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJpbnZhbGlkIGJ1ZmZlciBzaXplIjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGFuZCBkZXRlcm1pbmUgaWYgYW55IHN1YnNhbXBsZXMgYXJlCisgICAgLy8gZW5jcnlwdGVkLgorICAgIHVpbnQ4X3QqIHNyY1B0ciA9IHNyYy0+bUJhc2UgKyBpbl9hcmdzLnNvdXJjZS5vZmZzZXQgKyBpbl9hcmdzLm9mZnNldDsKKyAgICB1aW50OF90KiBkZXN0UHRyID0gZGVzdC0+bUJhc2UgKyBkZXN0QnVmZmVyLm9mZnNldDsKKyAgICBzaXplX3QgZGVzdFNpemUgPSAwOworICAgIHNpemVfdCBzcmNTaXplID0gMDsKKyAgICBib29sIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbl9hcmdzLnN1YlNhbXBsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBpbl9hcmdzLnN1YlNhbXBsZXNbaV07CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlc3RTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSwgJmRlc3RTaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhzcmNTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSwgJnNyY1NpemUpKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBjbGVhciBzaXplIG92ZXJmbG93IjsKKyAgICAgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCBkZXRhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZXN0U2l6ZSwgc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhLCAmZGVzdFNpemUpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNyY1NpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJnNyY1NpemUpKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBlbmNyeXB0ZWQgc2l6ZSBvdmVyZmxvdyI7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgZGV0YWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgICAgIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZXN0U2l6ZSA+IGRlc3RCdWZmZXIuc2l6ZSB8fCBzcmNTaXplID4gaW5fYXJncy5zb3VyY2Uuc2l6ZSkgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBzdW0gdG9vIGxhcmdlIjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIGlmIChpbl9hcmdzLm1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKKyAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gIkVuY3J5cHRlZCBzdWJzYW1wbGVzIGZvdW5kIGluIGFsbGVnZWRseSB1bmVuY3J5cHRlZCBkYXRhLiI7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5fYXJncy5zdWJTYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IGluX2FyZ3Muc3ViU2FtcGxlc1tpXTsKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzcmNQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCk7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7CisgICAgfSBlbHNlIGlmIChpbl9hcmdzLm1vZGUgPT0gTW9kZTo6QUVTX0NUUikgeworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWR7fTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2xlYXJEYXRhTGVuZ3RoczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZW5jcnlwdGVkRGF0YUxlbmd0aHM7CisgICAgICAgIGZvciAoYXV0byBzcyA6IGluX2FyZ3Muc3ViU2FtcGxlcykgeworICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3Rocy5wdXNoX2JhY2soc3MubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBlbmNyeXB0ZWREYXRhTGVuZ3Rocy5wdXNoX2JhY2soc3MubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOworICAgICAgICB9CisgICAgICAgIGF1dG8gcmVzID0KKyAgICAgICAgICAgICAgICBtU2Vzc2lvbi0+ZGVjcnlwdChpbl9hcmdzLmtleUlkLmRhdGEoKSwgaW5fYXJncy5pdi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyLCBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGVzdFB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3RocywgZW5jcnlwdGVkRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzRGVjcnlwdGVkKTsKKyAgICAgICAgaWYgKHJlcyA9PSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCk7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IDA7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gIkRlY3J5cHRpb24gRXJyb3IiOworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcyksIGRldGFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDA7CisgICAgICAgIGRldGFpbGVkRXJyb3IgPSAic2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENsZWFyS2V5IERSTSBQbHVnaW4iOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAge3RpbWVNaWxsaXMsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nUHJpb3JpdHk6OkVSUk9SLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKX19OworICAgICpfYWlkbF9yZXR1cm4gPSBsb2dzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIENyeXB0b1BsdWdpbjo6bm90aWZ5UmVzb2x1dGlvbihpbnQzMl90IGluX3dpZHRoLCBpbnQzMl90IGluX2hlaWdodCkgeworICAgIFVOVVNFRChpbl93aWR0aCk7CisgICAgVU5VU0VEKGluX2hlaWdodCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBDcnlwdG9QbHVnaW46OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIFVOVVNFRChpbl9taW1lKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBDcnlwdG9QbHVnaW46OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaWYgKCFpbl9zZXNzaW9uSWQuc2l6ZSgpKSB7CisgICAgICAgIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2Vzc2lvbiA9IFNlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFtU2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IFNoYXJlZEJ1ZmZlciYgaW5fYmFzZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzaGFyZWRfYnVmZmVyX2xvY2sobVNoYXJlZEJ1ZmZlckxvY2spOworICAgIG1TaGFyZWRCdWZmZXJNYXBbaW5fYmFzZS5idWZmZXJJZF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPFNoYXJlZEJ1ZmZlckJhc2U+KGluX2Jhc2UpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworU2hhcmVkQnVmZmVyQmFzZTo6U2hhcmVkQnVmZmVyQmFzZShjb25zdCBTaGFyZWRCdWZmZXImIG1lbSkKKyAgICAgICAgOiBtQmFzZShudWxscHRyKSwKKyAgICAgICAgICBtU2l6ZShtZW0uc2l6ZSkgeworICAgIGlmIChtZW0uaGFuZGxlLmZkcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBmZCA9IG1lbS5oYW5kbGUuZmRzWzBdLmdldCgpOworICAgIGF1dG8gYWRkciA9IG1tYXAobnVsbHB0ciwgbWVtLnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICBpZiAoYWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCJtbWFwIGVycjogZmQgJWQ7IGVycm5vICVzIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJhc2UgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYWRkcik7CisgICAgfQorfQorCitTaGFyZWRCdWZmZXJCYXNlOjp+U2hhcmVkQnVmZmVyQmFzZSgpIHsKKyAgICBpZiAobUJhc2UgJiYgbXVubWFwKG1CYXNlLCBtU2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoIm11bm1hcCBlcnI6IGJhc2UgJXA7IGVycm5vICVzIiwKKyAgICAgICAgICAgICAgbUJhc2UsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYjRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Ecm1GYWN0b3J5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEcm1GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJNaW1lVHlwZVN0ZFN0ci5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiQWlkbFV0aWxzLmgiCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpVdWlkOworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1GYWN0b3J5OjpjcmVhdGVEcm1QbHVnaW4oCisgICAgICAgIGNvbnN0IFV1aWQmIGluX3V1aWQsIGNvbnN0IHN0cmluZyYgaW5fYXBwUGFja2FnZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OklEcm1QbHVnaW4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBVTlVTRUQoaW5fYXBwUGFja2FnZU5hbWUpOworCisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRChpbl91dWlkLnV1aWQuZGF0YSgpKSkgeworICAgICAgICBBTE9HRSgiQ2xlYXJrZXkgRHJtIEhBTDogZmFpbGVkIHRvIGNyZWF0ZSBkcm0gcGx1Z2luLCAiCisgICAgICAgICAgICAgICJpbnZhbGlkIGNyeXB0byBzY2hlbWUiKTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1QbHVnaW4+IHBsdWdpbiA9CisgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxEcm1QbHVnaW4+KFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgKl9haWRsX3JldHVybiA9IHBsdWdpbjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1GYWN0b3J5OjpjcmVhdGVDcnlwdG9QbHVnaW4oCisgICAgICAgIGNvbnN0IFV1aWQmIGluX3V1aWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbml0RGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaXNDbGVhcktleVVVSUQoaW5fdXVpZC51dWlkLmRhdGEoKSkpIHsKKyAgICAgICAgQUxPR0UoIkNsZWFya2V5IERybSBIQUw6IGZhaWxlZCB0byBjcmVhdGUgY3J5cHRvIHBsdWdpbiwgIgorICAgICAgICAgICAgICAiaW52YWxpZCBjcnlwdG8gc2NoZW1lIik7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q3J5cHRvUGx1Z2luPiBwbHVnaW4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxDcnlwdG9QbHVnaW4+KGluX2luaXREYXRhKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gcGx1Z2luLT5nZXRJbml0U3RhdHVzKCk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHBsdWdpbi5yZXNldCgpOworICAgICAgICBwbHVnaW4gPSBudWxscHRyOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gcGx1Z2luOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtRmFjdG9yeTo6Z2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcyhDcnlwdG9TY2hlbWVzKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBDcnlwdG9TY2hlbWVzIHNjaGVtZXN7fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHV1aWQgOiA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCkpIHsKKyAgICAgICAgc2NoZW1lcy51dWlkcy5wdXNoX2JhY2soe3V1aWR9KTsKKyAgICB9CisgICAgZm9yIChhdXRvIG1pbWUgOiB7a0lzb0JtZmZWaWRlb01pbWVUeXBlLCBrSXNvQm1mZkF1ZGlvTWltZVR5cGUsIGtDZW5jSW5pdERhdGFGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAga1dlYm1WaWRlb01pbWVUeXBlLCBrV2VibUF1ZGlvTWltZVR5cGUsIGtXZWJtSW5pdERhdGFGb3JtYXR9KSB7CisgICAgICAgIGNvbnN0IGF1dG8gbWluTGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjb25zdCBhdXRvIG1heExldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgc2NoZW1lcy5taW1lVHlwZXMucHVzaF9iYWNrKHttaW1lLCBtaW5MZXZlbCwgbWF4TGV2ZWx9KTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHNjaGVtZXM7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworYmluZGVyX3N0YXR1c190IERybUZhY3Rvcnk6OmR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgdWludDMyX3QgbnVtQXJncykgeworICAgIFVOVVNFRChhcmdzKTsKKyAgICBVTlVTRUQobnVtQXJncyk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbmVnYXRpdmUgZmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjdXJyZW50U2Vzc2lvbnMgPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPm51bU9wZW5TZXNzaW9ucygpOworICAgIGRwcmludGYoZmQsICJjdXJyZW50IG9wZW4gc2Vzc2lvbnM6ICV1XG4iLCBjdXJyZW50U2Vzc2lvbnMpOworCisgICAgcmV0dXJuIFNUQVRVU19PSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0RybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtUGx1Z2luLmNwcApAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Ecm1QbHVnaW4iCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0RybU1ldHJpYy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJBaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJBaWRsQ2xlYXJLZXJ5UHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7Citjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKy8vIFZhbHVlOiAiU3RyZWFtaW5nIiBvciAiT2ZmbGluZSIKK2NvbnN0IHN0ZDo6c3RyaW5nIGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOworLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOworLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCisKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU2l6ZSA9IDEwOworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiB1aW50MzJUb1ZlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIC8vIDEwIGJ5dGVzIHRvIGRpc3BsYXkgbWF4IHZhbHVlIDQyOTQ5NjcyOTUgKyBvbmUgYnl0ZSBudWxsIHRlcm1pbmF0b3IKKyAgICBjaGFyIGJ1ZmZlcltrU2VjdXJlU3RvcElkU2l6ZV07CisgICAgbWVtc2V0KGJ1ZmZlciwgMCwga1NlY3VyZVN0b3BJZFNpemUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwga1NlY3VyZVN0b3BJZFNpemUsICIlIiBQUkl1MzIsIHZhbHVlKTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Cit9CisKK307ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OworCitEcm1QbHVnaW46OkRybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCisgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAorICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKKyAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50KDApLAorICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAorICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgIG1Nb2NrRXJyb3IoU3RhdHVzOjpPSykgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKKyAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5jbGVhcigpOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tWZW5kb3JLZXldID0ga0FpZGxWZW5kb3JWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trVmVyc2lvbktleV0gPSBrQWlkbFZlcnNpb25WYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga0FpZGxQbHVnaW5EZXNjcmlwdGlvblZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XSA9IGtBaWRsQWxnb3JpdGhtc1ZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XSA9IGtBaWRsTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0FpZGxEcm1FcnJvclRlc3RWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trQWlkbFZlcnNpb25LZXldID0ga0FpZGxWZXJzaW9uVmFsdWU7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZVZlY3RvcjsKKyAgICB2YWx1ZVZlY3Rvci5jbGVhcigpOworICAgIHZhbHVlVmVjdG9yLmluc2VydCh2YWx1ZVZlY3Rvci5lbmQoKSwga1Rlc3REZXZpY2VJZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0RGV2aWNlSWREYXRhICsgc2l6ZW9mKGtUZXN0RGV2aWNlSWREYXRhKSAvIHNpemVvZih1aW50OF90KSk7CisgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0RldmljZUlkS2V5XSA9IHZhbHVlVmVjdG9yOworCisgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKKyAgICB2YWx1ZVZlY3Rvci5pbnNlcnQodmFsdWVWZWN0b3IuZW5kKCksIGtNZXRyaWNzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAga01ldHJpY3NEYXRhICsgc2l6ZW9mKGtNZXRyaWNzRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tNZXRyaWNzS2V5XSA9IHZhbHVlVmVjdG9yOworfQorCisvLyBUaGUgc2VjdXJlIHN0b3AgaW4gQ2xlYXJLZXkgaW1wbGVtZW50YXRpb24gaXMgbm90IGluc3RhbGxlZCBzZWN1cmVseS4KKy8vIFRoaXMgZnVuY3Rpb24gbWVyZWx5IGNyZWF0ZXMgYSB0ZXN0IGVudmlyb25tZW50IGZvciB0ZXN0aW5nIHNlY3VyZSBzdG9wcyBBUElzLgorLy8gVGhlIGNvbnRlbnQgaW4gdGhpcyBzZWN1cmUgc3RvcCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQsIHRoZSBjbGVhcmtleQorLy8gc2VjdXJlU3RvcCBkb2VzIG5vdCBzZXJ2ZSBhcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KK3ZvaWQgRHJtUGx1Z2luOjppbnN0YWxsU2VjdXJlU3RvcChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgOjphbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VjdXJlU3RvcExvY2spOworCisgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U2VjdXJlU3RvcDsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuaWQgPSB1aW50MzJUb1ZlY3RvcigrK21OZXh0U2VjdXJlU3RvcElkKTsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuZGF0YS5hc3NpZ24oc2Vzc2lvbklkLmJlZ2luKCksIHNlc3Npb25JZC5lbmQoKSk7CisKKyAgICBtU2VjdXJlU3RvcHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPihjbGVhcmtleVNlY3VyZVN0b3AuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJrZXlTZWN1cmVTdG9wKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICBpZiAoc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCkgIT0gY2xlYXJrZXlkcm06Ok9LKSB7CisgICAgICAgICAgICBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShpbl9zZXNzaW9uSWQpOworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCsrOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworICAgIH0KKyAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQrKzsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6ZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2l2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBpbl9rZXlJZC5zaXplKCkgPT0gMCB8fCBpbl9pbnB1dC5zaXplKCkgPT0gMCB8fAorICAgICAgICBpbl9pdi5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjplbmNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSB7fTsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGluX2tleUlkLnNpemUoKSA9PSAwIHx8IGluX2lucHV0LnNpemUoKSA9PSAwIHx8CisgICAgICAgIGluX2l2LnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldEhkY3BMZXZlbHMoCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVscyogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jb25uZWN0ZWRMZXZlbCA9IEhkY3BMZXZlbDo6SERDUF9OT05FOworICAgIF9haWRsX3JldHVybi0+bWF4TGV2ZWwgPSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Njb3BlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5pdERhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lVHlwZSwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlUeXBlIGluX2tleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5VmFsdWU+JiBpbl9vcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdCogX2FpZGxfcmV0dXJuKSB7CisgICAgVU5VU0VEKGluX29wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoImh0dHBzOi8vZGVmYXVsdC51cmwiKTsKKworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdCA9IHt9OworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdFR5cGUgPSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSBkZWZhdWx0VXJsOworCisgICAgaWYgKGluX3Njb3BlLnNpemUoKSA9PSAwIHx8CisgICAgICAgIChpbl9rZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORyAmJiBpbl9rZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgIGluX2tleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IGluX3Njb3BlOworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBzdGQ6OnNldDxLZXlUeXBlPiBpbml0X3R5cGVze0tleVR5cGU6OlNUUkVBTUlORywgS2V5VHlwZTo6T0ZGTElORX07CisgICAgaWYgKGluaXRfdHlwZXMuY291bnQoaW5fa2V5VHlwZSkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICAgICAga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0ID0ge307CisgICAgYXV0byBrZXlUeXBlID0gc3RhdGljX2Nhc3Q8Q2RtS2V5VHlwZT4oaW5fa2V5VHlwZSk7CisgICAgYXV0byBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluX2luaXREYXRhLCBpbl9taW1lVHlwZSwga2V5VHlwZSwgJnJlcXVlc3QpOworCisgICAgaWYgKGluX2tleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QuYmVnaW4oKSwgcmVxdWVzdC5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKGtleVNldElkU3RyaW5nLCBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5UmVzcG9uc2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlByb2JsZW0gcmVsZWFzaW5nIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbGVhc2VLZXlzTWFwLmZpbmQoa2V5U2V0SWRTdHJpbmcpID09IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIG1SZWxlYXNlS2V5c01hcFtrZXlTZXRJZFN0cmluZ10gPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koImtleSBpcyBpbiB1c2UsIGlnbm9yZSByZWxlYXNlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJPZmZsaW5lIGxpY2Vuc2Ugbm90IGZvdW5kLCBub3RoaW5nIHRvIHJlbGVhc2UiKTsKKyAgICAgICAgfQorICAgICAgICBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOworICAgIH0KKyAgICBfYWlkbF9yZXR1cm4tPnJlcXVlc3QgPSByZXF1ZXN0OworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdFR5cGUgPSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSBkZWZhdWx0VXJsOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAge3RpbWVNaWxsaXMsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nUHJpb3JpdHk6OkVSUk9SLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKX19OworICAgICpfYWlkbF9yZXR1cm4gPSBsb2dzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0TWV0cmljcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpEcm1NZXRyaWNHcm91cD4qIF9haWRsX3JldHVybikgeworICAgIC8vIFNldCB0aGUgb3BlbiBzZXNzaW9uIGNvdW50IG1ldHJpYy4KKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIG9wZW5TZXNzaW9uT2tBdHRyaWJ1dGUgPSB7InN0YXR1cyIsIHN0YXRpY19jYXN0PGludDY0X3Q+KFN0YXR1czo6T0spfTsKKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbU9wZW5TZXNzaW9uT2tDb3VudH07CisgICAgRHJtTWV0cmljIG9wZW5TZXNzaW9uTWV0cmljID0geworICAgICAgICAgICAgIm9wZW5fc2Vzc2lvbiIsIHtvcGVuU2Vzc2lvbk9rQXR0cmlidXRlfSwge29wZW5TZXNzaW9uTWV0cmljVmFsdWV9fTsKKworICAgIC8vIFNldCB0aGUgY2xvc2Ugc2Vzc2lvbiBjb3VudCBtZXRyaWMuCisgICAgRHJtTWV0cmljTmFtZWRWYWx1ZSBjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZSA9IHsic3RhdHVzIiwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oU3RhdHVzOjpPSyl9OworICAgIERybU1ldHJpY05hbWVkVmFsdWUgY2xvc2VTZXNzaW9uTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbUNsb3NlU2Vzc2lvbk9rQ291bnR9OworICAgIERybU1ldHJpYyBjbG9zZVNlc3Npb25NZXRyaWMgPSB7CisgICAgICAgICAgICAiY2xvc2Vfc2Vzc2lvbiIsIHtjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZX0sIHtjbG9zZVNlc3Npb25NZXRyaWNWYWx1ZX19OworCisgICAgLy8gU2V0IHRoZSBjbG9zZSBzZXNzaW9uLCBub3Qgb3BlbmVkIG1ldHJpYy4KKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZEF0dHJpYnV0ZSA9IHsic3RhdHVzIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCl9OworICAgIERybU1ldHJpY05hbWVkVmFsdWUgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50fTsKKyAgICBEcm1NZXRyaWMgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljID0geworICAgICAgICAgICAgImNsb3NlX3Nlc3Npb24iLCB7Y2xvc2VTZXNzaW9uTm90T3BlbmVkQXR0cmlidXRlfSwge2Nsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpY1ZhbHVlfX07CisKKyAgICAvLyBTZXQgdGhlIHNldFBsYXliYWNrSWQgbWV0cmljLgorICAgIHN0ZDo6dmVjdG9yPERybU1ldHJpY05hbWVkVmFsdWU+IHNpZHMgPSB7fTsKKyAgICBzdGQ6OnZlY3RvcjxEcm1NZXRyaWNOYW1lZFZhbHVlPiBwbGF5YmFja0lkcyA9IHt9OworICAgIGZvciAoY29uc3QgYXV0byYgW2tleSwgdmFsdWVdIDogbVBsYXliYWNrSWQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2lkKGtleS5iZWdpbigpLCBrZXkuZW5kKCkpOworICAgICAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIHNlc3Npb25JZEF0dHJpYnV0ZSA9IHsic2lkIiwgc2lkfTsKKyAgICAgICAgc2lkcy5wdXNoX2JhY2soc2Vzc2lvbklkQXR0cmlidXRlKTsKKworICAgICAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIHBsYXliYWNrSWRNZXRyaWNWYWx1ZSA9IHsicGxheWJhY2tJZCIsIHZhbHVlfTsKKyAgICAgICAgcGxheWJhY2tJZHMucHVzaF9iYWNrKHBsYXliYWNrSWRNZXRyaWNWYWx1ZSk7CisgICAgfQorICAgIERybU1ldHJpYyBzZXRQbGF5YmFja0lkTWV0cmljID0geyJzZXRfcGxheWJhY2tfaWQiLCBzaWRzLCBwbGF5YmFja0lkc307CisKKyAgICBEcm1NZXRyaWNHcm91cCBtZXRyaWNzID0ge3tvcGVuU2Vzc2lvbk1ldHJpYywgY2xvc2VTZXNzaW9uTWV0cmljLCBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWMsCisgICAgICAgICAgICBzZXRQbGF5YmFja0lkTWV0cmljfX07CisKKyAgICAqX2FpZGxfcmV0dXJuID0ge21ldHJpY3N9OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0TnVtYmVyT2ZTZXNzaW9ucygKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBfYWlkbF9yZXR1cm4tPmN1cnJlbnRTZXNzaW9ucyA9IG1TZXNzaW9uTGlicmFyeS0+bnVtT3BlblNlc3Npb25zKCk7CisgICAgX2FpZGxfcmV0dXJuLT5tYXhTZXNzaW9ucyA9IDEwOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZU5hbWVzID0gbUZpbGVIYW5kbGUuTGlzdExpY2Vuc2VzKCk7CisgICAgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+IGtleVNldElkcyA9IHt9OworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGtleVNldElkczsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyh0b01vY2tTdGF0dXMobU1vY2tFcnJvcikpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBsaWNlbnNlTmFtZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsKKyAgICAgICAgS2V5U2V0SWQgaWQgPSB7fTsKKyAgICAgICAgaWQua2V5U2V0SWQgPSBrZXlTZXRJZDsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhpZCk7CisgICAgfQorICAgICpfYWlkbF9yZXR1cm4gPSBrZXlTZXRJZHM7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShpbl9rZXlTZXRJZC5rZXlTZXRJZC5iZWdpbigpLCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5lbmQoKSk7CisgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOworICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXModG9Nb2NrU3RhdHVzKG1Nb2NrRXJyb3IpKTsKKyAgICB9IGVsc2UgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgICAgICBsaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgICAgIGxpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd246CisgICAgICAgICAgICAgICAgbGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gbGljZW5zZVN0YXRlOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmZpbmQoc3RkOjpzdHJpbmcoaW5fcHJvcGVydHlOYW1lLmNfc3RyKCkpKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAoaXRyICE9IG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmVuZCgpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBpdHItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHByb3BlcnR5OiAlcyIsIGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSB7fTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKworICAgIGlmIChuYW1lID09IGtWZW5kb3JLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trVmVuZG9yS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga1ZlcnNpb25LZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trVmVyc2lvbktleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtQbHVnaW5EZXNjcmlwdGlvbktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tQbHVnaW5EZXNjcmlwdGlvbktleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtBbGdvcml0aG1zS2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0RybUVycm9yVGVzdEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrQWlkbFZlcnNpb25LZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWlkbFZlcnNpb25LZXldOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHZhbHVlOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fY2VydGlmaWNhdGVUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6UHJvdmlzaW9uUmVxdWVzdCogX2FpZGxfcmV0dXJuKSB7CisgICAgVU5VU0VEKGluX2NlcnRpZmljYXRlVHlwZSk7CisgICAgVU5VU0VEKGluX2NlcnRpZmljYXRlQXV0aG9yaXR5KTsKKyAgICBfYWlkbF9yZXR1cm4tPnJlcXVlc3QgPSB7fTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSB7fTsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3AoCisgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcCogX2FpZGxfcmV0dXJuKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RvcCA9IHt9OworCisgICAgbVNlY3VyZVN0b3BMb2NrLmxvY2soKTsKKyAgICBhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5maW5kKGluX3NlY3VyZVN0b3BJZC5zZWN1cmVTdG9wSWQpOworICAgIGlmIChpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpKSB7CisgICAgICAgIENsZWFya2V5U2VjdXJlU3RvcCBjbGVhcmtleVN0b3AgPSBpdHItPnNlY29uZDsKKyAgICAgICAgc3RvcC5pbnNlcnQoc3RvcC5lbmQoKSwgY2xlYXJrZXlTdG9wLmlkLmJlZ2luKCksIGNsZWFya2V5U3RvcC5pZC5lbmQoKSk7CisgICAgICAgIHN0b3AuaW5zZXJ0KHN0b3AuZW5kKCksIGNsZWFya2V5U3RvcC5kYXRhLmJlZ2luKCksIGNsZWFya2V5U3RvcC5kYXRhLmVuZCgpKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgU2VjdXJlU3RvcCBzZWN1cmVTdG9wID0ge307CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaWYgKCFzdG9wLmVtcHR5KCkpIHsKKyAgICAgICAgc2VjdXJlU3RvcC5vcGFxdWVEYXRhID0gc3RvcDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHNlY3VyZVN0b3A7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkPiogX2FpZGxfcmV0dXJuKSB7CisgICAgbVNlY3VyZVN0b3BMb2NrLmxvY2soKTsKKyAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZD4gaWRzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgU2VjdXJlU3RvcElkIGlkOworICAgICAgICBpZC5zZWN1cmVTdG9wSWQgPSBpdHItPmZpcnN0OworICAgICAgICBpZHMucHVzaF9iYWNrKGlkKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgKl9haWRsX3JldHVybiA9IGlkczsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBtU2VjdXJlU3RvcExvY2subG9jaygpOworICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcD4gc3RvcHM7CisgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgeworICAgICAgICBDbGVhcmtleVNlY3VyZVN0b3AgY2xlYXJrZXlTdG9wID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3B7fTsKKyAgICAgICAgc3RvcC5pbnNlcnQoc3RvcC5lbmQoKSwgY2xlYXJrZXlTdG9wLmlkLmJlZ2luKCksIGNsZWFya2V5U3RvcC5pZC5lbmQoKSk7CisgICAgICAgIHN0b3AuaW5zZXJ0KHN0b3AuZW5kKCksIGNsZWFya2V5U3RvcC5kYXRhLmJlZ2luKCksIGNsZWFya2V5U3RvcC5kYXRhLmVuZCgpKTsKKworICAgICAgICBTZWN1cmVTdG9wIHNlY3VyZVN0b3A7CisgICAgICAgIHNlY3VyZVN0b3Aub3BhcXVlRGF0YSA9IHN0b3A7CisgICAgICAgIHN0b3BzLnB1c2hfYmFjayhzZWN1cmVTdG9wKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgKl9haWRsX3JldHVybiA9IHN0b3BzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0U2VjdXJpdHlMZXZlbCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpZCA9IGluX3Nlc3Npb25JZDsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNpZCk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBTZWN1cml0eUxldmVsOjpVTktOT1dOOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbD46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2VjdXJpdHlMZXZlbC5maW5kKHNpZCk7CisgICAgaWYgKGl0ciA9PSBtU2VjdXJpdHlMZXZlbC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiU2Vzc2lvbiBpZCBub3QgZm91bmQiKTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbigKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsIGluX3NlY3VyaXR5TGV2ZWwsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBpbl9zZWN1cml0eUxldmVsKTsKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIHNlc3Npb25JZC5jbGVhcigpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gc2Vzc2lvbklkOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zY29wZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Jlc3BvbnNlLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoaW5fc2NvcGUuc2l6ZSgpID09IDAgfHwgaW5fcmVzcG9uc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluX3Jlc3BvbnNlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gaW5fc2NvcGU7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0ge307CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgaWYgKHNjb3BlSWQuc2l6ZSgpIDwga0tleVNldElkUHJlZml4LnNpemUoKSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE0NDUwNzA5NiIpOworICAgICAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSk7CisgICAgfQorICAgIGJvb2wgaXNSZWxlYXNlID0gKG1lbWNtcChzY29wZUlkLmRhdGEoKSwga0tleVNldElkUHJlZml4LmRhdGEoKSwga0tleVNldElkUHJlZml4LnNpemUoKSkgPT0gMCk7CisgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICBrZXlTZXRJZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKworICAgICAgICBhdXRvIGl0ZXIgPSBtUmVsZWFzZUtleXNNYXAuZmluZChzdGQ6OnN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSkpOworICAgICAgICBpZiAoaXRlciAhPSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oaXRlci0+c2Vjb25kLmJlZ2luKCksIGl0ZXItPnNlY29uZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXNzaW9uSWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIC8vIG5vbiBvZmZsaW5lIGxpY2Vuc2UgcmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7CisgICAgfQorICAgIHNldFBsYXlQb2xpY3koKTsKKworICAgIGF1dG8gcmVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKGluX3Jlc3BvbnNlKTsKKyAgICBpZiAocmVzID09IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbWFrZUtleVNldElkKCZrZXlTZXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbl9yZXNwb25zZS5iZWdpbigpLCBpbl9yZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlzU3RhdHVzID0ge307CisgICAgICAgIEtleVN0YXR1cyBrZXlTdGF0dXM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQxID0gezB4QSwgMHhCLCAweEN9OworICAgICAgICBrZXlTdGF0dXMua2V5SWQgPSBrZXlJZDE7CisgICAgICAgIGtleVN0YXR1cy50eXBlID0gS2V5U3RhdHVzVHlwZTo6VVNBQkxFOworICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleUlkMiA9IHsweEQsIDB4RSwgMHhGfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQyOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IEtleVN0YXR1c1R5cGU6OkVYUElSRUQ7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQzID0gezB4MCwgMHgxLCAweDJ9OworICAgICAgICBrZXlTdGF0dXMua2V5SWQgPSBrZXlJZDM7CisgICAgICAgIGtleVN0YXR1cy50eXBlID0gS2V5U3RhdHVzVHlwZTo6VVNBQkxFX0lOX0ZVVFVSRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleXNTdGF0dXMsIHRydWUpOworCisgICAgICAgIGluc3RhbGxTZWN1cmVTdG9wKHNlc3Npb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInByb3ZpZGVLZXlSZXNwb25zZSByZXR1cm5zIGVycm9yPSVkIiwgcmVzKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2FpZGxfcmV0dXJuLT5rZXlTZXRJZCA9IGtleVNldElkVmVjOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMocmVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9yZXNwb25zZSwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQqIF9haWRsX3JldHVybikgeworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIF9haWRsX3JldHVybi0+Y2VydGlmaWNhdGUgPSB7fTsKKyAgICBfYWlkbF9yZXR1cm4tPndyYXBwZWRLZXkgPSB7fTsKKyAgICBpZiAoaW5fcmVzcG9uc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpxdWVyeUtleVN0YXR1cygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlWYWx1ZT4qIF9haWRsX3JldHVybikgeworICAgIGlmIChpbl9zZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXkgc3RhdHVzIEtleVZhbHVlIHBhaXIKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcCA9IHt9OworICAgIG1QbGF5UG9saWN5TG9jay5sb2NrKCk7CisgICAgS2V5VmFsdWUga2V5VmFsdWVQYWlyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlQb2xpY3kuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAga2V5VmFsdWVQYWlyLmtleSA9IG1QbGF5UG9saWN5W2ldLmtleTsKKyAgICAgICAga2V5VmFsdWVQYWlyLnZhbHVlID0gbVBsYXlQb2xpY3lbaV0udmFsdWU7CisgICAgICAgIGluZm9NYXAucHVzaF9iYWNrKGtleVZhbHVlUGFpcik7CisgICAgfQorICAgIG1QbGF5UG9saWN5TG9jay51bmxvY2soKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5mb01hcDsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBjb25zdCBhdXRvIHJlcyA9IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgaWYgKCFyZXMuaXNPaygpICYmIHJlcy5nZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhfU0VSVklDRV9TUEVDSUZJQykgeworICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VTZWN1cmVTdG9wKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgY29uc3QgYXV0byByZXMgPSByZW1vdmVTZWN1cmVTdG9wKGluX3NlY3VyZVN0b3BJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpICYmIHJlcy5nZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhfU0VSVklDRV9TUEVDSUZJQykgeworICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VTZWN1cmVTdG9wcygKKyAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPcGFxdWVEYXRhJiBpbl9zc1JlbGVhc2UpIHsKKyAgICAvLyBPcGFxdWVEYXRhIHN0YXJ0cyB3aXRoIDQgYnl0ZSBkZWNpbWFsIGludGVnZXIgc3RyaW5nCisgICAgY29uc3Qgc2l6ZV90IGtGb3VyQnl0ZXNPZmZzZXQgPSA0OworICAgIGlmIChpbl9zc1JlbGVhc2Uub3BhcXVlRGF0YS5zaXplKCkgPCBrRm91ckJ5dGVzT2Zmc2V0KSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNlY3VyZVN0b3BSZWxlYXNlIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnB1dCA9IGluX3NzUmVsZWFzZS5vcGFxdWVEYXRhOworCisgICAgaWYgKGlucHV0LnNpemUoKSA8IGtTZWN1cmVTdG9wSWRTaXplICsga0ZvdXJCeXRlc09mZnNldCkgeworICAgICAgICAvLyBUaGUgbWluaW11bSBzaXplIG9mIHNlY3VyZSBzdG9wIGhhcyB0byBjb250YWluCisgICAgICAgIC8vIGEgNCBieXRlcyBjb3VudCBhbmQgb25lIHNlY3VyZVN0b3AgaWQKKyAgICAgICAgQUxPR0UoIlRvdGFsIHNpemUgb2Ygc2VjdXJlU3RvcHMgaXMgdG9vIHNob3J0Iik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIC8vIFRoZSBmb3JtYXQgb2Ygb3BhcXVlRGF0YSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgc2VydmVyCisgICAgLy8gYW5kIHRoZSBkcm0gc2VydmljZS4gVGhlIGNsZWFya2V5IGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mOgorICAgIC8vICAgIGNvdW50IC0gbnVtYmVyIG9mIHNlY3VyZSBzdG9wcworICAgIC8vICAgIGxpc3Qgb2YgZml4ZWQgbGVuZ3RoIHNlY3VyZSBzdG9wcworICAgIHNpemVfdCBjb3VudEJ1ZmZlclNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGlmIChpbnB1dC5zaXplKCkgPCBjb3VudEJ1ZmZlclNpemUpIHsKKyAgICAgICAgLy8gU2FmZXR5TmV0IGxvZ2dpbmcKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNDQ3NjY0NTUiKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBzc2NhbmYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oaW5wdXQuZGF0YSgpKSwgIiUwNCIgUFJJdTMyLCAmY291bnQpOworCisgICAgLy8gQXZvaWQgZGl2aWRlIGJ5IDAgYmVsb3cuCisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgMCBzZWN1cmVTdG9wIGNvdW50Iik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIC8vIENvbXB1dGVzIHRoZSBmaXhlZCBsZW5ndGggc2VjdXJlU3RvcCBzaXplCisgICAgc2l6ZV90IHNlY3VyZVN0b3BTaXplID0gKGlucHV0LnNpemUoKSAtIGtGb3VyQnl0ZXNPZmZzZXQpIC8gY291bnQ7CisgICAgaWYgKHNlY3VyZVN0b3BTaXplIDwga1NlY3VyZVN0b3BJZFNpemUpIHsKKyAgICAgICAgLy8gQSB2YWxpZCBzZWN1cmVTdG9wIGNvbnRhaW5zIHRoZSBpZCBwbHVzIGRhdGEKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc2VjdXJlU3RvcCBzaXplIik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKyAgICB1aW50OF90KiBidWZmZXIgPSBuZXcgdWludDhfdFtzZWN1cmVTdG9wU2l6ZV07CisgICAgc2l6ZV90IG9mZnNldCA9IGtGb3VyQnl0ZXNPZmZzZXQ7ICAvLyBza2lwIHRoZSBjb3VudAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgb2Zmc2V0ICs9IHNlY3VyZVN0b3BTaXplKSB7CisgICAgICAgIG1lbWNweShidWZmZXIsIGlucHV0LmRhdGEoKSArIG9mZnNldCwgc2VjdXJlU3RvcFNpemUpOworCisgICAgICAgIC8vIEEgc2VjdXJlU3RvcCBjb250YWlucyBpZCtkYXRhLCB3ZSBvbmx5IHVzZSB0aGUgaWQgZm9yIHJlbW92YWwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaWQoYnVmZmVyLCBidWZmZXIgKyBrU2VjdXJlU3RvcElkU2l6ZSk7CisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkIHNlY3VyZVN0b3BJZHtpZH07CisgICAgICAgIGNvbnN0IGF1dG8gcmVzID0gcmVtb3ZlU2VjdXJlU3RvcChzZWN1cmVTdG9wSWQpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkgJiYgcmVzLmdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWF9TRVJWSUNFX1NQRUNJRklDKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RhdHVzOjpPSyAhPSBzdGF0dXMpIGJyZWFrOworICAgIH0KKworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlY3VyZVN0b3BMb2NrKTsKKworICAgIG1TZWN1cmVTdG9wcy5jbGVhcigpOworICAgIG1OZXh0U2VjdXJlU3RvcElkID0ga1NlY3VyZVN0b3BJZFN0YXJ0OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlS2V5cyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbW92ZU9mZmxpbmVMaWNlbnNlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCkgeworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyh0b01vY2tTdGF0dXMobU1vY2tFcnJvcikpOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoaW5fa2V5U2V0SWQua2V5U2V0SWQuYmVnaW4oKSwgaW5fa2V5U2V0SWQua2V5U2V0SWQuZW5kKCkpOworICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlU2VjdXJlU3RvcCgKKyAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wSWQmIGluX3NlY3VyZVN0b3BJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZWN1cmVTdG9wTG9jayk7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAoMSAhPSBtU2VjdXJlU3RvcHMuZXJhc2UoaW5fc2VjdXJlU3RvcElkLnNlY3VyZVN0b3BJZCkpIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lLCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWwgaW5fbGV2ZWwsCisgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIFVOVVNFRChpbl9taW1lKTsKKyAgICBVTlVTRUQoaW5fbGV2ZWwpOworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVzdG9yZUtleXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkKSB7CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBEZXZpY2VGaWxlczo6TGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICBpZiAoIW1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbl9rZXlTZXRJZC5rZXlTZXRJZC5iZWdpbigpLCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5lbmQoKSksCisgICAgICAgICAgICAgICAgJmxpY2Vuc2VTdGF0ZSwgJm9mZmxpbmVMaWNlbnNlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgfQorCisgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0UpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgIH0KKyAgICBhdXRvIHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KG9mZmxpbmVMaWNlbnNlLmJlZ2luKCksIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgaWYgKHJlcyAhPSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhyZXMpOworfQorCit2b2lkIERybVBsdWdpbjo6c2VuZEV2ZW50KDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlIGluX2V2ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fZGF0YSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTGlzdGVuZXItPm9uRXZlbnQoaW5fZXZlbnRUeXBlLCBpbl9zZXNzaW9uSWQsIGluX2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKSB7CisgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIG1MaXN0ZW5lci0+b25FeHBpcmF0aW9uVXBkYXRlKGluX3Nlc3Npb25JZCwgaW5fZXhwaXJ5VGltZUluTVMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM+JiBpbl9rZXlTdGF0dXNMaXN0LAorICAgICAgICBib29sIGluX2hhc05ld1VzYWJsZUtleSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTGlzdGVuZXItPm9uS2V5c0NoYW5nZShpbl9zZXNzaW9uSWQsIGluX2tleVN0YXR1c0xpc3QsIGluX2hhc05ld1VzYWJsZUtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBEcm1QbHVnaW46OnNlbmRTZXNzaW9uTG9zdFN0YXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIHsKKyAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxpc3RlbmVyLT5vblNlc3Npb25Mb3N0U3RhdGUoaW5fc2Vzc2lvbklkKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnNldENpcGhlckFsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2FsZ29yaXRobSovKSB7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbkxpc3RlbmVyPiYgaW5fbGlzdGVuZXIpIHsKKyAgICBtTGlzdGVuZXIgPSBpbl9saXN0ZW5lcjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnNldE1hY0FsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2FsZ29yaXRobSovKSB7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRQbGF5YmFja0lkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3BsYXliYWNrSWQpIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gaW5fc2Vzc2lvbklkOworICAgIG1QbGF5YmFja0lkW3NpZF0gPSBpbl9wbGF5YmFja0lkOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3ZhbHVlKSB7CisgICAgaWYgKGluX3Byb3BlcnR5TmFtZSA9PSBrRGV2aWNlSWRLZXkpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfSBlbHNlIGlmIChpbl9wcm9wZXJ0eU5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tDbGllbnRJZEtleV0gPSBpbl92YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKKyAgICB9CisKKyAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSBieXRlIGFycmF5LCBrZXk9JXMiLCBpbl9wcm9wZXJ0eU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRQcm9wZXJ0eVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyBpbW11dGFibGVLZXlzOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtBbGdvcml0aG1zS2V5ICsgIiwiKTsKKyAgICBpbW11dGFibGVLZXlzLmFwcGVuZChrUGx1Z2luRGVzY3JpcHRpb25LZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtWZW5kb3JLZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtWZXJzaW9uS2V5ICsgIiwiKTsKKworICAgIHN0ZDo6c3RyaW5nIGtleSA9IHN0ZDo6c3RyaW5nKGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5maW5kKGtleSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRyID0gbVN0cmluZ1Byb3BlcnRpZXMuZmluZChrZXkpOworICAgIGlmIChpdHIgPT0gbVN0cmluZ1Byb3BlcnRpZXMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgdW5kZWZpbmVkIHByb3BlcnR5IHN0cmluZywga2V5PSVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcHJvcGVydHlOYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgaWYgKGluX3ZhbHVlID09IGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1czo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgICAgIH0gZWxzZSBpZiAoaW5fdmFsdWUgPT0ga0xvc3RTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKGluX3ZhbHVlID09IGtGcmFtZVRvb0xhcmdlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgICAgIH0gZWxzZSBpZiAoaW5fdmFsdWUgPT0ga0ludmFsaWRTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0cmluZ1Byb3BlcnRpZXNba2V5XSA9IHN0ZDo6c3RyaW5nKGluX3ZhbHVlLmNfc3RyKCkpOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2lnbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9rZXlJZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiAvKmluX21lc3NhZ2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2lnblJTQShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyppbl9hbGdvcml0aG0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9tZXNzYWdlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fd3JhcHBlZGtleSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjp2ZXJpZnkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fc2Vzc2lvbklkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9rZXlJZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fc2lnbmF0dXJlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworLy8gUHJpdmF0ZSBtZXRob2RzIGJlbG93Lgordm9pZCBEcm1QbHVnaW46OnNldFBsYXlQb2xpY3koKSB7CisgICAgOjphbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtUGxheVBvbGljeUxvY2spOworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisKKyAgICBLZXlWYWx1ZSBwb2xpY3k7CisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleUxpY2Vuc2VUeXBlOworICAgIHBvbGljeS52YWx1ZSA9IGtTdHJlYW1pbmc7CisgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CisKKyAgICBwb2xpY3kua2V5ID0ga1F1ZXJ5S2V5UGxheUFsbG93ZWQ7CisgICAgcG9saWN5LnZhbHVlID0ga1RydWU7CisgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CisKKyAgICBwb2xpY3kua2V5ID0ga1F1ZXJ5S2V5UmVuZXdBbGxvd2VkOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworfQorCitib29sIERybVBsdWdpbjo6bWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCkgeworICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgQUxPR0UoImtleVNldElkIGRlc3RpbmF0aW9uIG5vdCBwcm92aWRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtzaWQoa0tleVNldElkUHJlZml4LmJlZ2luKCksIGtLZXlTZXRJZFByZWZpeC5lbmQoKSk7CisgICAga3NpZC5yZXNpemUoa0tleVNldElkTGVuZ3RoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYW5kb21EYXRhKChrS2V5U2V0SWRMZW5ndGggLSBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSAvIDIsIDApOworCisgICAgd2hpbGUgKGtleVNldElkLT5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdHIgPSByYW5kb21EYXRhLmJlZ2luKCk7IGl0ciAhPSByYW5kb21EYXRhLmVuZCgpOyArK2l0cikgeworICAgICAgICAgICAgKml0ciA9IHN0ZDo6cmFuZCgpICUgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGlkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpOworICAgICAgICAqa2V5U2V0SWQgPSBrS2V5U2V0SWRQcmVmaXggKyA6OmFuZHJvaWQ6OkJ5dGVBcnJheVRvSGV4U3RyaW5nKGlkLCByYW5kb21EYXRhLnNpemUoKSk7CisgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKKyAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQorICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKKyAgICAgICAgICAgIGtleVNldElkLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitTdGF0dXMgRHJtUGx1Z2luOjpzZXRTZWN1cml0eUxldmVsKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChsZXZlbCAhPSBTZWN1cml0eUxldmVsOjpERUZBVUxUICYmIGxldmVsICE9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8pIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgc2VjdXJpdHkgbGV2ZWwgPiBtYXgiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gc2Vzc2lvbklkOworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2lkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD46Oml0ZXJhdG9yIGl0ciA9IG1TZWN1cml0eUxldmVsLmZpbmQoc2lkKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cml0eUxldmVsLmVuZCgpKSB7CisgICAgICAgIG1TZWN1cml0eUxldmVsW3NpZF0gPSBsZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TZWN1cml0eUxldmVsLmluc2VydChzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+KHNpZCwgbGV2ZWwpKQorICAgICAgICAgICAgICAgICAgICAgLnNlY29uZCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgc2VjdXJpdHkgbGV2ZWwiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL1NlcnZpY2UuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjA3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfTkRFQlVHIDEKKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktbWFpbiIKKworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkxvZ2RMb2dnZXI7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Y2xlYXJrZXk6OmNyZWF0ZURybUZhY3Rvcnk7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpEcm1GYWN0b3J5OworCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIqIGFyZ3ZbXSkgeworICAgIEluaXRMb2dnaW5nKGFyZ3YsIExvZ2RMb2dnZXIoKSk7CisgICAgOjphbmRyb2lkOjpiYXNlOjpTZXRNaW5pbXVtTG9nU2V2ZXJpdHkoOjphbmRyb2lkOjpiYXNlOjpWRVJCT1NFKTsKKyAgICBBQmluZGVyUHJvY2Vzc19zZXRUaHJlYWRQb29sTWF4VGhyZWFkQ291bnQoOCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IGNyZWF0ZURybUZhY3RvcnkoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkcm1JbnN0YW5jZSA9IHN0ZDo6c3RyaW5nKCkgKyBEcm1GYWN0b3J5OjpkZXNjcmlwdG9yICsgIi9jbGVhcmtleSI7CisgICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShkcm1GYWN0b3J5LT5hc0JpbmRlcigpLmdldCgpLCBkcm1JbnN0YW5jZS5jX3N0cigpKTsKKyAgICBDSEVDSyhzdGF0dXMgPT0gU1RBVFVTX09LKTsKKworICAgIEFCaW5kZXJQcm9jZXNzX2pvaW5UaHJlYWRQb29sKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsgIC8vIHNob3VsZCBub3QgcmVhY2hlZAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlTGF6eS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL1NlcnZpY2VMYXp5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EzM2JiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlTGF6eS5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX05ERUJVRyAxCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LW1haW4iCisKKyNpbmNsdWRlICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpMb2dkTG9nZ2VyOworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpjcmVhdGVEcm1GYWN0b3J5OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiBhcmd2W10pIHsKKyAgICBJbml0TG9nZ2luZyhhcmd2LCBMb2dkTG9nZ2VyKCkpOworICAgIDo6YW5kcm9pZDo6YmFzZTo6U2V0TWluaW11bUxvZ1NldmVyaXR5KDo6YW5kcm9pZDo6YmFzZTo6VkVSQk9TRSk7CisgICAgQUJpbmRlclByb2Nlc3Nfc2V0VGhyZWFkUG9vbE1heFRocmVhZENvdW50KDgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPERybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBjcmVhdGVEcm1GYWN0b3J5KCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZHJtSW5zdGFuY2UgPSBzdGQ6OnN0cmluZygpICsgRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciArICIvY2xlYXJrZXkiOworICAgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgQVNlcnZpY2VNYW5hZ2VyX3JlZ2lzdGVyTGF6eVNlcnZpY2UoZHJtRmFjdG9yeS0+YXNCaW5kZXIoKS5nZXQoKSwgZHJtSW5zdGFuY2UuY19zdHIoKSk7CisgICAgQ0hFQ0soc3RhdHVzID09IFNUQVRVU19PSyk7CisKKyAgICBBQmluZGVyUHJvY2Vzc19qb2luVGhyZWFkUG9vbCgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7ICAvLyBzaG91bGQgbm90IHJlYWNoZWQKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsOSBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LXNlcnZpY2UgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5CisgICAgb25lc2hvdAorICAgIGRpc2FibGVkCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhZHJtIGRybXJwYworICAgIGlvcHJpbyBydCA0CisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCisgICAgaW50ZXJmYWNlIGFpZGwgYW5kcm9pZC5oYXJkd2FyZS5kcm0uSURybUZhY3RvcnkvY2xlYXJrZXkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1zZXJ2aWNlIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWFkcm0gZHJtcnBjCisgICAgaW9wcmlvIHJ0IDQKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKKyAgICBpbnRlcmZhY2UgYWlkbCBhbmRyb2lkLmhhcmR3YXJlLmRybS5JRHJtRmFjdG9yeS9jbGVhcmtleQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzZTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS54bWwKQEAgLTAsMCArMSw3IEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJkZXZpY2UiPgorICAgIDxoYWwgZm9ybWF0PSJhaWRsIj4KKyAgICAgICAgPG5hbWU+YW5kcm9pZC5oYXJkd2FyZS5kcm08L25hbWU+CisgICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+CisgICAgICAgIDxmcW5hbWU+SURybUZhY3RvcnkvY2xlYXJrZXk8L2ZxbmFtZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQWlkbENsZWFyS2VyeVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsQ2xlYXJLZXJ5UHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmNjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQWlkbENsZWFyS2VyeVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQUlETF9DTEVBUktFWV9QUk9QRVJUSUVTX0gKKyNkZWZpbmUgQUlETF9DTEVBUktFWV9QUk9QRVJUSUVTX0gKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZXJzaW9uVmFsdWUoImFpZGwtMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxBbGdvcml0aG1zVmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlKCJ0cnVlIik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbERybUVycm9yVGVzdFZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbFJlc291cmNlQ29udGVudGlvblZhbHVlKCJyZXNvdXJjZUNvbnRlbnRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbExvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbEZyYW1lVG9vTGFyZ2VWYWx1ZSgiZnJhbWVUb29MYXJnZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsSW52YWxpZFN0YXRlVmFsdWUoImludmFsaWRTdGF0ZSIpOworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU3YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0FpZGxVdGlscy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vU3RhdHVzLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitpbmxpbmUgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXMgdG9Nb2NrU3RhdHVzKAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfQorCitpbmxpbmUgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdG9OZGtTY29wZWRBU3RhdHVzKDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnID0gbnVsbHB0cikgeworICAgIGlmIChTdGF0dXM6Ok9LID09IHN0YXR1cykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBlcnIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpOworICAgICAgICBpZiAobXNnKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcldpdGhNZXNzYWdlKGVyciwgbXNnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2lubGluZSA6Om5kazo6U2NvcGVkQVN0YXR1cyB0b05ka1Njb3BlZEFTdGF0dXMoY2xlYXJrZXlkcm06OkNkbVJlc3BvbnNlVHlwZSByZXMpIHsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXRpY19jYXN0PDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzPihyZXMpKTsKK30KKworI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCmNvcHkgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCmluZGV4IGIwOGE2MDQuLmUyYWZjZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xMywxNyArMTMsMjAgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjcHJhZ21hIG9uY2UKIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKIAotLyoqCi0gKiBBdWRpbyBlbmNhcHN1bGF0aW9uIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSBpZiB0aGUgYXVkaW8gZGF0YSBzaG91bGQgYmUgc2VudCB3aXRoIGEgcGFydGljdWxhcgotICogZW5jYXBzdWxhdGlvbiB0eXBlIG9yIG5vdC4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgewotICAgIE5PTkUgICAgID0gMCwKLSAgICBJRUM2MTkzNyA9IDEsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworc3RkOjpzaGFyZWRfcHRyPERybUZhY3Rvcnk+IGNyZWF0ZURybUZhY3RvcnkoKTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vQm5DcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NvbW1vbi9Bc2htZW0uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKK25hbWVzcGFjZSB7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEtFWV9JRF9TSVpFID0gMTY7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEtFWV9JVl9TSVpFID0gMTY7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgbmFtZXNwYWNlIGNsZWFya2V5ZHJtOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpEZWNyeXB0QXJnczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOworCitzdHJ1Y3QgU2hhcmVkQnVmZmVyQmFzZSB7CisgICAgdWludDhfdCogbUJhc2U7CisgICAgaW50NjRfdCBtU2l6ZTsKKyAgICBTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2hhcmVkQnVmZmVyJiBtZW0pOworICAgIH5TaGFyZWRCdWZmZXJCYXNlKCk7Cit9OworCitzdHJ1Y3QgQ3J5cHRvUGx1Z2luIDogcHVibGljIEJuQ3J5cHRvUGx1Z2luIHsKKyAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBjb25zdCBhdXRvIHJlcyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBtSW5pdFN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGlmICghcmVzLmlzT2soKSAmJiByZXMuZ2V0RXhjZXB0aW9uQ29kZSgpID09IEVYX1NFUlZJQ0VfU1BFQ0lGSUMpIHsKKyAgICAgICAgICAgIG1Jbml0U3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihyZXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCB+Q3J5cHRvUGx1Z2luKCkge30KKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRlY3J5cHQoY29uc3QgRGVjcnlwdEFyZ3MmIGluX2FyZ3MsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nTWVzc2FnZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBub3RpZnlSZXNvbHV0aW9uKGludDMyX3QgaW5fd2lkdGgsIGludDMyX3QgaW5faGVpZ2h0KSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFNoYXJlZEJ1ZmZlckJhc2UoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNoYXJlZEJ1ZmZlciYgaW5fYmFzZSkgb3ZlcnJpZGU7CisKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1cyBnZXRJbml0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXRTdGF0dXM7IH0KKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDcnlwdG9QbHVnaW4pOworCisgICAgc3RkOjptdXRleCBtU2hhcmVkQnVmZmVyTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgc3RkOjpzaGFyZWRfcHRyPFNoYXJlZEJ1ZmZlckJhc2U+PiBtU2hhcmVkQnVmZmVyTWFwCisgICAgICAgICAgICBHVUFSREVEX0JZKG1TaGFyZWRCdWZmZXJMb2NrKTsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IG1TZXNzaW9uOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzIG1Jbml0U3RhdHVzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzOWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vQm5Ecm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSUNyeXB0b1BsdWdpbi5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworc3RydWN0IERybUZhY3RvcnkgOiBwdWJsaWMgQm5Ecm1GYWN0b3J5IHsKKyAgICBEcm1GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5Ecm1GYWN0b3J5KCkge30KKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNyZWF0ZURybVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZCYgaW5fdXVpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9hcHBQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OklEcm1QbHVnaW4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY3JlYXRlQ3J5cHRvUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpVdWlkJiBpbl91dWlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2luaXREYXRhLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpDcnlwdG9TY2hlbWVzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgYmluZGVyX3N0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgdWludDMyX3QgbnVtQXJncykgb3ZlcnJpZGU7CisKKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEcm1GYWN0b3J5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMwNWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9TdGF0dXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCisjaW5jbHVkZSAiRGV2aWNlRmlsZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyBuYW1lc3BhY2UgY2xlYXJrZXlkcm07Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKKworc3RydWN0IERybVBsdWdpbiA6IHB1YmxpYyBCbkRybVBsdWdpbiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7IG1GaWxlSGFuZGxlLkRlbGV0ZUFsbExpY2Vuc2VzKCk7IH0KKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkZWNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBlbmNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpIZGNwTGV2ZWxzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEtleVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2NvcGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lVHlwZSwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlUeXBlIGluX2tleVR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlPiYgaW5fb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlSZXF1ZXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldExvZ01lc3NhZ2VzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE1ldHJpY3MoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkRybU1ldHJpY0dyb3VwPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXROdW1iZXJPZlNlc3Npb25zKAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTZXRJZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFByb3BlcnR5Qnl0ZUFycmF5KGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UHJvcGVydHlTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NlcnRpZmljYXRlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aXNpb25SZXF1ZXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyZVN0b3AoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U2VjdXJlU3RvcHMoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyaXR5TGV2ZWwoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5TZXNzaW9uKDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbCBpbl9zZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zY29wZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Jlc3BvbnNlLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTZXRJZCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fcmVzcG9uc2UsCisgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlByb3ZpZGVQcm92aXNpb25SZXNwb25zZVJlc3VsdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBxdWVyeUtleVN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWxlYXNlU2VjdXJlU3RvcCgKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbGVhc2VTZWN1cmVTdG9wcygKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6T3BhcXVlRGF0YSYgaW5fc3NSZWxlYXNlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZW1vdmVBbGxTZWN1cmVTdG9wcygpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZUtleXMoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlU2VjdXJlU3RvcCgKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lLCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWwgaW5fbGV2ZWwsCisgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlc3RvcmVLZXlzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRDaXBoZXJBbGdvcml0aG0oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2FsZ29yaXRobSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0TGlzdGVuZXIoCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpJRHJtUGx1Z2luTGlzdGVuZXI+JgorICAgICAgICAgICAgLy8gICAgICAgICAgICBpbl9saXN0ZW5lcikKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRHJtUGx1Z2luTGlzdGVuZXI+JiBpbl9saXN0ZW5lcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0TWFjQWxnb3JpdGhtKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9hbGdvcml0aG0pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFBsYXliYWNrSWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wbGF5YmFja0lkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRQcm9wZXJ0eUJ5dGVBcnJheShjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl92YWx1ZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0UHJvcGVydHlTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fdmFsdWUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNpZ24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2lnblJTQShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2FsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3dyYXBwZWRrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB2ZXJpZnkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIGJvb2wgbWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCk7CisgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CisKKyAgICB2b2lkIHNlbmRFdmVudCg6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkV2ZW50VHlwZSBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fZGF0YSk7CisgICAgdm9pZCBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbl9leHBpcnlUaW1lSW5NUyk7CisgICAgdm9pZCBzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVN0YXR1cz4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICBib29sIGluX2hhc05ld1VzYWJsZUtleSk7CisgICAgdm9pZCBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKTsKKworICAgIFN0YXR1cyBzZXRTZWN1cml0eUxldmVsKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpOworCisgICAgU3RhdHVzIGdldEtleVJlcXVlc3RDb21tb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIHJlcXVlc3QsIEtleVJlcXVlc3RUeXBlKiBnZXRLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGVmYXVsdFVybCk7CisKKyAgICBzdHJ1Y3QgQ2xlYXJrZXlTZWN1cmVTdG9wIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE7CisgICAgfTsKKworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBDbGVhcmtleVNlY3VyZVN0b3A+IG1TZWN1cmVTdG9wczsKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gbVBsYXlQb2xpY3k7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtU3RyaW5nUHJvcGVydGllczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbVJlbGVhc2VLZXlzTWFwOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnN0cmluZz4gbVBsYXliYWNrSWQ7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+IG1TZWN1cml0eUxldmVsOworICAgIDo6c3RkOjpzaGFyZWRfcHRyPElEcm1QbHVnaW5MaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7CisgICAgaW50NjRfdCBtT3BlblNlc3Npb25Pa0NvdW50OworICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk9rQ291bnQ7CisgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQ7CisgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CisgICAgOjphbmRyb2lkOjpNdXRleCBtUGxheVBvbGljeUxvY2s7CisKKyAgICAvLyBzZXQgYnkgcHJvcGVydHkgdG8gbW9jayBlcnJvciBzY2VuYXJpb3MKKyAgICBTdGF0dXMgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgICAgIHNlc3Npb24tPnNldE1vY2tFcnJvcihzdGF0aWNfY2FzdDxDZG1SZXNwb25zZVR5cGU+KG1Nb2NrRXJyb3IpKTsKKyAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1czo6T0s7CisgICAgfQorCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisgICAgOjphbmRyb2lkOjpNdXRleCBtU2VjdXJlU3RvcExvY2s7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQWVzQ3RyRGVjcnlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk3ODIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Flc0N0ckRlY3J5cHRvci5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LUFlc0RlY3J5cHRvciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQmxvY2tCaXRDb3VudCA9IGtCbG9ja1NpemUgKiA4OworCitDZG1SZXNwb25zZVR5cGUgQWVzQ3RyRGVjcnlwdG9yOjpkZWNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgY2xlYXJEYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisKKyAgICBpZiAoa2V5LnNpemUoKSAhPSBrQmxvY2tTaXplIHx8IGNsZWFyRGF0YUxlbmd0aHMuc2l6ZSgpICE9IGVuY3J5cHRlZERhdGFMZW5ndGhzLnNpemUoKSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYzOTgyNzY4Iik7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfREVDUllQVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBibG9ja09mZnNldCA9IDA7CisgICAgdWludDhfdCBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXJba0Jsb2NrU2l6ZV07CisgICAgbWVtc2V0KHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgMCwga0Jsb2NrU2l6ZSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuZGF0YSgpLCBrQmxvY2tCaXRDb3VudCwgJm9wZW5zc2xLZXkpOworICAgIEl2IG9wZW5zc2xJdjsKKyAgICBtZW1jcHkob3BlbnNzbEl2LCBpdiwgc2l6ZW9mKG9wZW5zc2xJdikpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbGVhckRhdGFMZW5ndGhzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgbnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGNsZWFyRGF0YUxlbmd0aHNbaV07CisgICAgICAgIGlmIChudW1CeXRlc09mQ2xlYXJEYXRhID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgb2Zmc2V0LCBzb3VyY2UgKyBvZmZzZXQsIG51bUJ5dGVzT2ZDbGVhckRhdGEpOworICAgICAgICAgICAgb2Zmc2V0ICs9IG51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gZW5jcnlwdGVkRGF0YUxlbmd0aHNbaV07CisgICAgICAgIGlmIChudW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgICAgIEFFU19jdHIxMjhfZW5jcnlwdChzb3VyY2UgKyBvZmZzZXQsIGRlc3RpbmF0aW9uICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhLCAmb3BlbnNzbEtleSwgb3BlbnNzbEl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgJmJsb2NrT2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBudW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpieXRlc0RlY3J5cHRlZE91dCA9IG9mZnNldDsKKyAgICByZXR1cm4gY2xlYXJrZXlkcm06Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggN2VkOGI4OC4uYTZhNWIyOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTQ0LDMgKzQ0LDU2IEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3Rvcy5jb21tb24iLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzcmNzOiBbInByb3Rvcy9EZXZpY2VGaWxlcy5wcm90byJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNsZWFya2V5YmFzZSIsCisgICAgdmVuZG9yOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQWVzQ3RyRGVjcnlwdG9yLmNwcCIsCisgICAgICAgICJCYXNlNjQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlci5jcHAiLAorICAgICAgICAiQ2xlYXJLZXlVVUlELmNwcCIsCisgICAgICAgICJEZXZpY2VGaWxlcy5jcHAiLAorICAgICAgICAiSW5pdERhdGFQYXJzZXIuY3BwIiwKKyAgICAgICAgIkpzb25XZWJLZXkuY3BwIiwKKyAgICAgICAgIk1lbW9yeUZpbGVTeXN0ZW0uY3BwIiwKKyAgICAgICAgIlNlc3Npb24uY3BwIiwKKyAgICAgICAgIlNlc3Npb25MaWJyYXJ5LmNwcCIsCisgICAgICAgICJVdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgXSwKKworICAgIHdob2xlX3N0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJqc21uIiwKKyAgICAgICAgImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zLmNvbW1vbiIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW5jbHVkZS9jbGVhcmtleWRybSIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Jhc2U2NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5OTc5MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CYXNlNjQuY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktQmFzZTY0IgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKKzo6YW5kcm9pZDo6c3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICBzaXplX3QgbiA9IHMuc2l6ZSgpOworCisgICAgaWYgKChuICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzaXplX3QgcGFkZGluZyA9IDA7CisgICAgaWYgKG4gPj0gMSAmJiBzLmNfc3RyKClbbiAtIDFdID09ICc9JykgeworICAgICAgICBwYWRkaW5nID0gMTsKKworICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgICAgICBwYWRkaW5nID0gMjsKKworICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzLmNfc3RyKClbbiAtIDNdID09ICc9JykgeworICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgZGl2aWRlIGZpcnN0IHRvIGF2b2lkIG92ZXJmbG93LiBJdCdzIE9LIHRvIGRvIHRoaXMgYmVjYXVzZSB3ZQorICAgIC8vIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgbiAlIDQgPT0gMC4KKyAgICBzaXplX3Qgb3V0TGVuID0gKG4gLyA0KSAqIDMgLSBwYWRkaW5nOworCisgICAgOjphbmRyb2lkOjpzcDxCdWZmZXI+IGJ1ZmZlciA9IG5ldyBCdWZmZXIob3V0TGVuKTsKKyAgICB1aW50OF90KiBvdXQgPSBidWZmZXItPmRhdGEoKTsKKyAgICBpZiAob3V0ID09IG51bGxwdHIgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IGogPSAwOworICAgIHVpbnQzMl90IGFjY3VtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIHVuc2lnbmVkIHZhbHVlOworICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgdmFsdWUgPSAyNiArIGMgLSAnYSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNTIgKyBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYyOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYzOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgYWNjdW0gPSAoYWNjdW0gPDwgNikgfCB2YWx1ZTsKKworICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeworICAgICAgICAgICAgICAgIG91dFtqKytdID0gKGFjY3VtID4+IDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7CisgICAgICAgICAgICAgICAgb3V0W2orK10gPSAoYWNjdW0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsKKyAgICAgICAgICAgICAgICBvdXRbaisrXSA9IGFjY3VtICYgMHhmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CisgICAgaWYgKHggPD0gMjUpIHsKKyAgICAgICAgcmV0dXJuICdBJyArIHg7CisgICAgfSBlbHNlIGlmICh4IDw9IDUxKSB7CisgICAgICAgIHJldHVybiAnYScgKyB4IC0gMjY7CisgICAgfSBlbHNlIGlmICh4IDw9IDYxKSB7CisgICAgICAgIHJldHVybiAnMCcgKyB4IC0gNTI7CisgICAgfSBlbHNlIGlmICh4ID09IDYyKSB7CisgICAgICAgIHJldHVybiAnKyc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICcvJzsKKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQqIF9kYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcqIG91dCkgeworICAgIG91dC0+Y2xlYXIoKTsKKworICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSAoY29uc3QgdWludDhfdCopX2RhdGE7CisKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgLyAzKSAqIDM7IGkgKz0gMykgeworICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgdWludDhfdCB4MiA9IGRhdGFbaSArIDFdOworICAgICAgICB1aW50OF90IHgzID0gZGF0YVtpICsgMl07CisKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MSA+PiAyKSk7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgxIDw8IDQgfCB4MiA+PiA0KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDIgPDwgMiB8IHgzID4+IDYpICYgMHgzZikpOworICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KHgzICYgMHgzZikpOworICAgIH0KKyAgICBzd2l0Y2ggKHNpemUgJSAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDEgPSBkYXRhW2ldOworICAgICAgICAgICAgdWludDhfdCB4MiA9IGRhdGFbaSArIDFdOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MSA+PiAyKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MiA8PCAyKSAmIDB4M2YpKTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKCc9Jyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDEgPDwgNCkgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCgiPT0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkKiBfZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgICBlbmNvZGVCYXNlNjQoX2RhdGEsIHNpemUsIG91dCk7CisKKyAgICBpZiAoKHN0ZDo6c3RyaW5nOjpucG9zICE9IG91dC0+ZmluZCgiKyIpKSB8fCAoc3RkOjpzdHJpbmc6Om5wb3MgIT0gb3V0LT5maW5kKCIvIikpKSB7CisgICAgICAgIHNpemVfdCBvdXRMZW4gPSBvdXQtPnNpemUoKTsKKyAgICAgICAgY2hhciogYmFzZTY0dXJsID0gbmV3IGNoYXJbb3V0TGVuXTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRMZW47ICsraSkgeworICAgICAgICAgICAgaWYgKG91dC0+Y19zdHIoKVtpXSA9PSAnKycpCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gJy0nOworICAgICAgICAgICAgZWxzZSBpZiAob3V0LT5jX3N0cigpW2ldID09ICcvJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnXyc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gb3V0LT5jX3N0cigpW2ldOworICAgICAgICB9CisKKyAgICAgICAgb3V0LT5hc3NpZ24oYmFzZTY0dXJsLCBvdXRMZW4pOworICAgICAgICBkZWxldGVbXSBiYXNlNjR1cmw7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CdWZmZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0J1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MTU5OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CdWZmZXIuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpIDogbVJhbmdlT2Zmc2V0KDApLCBtT3duc0RhdGEodHJ1ZSkgeworICAgIG1EYXRhID0gbWFsbG9jKGNhcGFjaXR5KTsKKyAgICBpZiAobURhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBtQ2FwYWNpdHkgPSAwOworICAgICAgICBtUmFuZ2VMZW5ndGggPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYXBhY2l0eSA9IGNhcGFjaXR5OworICAgICAgICBtUmFuZ2VMZW5ndGggPSBjYXBhY2l0eTsKKyAgICB9Cit9CisKK0J1ZmZlcjo6fkJ1ZmZlcigpIHsKKyAgICBpZiAobU93bnNEYXRhKSB7CisgICAgICAgIGlmIChtRGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vRGV2aWNlRmlsZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk5MjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0RldmljZUZpbGVzLmNwcApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAicHJvdG9zL0RldmljZUZpbGVzLnBiLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisvLyBQcm90b2J1ZiBnZW5lcmF0ZWQgY2xhc3Nlcy4KK3VzaW5nIGNsZWFya2V5ZHJtOjpIYXNoZWRGaWxlOwordXNpbmcgY2xlYXJrZXlkcm06OkxpY2Vuc2U7Cit1c2luZyBjbGVhcmtleWRybTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOwordXNpbmcgY2xlYXJrZXlkcm06OkxpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzsKK3VzaW5nIGNsZWFya2V5ZHJtOjpPZmZsaW5lRmlsZTsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIga0xpY2Vuc2VGaWxlTmFtZUV4dFtdID0gIi5saWMiOworCitib29sIEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHN0ZDo6c3RyaW5nKiBoYXNoKSB7CisgICAgaWYgKCFoYXNoKSByZXR1cm4gZmFsc2U7CisKKyAgICBoYXNoLT5yZXNpemUoU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhLmRhdGEoKSk7CisgICAgdW5zaWduZWQgY2hhciogb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJigqaGFzaClbMF0pOworICAgIFNIQTI1NihpbnB1dCwgZGF0YS5zaXplKCksIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitib29sIERldmljZUZpbGVzOjpTdG9yZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpY2Vuc2VSZXNwb25zZSkgeworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKHNlcmlhbGl6ZWRGaWxlLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVdpdGhIYXNoOiBGYWlsZWQgdG8gY29tcHV0ZSBoYXNoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGhhc2hGaWxlLnNldF9maWxlKHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBoYXNoRmlsZS5zZXRfaGFzaChoYXNoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIHJldHVybiBTdG9yZUZpbGVSYXcoZmlsZU5hbWUsIHNlcmlhbGl6ZWRIYXNoRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkSGFzaEZpbGUpIHsKKyAgICBNZW1vcnlGaWxlU3lzdGVtOjpNZW1vcnlGaWxlIG1lbUZpbGU7CisgICAgbWVtRmlsZS5zZXRGaWxlTmFtZShmaWxlTmFtZSk7CisgICAgbWVtRmlsZS5zZXRDb250ZW50KHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgbWVtRmlsZS5zZXRGaWxlU2l6ZShzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKTsKKyAgICBzaXplX3QgbGVuID0gbUZpbGVIYW5kbGUuV3JpdGUoZmlsZU5hbWUsIG1lbUZpbGUpOworCisgICAgaWYgKGxlbiAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVSYXc6IEZhaWxlZCB0byB3cml0ZSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiBleHBlY3RlZD0lemQsIGFjdHVhbD0lenUiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBsZW4pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogd3JvdGUgJXp1IGJ5dGVzIHRvICVzIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisgICAgT2ZmbGluZUZpbGUgZmlsZTsKKyAgICBpZiAoIVJldHJpZXZlSGFzaGVkRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQsICZmaWxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudHlwZSgpICE9IE9mZmxpbmVGaWxlOjpMSUNFTlNFKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB0eXBlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS52ZXJzaW9uKCkgIT0gT2ZmbGluZUZpbGU6OlZFUlNJT05fMSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmaWxlLmhhc19saWNlbnNlKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogTGljZW5zZSBub3QgcHJlc2VudCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTGljZW5zZSBsaWNlbnNlID0gZmlsZS5saWNlbnNlKCk7CisgICAgc3dpdGNoIChsaWNlbnNlLnN0YXRlKCkpIHsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlQWN0aXZlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlJldHJpZXZlTGljZW5zZTogVW5yZWNvZ25pemVkIGxpY2Vuc2Ugc3RhdGU6ICV1Iiwga0xpY2Vuc2VTdGF0ZVVua25vd24pOworICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKm9mZmxpbmVMaWNlbnNlID0gbGljZW5zZS5saWNlbnNlKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlQWxsTGljZW5zZXMoKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUFsbEZpbGVzKCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkxpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERldmljZUZpbGVzOjpMaXN0TGljZW5zZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VzID0gbUZpbGVIYW5kbGUuTGlzdEZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaWNlbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyYgbGljZW5zZSA9IGxpY2Vuc2VzW2ldOworICAgICAgICBsaWNlbnNlID0gbGljZW5zZS5zdWJzdHIoMCwgbGljZW5zZS5zaXplKCkgLSBzdHJsZW4oa0xpY2Vuc2VGaWxlTmFtZUV4dCkpOworICAgIH0KKyAgICByZXR1cm4gbGljZW5zZXM7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghRmlsZUV4aXN0cyhmaWxlTmFtZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogJXMgZG9lcyBub3QgZXhpc3QiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgYnl0ZXMgPSBHZXRGaWxlU2l6ZShmaWxlTmFtZSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHNpemU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgc2VyaWFsaXplZEhhc2hGaWxlLnJlc2l6ZShieXRlcyk7CisgICAgYnl0ZXMgPSBtRmlsZUhhbmRsZS5SZWFkKGZpbGVOYW1lLCAmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIGlmIChieXRlcyAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGV4cGVjdGVkOiAlemQsIGFjdHVhbDogJXpkIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgYnl0ZXMpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogcmVhZCAlemQgZnJvbSAlcyIsIGJ5dGVzLCBmaWxlTmFtZS5jX3N0cigpKTsKKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaWYgKCFoYXNoRmlsZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZEhhc2hGaWxlKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgaGFzaCBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goaGFzaEZpbGUuZmlsZSgpLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBjb21wdXRhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChoYXNoICE9IGhhc2hGaWxlLmhhc2goKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIG1pc21hdGNoIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlLT5QYXJzZUZyb21TdHJpbmcoaGFzaEZpbGUuZmlsZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGZpbGVOYW1lKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShmaWxlTmFtZSk7Cit9CisKK3NzaXplX3QgRGV2aWNlRmlsZXM6OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5HZXRGaWxlU2l6ZShmaWxlTmFtZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Jbml0RGF0YVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MzllOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Jbml0RGF0YVBhcnNlciIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlLmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBTdHJUb1ZlY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjKHN0ci5iZWdpbigpLCBzdHIuZW5kKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK0NkbVJlc3BvbnNlVHlwZSBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENkbUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KSB7CisgICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBrZXkgSURzCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+IGtleUlkczsKKworICAgIGlmIChtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUuY19zdHIoKSB8fCBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKKyAgICAgICAgYXV0byByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOworICAgICAgICBpZiAocmVzICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobWltZVR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlLmNfc3RyKCkgfHwgbWltZVR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlLmNfc3RyKCkgfHwKKyAgICAgICAgICAgICAgIG1pbWVUeXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQuY19zdHIoKSkgeworICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECisgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgICAgICB9CisgICAgICAgIGtleUlkcy5wdXNoX2JhY2soaW5pdERhdGEuZGF0YSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX1JFTEVBU0UpIHsKKyAgICAgICAgLy8gcmVzdG9yZSBrZXkKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdAorICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleVR5cGUsIGtleUlkcyk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdEpzb25WZWMgPSBTdHJUb1ZlY3RvcihyZXF1ZXN0SnNvbik7CisKKyAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKKyAgICBsaWNlbnNlUmVxdWVzdC0+aW5zZXJ0KGxpY2Vuc2VSZXF1ZXN0LT5lbmQoKSwgcmVxdWVzdEpzb25WZWMuYmVnaW4oKSwgcmVxdWVzdEpzb25WZWMuZW5kKCkpOworICAgIHJldHVybiBjbGVhcmtleWRybTo6T0s7Cit9CisKK0NkbVJlc3BvbnNlVHlwZSBJbml0RGF0YVBhcnNlcjo6cGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKSB7CisgICAgLy8gRGVzY3JpcHRpb24gb2YgUFNTSCBmb3JtYXQ6CisgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2VuY3J5cHRlZC1tZWRpYS9mb3JtYXQtcmVnaXN0cnkvaW5pdGRhdGEvY2VuYy5odG1sCisgICAgc2l6ZV90IHJlYWRQb3NpdGlvbiA9IDA7CisKKyAgICB1aW50MzJfdCBleHBlY3RlZFNpemUgPSBpbml0RGF0YS5zaXplKCk7CisgICAgY29uc3QgY2hhciBwc3NoSWRlbnRpZmllcls0XSA9IHsncCcsICdzJywgJ3MnLCAnaCd9OworICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIHVpbnQzMl90IGtleUlkQ291bnQgPSAwOworICAgIHNpemVfdCBoZWFkZXJTaXplID0gc2l6ZW9mKGV4cGVjdGVkU2l6ZSkgKyBzaXplb2YocHNzaElkZW50aWZpZXIpICsgc2l6ZW9mKHBzc2hWZXJzaW9uMSkgKworICAgICAgICAgICAgICAgICAgICAgICAga1N5c3RlbUlkU2l6ZSArIHNpemVvZihrZXlJZENvdW50KTsKKyAgICBpZiAoaW5pdERhdGEuc2l6ZSgpIDwgaGVhZGVyU2l6ZSkgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgc2l6ZSBmaWVsZAorICAgIGV4cGVjdGVkU2l6ZSA9IGh0b25sKGV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgJmV4cGVjdGVkU2l6ZSwgc2l6ZW9mKGV4cGVjdGVkU2l6ZSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGV4cGVjdGVkU2l6ZSk7CisKKyAgICAvLyBWYWxpZGF0ZSBQU1NIIGJveCBpZGVudGlmaWVyCisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgcHNzaElkZW50aWZpZXIsIHNpemVvZihwc3NoSWRlbnRpZmllcikpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwgc2l6ZW9mKHBzc2hWZXJzaW9uMSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hWZXJzaW9uMSk7CisKKyAgICAvLyBWYWxpZGF0ZSBzeXN0ZW0gSUQKKyAgICBpZiAoIWlzQ2xlYXJLZXlVVUlEKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dKSkgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBrU3lzdGVtSWRTaXplOworCisgICAgLy8gUmVhZCBrZXkgSUQgY291bnQKKyAgICBtZW1jcHkoJmtleUlkQ291bnQsICZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBzaXplb2Yoa2V5SWRDb3VudCkpOworICAgIGtleUlkQ291bnQgPSBudG9obChrZXlJZENvdW50KTsKKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGtleUlkQ291bnQpOworCisgICAgdWludDY0X3QgcHNzaFNpemUgPSAwOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGtleUlkQ291bnQsIGtLZXlJZFNpemUsICZwc3NoU2l6ZSkgfHwKKyAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhyZWFkUG9zaXRpb24sIHBzc2hTaXplLCAmcHNzaFNpemUpIHx8CisgICAgICAgIHBzc2hTaXplICE9IGluaXREYXRhLnNpemUoKSAtIHNpemVvZih1aW50MzJfdCkgLyogRGF0YVNpemUoMCkgKi8pIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUga2V5IElEIG9mZnNldHMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga2V5SWRDb3VudDsgKytpKSB7CisgICAgICAgIHNpemVfdCBrZXlJZFBvc2l0aW9uID0gcmVhZFBvc2l0aW9uICsgKGkgKiBrS2V5SWRTaXplKTsKKyAgICAgICAga2V5SWRzLT5wdXNoX2JhY2soJmluaXREYXRhW2tleUlkUG9zaXRpb25dKTsKKyAgICB9CisgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpPSzsKK30KKworc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChDZG1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeVNlc3Npb24oIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudFNlc3Npb24oIl0sXCJ0eXBlXCI6XCJwZXJzaXN0ZW50LWxpY2Vuc2VcIn0iKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOworICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRJZDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkSWQuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RlQmFzZTY0VXJsKGtleUlkc1tpXSwga0tleUlkU2l6ZSwgJmVuY29kZWRJZCk7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIsIik7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGVuY29kZWRJZCk7CisgICAgICAgIHJlcXVlc3QucHVzaF9iYWNrKCdcIicpOworICAgIH0KKyAgICBpZiAoa2V5VHlwZSA9PSBjbGVhcmtleWRybTo6S0VZX1RZUEVfU1RSRUFNSU5HKSB7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtUZW1wb3JhcnlTZXNzaW9uKTsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX09GRkxJTkUgfHwKKyAgICAgICAgICAgICAgIGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX1JFTEVBU0UpIHsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1BlcnNpc3RlbnRTZXNzaW9uKTsKKyAgICB9CisKKyAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KKyAgICBjb25zdCBjaGFyIGtCYXNlNjRQYWRkaW5nID0gJz0nOworICAgIHJlcXVlc3QuZXJhc2Uoc3RkOjpyZW1vdmUocmVxdWVzdC5iZWdpbigpLCByZXF1ZXN0LmVuZCgpLCBrQmFzZTY0UGFkZGluZyksIHJlcXVlc3QuZW5kKCkpOworCisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0pzb25XZWJLZXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYmM1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vSnNvbldlYktleS5jcHAKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Kc29uV2ViS2V5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5c1RhZygia2V5cyIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleVR5cGVUYWcoImt0eSIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleVRhZygiayIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleUlkVGFnKCJraWQiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZWRpYVNlc3Npb25UeXBlKCJ0eXBlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudExpY2Vuc2VTZXNzaW9uKCJwZXJzaXN0ZW50LWxpY2Vuc2UiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZVNlc3Npb24oInRlbXBvcmFyeSIpOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK0pzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7fQorCitKc29uV2ViS2V5Ojp+SnNvbldlYktleSgpIHt9CisKKy8qCisgKiBQYXJzZXMgYSBKU09OIFdlYiBLZXkgU2V0IHN0cmluZywgaW5pdGlhbGl6ZXMgYSBLZXlNYXAgd2l0aCBrZXkgaWQ6a2V5CisgKiBwYWlycyBmcm9tIHRoZSBKU09OIFdlYiBLZXkgU2V0LiBCb3RoIGtleSBpZHMgYW5kIGtleXMgYXJlIGJhc2U2NHVybAorICogZW5jb2RlZC4gVGhlIEtleU1hcCBjb250YWlucyBiYXNlNjR1cmwgZGVjb2RlZCBrZXkgaWQ6a2V5IHBhaXJzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsIEtleU1hcCoga2V5cykgeworICAgIGtleXMtPmNsZWFyKCk7CisKKyAgICBpZiAoIXBhcnNlSnNvbldlYktleVNldChqc29uV2ViS2V5U2V0LCAmbUpzb25PYmplY3RzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbUpzb25PYmplY3RzWzBdIGNvbnRhaW5zIHRoZSBlbnRpcmUgSlNPTiBXZWIgS2V5IFNldCwgaW5jbHVkaW5nCisgICAgLy8gYWxsIHRoZSBiYXNlNjQgZW5jb2RlZCBrZXlzLiBFYWNoIGtleSBpcyBhbHNvIHN0b3JlZCBzZXBhcmF0ZWx5IGFzCisgICAgLy8gYSBKU09OIG9iamVjdCBpbiBtSnNvbk9iamVjdHNbMS4ubl0gd2hlcmUgbiBpcyB0aGUgdG90YWwKKyAgICAvLyBudW1iZXIgb2Yga2V5cyBpbiB0aGUgc2V0LgorICAgIGlmIChtSnNvbk9iamVjdHMuc2l6ZSgpID09IDAgfHwgIWlzSnNvbldlYktleVNldChtSnNvbk9iamVjdHNbMF0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkS2V5LCBlbmNvZGVkS2V5SWQ7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVjb2RlZEtleSwgZGVjb2RlZEtleUlkOworCisgICAgLy8gbUpzb25PYmplY3RzWzFdIGNvbnRhaW5zIHRoZSBmaXJzdCBKU09OIFdlYiBLZXkgaW4gdGhlIHNldAorICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbUpzb25PYmplY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRLZXlJZC5jbGVhcigpOworICAgICAgICBlbmNvZGVkS2V5LmNsZWFyKCk7CisKKyAgICAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzW2ldLCAmbVRva2VucykpIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZmluZEtleShtSnNvbk9iamVjdHNbaV0sICZlbmNvZGVkS2V5SWQsICZlbmNvZGVkS2V5KSkgeworICAgICAgICAgICAgaWYgKGVuY29kZWRLZXlJZC5lbXB0eSgpIHx8IGVuY29kZWRLZXkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5LCAmZGVjb2RlZEtleSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkoJXMpIiwgZW5jb2RlZEtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5cy0+aW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+KGRlY29kZWRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkS2V5KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCkgeworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgc3RkOjpzdHJpbmcgcGFkZGVkVGV4dChlbmNvZGVkVGV4dCk7CisgICAgaWYgKHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0IC0gcmVtYWluZGVyOyArK2kpIHsKKyAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8QnVmZmVyPiBidWZmZXIgPSBkZWNvZGVCYXNlNjQocGFkZGVkVGV4dCk7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgY29udGVudCBmb3VuZC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlY29kZWRUZXh0LT5pbnNlcnQoZGVjb2RlZFRleHQtPmVuZCgpLCBidWZmZXItPmJhc2UoKSwgYnVmZmVyLT5iYXNlKCkgKyBidWZmZXItPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZmluZEtleShjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjpzdHJpbmcqIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlbmNvZGVkS2V5KSB7CisgICAgc3RkOjpzdHJpbmcga2V5LCB2YWx1ZTsKKworICAgIC8vIE9ubHkgYWxsb3cgc3ltbWV0cmljIGtleSwgaS5lLiAia3R5Ijoib2N0IiBwYWlyLgorICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleVR5cGVUYWcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VHlwZVRhZywgJnZhbHVlKTsKKyAgICAgICAgaWYgKDAgIT0gdmFsdWUuY29tcGFyZShrU3ltbWV0cmljS2V5VmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5SWRUYWcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5SWRUYWcsIGtleUlkKTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUYWcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VGFnLCBlbmNvZGVkS2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSnNvbldlYktleTo6ZmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICAgIHZhbHVlLT5jbGVhcigpOworICAgIGNvbnN0IGNoYXIqIHZhbHVlVG9rZW47CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5leHRUb2tlbiA9IG1Ub2tlbnMuYmVnaW4oKTsKKyAgICAgICAgIG5leHRUb2tlbiAhPSBtVG9rZW5zLmVuZCgpOyArK25leHRUb2tlbikgeworICAgICAgICBpZiAoMCA9PSAoKm5leHRUb2tlbikuY29tcGFyZShrZXkpKSB7CisgICAgICAgICAgICBpZiAobmV4dFRva2VuICsgMSA9PSBtVG9rZW5zLmVuZCgpKSBicmVhazsKKyAgICAgICAgICAgIHZhbHVlVG9rZW4gPSAoKihuZXh0VG9rZW4gKyAxKSkuY19zdHIoKTsKKyAgICAgICAgICAgIHZhbHVlLT5hc3NpZ24odmFsdWVUb2tlbik7CisgICAgICAgICAgICBuZXh0VG9rZW4rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEpzb25XZWJLZXk6OmlzSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCkgY29uc3QgeworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleXNUYWcpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJKU09OIFdlYiBLZXkgZG9lcyBub3QgY29udGFpbiBrZXlzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBvYmplY3RzIHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgdG9rZW5zLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbk9iamVjdChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwganNvbk9iamVjdC5jX3N0cigpLCBqc29uT2JqZWN0LnNpemUoKSwgbnVsbHB0ciwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuY2xlYXIoKTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3QuY19zdHIoKSwganNvbk9iamVjdC5zaXplKCksIG1Kc21uVG9rZW5zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Ub2tlbnMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRva2Vucy0+Y2xlYXIoKTsKKyAgICBzdGQ6OnN0cmluZyB0b2tlbjsKKyAgICBjb25zdCBjaGFyKiBwanM7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1Ub2tlbnM7ICsraikgeworICAgICAgICBwanMgPSBqc29uT2JqZWN0LmNfc3RyKCkgKyBtSnNtblRva2Vuc1tqXS5zdGFydDsKKyAgICAgICAgaWYgKG1Kc21uVG9rZW5zW2pdLnR5cGUgPT0gSlNNTl9TVFJJTkcgfHwgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uYXNzaWduKHBqcywgbUpzbW5Ub2tlbnNbal0uZW5kIC0gbUpzbW5Ub2tlbnNbal0uc3RhcnQpOworICAgICAgICAgICAgdG9rZW5zLT5wdXNoX2JhY2sodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIEpTT04gV2ViIEtleSBTZXQgc3RyaW5nIGFuZCBpbml0aWFsaXplcyBhIHZlY3RvciBvZiBKU09OIG9iamVjdHMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6cGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBqc29uT2JqZWN0cykgeworICAgIGlmIChqc29uV2ViS2V5U2V0LmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkVtcHR5IEpTT04gV2ViIEtleSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhlIGpzbW4gcGFyc2VyIG9ubHkgc3VwcG9ydHMgdW5pY29kZSBlbmNvZGluZy4KKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICAvLyBDb21wdXRlcyBudW1iZXIgb2YgdG9rZW5zLiBBIHRva2VuIG1hcmtzIHRoZSB0eXBlLCBvZmZzZXQgaW4KKyAgICAvLyB0aGUgb3JpZ2luYWwgc3RyaW5nLgorICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgbnVtVG9rZW5zID0ganNtbl9wYXJzZSgmcGFyc2VyLCBqc29uV2ViS2V5U2V0LmNfc3RyKCksIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBudWxscHRyLCAwKTsKKyAgICBpZiAobnVtVG9rZW5zIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIG51bVRva2Vucyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQganNtblRva2Vuc1NpemUgPSBudW1Ub2tlbnMgKiBzaXplb2YoanNtbnRva190KTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuY19zdHIoKSwganNvbldlYktleVNldC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnMuZGF0YSgpLCBudW1Ub2tlbnMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRva2VuOworICAgIGNvbnN0IGNoYXIqIHBqczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRva2VuczsgKytpKSB7CisgICAgICAgIHBqcyA9IGpzb25XZWJLZXlTZXQuY19zdHIoKSArIG1Kc21uVG9rZW5zW2ldLnN0YXJ0OworICAgICAgICBpZiAobUpzbW5Ub2tlbnNbaV0udHlwZSA9PSBKU01OX09CSkVDVCkgeworICAgICAgICAgICAgdG9rZW4uYXNzaWduKHBqcywgbUpzbW5Ub2tlbnNbaV0uZW5kIC0gbUpzbW5Ub2tlbnNbaV0uc3RhcnQpOworICAgICAgICAgICAganNvbk9iamVjdHMtPnB1c2hfYmFjayh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL01lbW9yeUZpbGVTeXN0ZW0uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL01lbW9yeUZpbGVTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDU0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vTWVtb3J5RmlsZVN5c3RlbS5jcHAKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworc3RkOjpzdHJpbmcgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBzaXplX3QgaW5kZXggPSBwYXRoLmZpbmRfbGFzdF9vZignLycpOworICAgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHIoaW5kZXggKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIHJldHVybiByZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCk7Cit9CisKK3NzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIGZvciAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVtb3J5RmlsZVN5c3RlbTo6TGlzdEZpbGVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaXN0OworICAgIGZvciAoY29uc3QgYXV0byYgZmlsZW5hbWUgOiBtTWVtb3J5RmlsZVN5c3RlbSkgeworICAgICAgICBsaXN0LnB1c2hfYmFjayhmaWxlbmFtZS5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6UmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGJ1ZmZlcikgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOworICAgICAgICBidWZmZXItPmFzc2lnbihzZXJpYWxpemVkSGFzaEZpbGUpOworICAgICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKGtleSk7CisgICAgfQorICAgIG1NZW1vcnlGaWxlU3lzdGVtLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+KGtleSwgbWVtb3J5RmlsZSkpOworICAgIHJldHVybiBtZW1vcnlGaWxlLmdldEZpbGVTaXplKCk7Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2UocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIGxpY2Vuc2UgdG8gcmVtb3ZlOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUFsbEZpbGVzKCkgeworICAgIG1NZW1vcnlGaWxlU3lzdGVtLmNsZWFyKCk7CisgICAgcmV0dXJuIG1NZW1vcnlGaWxlU3lzdGVtLmVtcHR5KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZmQxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LVNlc3Npb24iCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworQ2RtUmVzcG9uc2VUeXBlIFNlc3Npb246OmdldEtleVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RtS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0IHsKKyAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIGtleVJlcXVlc3QpOworfQorCitDZG1SZXNwb25zZVR5cGUgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSkgeworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChhdXRvJiBrZXkgOiBrZXlzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaXJzdChrZXkuZmlyc3QuYmVnaW4oKSwga2V5LmZpcnN0LmVuZCgpKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlY29uZChrZXkuc2Vjb25kLmJlZ2luKCksIGtleS5zZWNvbmQuZW5kKCkpOworICAgICAgICAgICAgbUtleU1hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+KGtleS5maXJzdCwga2V5LnNlY29uZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6T0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9VTktOT1dOOworICAgIH0KK30KKworQ2RtUmVzcG9uc2VUeXBlIFNlc3Npb246OmRlY3J5cHQoY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjUHRyLCB1aW50OF90KiBkZXN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGNsZWFyRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgZW5jcnlwdGVkRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworCisgICAgaWYgKGdldE1vY2tFcnJvcigpICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICByZXR1cm4gZ2V0TW9ja0Vycm9yKCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CisgICAga2V5SWRWZWN0b3IuY2xlYXIoKTsKKyAgICBrZXlJZFZlY3Rvci5pbnNlcnQoa2V5SWRWZWN0b3IuZW5kKCksIGtleUlkLCBrZXlJZCArIGtCbG9ja1NpemUpOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj46Oml0ZXJhdG9yIGl0cjsKKyAgICBpdHIgPSBtS2V5TWFwLmZpbmQoa2V5SWRWZWN0b3IpOworICAgIGlmIChpdHIgPT0gbUtleU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX05PX0xJQ0VOU0U7CisgICAgfQorCisgICAgY2xlYXJrZXlkcm06OkFlc0N0ckRlY3J5cHRvciBkZWNyeXB0b3I7CisgICAgYXV0byBzdGF0dXMgPSBkZWNyeXB0b3IuZGVjcnlwdChpdHItPnNlY29uZCAvKmtleSovLCBpdiwgc3JjUHRyLCBkZXN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNEZWNyeXB0ZWRPdXQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uTGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyZmYzOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LVNlc3Npb25MaWJyYXJ5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworTXV0ZXggU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b25Mb2NrOworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uID0gTlVMTDsKKworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpnZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1NpbmdsZXRvbkxvY2spOworCisgICAgaWYgKHNTaW5nbGV0b24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBTZXNzaW9uIExpYnJhcnkgU2luZ2xldG9uLiIpOworICAgICAgICBzU2luZ2xldG9uID0gbmV3IFNlc3Npb25MaWJyYXJ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHNTaW5nbGV0b247Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpjcmVhdGVTZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworCisgICAgY2hhciBzZXNzaW9uSWRSYXdbMTZdOworICAgIHNucHJpbnRmKHNlc3Npb25JZFJhdywgc2l6ZW9mKHNlc3Npb25JZFJhdyksICIldSIsIG1OZXh0U2Vzc2lvbklkKTsKKworICAgIG1OZXh0U2Vzc2lvbklkICs9IDE7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmluc2VydChzZXNzaW9uSWQuZW5kKCksIHNlc3Npb25JZFJhdywKKyAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZFJhdyArIHNpemVvZihzZXNzaW9uSWRSYXcpIC8gc2l6ZW9mKHVpbnQ4X3QpKTsKKworICAgIG1TZXNzaW9ucy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+PihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4+OjppdGVyYXRvciBpdHIgPSBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOworICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+Pjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIFNlc3Npb25MaWJyYXJ5OjpkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworICAgIG1TZXNzaW9ucy5lcmFzZShzZXNzaW9uLT5zZXNzaW9uSWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9DbGVhcktleVVVSUQuaAppbmRleCBmZTEwZmJhLi44OTExMDI0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9DbGVhcktleVVVSUQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9DbGVhcktleVVVSUQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDkgKzEzLDcgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KLSNpZm5kZWYgQ0xFQVJLRVlfVVVJRF9IXwotI2RlZmluZSBDTEVBUktFWV9VVUlEX0hfCisjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CkBAIC0yNyw2ICsyNSw0IEBACiAKIHN0ZDo6dmVjdG9yPHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+PiBnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCk7CiAKLX0gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCi0KLSNlbmRpZiAvLyBDTEVBUktFWV9VVUlEX0hfCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQWVzQ3RyRGVjcnlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmMzA5OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Flc0N0ckRlY3J5cHRvci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworICBwdWJsaWM6CisgICAgQWVzQ3RyRGVjcnlwdG9yKCkge30KKworICAgIENkbVJlc3BvbnNlVHlwZSBkZWNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGNsZWFyRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpOworCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFlc0N0ckRlY3J5cHRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CYXNlNjQuaApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Jhc2U2NC5oCmluZGV4IGIwOGE2MDQuLjA3NWQyNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQmFzZTY0LmgKQEAgLTEzLDE3ICsxMywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKyNwcmFnbWEgb25jZQogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaW5jbHVkZSAiQnVmZmVyLmgiCiAKLS8qKgotICogQXVkaW8gZW5jYXBzdWxhdGlvbiB0eXBlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaWYgdGhlIGF1ZGlvIGRhdGEgc2hvdWxkIGJlIHNlbnQgd2l0aCBhIHBhcnRpY3VsYXIKLSAqIGVuY2Fwc3VsYXRpb24gdHlwZSBvciBub3QuCi0gKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlIHsKLSAgICBOT05FICAgICA9IDAsCi0gICAgSUVDNjE5MzcgPSAxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3N0cnVjdCBCdWZmZXI7CisKKzo6YW5kcm9pZDo6c3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHMpOworCit2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcqIG91dCk7CisKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyogb3V0KTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CdWZmZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWM0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CdWZmZXIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworc3RydWN0IEJ1ZmZlciA6IHB1YmxpYyA6OmFuZHJvaWQ6OlJlZkJhc2UgeworICAgIGV4cGxpY2l0IEJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpOworCisgICAgdWludDhfdCogYmFzZSgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1EYXRhKTsgfQorICAgIHVpbnQ4X3QqIGRhdGEoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtRGF0YSkgKyBtUmFuZ2VPZmZzZXQ7IH0KKyAgICBzaXplX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtQ2FwYWNpdHk7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1SYW5nZUxlbmd0aDsgfQorICAgIHNpemVfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtUmFuZ2VPZmZzZXQ7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QnVmZmVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkKiBtRGF0YTsKKyAgICBzaXplX3QgbUNhcGFjaXR5OworICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CisgICAgc2l6ZV90IG1SYW5nZUxlbmd0aDsKKworICAgIGJvb2wgbU93bnNEYXRhOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkYTM4OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0S2V5KCJkcm1FcnJvclRlc3QiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0VmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSgicmVzb3VyY2VDb250ZW50aW9uIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRnJhbWVUb29MYXJnZVZhbHVlKCJmcmFtZVRvb0xhcmdlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ludmFsaWRTdGF0ZVZhbHVlKCJpbnZhbGlkU3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbFZlcnNpb25LZXkoImFpZGxWZXJzaW9uIik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CitzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0gezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgsIDB4OSwgMHhhLCAweGIsIDB4YywgMHhkLCAweGUsIDB4Zn07CisKKy8vIHNldHRhYmxlIGJ5dGUgYXJyYXkgcHJvcGVydHkKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQ2xpZW50SWRLZXkoImNsaWVudElkIik7CisKKy8vIFRPRE8gc3R1YiBvdXQgbWV0cmljcyBmb3IgbncKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWV0cmljc0tleSgibWV0cmljcyIpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01ldHJpY3NEYXRhW10gPSB7MH07CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzk1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9DbGVhcktleVR5cGVzLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgIC8vIEFFU19CTE9DS19TSVpFOwordHlwZWRlZiB1aW50OF90IEtleUlkW2tCbG9ja1NpemVdOwordHlwZWRlZiB1aW50OF90IEl2W2tCbG9ja1NpemVdOworCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gS2V5TWFwOworCisjZGVmaW5lIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUeXBlTmFtZSkgXAorICAgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgICAgICAgIFwKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOworCisjZGVmaW5lIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl9BTkRfTkVXKFR5cGVOYW1lKSBcCisgICAgVHlwZU5hbWUoKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKKworZW51bSBDZG1SZXNwb25zZVR5cGUgOiBpbnQzMl90IHsKKyAgICBPSyA9IDAsCisgICAgRVJST1JfTk9fTElDRU5TRSA9IDEsCisgICAgRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVEID0gMywKKyAgICBFUlJPUl9DQU5OT1RfSEFORExFID0gNCwKKyAgICBFUlJPUl9JTlZBTElEX1NUQVRFID0gNSwKKyAgICBCQURfVkFMVUUgPSA2LAorICAgIEVSUk9SX0RFQ1JZUFQgPSAxMSwKKyAgICBFUlJPUl9VTktOT1dOID0gMTIsCisgICAgRVJST1JfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZID0gMTMsCisgICAgRVJST1JfRlJBTUVfVE9PX0xBUkdFID0gMTQsCisgICAgRVJST1JfU0VTU0lPTl9MT1NUX1NUQVRFID0gMTUsCisgICAgRVJST1JfUkVTT1VSQ0VfQ09OVEVOVElPTiA9IDE2LAorfTsKKworZW51bSBDZG1LZXlUeXBlIDogaW50MzJfdCB7CisgICAgS0VZX1RZUEVfT0ZGTElORSA9IDAsCisgICAgS0VZX1RZUEVfU1RSRUFNSU5HID0gMSwKKyAgICBLRVlfVFlQRV9SRUxFQVNFID0gMiwKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vRGV2aWNlRmlsZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5ODQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0RldmljZUZpbGVzLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKK2NsYXNzIE9mZmxpbmVGaWxlOworY2xhc3MgRGV2aWNlRmlsZXMgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24sCisgICAgICAgIGtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmcsCisgICAgfSBMaWNlbnNlU3RhdGU7CisKKyAgICBEZXZpY2VGaWxlcygpe307CisgICAgdmlydHVhbCB+RGV2aWNlRmlsZXMoKXt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc2V0X2lkLCBMaWNlbnNlU3RhdGUqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKTsKKworICAgIHZpcnR1YWwgYm9vbCBMaWNlbnNlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0TGljZW5zZXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlQWxsTGljZW5zZXMoKTsKKworICBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsCisgICAgICAgICAgICBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0luaXREYXRhUGFyc2VyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Jbml0RGF0YVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2M4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Jbml0RGF0YVBhcnNlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEluaXREYXRhUGFyc2VyIHsKKyAgcHVibGljOgorICAgIEluaXREYXRhUGFyc2VyKCkge30KKworICAgIENkbVJlc3BvbnNlVHlwZSBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RtS2V5VHlwZSBrZXlUeXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpOworCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEluaXREYXRhUGFyc2VyKTsKKworICAgIENkbVJlc3BvbnNlVHlwZSBwYXJzZVBzc2goY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOworCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVSZXF1ZXN0KENkbUtleVR5cGUga2V5VHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Kc29uV2ViS2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4MTU1MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0pzb25XZWJLZXkuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImpzbW4uaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEpzb25XZWJLZXkgeworICBwdWJsaWM6CisgICAgSnNvbldlYktleSgpOworICAgIHZpcnR1YWwgfkpzb25XZWJLZXkoKTsKKworICAgIGJvb2wgZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbldlYktleVNldCwgS2V5TWFwKiBrZXlzKTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPGpzbW50b2tfdD4gbUpzbW5Ub2tlbnM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Kc29uT2JqZWN0czsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVRva2VuczsKKworICAgIGJvb2wgZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGVkVGV4dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRlY29kZWRUZXh0KTsKKyAgICBib29sIGZpbmRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QsIHN0ZDo6c3RyaW5nKiBrZXlJZCwgc3RkOjpzdHJpbmcqIGVuY29kZWRLZXkpOworICAgIHZvaWQgZmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QpIGNvbnN0OworICAgIGJvb2wgcGFyc2VKc29uT2JqZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uT2JqZWN0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHRva2Vucyk7CisgICAgYm9vbCBwYXJzZUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBqc29uT2JqZWN0cyk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSnNvbldlYktleSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01lbW9yeUZpbGVTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQyYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vTWVtb3J5RmlsZVN5c3RlbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBNZW1vcnlGaWxlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlsZU5hbWU7ICAvLyBleGNsdWRlcyBwYXRoCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZTsKKworICAgICAgICBzdGQ6OnN0cmluZyBnZXRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gY29udGVudDsgfQorICAgICAgICBzaXplX3QgZ2V0RmlsZVNpemUoKSBjb25zdCB7IHJldHVybiBmaWxlU2l6ZTsgfQorICAgICAgICB2b2lkIHNldENvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsgY29udGVudCA9IGZpbGU7IH0KKyAgICAgICAgdm9pZCBzZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBmaWxlTmFtZSA9IG5hbWU7IH0KKyAgICAgICAgdm9pZCBzZXRGaWxlU2l6ZShzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgY29udGVudC5yZXNpemUoc2l6ZSk7CisgICAgICAgICAgICBmaWxlU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTWVtb3J5RmlsZVN5c3RlbSgpe307CisgICAgdmlydHVhbCB+TWVtb3J5RmlsZVN5c3RlbSgpe307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgIHByaXZhdGU6CisgICAgLy8gTGljZW5zZSBmaWxlIG5hbWUgaXMgbWFkZSB1cCBvZiBhIHVuaXF1ZSBrZXlTZXRJZCwgdGhlcmVmb3JlLAorICAgIC8vIHRoZSBmaWxlbmFtZSBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IHRvIGxvY2F0ZSBsaWNlbnNlcyBpbiB0aGUKKyAgICAvLyBtZW1vcnkgZmlsZSBzeXN0ZW0uCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtOworCisgICAgc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1lbW9yeUZpbGVTeXN0ZW0pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vTWltZVR5cGVTdGRTdHIuaApzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01pbWVUeXBlU3RkU3RyLmgKaW5kZXggYjA4YTYwNC4uZGVhMjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9NaW1lVHlwZVN0ZFN0ci5oCkBAIC0xMywxNyArMTMsMTUgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjcHJhZ21hIG9uY2UKIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI2luY2x1ZGUgPHN0cmluZz4KIAotLyoqCi0gKiBBdWRpbyBlbmNhcHN1bGF0aW9uIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSBpZiB0aGUgYXVkaW8gZGF0YSBzaG91bGQgYmUgc2VudCB3aXRoIGEgcGFydGljdWxhcgotICogZW5jYXBzdWxhdGlvbiB0eXBlIG9yIG5vdC4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgewotICAgIE5PTkUgICAgID0gMCwKLSAgICBJRUM2MTkzNyA9IDEsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtDZW5jSW5pdERhdGFGb3JtYXQoImNlbmMiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtJc29CbWZmQXVkaW9NaW1lVHlwZSgiYXVkaW8vbXA0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrSXNvQm1mZlZpZGVvTWltZVR5cGUoInZpZGVvL21wNCIpOworY29uc3Qgc3RkOjpzdHJpbmcga1dlYm1Jbml0RGF0YUZvcm1hdCgid2VibSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1dlYm1BdWRpb01pbWVUeXBlKCJhdWRpby93ZWJtIik7Citjb25zdCBzdGQ6OnN0cmluZyBrV2VibVZpZGVvTWltZVR5cGUoInZpZGVvL3dlYm0iKTsKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDRlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9TZXNzaW9uLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIFNlc3Npb24gOiBwdWJsaWMgOjphbmRyb2lkOjpSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKKyAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1Nb2NrRXJyb3IoY2xlYXJrZXlkcm06Ok9LKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KKworICAgIENkbVJlc3BvbnNlVHlwZSBnZXRLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENkbUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3Q7CisKKyAgICBDZG1SZXNwb25zZVR5cGUgcHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSk7CisKKyAgICBDZG1SZXNwb25zZVR5cGUgZGVjcnlwdChjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwgdWludDhfdCogZHN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBjbGVhckRhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBlbmNyeXB0ZWREYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKworICAgIHZvaWQgc2V0TW9ja0Vycm9yKENkbVJlc3BvbnNlVHlwZSBlcnJvcikgeyBtTW9ja0Vycm9yID0gZXJyb3I7IH0KKyAgICBDZG1SZXNwb25zZVR5cGUgZ2V0TW9ja0Vycm9yKCkgY29uc3QgeyByZXR1cm4gbU1vY2tFcnJvcjsgfQorCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKyAgICBLZXlNYXAgbUtleU1hcDsKKyAgICA6OmFuZHJvaWQ6Ok11dGV4IG1NYXBMb2NrOworCisgICAgLy8gRm9yIG1vY2tpbmcgZXJyb3IgcmV0dXJuIHNjZW5hcmlvcworICAgIENkbVJlc3BvbnNlVHlwZSBtTW9ja0Vycm9yOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbkxpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q0YTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbkxpYnJhcnkuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uTGlicmFyeSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIGdldCgpOworCisgICAgOjphbmRyb2lkOjpzcDxTZXNzaW9uPiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IGZpbmRTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKTsKKworICAgIHNpemVfdCBudW1PcGVuU2Vzc2lvbnMoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbnMuc2l6ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2Vzc2lvbkxpYnJhcnkpOworCisgICAgU2Vzc2lvbkxpYnJhcnkoKSA6IG1OZXh0U2Vzc2lvbklkKDEpIHt9CisKKyAgICBzdGF0aWMgOjphbmRyb2lkOjpNdXRleCBzU2luZ2xldG9uTG9jazsKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIHNTaW5nbGV0b247CisKKyAgICA6OmFuZHJvaWQ6Ok11dGV4IG1TZXNzaW9uc0xvY2s7CisgICAgdWludDMyX3QgbU5leHRTZXNzaW9uSWQ7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4+IG1TZXNzaW9uczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90byBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5ODY1NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBjbGVhcmtleWRybTsKKworLy8gbmVlZCB0aGlzIGlmIHdlIGFyZSB1c2luZyBsaWJwcm90b2J1Zi1jcHAtMi4zLjAtbGl0ZQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBMaWNlbnNlIHsKKyAgZW51bSBMaWNlbnNlU3RhdGUgeworICAgIEFDVElWRSA9IDE7CisgICAgUkVMRUFTSU5HID0gMjsKKyAgfQorCisgIG9wdGlvbmFsIExpY2Vuc2VTdGF0ZSBzdGF0ZSA9IDE7CisgIG9wdGlvbmFsIGJ5dGVzIGxpY2Vuc2UgPSAyOworfQorCittZXNzYWdlIE9mZmxpbmVGaWxlIHsKKyAgZW51bSBGaWxlVHlwZSB7CisgICAgTElDRU5TRSA9IDE7CisgIH0KKworICBlbnVtIEZpbGVWZXJzaW9uIHsKKyAgICBWRVJTSU9OXzEgPSAxOworICB9CisKKyAgb3B0aW9uYWwgRmlsZVR5cGUgdHlwZSA9IDE7CisgIG9wdGlvbmFsIEZpbGVWZXJzaW9uIHZlcnNpb24gPSAyIFtkZWZhdWx0ID0gVkVSU0lPTl8xXTsKKyAgb3B0aW9uYWwgTGljZW5zZSBsaWNlbnNlID0gMzsKKworfQorCittZXNzYWdlIEhhc2hlZEZpbGUgeworICBvcHRpb25hbCBieXRlcyBmaWxlID0gMTsKKyAgLy8gQSByYXcgKG5vdCBoZXgtZW5jb2RlZCkgU0hBMjU2LCB0YWtlbiBvdmVyIHRoZSBieXRlcyBvZiAnZmlsZScuCisgIG9wdGlvbmFsIGJ5dGVzIGhhc2ggPSAyOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1QbHVnaW4uY3BwCmluZGV4IDZhYzM1MTAuLjA4OWViMWMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0RybVBsdWdpbi5jcHAKQEAgLTIwNyw2ICsyMDcsNyBAQAogICAgIH0KIAogICAgIGluZm9NYXAuY2xlYXIoKTsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtUGxheVBvbGljeUxvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlQb2xpY3kuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaW5mb01hcC5hZGQobVBsYXlQb2xpY3kua2V5QXQoaSksIG1QbGF5UG9saWN5LnZhbHVlQXQoaSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaAppbmRleCBhYTliNTlkLi45NWYxNWNhIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CiAKLSAgICBhbmRyb2lkOjpNdXRleCBtUGxheVBvbGljeUxvY2s7CisgICAgbXV0YWJsZSBhbmRyb2lkOjpNdXRleCBtUGxheVBvbGljeUxvY2s7CiAgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVBsYXlQb2xpY3k7CiAgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVN0cmluZ1Byb3BlcnRpZXM7CiAgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8U3RyaW5nOCwgVmVjdG9yPHVpbnQ4X3Q+PiBtQnl0ZUFycmF5UHJvcGVydGllczsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCA2YzY4NTMyLi5iODJkOTk2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC05Myw2ICs5MywxMSBAQAogICAgIHNyY3M6IFsicHJvdG9zL0RldmljZUZpbGVzLnByb3RvIl0sCiB9CiAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWhpZGwiLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKK30KKwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiLAogICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKQEAgLTEyNiwzICsxMzEsMzcgQEAKICAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMiXSwKICAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkueG1sIl0sCiB9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJjbGVhcmtleVYxLjRfZnV6emVyIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjbGVhcmtleWhpZGwiLAorICAgICAgICAibGliY2xlYXJrZXljb21tb24iLAorICAgICAgICAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAorICAgICAgICAibGlianNtbiIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IGJjN2MzZjIuLjMyZDc3MjMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAotICAgICpkZWZhdWx0VXJsID0gIiI7CisgICAgKmRlZmF1bHRVcmwgPSAiaHR0cHM6Ly9kZWZhdWx0LnVybCI7CiAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKQEAgLTIyMSw3ICsyMjEsNiBAQAogICAgICAgICBpZiAocmVxdWVzdFN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVtcHR5UmVzcG9uc2U7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXlTZXRJZFN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAogICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgewpAQCAtMzM3LDcgKzMzNiw2IEBACiAgICAgICAgIH0KICAgICAgICAgKmtleVNldElkID0ga0tleVNldElkUHJlZml4ICsgQnl0ZUFycmF5VG9IZXhTdHJpbmcoCiAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpLCByYW5kb21EYXRhLnNpemUoKSk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKICAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQogICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKQEAgLTM5NSw3ICszOTMsNiBAQAogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgewogICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgICAgICAgICAgbUZpbGVIYW5kbGUuRGVsZXRlTGljZW5zZShrZXlTZXRJZCk7CiAgICAgICAgICAgICAgICAgbVNlc3Npb25MaWJyYXJ5LT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00MDQsNyArNDAxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlLApAQCAtNDU5LDcgKzQ1NSw2IEBACiAgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOwogICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKICAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CkBAIC01ODIsNyArNTc3LDYgQEAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OnF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICBxdWVyeUtleVN0YXR1c19jYiBfaGlkbF9jYikgewotCiAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgewogICAgICAgICAvLyBSZXR1cm5zIGVtcHR5IGtleSBzdGF0dXMgS2V5VmFsdWUgcGFpcgogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgaGlkbF92ZWM8S2V5VmFsdWU+KCkpOwpAQCAtNTkyLDEyICs1ODYsMTQgQEAKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcFZlYzsKICAgICBpbmZvTWFwVmVjLmNsZWFyKCk7CiAKKyAgICBtUGxheVBvbGljeUxvY2subG9jaygpOwogICAgIEtleVZhbHVlIGtleVZhbHVlUGFpcjsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7CiAgICAgICAgIGtleVZhbHVlUGFpci5rZXkgPSBtUGxheVBvbGljeVtpXS5rZXk7CiAgICAgICAgIGtleVZhbHVlUGFpci52YWx1ZSA9IG1QbGF5UG9saWN5W2ldLnZhbHVlOwogICAgICAgICBpbmZvTWFwVmVjLnB1c2hfYmFjayhrZXlWYWx1ZVBhaXIpOwogICAgIH0KKyAgICBtUGxheVBvbGljeUxvY2sudW5sb2NrKCk7CiAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdG9IaWRsVmVjKGluZm9NYXBWZWMpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQpAQCAtNzY4LDggKzc2NCw2IEBACiB9CiAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUZpbGVIYW5kbGVMb2NrKTsKLQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlTmFtZXMgPSBtRmlsZUhhbmRsZS5MaXN0TGljZW5zZXMoKTsKICAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4ga2V5U2V0SWRzOwogICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgewpAQCAtNzkwLDcgKzc4NCw2IEBACiAgICAgICAgIHJldHVybiB0b1N0YXR1c18xXzAobU1vY2tFcnJvcik7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgewogICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKICAgICB9CkBAIC03OTksOCArNzkyLDYgQEAKIAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQsCiAgICAgICAgIGdldE9mZmxpbmVMaWNlbnNlU3RhdGVfY2IgX2hpZGxfY2IpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwotCiAgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOwogICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgc3RhdGU7CiAgICAgc3RkOjpzdHJpbmcgbGljZW5zZTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCmluZGV4IGU2MWRiM2YuLjU2OTEwYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApAQCAtMjQsMTMgKzI0LDExIEBACiB9CiAKIGJvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CiAgICAgcmV0dXJuIHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKTsKIH0KIAogc3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzdWx0LT5zZWNvbmQuZ2V0RmlsZVNpemUoKSk7CkBAIC00Miw3ICs0MCw2IEBACiAKIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNZW1vcnlGaWxlU3lzdGVtOjpMaXN0RmlsZXMoKSBjb25zdCB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3Q7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGVuYW1lIDogbU1lbW9yeUZpbGVTeXN0ZW0pIHsKICAgICAgICAgbGlzdC5wdXNoX2JhY2soZmlsZW5hbWUuZmlyc3QpOwogICAgIH0KQEAgLTUxLDcgKzQ4LDYgQEAKIAogc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OlJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBidWZmZXIpIHsKICAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOwogICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOwpAQCAtNjUsNyArNjEsNiBAQAogCiBzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKICAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOwogICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKICAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2Uoa2V5KTsKQEAgLTc1LDcgKzcwLDYgQEAKIH0KIAogYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKICAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CiAgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKHJlc3VsdCk7CkBAIC04Nyw3ICs4MSw2IEBACiB9CiAKIGJvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlQWxsRmlsZXMoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKICAgICBtTWVtb3J5RmlsZVN5c3RlbS5jbGVhcigpOwogICAgIHJldHVybiBtTWVtb3J5RmlsZVN5c3RlbS5lbXB0eSgpOwogfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCmluZGV4IDlhZmQzZDcuLmVjNDUxN2QgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTExLDQgKzExLDQgQEAKICAgICB1c2VyIG1lZGlhCiAgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCmluZGV4IGMxYWJlN2YuLjNiNDhjZjIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMTAsNCArMTAsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCmluZGV4IDFlMGQ0MzEuLjZlNjQ5NzggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTEzLDQgKzEzLDQgQEAKICAgICB1c2VyIG1lZGlhCiAgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLmNsZWFya2V5LnJjCmluZGV4IDgxMzA1MTEuLmUzMDJlMWIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMTEsNCArMTEsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCmluZGV4IDQ2YWJhODguLjg0YTYzYTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTE1LDQgKzE1LDQgQEAKICAgICB1c2VyIG1lZGlhCiAgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnJjCmluZGV4IDgxODY5MzMuLjY0OTU5OWUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMTMsNCArMTMsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvUkVBRE1FLm1kIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDU0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1MiBAQAorIyBGdXp6ZXIgZm9yIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5CisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3NvdXJjZSBjb2RlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIFNlY3VyaXR5IExldmVsIChwYXJhbWV0ZXIgbmFtZTogYHNlY3VyaXR5TGV2ZWxgKQorMi4gTWltZSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYG1pbWVUeXBlYCkKKzMuIEtleSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGtleVR5cGVgKQorNC4gQ3J5cHRvIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgY3J5cHRvTW9kZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgc2VjdXJpdHlMZXZlbGAgfCAwLmBTZWN1cml0eUxldmVsOjpVTktOT1dOYCAxLmBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPYCAyLmBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFYCAzLmBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPYCAgNC5gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERWAgNS5gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTGB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDV8Cit8IGBtaW1lVHlwZWAgfCAwLmB2aWRlby9tcDRgIDEuYHZpZGVvL21wZWdgIDIuYHZpZGVvL3gtZmx2YCAzLmB2aWRlby9tajJgIDQuYHZpZGVvLzNncDJgIDUuYHZpZGVvLzNncHBgIDYuYHZpZGVvLzNncHAyYCA3LmBhdWRpby9tcDRgIDguYGF1ZGlvL21wZWdgIDkuYGF1ZGlvL2FhY2AgMTAuYGF1ZGlvLzNncDJgIDExLmBhdWRpby8zZ3BwYCAxMi5gYXVkaW8vM2dwcDJgIDEzLmBhdWRpby93ZWJtYCAxNC5gdmlkZW8vd2VibWAgMTUuYHdlYm1gIDE2LmBjZW5jYCAxNy5gdmlkZW8vdW5rbm93bmAgMTguYGF1ZGlvL3Vua25vd25gfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byAxOHwKK3wgYGtleVR5cGVgIHwgMC5gS2V5VHlwZTo6T0ZGTElORWAgMS5gS2V5VHlwZTo6U1RSRUFNSU5HYCAyLmBLZXlUeXBlOjpSRUxFQVNFYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDJ8Cit8IGBjcnlwdG9Nb2RlYCB8IDAuYE1vZGU6OlVORU5DUllQVEVEYCAxLmBNb2RlOjpBRVNfQ1RSYCAyLmBNb2RlOjpBRVNfQ0JDX0NUU2AgMy5gTW9kZTo6QUVTX0NCQ2AgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byAzfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgY2xlYXJrZXlWMS40X2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgY2xlYXJrZXlWMS40X2Z1enplcgorYGBgCisjIyMjIFN0ZXBzIHRvIHJ1bgorVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L2NsZWFya2V5VjEuNF9mdXp6ZXIvdmVuZG9yL2h3L2NsZWFya2V5VjEuNF9mdXp6ZXIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvY2xlYXJrZXlWMS40X2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlMGU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNzE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGluY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorI2luY2x1ZGUgPGluY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aW5jbHVkZS9DcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8aW5jbHVkZS9DcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxpbmNsdWRlL0RybVBsdWdpbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OkV2ZW50VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwordXNpbmcgZHJtOjpWMV8wOjpLZXllZFZlY3RvcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwordXNpbmcgZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OklEcm1GYWN0b3J5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6a0FsZ29yaXRobXNLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprQ2xpZW50SWRLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprRGV2aWNlSWRLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprRHJtRXJyb3JUZXN0S2V5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6a0xpc3RlbmVyVGVzdFN1cHBvcnRLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprTWV0cmljc0tleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtQbHVnaW5EZXNjcmlwdGlvbktleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtWZW5kb3JLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprVmVyc2lvbktleTsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBTZXNzaW9uSWQ7Cit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IFNlY3VyZVN0b3BJZDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ludmFsaWRVVUlEW10gPSB7MHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHg1MCwgMHg2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAsIDB4ODAsIDB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwLCAweDYwLCAweDcwLCAweDgwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NsZWFyS2V5VVVJRFtdID0gezB4RTIsIDB4NzEsIDB4OUQsIDB4NTgsIDB4QTksIDB4ODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMywgMHhDOSwgMHg3OCwgMHgxQSwgMHhCMCwgMHgzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEFGLCAweDc4LCAweEQzLCAweDBFfTsKKworY29uc3QgU2VjdXJpdHlMZXZlbCBrU2VjdXJpdHlMZXZlbFtdID0geworICAgIFNlY3VyaXR5TGV2ZWw6OlVOS05PV04sICAgICAgICAgIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8sCisgICAgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERSwgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTywKKyAgICBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFLCBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMfTsKKworY29uc3QgY2hhciAqa01pbWVUeXBlW10gPSB7CisgICAgInZpZGVvL21wNCIsICAidmlkZW8vbXBlZyIsICAidmlkZW8veC1mbHYiLCAgICJ2aWRlby9tajIiLCAgICAidmlkZW8vM2dwMiIsCisgICAgInZpZGVvLzNncHAiLCAidmlkZW8vM2dwcDIiLCAiYXVkaW8vbXA0IiwgICAgICJhdWRpby9tcGVnIiwgICAiYXVkaW8vYWFjIiwKKyAgICAiYXVkaW8vM2dwMiIsICJhdWRpby8zZ3BwIiwgICJhdWRpby8zZ3BwMiIsICAgImF1ZGlvL3dlYm0iLCAgICJ2aWRlby93ZWJtIiwKKyAgICAid2VibSIsICAgICAgICJjZW5jIiwgICAgICAgICJ2aWRlby91bmtub3duIiwgImF1ZGlvL3Vua25vd24ifTsKKworY29uc3QgY2hhciAqa0NpcGhlckFsZ29yaXRobVtdID0geyJBRVMvQ0JDL05vUGFkZGluZyIsICIifTsKKworY29uc3QgY2hhciAqa01hY0FsZ29yaXRobVtdID0geyJIbWFjU0hBMjU2IiwgIiJ9OworCitjb25zdCBjaGFyICprUlNBQWxnb3JpdGhtW10gPSB7IlJTQVNTQS1QU1MtU0hBMSIsICIifTsKKworY29uc3Qgc3RkOjpzdHJpbmcga1Byb3BlcnR5W10gPSB7a1ZlbmRvcktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWZXJzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BsdWdpbkRlc2NyaXB0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0FsZ29yaXRobXNLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEcm1FcnJvclRlc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGV2aWNlSWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50SWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWV0cmljc0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciJ9OworCitjb25zdCBLZXlUeXBlIGtLZXlUeXBlW10gPSB7S2V5VHlwZTo6T0ZGTElORSwgS2V5VHlwZTo6U1RSRUFNSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVR5cGU6OlJFTEVBU0V9OworCitjb25zdCBNb2RlIGtDcnlwdG9Nb2RlW10gPSB7TW9kZTo6VU5FTkNSWVBURUQsIE1vZGU6OkFFU19DVFIsIE1vZGU6OkFFU19DQkNfQ1RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGU6OkFFU19DQkN9OworCitjb25zdCBoaWRsX3ZlYzx1aW50OF90PiB2YWxpZEluaXREYXRhID0geworICAgIC8vIEJNRkYgYm94IGhlYWRlciAoNCBieXRlcyBzaXplICsgJ3Bzc2gnKQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4NzAsIDB4NzMsIDB4NzMsIDB4NjgsCisgICAgLy8gZnVsbCBib3ggaGVhZGVyICh2ZXJzaW9uID0gMSBmbGFncyA9IDApCisgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAvLyBzeXN0ZW0gaWQKKyAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAweGFjLCAweGUzLCAweDNjLCAweDFlLAorICAgIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgLy8gbnVtYmVyIG9mIGtleSBpZHMKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLAorICAgIC8vIGtleSBpZAorICAgIDB4NjAsIDB4MDYsIDB4MWUsIDB4MDEsIDB4N2UsIDB4NDcsIDB4N2UsIDB4ODcsIDB4N2UsIDB4NTcsIDB4ZDAsIDB4MGQsCisgICAgMHgxZSwgMHhkMCwgMHgwZCwgMHgxZSwKKyAgICAvLyBzaXplIG9mIGRhdGEsIG11c3QgYmUgemVybworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCitjb25zdCBoaWRsX3ZlYzx1aW50OF90PiB2YWxpZEtleVJlc3BvbnNlID0geworICAgIDB4N2IsIDB4MjIsIDB4NmIsIDB4NjUsIDB4NzksIDB4NzMsIDB4MjIsIDB4M2EsIDB4NWIsIDB4N2IsIDB4MjIsCisgICAgMHg2YiwgMHg3NCwgMHg3OSwgMHgyMiwgMHgzYSwgMHgyMiwgMHg2ZiwgMHg2MywgMHg3NCwgMHgyMiwgMHgyYywKKyAgICAweDIyLCAweDZiLCAweDY5LCAweDY0LCAweDIyLCAweDNhLCAweDIyLCAweDU5LCAweDQxLCAweDU5LCAweDY1LAorICAgIDB4NDEsIDB4NTgsIDB4MzUsIDB4NDgsIDB4NjYsIDB4NmYsIDB4NjQsIDB4MmQsIDB4NTYsIDB4MzksIDB4NDEsCisgICAgMHg0ZSwgMHg0OCwgMHg3NCwgMHg0MSwgMHg0ZSwgMHg0OCwgMHg2NywgMHgyMiwgMHgyYywgMHgyMiwgMHg2YiwKKyAgICAweDIyLCAweDNhLCAweDIyLCAweDQ3LCAweDZmLCAweDZmLCAweDY3LCAweDZjLCAweDY1LCAweDU0LCAweDY1LAorICAgIDB4NzMsIDB4NzQsIDB4NGIsIDB4NjUsIDB4NzksIDB4NDIsIDB4NjEsIDB4NzMsIDB4NjUsIDB4MzYsIDB4MzQsCisgICAgMHg2NywgMHg2NywgMHg2NywgMHgyMiwgMHg3ZCwgMHg1ZCwgMHg3ZCwgMHgwYX07CisKK2NvbnN0IHNpemVfdCBrQUVTQmxvY2tTaXplID0gMTY7Citjb25zdCBzaXplX3Qga01heFN0cmluZ0xlbmd0aCA9IDEwMDsKK2NvbnN0IHNpemVfdCBrTWF4U3ViU2FtcGxlcyA9IDEwOworY29uc3Qgc2l6ZV90IGtNYXhOdW1CeXRlcyA9IDEwMDA7Citjb25zdCBzaXplX3Qga1NlZ21lbnRJbmRleCA9IDA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3Qgc2l6ZT4KK1QgZ2V0VmFsdWVGcm9tQXJyYXkoRnV6emVkRGF0YVByb3ZpZGVyICpmZHAsIGNvbnN0IFQgKCZhcnIpW3NpemVdKSB7CisgIHJldHVybiBhcnJbZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KDAsIHNpemUgLSAxKV07Cit9CisKK2NsYXNzIFRlc3REcm1QbHVnaW5MaXN0ZW5lciA6IHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgeworcHVibGljOgorICBUZXN0RHJtUGx1Z2luTGlzdGVuZXIoKSB7fQorICB2aXJ0dWFsIH5UZXN0RHJtUGx1Z2luTGlzdGVuZXIoKSB7fQorCisgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudChFdmVudFR5cGUgLypldmVudFR5cGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYgLypkYXRhKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7CisgIH0KKworICB2aXJ0dWFsIFJldHVybjx2b2lkPgorICBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmIC8qc2Vzc2lvbklkKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypleHBpcnlUaW1lSW5NUyovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJldHVybjx2b2lkPigpOworICB9CisKKyAgdmlydHVhbCBSZXR1cm48dm9pZD4KKyAgc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiAvKnNlc3Npb25JZCovLAorICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+ICYgLyprZXlTdGF0dXNMaXN0Ki8sCisgICAgICAgICAgICAgICAgIGJvb2wgLypoYXNOZXdVc2FibGVLZXkqLykgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKKyAgfQorfTsKKworY2xhc3MgQ2xlYXJLZXlGdXp6ZXIgeworcHVibGljOgorICB+Q2xlYXJLZXlGdXp6ZXIoKSB7IGRlSW5pdCgpOyB9CisgIGJvb2wgaW5pdCgpOworICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitwcml2YXRlOgorICB2b2lkIGRlSW5pdCgpOworICB2b2lkIGludm9rZURybVBsdWdpbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgaW52b2tlQ3J5cHRvUGx1Z2luKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICB2b2lkIGludm9rZURybShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgaW52b2tlQ3J5cHRvKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICB2b2lkIGludm9rZURybURlY3J5cHRFbmNyeXB0QVBJKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgYm9vbCBpbnZva2VEcm1GYWN0b3J5KCk7CisgIGJvb2wgaW52b2tlQ3J5cHRvRmFjdG9yeSgpOworICB2b2lkIGludm9rZURybVYxXzRBUEkoKTsKKyAgdm9pZCBpbnZva2VEcm1TZXRBbGdvcml0aG1BUEkoKTsKKyAgdm9pZCBpbnZva2VEcm1Qcm9wZXJ0eUFQSSgpOworICB2b2lkIGludm9rZURybVNlY3VyZVN0b3BBUEkoKTsKKyAgdm9pZCBpbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIFNlc3Npb25JZCBnZXRTZXNzaW9uSWQoKTsKKyAgU2VjdXJlU3RvcFJlbGVhc2UgbWFrZVNlY3VyZVJlbGVhc2UoY29uc3QgU2VjdXJlU3RvcCAmc3RvcCk7CisgIHNwPElEcm1GYWN0b3J5PiBtRHJtRmFjdG9yeSA9IG51bGxwdHI7CisgIHNwPElDcnlwdG9GYWN0b3J5PiBtQ3J5cHRvRmFjdG9yeSA9IG51bGxwdHI7CisgIHNwPElEcm1QbHVnaW4+IG1Ecm1QbHVnaW4gPSBudWxscHRyOworICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1Ecm1QbHVnaW5WMV8xID0gbnVsbHB0cjsKKyAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtRHJtUGx1Z2luVjFfMiA9IG51bGxwdHI7CisgIHNwPGRybTo6VjFfNDo6SURybVBsdWdpbj4gbURybVBsdWdpblYxXzQgPSBudWxscHRyOworICBzcDxkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW4+IG1DcnlwdG9QbHVnaW5WMV80ID0gbnVsbHB0cjsKKyAgc3A8SUNyeXB0b1BsdWdpbj4gbUNyeXB0b1BsdWdpbiA9IG51bGxwdHI7CisgIEZ1enplZERhdGFQcm92aWRlciAqbUZEUCA9IG51bGxwdHI7CisgIFNlc3Npb25JZCBtU2Vzc2lvbklkID0ge307CisgIFNlc3Npb25JZCBtU2Vzc2lvbklkVjEgPSB7fTsKK307CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6OmRlSW5pdCgpIHsKKyAgaWYgKG1Ecm1QbHVnaW5WMV8xKSB7CisgICAgbURybVBsdWdpblYxXzEtPmNsb3NlU2Vzc2lvbihtU2Vzc2lvbklkVjEpOworICB9CisgIGlmIChtRHJtUGx1Z2luVjFfMikgeworICAgIG1Ecm1QbHVnaW5WMV8yLT5jbG9zZVNlc3Npb24obVNlc3Npb25JZCk7CisgIH0KKyAgbURybUZhY3RvcnkuY2xlYXIoKTsKKyAgbUNyeXB0b0ZhY3RvcnkuY2xlYXIoKTsKKyAgbURybVBsdWdpbi5jbGVhcigpOworICBtRHJtUGx1Z2luVjFfMS5jbGVhcigpOworICBtRHJtUGx1Z2luVjFfMi5jbGVhcigpOworICBtRHJtUGx1Z2luVjFfNC5jbGVhcigpOworICBtQ3J5cHRvUGx1Z2luLmNsZWFyKCk7CisgIG1DcnlwdG9QbHVnaW5WMV80LmNsZWFyKCk7CisgIG1TZXNzaW9uSWQgPSB7fTsKKyAgbVNlc3Npb25JZFYxID0ge307Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybVYxXzRBUEkoKSB7CisgIG1Ecm1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga01pbWVUeXBlKSk7CisgIG1Ecm1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXIoCisgICAgICBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpLAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1NlY3VyaXR5TGV2ZWwpKTsKKyAgbURybVBsdWdpblYxXzQtPnNldFBsYXliYWNrSWQoCisgICAgICBtU2Vzc2lvbklkLCBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkpOworICBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmdldExvZ01lc3NhZ2VzX2NiIGNiID0KKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfNDo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGhpZGxfdmVjPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gbG9ncykge307CisgIG1Ecm1QbHVnaW5WMV80LT5nZXRMb2dNZXNzYWdlcyhjYik7Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybVNldEFsZ29yaXRobUFQSSgpIHsKKyAgY29uc3QgaGlkbF9zdHJpbmcgY2lwaGVyQWxnbyA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgPyBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkKKyAgICAgICAgICA6IGhpZGxfc3RyaW5nKGtDaXBoZXJBbGdvcml0aG1bbUZEUC0+Q29uc3VtZUJvb2woKV0pOworICBtRHJtUGx1Z2luVjFfMi0+c2V0Q2lwaGVyQWxnb3JpdGhtKG1TZXNzaW9uSWQsIGNpcGhlckFsZ28pOworCisgIGNvbnN0IGhpZGxfc3RyaW5nIG1hY0FsZ28gPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKQorICAgICAgICAgID8gbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpCisgICAgICAgICAgOiBoaWRsX3N0cmluZyhrTWFjQWxnb3JpdGhtW21GRFAtPkNvbnN1bWVCb29sKCldKTsKKyAgbURybVBsdWdpblYxXzItPnNldE1hY0FsZ29yaXRobShtU2Vzc2lvbklkLCBtYWNBbGdvKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtUHJvcGVydHlBUEkoKSB7CisgIG1Ecm1QbHVnaW5WMV8yLT5zZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgIGhpZGxfc3RyaW5nKGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtQcm9wZXJ0eSkpLCBoaWRsX3N0cmluZygidmFsdWUiKSk7CisKKyAgaGlkbF9zdHJpbmcgc3RyaW5nVmFsdWU7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgIGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtQcm9wZXJ0eSksCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcgJmhWYWx1ZSkgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBzdHJpbmdWYWx1ZSA9IGhWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gdmFsdWUgPSB7fTsKKyAgbURybVBsdWdpblYxXzItPnNldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgaGlkbF9zdHJpbmcoZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1Byb3BlcnR5KSksIHZhbHVlKTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBieXRlVmFsdWU7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgIGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtQcm9wZXJ0eSksCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmhWYWx1ZSkgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBieXRlVmFsdWUgPSBoVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0pOworfQorCitTZXNzaW9uSWQgQ2xlYXJLZXlGdXp6ZXI6OmdldFNlc3Npb25JZCgpIHsKKyAgU2Vzc2lvbklkIGVtcHR5U2Vzc2lvbklkID0ge307CisgIHJldHVybiBtRkRQLT5Db25zdW1lQm9vbCgpID8gbVNlc3Npb25JZCA6IGVtcHR5U2Vzc2lvbklkOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VEcm1EZWNyeXB0RW5jcnlwdEFQSShjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgdWludDMyX3QgY3VyclNlc3Npb25zLCBtYXhpbXVtU2Vzc2lvbnM7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXROdW1iZXJPZlNlc3Npb25zKAorICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhDdXJyZW50U2Vzc2lvbnMsIHVpbnQzMl90IGhNYXhTZXNzaW9ucykgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBjdXJyU2Vzc2lvbnMgPSBoQ3VycmVudFNlc3Npb25zOworICAgICAgICAgIG1heGltdW1TZXNzaW9ucyA9IGhNYXhTZXNzaW9uczsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgSGRjcExldmVsIGNvbm5lY3RlZCwgbWF4aW11bTsKKyAgbURybVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHMoWyZdKFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZGNwTGV2ZWwgJmhDb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhkY3BMZXZlbCAmaE1heExldmVsKSB7CisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICBjb25uZWN0ZWQgPSBoQ29ubmVjdGVkTGV2ZWw7CisgICAgICBtYXhpbXVtID0gaE1heExldmVsOworICAgIH0KKyAgfSk7CisKKyAgZHJtOjpWMV8yOjpIZGNwTGV2ZWwgY29ubmVjdGVkVjFfMiwgbWF4aW11bVYxXzI7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRIZGNwTGV2ZWxzXzFfMigKKyAgICAgIFsmXShkcm06OlYxXzI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IGRybTo6VjFfMjo6SGRjcExldmVsICZjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICBjb25zdCBkcm06OlYxXzI6OkhkY3BMZXZlbCAmbWF4TGV2ZWwpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBkcm06OlYxXzI6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICBjb25uZWN0ZWRWMV8yID0gY29ubmVjdGVkTGV2ZWw7CisgICAgICAgICAgbWF4aW11bVYxXzIgPSBtYXhMZXZlbDsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsOworICBtRHJtUGx1Z2luVjFfMi0+Z2V0U2VjdXJpdHlMZXZlbChtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgU2VjdXJpdHlMZXZlbCBoTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5TGV2ZWwgPSBoTGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gbWV0cmljczsKKyAgbURybVBsdWdpblYxXzItPmdldE1ldHJpY3MoCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IGhNZXRyaWNHcm91cHMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgbWV0cmljcyA9IGhNZXRyaWNHcm91cHM7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIGhpZGxfc3RyaW5nIGNlcnRpZmljYXRlVHlwZTsKKyAgaGlkbF9zdHJpbmcgY2VydGlmaWNhdGVBdXRob3JpdHk7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0KGNlcnRpZmljYXRlVHlwZSwgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcgJikge30pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgIGNlcnRpZmljYXRlVHlwZSwgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBkcm06OlYxXzI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcgJikge30pOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IHJlc3BvbnNlOworICBtRHJtUGx1Z2luVjFfMi0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKAorICAgICAgcmVzcG9uc2UsIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYpIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBpbml0RGF0YSA9IHt9OworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIGluaXREYXRhID0gdmFsaWRJbml0RGF0YTsKKyAgfSBlbHNlIHsKKyAgICBpbml0RGF0YS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwga0FFU0Jsb2NrU2l6ZSk7CisgIH0KKyAgaGlkbF9zdHJpbmcgbWltZVR5cGUgPSBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpOworICBLZXlUeXBlIGtleVR5cGUgPSBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PEtleVR5cGU+KG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtLZXlUeXBlKTsKKyAgS2V5ZWRWZWN0b3Igb3B0aW9uYWxQYXJhbWV0ZXJzOworICBtRHJtUGx1Z2luVjFfMi0+Z2V0S2V5UmVxdWVzdF8xXzIoCisgICAgICBtU2Vzc2lvbklkLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfMjo6U3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisgIG1Ecm1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICAgIG1TZXNzaW9uSWRWMSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBkcm06OlYxXzA6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSwgY29uc3QgaGlkbF9zdHJpbmcgJikge30pOworICBoaWRsX3ZlYzx1aW50OF90PiBlbXB0eUluaXREYXRhID0ge307CisgIG1Ecm1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICBtU2Vzc2lvbklkLCBtRkRQLT5Db25zdW1lQm9vbCgpID8gaW5pdERhdGEgOiBlbXB0eUluaXREYXRhLCBtaW1lVHlwZSwKKyAgICAgIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4ga2V5UmVzcG9uc2UgPSB7fTsKKyAgaWYgKG1GRFAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICBrZXlSZXNwb25zZSA9IHZhbGlkS2V5UmVzcG9uc2U7CisgIH0gZWxzZSB7CisgICAga2V5UmVzcG9uc2Uuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICB9CisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGtleVNldElkOworICBoaWRsX3ZlYzx1aW50OF90PiBlbXB0eUtleVJlc3BvbnNlID0ge307CisgIG1Ecm1QbHVnaW5WMV8yLT5wcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICBnZXRTZXNzaW9uSWQoKSwgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtleVJlc3BvbnNlIDogZW1wdHlLZXlSZXNwb25zZSwKKyAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmaEtleVNldElkKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGtleVNldElkID0gaEtleVNldElkOworICAgICAgICB9CisgICAgICB9KTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVzdG9yZUtleXMoZ2V0U2Vzc2lvbklkKCksIGtleVNldElkKTsKKworICBtRHJtUGx1Z2luVjFfMi0+cXVlcnlLZXlTdGF0dXMoCisgICAgICBnZXRTZXNzaW9uSWQoKSwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIEtleWVkVmVjdG9yIC8qIGluZm8gKi8pIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBrZXlJZCwgaW5wdXQsIGl2OworICBrZXlJZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwgc2l6ZSk7CisgIGlucHV0LnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgaXYuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICBtRHJtUGx1Z2luVjFfMi0+ZW5jcnlwdCgKKyAgICAgIGdldFNlc3Npb25JZCgpLCBrZXlJZCwgaW5wdXQsIGl2LAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJikge30pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5kZWNyeXB0KAorICAgICAgZ2V0U2Vzc2lvbklkKCksIGtleUlkLCBpbnB1dCwgaXYsCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwgc2l6ZSk7CisgIG1Ecm1QbHVnaW5WMV8yLT5zaWduKAorICAgICAgZ2V0U2Vzc2lvbklkKCksIGtleUlkLCBtZXNzYWdlLAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJikge30pOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IHNpZ25hdHVyZTsKKyAgc2lnbmF0dXJlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgbURybVBsdWdpblYxXzItPnZlcmlmeShnZXRTZXNzaW9uSWQoKSwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBib29sKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gd3JhcHBlZEtleTsKKyAgc2lnbmF0dXJlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgbURybVBsdWdpblYxXzItPnNpZ25SU0EoCisgICAgICBnZXRTZXNzaW9uSWQoKSwga1JTQUFsZ29yaXRobVttRkRQLT5Db25zdW1lQm9vbCgpXSwgbWVzc2FnZSwgd3JhcHBlZEtleSwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYpIHt9KTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVtb3ZlS2V5cyhnZXRTZXNzaW9uSWQoKSk7Cit9CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHNlY3VyZSByZWxlYXNlIG1lc3NhZ2UgZm9yCisgKiBhIHNlY3VyZSBzdG9wLiBUaGUgY2xlYXJrZXkgc2VjdXJlIHN0b3AgcmVsZWFzZSBmb3JtYXQKKyAqIGlzIGp1c3QgYSBjb3VudCBmb2xsb3dlZCBieSB0aGUgc2VjdXJlIHN0b3Agb3BhcXVlIGRhdGEuCisgKi8KK1NlY3VyZVN0b3BSZWxlYXNlIENsZWFyS2V5RnV6emVyOjptYWtlU2VjdXJlUmVsZWFzZShjb25zdCBTZWN1cmVTdG9wICZzdG9wKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3BEYXRhID0gc3RvcC5vcGFxdWVEYXRhOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisgIHN0ZDo6c3RyaW5nIGNvdW50ID0gIjAwMDEiOworCisgIGF1dG8gaXQgPSBidWZmZXIuaW5zZXJ0KGJ1ZmZlci5iZWdpbigpLCBjb3VudC5iZWdpbigpLCBjb3VudC5lbmQoKSk7CisgIGJ1ZmZlci5pbnNlcnQoaXQgKyBjb3VudC5zaXplKCksIHN0b3BEYXRhLmJlZ2luKCksIHN0b3BEYXRhLmVuZCgpKTsKKyAgU2VjdXJlU3RvcFJlbGVhc2UgcmVsZWFzZSA9IHsub3BhcXVlRGF0YSA9IGhpZGxfdmVjPHVpbnQ4X3Q+KGJ1ZmZlcil9OworICByZXR1cm4gcmVsZWFzZTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpIHsKKyAgU2VjdXJlU3RvcElkIHNzaWQ7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRTZWN1cmVTdG9wKAorICAgICAgc3NpZCwgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgU2VjdXJlU3RvcCAmKSB7fSk7CisKKyAgbURybVBsdWdpblYxXzItPmdldFNlY3VyZVN0b3BJZHMoCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLAorICAgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiAmc2VjdXJlU3RvcElkcykge30pOworCisgIFNlY3VyZVN0b3BSZWxlYXNlIHJlbGVhc2U7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRTZWN1cmVTdG9wcygKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3A+ICZzdG9wcykgeworICAgICAgICBpZiAoc3RvcHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgIHJlbGVhc2UgPSBtYWtlU2VjdXJlUmVsZWFzZSgKKyAgICAgICAgICAgICAgc3RvcHNbbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHN0b3BzLnNpemUoKSAtIDEpXSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZWxlYXNlU2VjdXJlU3RvcHMocmVsZWFzZSk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbW92ZVNlY3VyZVN0b3Aoc3NpZCk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbGVhc2VTZWN1cmVTdG9wKHNzaWQpOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtT2ZmbGluZUxpY2Vuc2VBUEkoY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGhpZGxfdmVjPEtleVNldElkPiBrZXlTZXRJZHMgPSB7fTsKKyAgbURybVBsdWdpblYxXzItPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKAorICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiAmaEtleVNldElkcykgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBrZXlTZXRJZHMgPSBoS2V5U2V0SWRzOworICAgICAgICB9CisgICAgICB9KTsKKworICBPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZTsKKyAgS2V5U2V0SWQga2V5U2V0SWQgPSB7fTsKKyAgaWYgKGtleVNldElkcy5zaXplKCkgPiAwKSB7CisgICAga2V5U2V0SWQgPSBrZXlTZXRJZHNbbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAwLCBrZXlTZXRJZHMuc2l6ZSgpIC0gMSldOworICB9IGVsc2UgeworICAgIGtleVNldElkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgfQorICBtRHJtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgIGtleVNldElkLCBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGxpY2Vuc2VTdGF0ZSA9IGhMaWNlbnNlU3RhdGU7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybVBsdWdpbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBTZWN1cml0eUxldmVsIHNlY0xldmVsID0KKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCkKKyAgICAgICAgICA/IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtTZWN1cml0eUxldmVsKQorICAgICAgICAgIDogc3RhdGljX2Nhc3Q8U2VjdXJpdHlMZXZlbD4obUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKKyAgbURybVBsdWdpblYxXzEtPm9wZW5TZXNzaW9uXzFfMSgKKyAgICAgIHNlY0xldmVsLCBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBTZXNzaW9uSWQgJmlkKSB7CisgICAgICAgIG1TZXNzaW9uSWRWMSA9IGlkOworICAgICAgfSk7CisgIG1Ecm1QbHVnaW5WMV8yLT5vcGVuU2Vzc2lvbihbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlc3Npb25JZCAmaWQpIHsgbVNlc3Npb25JZCA9IGlkOyB9KTsKKworICBzcDxUZXN0RHJtUGx1Z2luTGlzdGVuZXI+IGxpc3RlbmVyID0gbmV3IFRlc3REcm1QbHVnaW5MaXN0ZW5lcigpOworICBtRHJtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3QgPSB7CisgICAgICB7ezF9LCBLZXlTdGF0dXNUeXBlOjpVU0FCTEV9LAorICAgICAge3syfSwgS2V5U3RhdHVzVHlwZTo6RVhQSVJFRH0sCisgICAgICB7ezN9LCBLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEfSwKKyAgICAgIHt7NH0sIEtleVN0YXR1c1R5cGU6OlNUQVRVU1BFTkRJTkd9LAorICAgICAge3s1fSwgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUn0sCisgIH07CisgIG1Ecm1QbHVnaW5WMV8yLT5zZW5kS2V5c0NoYW5nZShtU2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCB0cnVlKTsKKworICBpbnZva2VEcm1WMV80QVBJKCk7CisgIGludm9rZURybVNldEFsZ29yaXRobUFQSSgpOworICBpbnZva2VEcm1Qcm9wZXJ0eUFQSSgpOworICBpbnZva2VEcm1EZWNyeXB0RW5jcnlwdEFQSShkYXRhLCBzaXplKTsKKyAgaW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpOworICBpbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSShkYXRhLCBzaXplKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlQ3J5cHRvUGx1Z2luKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgbUNyeXB0b1BsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga01pbWVUeXBlKSk7CisKKyAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgbUNyeXB0b1BsdWdpbi0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICBtQ3J5cHRvUGx1Z2luLT5zZXRNZWRpYURybVNlc3Npb24obVNlc3Npb25JZCk7CisKKyAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgIGNvbnN0IHNpemVfdCBudW1TdWJTYW1wbGVzID0KKyAgICAgIG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigxLCBrTWF4U3ViU2FtcGxlcyk7CisKKyAgY29uc3QgUGF0dGVybiBwYXR0ZXJuID0gezAsIDB9OworICBoaWRsX3ZlYzxTdWJTYW1wbGU+IHN1YlNhbXBsZXM7CisgIHN1YlNhbXBsZXMucmVzaXplKG51bVN1YlNhbXBsZXMpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgY2xlYXJCeXRlcyA9CisgICAgICAgIG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIGtNYXhOdW1CeXRlcyk7CisgICAgY29uc3QgdWludDMyX3QgZW5jcnlwdGVkQnl0ZXMgPQorICAgICAgICBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBrTWF4TnVtQnl0ZXMpOworICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGNsZWFyQnl0ZXM7CisgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGVuY3J5cHRlZEJ5dGVzOworICAgIHRvdGFsU2l6ZSArPSBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgdG90YWxTaXplICs9IHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgIH0KKworICAvLyBUaGUgZmlyc3QgdG90YWxTaXplIGJ5dGVzIG9mIHNoYXJlZCBtZW1vcnkgaXMgdGhlIGVuY3J5cHRlZAorICAvLyBpbnB1dCwgdGhlIHNlY29uZCB0b3RhbFNpemUgYnl0ZXMgaXMgdGhlIGRlY3J5cHRlZCBvdXRwdXQuCisgIHNpemVfdCBtZW1vcnlCeXRlcyA9IHRvdGFsU2l6ZSAqIDI7CisKKyAgc3A8SUFsbG9jYXRvcj4gYXNobWVtQWxsb2NhdG9yID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgIGlmICghYXNobWVtQWxsb2NhdG9yLmdldCgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaGlkbF9tZW1vcnkgaGlkbE1lbW9yeTsKKyAgYXNobWVtQWxsb2NhdG9yLT5hbGxvY2F0ZShtZW1vcnlCeXRlcywgWyZdKFtbbWF5YmVfdW51c2VkXV0gYm9vbCBzdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9tZW1vcnkgJm1lbW9yeSkgeworICAgIG1DcnlwdG9QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtb3J5LCBrU2VnbWVudEluZGV4KTsKKyAgICBoaWRsTWVtb3J5ID0gbWVtb3J5OworICB9KTsKKworICBzcDxJTWVtb3J5PiBtYXBwZWRNZW1vcnkgPSBtYXBNZW1vcnkoaGlkbE1lbW9yeSk7CisgIGlmICghbWFwcGVkTWVtb3J5LmdldCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIG1DcnlwdG9QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UoaGlkbE1lbW9yeSwga1NlZ21lbnRJbmRleCk7CisKKyAgdWludDMyX3Qgc3JjQnVmZmVySWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtTZWdtZW50SW5kZXggOiBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGNvbnN0IFNoYXJlZEJ1ZmZlciBzb3VyY2VCdWZmZXIgPSB7CisgICAgICAuYnVmZmVySWQgPSBzcmNCdWZmZXJJZCwgLm9mZnNldCA9IDAsIC5zaXplID0gdG90YWxTaXplfTsKKworICBCdWZmZXJUeXBlIHR5cGUgPSBtRkRQLT5Db25zdW1lQm9vbCgpID8gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgdWludDMyX3QgZGVzdEJ1ZmZlcklkID0KKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCkgPyBrU2VnbWVudEluZGV4IDogbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0QnVmZmVyID0geworICAgICAgLnR5cGUgPSB0eXBlLAorICAgICAgey5idWZmZXJJZCA9IGRlc3RCdWZmZXJJZCwgLm9mZnNldCA9IHRvdGFsU2l6ZSwgLnNpemUgPSB0b3RhbFNpemV9LAorICAgICAgLnNlY3VyZU1lbW9yeSA9IG51bGxwdHJ9OworCisgIGNvbnN0IHVpbnQ2NF90IG9mZnNldCA9IDA7CisgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CisgIGhpZGxfYXJyYXk8dWludDhfdCwga0FFU0Jsb2NrU2l6ZT4ga2V5SWQgPQorICAgICAgaGlkbF9hcnJheTx1aW50OF90LCBrQUVTQmxvY2tTaXplPihkYXRhKTsKKyAgaGlkbF9hcnJheTx1aW50OF90LCBrQUVTQmxvY2tTaXplPiBpdiA9CisgICAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIGtBRVNCbG9ja1NpemU+KGRhdGEpOworICBNb2RlIG1vZGUgPSBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrQ3J5cHRvTW9kZSk7CisgIG1DcnlwdG9QbHVnaW4tPmRlY3J5cHQoCisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpLCBrZXlJZCwgaXYsIG1vZGUsIHBhdHRlcm4sIHN1YlNhbXBsZXMsIHNvdXJjZUJ1ZmZlciwKKyAgICAgIG9mZnNldCwgZGVzdEJ1ZmZlciwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gc3RyaW5nIGRldGFpbGVkRXJyb3IpIHsgYnl0ZXNXcml0dGVuID0gY291bnQ7IH0pOworICBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmdldExvZ01lc3NhZ2VzX2NiIGNiID0KKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfNDo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGhpZGxfdmVjPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gbG9ncykge307CisgIG1DcnlwdG9QbHVnaW5WMV80LT5nZXRMb2dNZXNzYWdlcyhjYik7Cit9CisKK2Jvb2wgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybUZhY3RvcnkoKSB7CisgIGhpZGxfc3RyaW5nIHBhY2thZ2VOYW1lKAorICAgICAgbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpKTsKKyAgaGlkbF9zdHJpbmcgbWltZVR5cGUoZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga01pbWVUeXBlKSk7CisgIFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgPyBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrU2VjdXJpdHlMZXZlbCkKKyAgICAgICAgICA6IHN0YXRpY19jYXN0PFNlY3VyaXR5TGV2ZWw+KG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CisgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHV1aWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtDbGVhcktleVVVSUQgOiBrSW52YWxpZFVVSUQ7CisgIG1Ecm1GYWN0b3J5LT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwgbWltZVR5cGUsIHNlY3VyaXR5TGV2ZWwpOworICBtRHJtRmFjdG9yeS0+Y3JlYXRlUGx1Z2luKAorICAgICAgdXVpZCwgcGFja2FnZU5hbWUsIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDxJRHJtUGx1Z2luPiAmcGx1Z2luKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIG1Ecm1QbHVnaW4gPSBwbHVnaW4uZ2V0KCk7CisgICAgICAgICAgbURybVBsdWdpblYxXzEgPSBkcm06OlYxXzE6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1Ecm1QbHVnaW4pOworICAgICAgICAgIG1Ecm1QbHVnaW5WMV8yID0gZHJtOjpWMV8yOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtRHJtUGx1Z2luKTsKKyAgICAgICAgICBtRHJtUGx1Z2luVjFfNCA9IGRybTo6VjFfNDo6SURybVBsdWdpbjo6Y2FzdEZyb20obURybVBsdWdpbik7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIHN0ZDo6dmVjdG9yPGhpZGxfYXJyYXk8dWludDhfdCwgMTY+PiBzdXBwb3J0ZWRTY2hlbWVzOworICBtRHJtRmFjdG9yeS0+Z2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcygKKyAgICAgIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX2FycmF5PHVpbnQ4X3QsIDE2Pj4gJnNjaGVtZXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzY2hlbWUgOiBzY2hlbWVzKSB7CisgICAgICAgICAgc3VwcG9ydGVkU2NoZW1lcy5wdXNoX2JhY2soc2NoZW1lKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaWYgKCEobURybVBsdWdpbiAmJiBtRHJtUGx1Z2luVjFfMSAmJiBtRHJtUGx1Z2luVjFfMiAmJiBtRHJtUGx1Z2luVjFfNCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZUNyeXB0b0ZhY3RvcnkoKSB7CisgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHV1aWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtDbGVhcktleVVVSUQgOiBrSW52YWxpZFVVSUQ7CisgIG1DcnlwdG9GYWN0b3J5LT5jcmVhdGVQbHVnaW4oCisgICAgICB1dWlkLCBtU2Vzc2lvbklkLCBbdGhpc10oU3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8SUNyeXB0b1BsdWdpbj4gJnBsdWdpbikgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBtQ3J5cHRvUGx1Z2luID0gcGx1Z2luOworICAgICAgICAgIG1DcnlwdG9QbHVnaW5WMV80ID0gZHJtOjpWMV80OjpJQ3J5cHRvUGx1Z2luOjpjYXN0RnJvbShtQ3J5cHRvUGx1Z2luKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaWYgKCFtQ3J5cHRvUGx1Z2luICYmICFtQ3J5cHRvUGx1Z2luVjFfNCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICghaW52b2tlRHJtRmFjdG9yeSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludm9rZURybVBsdWdpbihkYXRhLCBzaXplKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlQ3J5cHRvKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgaWYgKCFpbnZva2VDcnlwdG9GYWN0b3J5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW52b2tlQ3J5cHRvUGx1Z2luKGRhdGEpOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1GRFAgPSBuZXcgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBpbnZva2VEcm0oZGF0YSwgc2l6ZSk7CisgIGludm9rZUNyeXB0byhkYXRhKTsKKyAgZGVsZXRlIG1GRFA7Cit9CisKK2Jvb2wgQ2xlYXJLZXlGdXp6ZXI6OmluaXQoKSB7CisgIG1DcnlwdG9GYWN0b3J5ID0KKyAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OmNsZWFya2V5OjpjcmVhdGVDcnlwdG9GYWN0b3J5KCk7CisgIG1Ecm1GYWN0b3J5ID0gYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6Y2xlYXJrZXk6OmNyZWF0ZURybUZhY3RvcnkoKTsKKyAgaWYgKCFtRHJtRmFjdG9yeSAmJiAhbUNyeXB0b0ZhY3RvcnkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCBrQUVTQmxvY2tTaXplKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ2xlYXJLZXlGdXp6ZXIgY2xlYXJLZXlGdXp6ZXI7CisgIGlmIChjbGVhcktleUZ1enplci5pbml0KCkpIHsKKyAgICBjbGVhcktleUZ1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCmluZGV4IDVkNmUzZGEuLmNiNWM5ZmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKQEAgLTQzMiw4ICs0MzIsNyBAQAogICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6Ok9LOwogICAgIH0KIAotICAgIERldmljZUZpbGVzIG1GaWxlSGFuZGxlIEdVQVJERURfQlkobUZpbGVIYW5kbGVMb2NrKTsKLSAgICBNdXRleCBtRmlsZUhhbmRsZUxvY2s7CisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CiAgICAgTXV0ZXggbVNlY3VyZVN0b3BMb2NrOwogCiAgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOX0FORF9ORVcoRHJtUGx1Z2luKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oCmluZGV4IGE5MGQ4MTguLjFkOTg4NjAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApAQCAtNSw5ICs1LDcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCiAjZGVmaW5lIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCkBAIC01MSwxMiArNDksMTAgQEAKICAgICBzaXplX3QgV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhOYW1lLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKTsKIAogIHByaXZhdGU6Ci0gICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NZW1vcnlGaWxlU3lzdGVtTG9jazsKLQogICAgIC8vIExpY2Vuc2UgZmlsZSBuYW1lIGlzIG1hZGUgdXAgb2YgYSB1bmlxdWUga2V5U2V0SWQsIHRoZXJlZm9yZSwKICAgICAvLyB0aGUgZmlsZW5hbWUgY2FuIGJlIHVzZWQgYXMgdGhlIGtleSB0byBsb2NhdGUgbGljZW5zZXMgaW4gdGhlCiAgICAgLy8gbWVtb3J5IGZpbGUgc3lzdGVtLgotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPiBtTWVtb3J5RmlsZVN5c3RlbSBHVUFSREVEX0JZKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtOwogCiAgICAgc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvc2VydmljZS1sYXp5Lm1rCnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3NlcnZpY2UtbGF6eS5tawppbmRleCA0Y2ZlY2ZkLi4wZDE2ZjRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3NlcnZpY2UtbGF6eS5tawpAQCAtMSw0ICsxLDUgQEAKLSMgQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTEsMTIgKzEyLDUgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBCdWlsZCB0ZXN0cwotCi1pbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawotCisjCitQUk9EVUNUX1BBQ0tBR0VTICs9IGFuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UtbGF6eS5jbGVhcmtleQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3NlcnZpY2UubWsKc2ltaWxhcml0eSBpbmRleCA3NyUKY29weSBmcm9tIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLm1rCmluZGV4IDRjZmVjZmQuLjE1OTg4ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvc2VydmljZS5tawpAQCAtMSw0ICsxLDUgQEAKLSMgQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTEsMTIgKzEyLDUgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBCdWlsZCB0ZXN0cwotCi1pbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawotCisjCitQUk9EVUNUX1BBQ0tBR0VTICs9IGFuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvT1dORVJTIGIvaW5jbHVkZS9PV05FUlMKaW5kZXggZDZiZDk5OC4uZTFkNGRiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9PV05FUlMKKysrIGIvaW5jbHVkZS9PV05FUlMKQEAgLTEsNiArMSw2IEBACiBlbGF1cmVudEBnb29nbGUuY29tCi1na2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIGp0aW5rZXJAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggMjAwZTkyZC4uYTFlMTcwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC01Myw2ICs1Myw4NCBAQAogLy9FTF9GSVhNRSAyMCBzZWNvbmRzIG1heSBub3QgYmUgZW5vdWdoIGFuZCBtdXN0IGJlIHJlY29uY2lsZWQgd2l0aCBuZXcgb2J0YWluQnVmZmVyIGltcGxlbWVudGF0aW9uCiAjZGVmaW5lIE1BWF9SVU5fT0ZGTE9BREVEX1RJTUVPVVRfTVMgMjAwMDAgLy8gYXNzdW1pbmcgdXAgdG8gYSBtYXhpbXVtIG9mIDIwIHNlY29uZHMgb2Ygb2ZmbG9hZGVkCiAKKy8vIGZvciBhdWRpb190cmFja19jYmxrX3Q6Om1TdGF0ZSwgdG8gbWF0Y2ggVHJhY2tCYXNlLmgKK3N0YXRpYyBpbmxpbmUgY29uc3RleHByIGludCBDQkxLX1NUQVRFX0lETEUgPSAwOworc3RhdGljIGlubGluZSBjb25zdGV4cHIgaW50IENCTEtfU1RBVEVfQUNUSVZFID0gNjsKK3N0YXRpYyBpbmxpbmUgY29uc3RleHByIGludCBDQkxLX1NUQVRFX1BBVVNJTkcgPSA3OworCisvKioKKyAqIE1pcnJvcmVkVmFyaWFibGUgaXMgYSBsb2NhbCB2YXJpYWJsZSB3aGljaCBzaW11bHRhbmVvdXNseSB1cGRhdGVzCisgKiBhIG1pcnJvcmVkIHN0b3JhZ2UgbG9jYXRpb24uICBUaGlzIGlzIHVzZWZ1bCBmb3Igc2VydmVyIHNpZGUgdmFyaWFibGVzCisgKiB3aGVyZSBhIGxvY2FsIGNvcHkgaXMga2VwdCwgYnV0IGEgY2xpZW50IHZpc2libGUgY29weSBpcyBvZmZlcmVkIHRocm91Z2ggc2hhcmVkIG1lbW9yeS4KKyAqCisgKiBXZSB1c2Ugc3RkOjphdG9taWMgYXMgdGhlIGRlZmF1bHQgY29udGFpbmVyIGNsYXNzIHRvIGFjY2VzcyB0aGlzIG1lbW9yeS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgQ29udGFpbmVyID0gc3RkOjphdG9taWM+CitjbGFzcyBNaXJyb3JlZFZhcmlhYmxlIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KKyAgICBzdHJ1Y3QgQ29uc3RyYWludHMgeworICAgICAgICAvLyBJZiBzZXRNaXJyb3IgaXMgdXNlZCB3aXRoIGEgZGlmZmVyZW50IHR5cGUgVSAhPSBUIHBhc3NlZCBpbiwKKyAgICAgICAgLy8gYXMgYSBnZW5lcmFsIHJ1bGUsIHRoZSBDb250YWluZXIgbXVzdCBpc3N1ZSBhIG1lbWNweSB0byByZWFkIG9yIHdyaXRlCisgICAgICAgIC8vIChvciBpdHMgZXF1aXZhbGVudCkgdG8gYXZvaWQgcG9zc2libGUgc3RyaWN0IGFsaWFzaW5nIGlzc3Vlcy4KKyAgICAgICAgLy8gVGhlIG1lbWNweSBhbHNvIGF2b2lkcyBnYXBzIGluIHN0cnVjdHMgYW5kIGFsaWdubWVudCBpc3N1ZXMgd2l0aCBkaWZmZXJlbnQgdHlwZXMuCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBva18gPSBmYWxzZTsgIC8vIENvbnRhaW5lcnMgbXVzdCBzcGVjaWZ5IGNvbnN0cmFpbnRzLgorICAgIH07CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFg+CisgICAgc3RydWN0IENvbnN0cmFpbnRzPHN0ZDo6YXRvbWljPFg+PiB7CisgICAgICAgIC8vIEF0b21pY3MgZm9yY2UgcmVhZCBhbmQgd3JpdGUgdG8gbWVtb3J5LgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgb2sgPSBzdGQ6OmlzX3NhbWVfdjxYLCBUPiB8fAorICAgICAgICAgICAgICAgIChzdGQ6OmF0b21pYzxYPjo6aXNfYWx3YXlzX2xvY2tfZnJlZSAgICAgICAgICAgICAgICAgICAvLyBubyBhZGRpdGlvbmFsIGxvY2tpbmcKKyAgICAgICAgICAgICAgICAmJiBzaXplb2Yoc3RkOjphdG9taWM8WD4pID09IHNpemVvZihYKSAgICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlkZW50aWNhbCB0byBYLgorICAgICAgICAgICAgICAgICYmIChzdGQ6OmlzX2FyaXRobWV0aWNfdjxYPiB8fCBzdGQ6OmlzX2VudW1fdjxYPikpOyAgICAvLyBObyBnYXBzIGluIHRoZSBsYXlvdXQuCisgICAgfTsKKworc3RhdGljX2Fzc2VydChDb25zdHJhaW50czxDb250YWluZXI8VD4+Ojpvayk7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWlycm9yZWRWYXJpYWJsZShjb25zdCBUJiB0KSA6IHRfe3R9IHt9CisKKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9yCisgICAgb3BlcmF0b3IgVCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRfOworICAgIH0KKworICAgIE1pcnJvcmVkVmFyaWFibGUmIG9wZXJhdG9yPShjb25zdCBUJiB0KSB7CisgICAgICAgIHRfID0gdDsKKyAgICAgICAgaWYgKG1pcnJvcl8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKm1pcnJvcl8gPSB0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICB2b2lkIHNldE1pcnJvcihDb250YWluZXI8VT4gKm90aGVyX21pcnJvcikgeworICAgICAgICAvLyBNdWNoIG9mIHRoZSBjb25jZXJuIGlzIHdpdGggVCAhPSBVLCBob3dldmVyIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGNvbmNlcm5zCisgICAgICAgIC8vIHdoZW4gc3RvcmFnZSB1c2VzIHNoYXJlZCBtZW1vcnkgYmV0d2VlbiBwcm9jZXNzZXMuICBGb3IgYXRvbWljcywgaXQgbXVzdCBiZQorICAgICAgICAvLyBsb2NrIGZyZWUuCisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFUpID09IHNpemVvZihUKSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihVKSA9PSBhbGlnbm9mKFQpKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDb25zdHJhaW50czxDb250YWluZXI8VT4+Ojpvayk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbnRhaW5lcjxVPikgPT0gc2l6ZW9mKENvbnRhaW5lcjxUPikpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGFsaWdub2YoQ29udGFpbmVyPFU+KSA9PSBhbGlnbm9mKENvbnRhaW5lcjxUPikpOworICAgICAgICBhdXRvIG1pcnJvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29udGFpbmVyPFQ+Kj4ob3RoZXJfbWlycm9yKTsKKyAgICAgICAgaWYgKG1pcnJvcl8gIT0gbWlycm9yKSB7CisgICAgICAgICAgICBtaXJyb3JfID0gbWlycm9yOworICAgICAgICAgICAgaWYgKG1pcnJvciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKm1pcnJvciA9IHRfOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbWlycm9yXyA9IG51bGxwdHI7CisgICAgfQorCisgICAgTWlycm9yZWRWYXJpYWJsZSYgb3BlcmF0b3ImKCkgY29uc3QgPSBkZWxldGU7CisKK3Byb3RlY3RlZDoKKyAgICBUIHRfe307CisgICAgQ29udGFpbmVyPFQ+KiBtaXJyb3JfID0gbnVsbHB0cjsKK307CisKIHN0cnVjdCBBdWRpb1RyYWNrU2hhcmVkU3RyZWFtaW5nIHsKICAgICAvLyBzaW1pbGFyIHRvIE5CQUlPIE1vbm9QaXBlCiAgICAgLy8gaW4gY29udGludW91c2x5IGluY3JlbWVudGluZyBmcmFtZSB1bml0cywgdGFrZSBtb2R1bG8gYnVmZmVyIHNpemUsIHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZiAyCkBAIC0xODgsNiArMjY2LDggQEAKIAogICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgIG1GbGFnczsgICAgICAgICAvLyBjb21iaW5hdGlvbnMgb2YgQ0JMS18qCiAKKyAgICAgICAgICAgICAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAgbVN0YXRlOyAvLyBjdXJyZW50IFRyYWNrQmFzZSBzdGF0ZS4KKwogcHVibGljOgogICAgICAgICAgICAgICAgIHVuaW9uIHsKICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFja1NoYXJlZFN0cmVhbWluZyAgIG1TdHJlYW1pbmc7CkBAIC0xOTgsNiArMjc4LDkgQEAKICAgICAgICAgICAgICAgICAvLyBDYWNoZSBsaW5lIGJvdW5kYXJ5ICgzMiBieXRlcykKIH07CiAKKy8vIFRPRE86IGVuc3VyZSBzdGFuZGFyZCBsYXlvdXQuCisvLyBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0X3Y8YXVkaW9fdHJhY2tfY2Jsa190Pik7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gUHJveHkgZm9yIHNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jaywgdG8gaXNvbGF0ZSBjYWxsZXJzIGZyb20gbmVlZGluZyB0byBrbm93IHRoZSBkZXRhaWxzLgpAQCAtMzIzLDYgKzQwNiw3IEBACiAgICAgICAgIHJldHVybiBtRXBvY2g7CiAgICAgfQogCisgICAgaW50MzJfdCBnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU3RhdGU7IH0KICAgICB1aW50MzJfdCAgICAgIGdldEJ1ZmZlclNpemVJbkZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplSW5GcmFtZXM7IH0KICAgICAvLyBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgQXVkaW9UcmFjazo6c2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKICAgICB1aW50MzJfdCAgICAgIHNldEJ1ZmZlclNpemVJbkZyYW1lcyh1aW50MzJfdCByZXF1ZXN0ZWRTaXplKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCmluZGV4IDE2ZTc5NGEuLmQ0MDI1ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaApAQCAtMzgsMTMgKzM4LDEzIEBACiAgICAgVmlkZW9GcmFtZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgdWludDMyX3QgZGlzcGxheVdpZHRoLCB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgdWludDMyX3QgdGlsZVdpZHRoLCB1aW50MzJfdCB0aWxlSGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgYW5nbGUsIHVpbnQzMl90IGJwcCwgYm9vbCBoYXNEYXRhLCBzaXplX3QgaWNjU2l6ZSk6CisgICAgICAgICAgICB1aW50MzJfdCBhbmdsZSwgdWludDMyX3QgYnBwLCB1aW50MzJfdCBiaXREZXB0aCwgYm9vbCBoYXNEYXRhLCBzaXplX3QgaWNjU2l6ZSk6CiAgICAgICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwKICAgICAgICAgbURpc3BsYXlXaWR0aChkaXNwbGF5V2lkdGgpLCBtRGlzcGxheUhlaWdodChkaXNwbGF5SGVpZ2h0KSwKICAgICAgICAgbVRpbGVXaWR0aCh0aWxlV2lkdGgpLCBtVGlsZUhlaWdodCh0aWxlSGVpZ2h0KSwgbUR1cmF0aW9uVXMoMCksCiAgICAgICAgIG1Sb3RhdGlvbkFuZ2xlKGFuZ2xlKSwgbUJ5dGVzUGVyUGl4ZWwoYnBwKSwgbVJvd0J5dGVzKGJwcCAqIHdpZHRoKSwKICAgICAgICAgbVNpemUoaGFzRGF0YSA/IChicHAgKiB3aWR0aCAqIGhlaWdodCkgOiAwKSwKLSAgICAgICAgbUljY1NpemUoaWNjU2l6ZSksIG1SZXNlcnZlZCgwKSB7CisgICAgICAgIG1JY2NTaXplKGljY1NpemUpLCBtQml0RGVwdGgoYml0RGVwdGgpIHsKICAgICB9CiAKICAgICB2b2lkIGluaXQoY29uc3QgVmlkZW9GcmFtZSYgY29weSwgY29uc3Qgdm9pZCogaWNjRGF0YSwgc2l6ZV90IGljY1NpemUpIHsKQEAgLTg0LDcgKzg0LDkgQEAKICAgICB1aW50MzJfdCBtUm93Qnl0ZXM7ICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHJvdyBiZWZvcmUgcm90YXRpb24KICAgICB1aW50MzJfdCBtU2l6ZTsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgZnJhbWUgZGF0YQogICAgIHVpbnQzMl90IG1JY2NTaXplOyAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBvZiBJQ0MgZGF0YQotICAgIHVpbnQzMl90IG1SZXNlcnZlZDsgICAgICAgIC8vIChwYWRkaW5nIHRvIG1ha2UgbURhdGEgNjQtYml0IGFsaWduZWQpCisgICAgdWludDMyX3QgbUJpdERlcHRoOyAgICAgICAgLy8gbnVtYmVyIG9mIGJpdHMgcGVyIFIgLyBHIC8gQiBjaGFubmVsCisKKyAgICAvLyBBZGRpbmcgbmV3IGl0ZW1zIG11c3QgYmUgNjQtYml0IGFsaWduZWQuCiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYTM1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cyxhdWRpb19lZmZlY3RzLmNvbmYpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzLGF1ZGlvX2VmZmVjdHMueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQsKSkKZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCA0Y2Y0ODcwLi40YTI1YjY4IDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC0xLDcgKzEsNiBAQAogIyBCdWcgY29tcG9uZW50OiAxMzQ0CiBlbGF1cmVudEBnb29nbGUuY29tCiBlc3NpY2tAZ29vZ2xlLmNvbQotaGt1YW5nQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIGppYWJpbkBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KQEAgLTE1LDYgKzE0LDcgQEAKIHJvYmVydHNoaWhAZ29vZ2xlLmNvbQogdGFrbGVlQGdvb2dsZS5jb20KIHdvbnNpa0Bnb29nbGUuY29tCit5dGFpQGdvb2dsZS5jb20KIAogIyBnby9hbmRyb2lkLWZ3ay1tZWRpYS1zb2x1dGlvbnMgZm9yIGluZm8gb24gYXJlYXMgb2Ygb3duZXJzaGlwLgogaW5jbHVkZSBwbGF0Zm9ybS9mcmFtZXdvcmtzL2F2Oi9tZWRpYS9qYW5pdG9ycy9tZWRpYV9zb2x1dGlvbnNfT1dORVJTCmRpZmYgLS1naXQgYS9tZWRpYS9URVNUX01BUFBJTkcgYi9tZWRpYS9URVNUX01BUFBJTkcKaW5kZXggNWJjNzI2Mi4uYTRjMDNiYSAxMDA2NDQKLS0tIGEvbWVkaWEvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL1RFU1RfTUFQUElORwpAQCAtMSwyNCArMSw3IEBACiAvLyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYQogewotICAgICJwcmVzdWJtaXQtbGFyZ2UiOiBbCi0gICAgICAgIC8vIHJ1bnMgd2hlbmV2ZXIgd2UgY2hhbmdlIHNvbWV0aGluZyBpbiB0aGlzIHRyZWUKLSAgICAgICAgewotICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAotICAgICAgICAgICAgIm9wdGlvbnMiOiBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuRW5jb2RlRGVjb2RlVGVzdCIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKLSAgICAgICAgICAgICJvcHRpb25zIjogWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkRlY29kZUVkaXRFbmNvZGVUZXN0IgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KLSAgICAgICAgfQotICAgIF0sCisgICAgLy8gVE9ETyAoYi8yMjkyODY0MDcpIEFkZCBFbmNvZGVEZWNvZGVUZXN0IGFuZCBEZWNvZGVFZGl0RW5jb2RlVGVzdCB0bworICAgIC8vIHByZXN1Ym1pdC1sYXJnZSBvbmNlIGlzc3VlcyBpbiBjdXR0bGVmaXNoIGFyZSBmaXhlZAogICAgICJwcmVzdWJtaXQiOiBbCiAgICAgICAgIHsKICAgICAgICAgICAgICJuYW1lIjogIkd0c01lZGlhVGVzdENhc2VzIiwKQEAgLTQwLDI2ICsyMyw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgICJwYXRoIjogImZyYW1ld29ya3MvYXYvZHJtL21lZGlhZHJtL3BsdWdpbnMiCiAgICAgICAgIH0KLSAgICBdLAotCi0gICAgInBsYXRpbnVtLXBvc3RzdWJtaXQiOiBbCi0gICAgICAgIC8vIHJ1bnMgcmVndWxhcmx5LCBpbmRlcGVuZGVudCBvZiBjaGFuZ2VzIGluIHRoaXMgdHJlZS4KLSAgICAgICAgLy8gc2lnbmFscyBpZiBjaGFuZ2VzIGVsc2V3aGVyZSBicmVhayBtZWRpYSBmdW5jdGlvbmFsaXR5Ci0gICAgICAgIHsKLSAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKLSAgICAgICAgICAgICJvcHRpb25zIjogWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkVuY29kZURlY29kZVRlc3QiCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCi0gICAgICAgICAgICAib3B0aW9ucyI6IFsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5EZWNvZGVFZGl0RW5jb2RlVGVzdCIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi0gICAgICAgIH0KICAgICBdCisKKyAgICAvLyBUT0RPIChiLzIyOTI4NjQwNykgQWRkIEVuY29kZURlY29kZVRlc3QgYW5kIERlY29kZUVkaXRFbmNvZGVUZXN0IHRvCisgICAgLy8gcGxhdGludW0tcG9zdHN1Ym1pdCBvbmNlIGlzc3VlcyBpbiBjdXR0bGVmaXNoIGFyZSBmaXhlZAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYmUyNWZmYi4uODI4ZDg2MSAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwCkBAIC0yMSwxMSArMjEsMTQgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgICAgICAibGliYWF1ZGlvc2VydmljZSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJhdWRpb2ZsaW5nZXIiLAogICAgICAgICAibGliYXVkaW9wb2xpY3lzZXJ2aWNlIiwKICAgICAgICAgImxpYmF1ZGlvcHJvY2Vzc2luZyIsCkBAIC00MSw3ICs0NCw2IEBACiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidmlicmF0b3IiLAotCiAgICAgXSwKIAogICAgIC8vIFRPRE8gY2hlY2sgaWYgd2Ugc3RpbGwgbmVlZCBhbGwgb2YgdGhlc2UgaW5jbHVkZSBkaXJlY3RvcmllcwpAQCAtNTAsNyArNTIsNiBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmciLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSIsCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcCBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCmluZGV4IDhlZTFlZmIuLmUzZGI1YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCkBAIC0xNywxMSArMTcsMTcgQEAKICNkZWZpbmUgTE9HX1RBRyAiYXVkaW9zZXJ2ZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0zMCw3ICszNiw2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIC8vIGZyb20gaW5jbHVkZV9kaXJzCi0jaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIgLy8gYWF1ZGlvX3BvbGljeV90LCBBQVVESU9fUFJPUF9NTUFQX1BPTElDWSwgQUFVRElPX1BPTElDWV8qCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgpAQCAtMzksNiArNDQsMTAgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3k7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbzsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlOworCiBpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YpCiB7CiAgICAgLy8gVE9ETzogdXBkYXRlIHdpdGggcmVmaW5lZCBwYXJhbWV0ZXJzCkBAIC03MywxMCArODIsOCBAQAogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBzaWdpbmZvX3QgaW5mbzsKLSAgICAgICAgICAgIGludCByZXQgPSB3YWl0aWQoUF9QSUQsIGNoaWxkUGlkLCAmaW5mbywgV0VYSVRFRCB8IFdTVE9QUEVEIHwgV0NPTlRJTlVFRCk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IEVJTlRSKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRpZChQX1BJRCwgY2hpbGRQaWQsICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VYSVRFRCB8IFdTVE9QUEVEIHwgV0NPTlRJTlVFRCkpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE0NiwxMCArMTUzLDI0IEBACiAgICAgICAgIC8vIEFBdWRpb1NlcnZpY2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBPQy1NUjEgYW5kIGxhdGVyLgogICAgICAgICAvLyBBbmQgb25seSBlbmFibGUgdGhlIEFBdWRpb1NlcnZpY2UgaWYgdGhlIHN5c3RlbSBNTUFQIHBvbGljeSBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIGNsaWVudCBmcm9tIG1pc3VzaW5nIEFBdWRpb1NlcnZpY2Ugd2hlbiBpdCBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICBhYXVkaW9fcG9saWN5X3QgbW1hcFBvbGljeSA9IHByb3BlcnR5X2dldF9pbnQzMihBQVVESU9fUFJPUF9NTUFQX1BPTElDWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BPTElDWV9ORVZFUik7Ci0gICAgICAgIGlmIChtbWFwUG9saWN5ID09IEFBVURJT19QT0xJQ1lfQVVUTyB8fCBtbWFwUG9saWN5ID09IEFBVURJT19QT0xJQ1lfQUxXQVlTKSB7CisgICAgICAgIC8vIElmIHdlIGNhbm5vdCBnZXQgYXVkaW8gZmxpbmdlciBoZXJlLCB0aGVyZSBtdXN0IGJlIHNvbWUgc2VyaW91cyBwcm9ibGVtcy4gSW4gdGhhdCBjYXNlLAorICAgICAgICAvLyBhdHRlbXB0aW5nIHRvIGNhbGwgYXVkaW8gZmxpbmdlciBvbiBhIG51bGwgcG9pbnRlciBjb3VsZCBtYWtlIHRoZSBwcm9jZXNzIGNyYXNoCisgICAgICAgIC8vIGFuZCBhdHRyYWN0IGF0dGVudGlvbnMuCisgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvTU1hcFBvbGljeUluZm8+IHBvbGljeUluZm9zOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZi0+Z2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICAgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkRFRkFVTFQsICZwb2xpY3lJbmZvcyk7CisgICAgICAgIC8vIEluaXRpYWxpemUgYWF1ZGlvIHNlcnZpY2Ugd2hlbiBxdWVyeWluZyBtbWFwIHBvbGljeSBzdWNjZWVkcyBhbmQKKyAgICAgICAgLy8gYW55IG9mIHRoZSBwb2xpY3kgc3VwcG9ydHMgTU1BUC4KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJgorICAgICAgICAgICAgc3RkOjphbnlfb2YocG9saWN5SW5mb3MuYmVnaW4oKSwgcG9saWN5SW5mb3MuZW5kKCksIFtdKGNvbnN0IGF1dG8mIGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8ubW1hcFBvbGljeSA9PSBBdWRpb01NYXBQb2xpY3k6OkFVVE8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubW1hcFBvbGljeSA9PSBBdWRpb01NYXBQb2xpY3k6OkFMV0FZUzsKKyAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIkRvIG5vdCBpbml0IGFhdWRpbyBzZXJ2aWNlLCBzdGF0dXMgJWQsIHBvbGljeSBpbmZvIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgcG9saWN5SW5mb3Muc2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCmluZGV4IDY3MzNlMGMuLmRiNTRkNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpAQCAtMSw2ICsxLDUgQEAKICMgTWVkaWEgdGVhbQogbGFqb3NAZ29vZ2xlLmNvbQotcGF3aW5AZ29vZ2xlLmNvbQogdGFrbGVlQGdvb2dsZS5jb20KIHdvbnNpa0Bnb29nbGUuY29tCiAKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCmluZGV4IDBkMWZlMjcuLjkzMGIwMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApAQCAtNDAsNiArNDAsMTIgQEAKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC1kZWZhdWx0Il0sCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgICAgICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKICAgICAvLyBUT0RPOiBiLzE0NzE0Nzk5MgogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDgwM2E4MTMuLjVlMjZlM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApAQCAtODAsMyArODAsMjIgQEAKICAgICBdLAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkJ1ZmZlcnBvb2xVbml0VGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJCdWZmZXJwb29sVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjdhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIGJ1ZmZlcnBvb2wgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IkJ1ZmZlcnBvb2xVbml0VGVzdCIgLz4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iQnVmZmVycG9vbFVuaXRUZXN0IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0J1ZmZlcnBvb2xVbml0VGVzdC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9CdWZmZXJwb29sVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDg0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9CdWZmZXJwb29sVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsNTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJCdWZmZXJwb29sVW5pdFRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVQsCisgICAgVFJBTlNGRVIsCisgICAgU1RPUCwKKworICAgIElOSVRfT0ssCisgICAgSU5JVF9FUlJPUiwKKyAgICBUUkFOU0ZFUl9PSywKKyAgICBUUkFOU0ZFUl9FUlJPUiwKKyAgICBTVE9QX09LLAorICAgIFNUT1BfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBpbnQzMl90IG1lbXNldFZhbHVlOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIH0gZGF0YTsKKyAgICBjaGFyIGFycmF5WzBdOworfTsKKworc3RhdGljIGludDMyX3Qga051bUl0ZXJhdGlvbkNvdW50ID0gMTA7CisKK2NsYXNzIEJ1ZmZlcnBvb2xUZXN0IHsKKyAgcHVibGljOgorICAgIEJ1ZmZlcnBvb2xUZXN0KCkgOiBtQ29ubmVjdGlvblZhbGlkKGZhbHNlKSwgbU1hbmFnZXIobnVsbHB0ciksIG1BbGxvY2F0b3IobnVsbHB0cikgeworICAgICAgICBtQ29ubmVjdGlvbklkID0gLTE7CisgICAgICAgIG1SZWNlaXZlcklkID0gLTE7CisgICAgfQorCisgICAgfkJ1ZmZlcnBvb2xUZXN0KCkgeworICAgICAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcklkOworCisgICAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICB2b2lkIHNldHVwQnVmZmVycG9vbE1hbmFnZXIoKTsKK307CisKK3ZvaWQgQnVmZmVycG9vbFRlc3Q6OnNldHVwQnVmZmVycG9vbE1hbmFnZXIoKSB7CisgICAgLy8gcmV0cmlldmluZyBwZXIgcHJvY2VzcyBidWZmZXJwb29sIG9iamVjdCBzcDxDbGllbnRNYW5hZ2VyPgorICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpIDw8ICJ1bmFibGUgdG8gZ2V0IENsaWVudE1hbmFnZXJcbiI7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfTkUobUFsbG9jYXRvciwgbnVsbHB0cikgPDwgInVuYWJsZSB0byBjcmVhdGUgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3JcbiI7CisKKyAgICAvLyBzZXQtdXAgbG9jYWwgYnVmZmVycG9vbCBjb25uZWN0aW9uIGZvciBzZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykKKyAgICAgICAgICAgIDw8ICJ1bmFibGUgdG8gc2V0LXVwIGxvY2FsIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiBmb3Igc2VuZGVyXG4iOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworfQorCitjbGFzcyBCdWZmZXJwb29sVW5pdFRlc3QgOiBwdWJsaWMgQnVmZmVycG9vbFRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cEJ1ZmZlcnBvb2xNYW5hZ2VyKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHt9Cit9OworCitjbGFzcyBCdWZmZXJwb29sRnVuY3Rpb25hbGl0eVRlc3QgOiBwdWJsaWMgQnVmZmVycG9vbFRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKworICAgICAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCkgPDwgInBpcGUgY29ubmVjdGlvbiBmYWlsZWQgZm9yIGNvbW1hbmRQaXBlXG4iOworICAgICAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKSA8PCAicGlwZSBjb25uZWN0aW9uIGZhaWxlZCBmb3IgcmVzdWx0UGlwZVxuIjsKKworICAgICAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKSA8PCAiZm9yayBmYWlsZWRcbiI7CisKKyAgICAgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICAgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbSB0ZWFyRG93bgorICAgICAgICAgICAgcGF1c2UoKTsKKyAgICAgICAgfQorICAgICAgICBzZXR1cEJ1ZmZlcnBvb2xNYW5hZ2VyKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAgICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgICAgICAgaW50IHdzdGF0dXM7CisgICAgICAgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgcGlkX3QgbVJlY2VpdmVyUGlkOworICAgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgICAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgICAgYm9vbCBzZW5kTWVzc2FnZShpbnQqIHBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSYgbWVzc2FnZSkgeworICAgICAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgICAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgICAgfQorCisgICAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQqIHBpcGVzLCBQaXBlTWVzc2FnZSogbWVzc2FnZSkgeworICAgICAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgICAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgICAgfQorCisgICAgdm9pZCBkb1JlY2VpdmVyKCk7Cit9OworCit2b2lkIEJ1ZmZlcnBvb2xGdW5jdGlvbmFsaXR5VGVzdDo6ZG9SZWNlaXZlcigpIHsKKyAgICAvLyBDb25maWd1cmVzIHRoZSB0aHJlYWRwb29sIHVzZWQgZm9yIGhhbmRsaW5nIGluY29taW5nIFJQQyBjYWxscyBpbiB0aGlzIHByb2Nlc3MuCisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxIC8qdGhyZWFkcyovLCBmYWxzZSAvKndpbGxKb2luKi8pOworICAgIGJvb2wgcmVjZWl2ZXJSdW5uaW5nID0gdHJ1ZTsKKyAgICB3aGlsZSAocmVjZWl2ZXJSdW5uaW5nKSB7CisgICAgICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgICAgICBSZXN1bHRTdGF0dXMgZXJyID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLmRhdGEuY29tbWFuZCkgeworICAgICAgICAgICAgY2FzZSBQaXBlQ29tbWFuZDo6SU5JVDogeworICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1hbmFnZXIgY3JlYXRpb24KKyAgICAgICAgICAgICAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUGlwZUNvbW1hbmQ6OlRSQU5TRkVSOiB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiByZWNlaXZlSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJlY2VpdmVCdWZmZXI7CisgICAgICAgICAgICAgICAgZXJyID0gbU1hbmFnZXItPnJlY2VpdmUobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkLCBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2VpdmVIYW5kbGUsICZyZWNlaXZlQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6VFJBTlNGRVJfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjZWl2ZUhhbmRsZSwgbWVzc2FnZS5kYXRhLm1lbXNldFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpUUkFOU0ZFUl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UocmVjZWl2ZUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKHJlY2VpdmVIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWNlaXZlSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICByZWNlaXZlQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6VFJBTlNGRVJfT0s7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBQaXBlQ29tbWFuZDo6U1RPUDogeworICAgICAgICAgICAgICAgIGVyciA9IG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U1RPUF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNUT1BfT0s7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHJlY2VpdmVyUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgidW5rbm93biBjb21tYW5kLiB0cnkgYWdhaW4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoIHVuaXF1ZSBidWZmZXIgaWQuCitURVNUX0YoQnVmZmVycG9vbFVuaXRUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPj4gYnVmZmVyc3t9OworICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGFsbG9jSGFuZGxle307CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJ7fTsKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmhhbmRsZSwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJhbGxvY2F0ZSBmYWlsZWQgZm9yICIgPDwgaSA8PCAiaXRlcmF0aW9uIjsKKworICAgICAgICBidWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoYnVmZmVyKSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGFsbG9jSGFuZGxlLnB1c2hfYmFjayhzdGQ6Om1vdmUoaGFuZGxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1JdGVyYXRpb25Db3VudDsgKytqKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShidWZmZXJzW2ldLT5tSWQgIT0gYnVmZmVyc1tqXS0+bUlkKSA8PCAiYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIG5vdCB1bmlxdWUiOworICAgICAgICB9CisgICAgfQorICAgIC8vIGRlbGV0ZSB0aGUgYnVmZmVyIGhhbmRsZXMKKyAgICBmb3IgKGF1dG8gaGFuZGxlIDogYWxsb2NIYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIH0KKyAgICAvLyBjbGVhciB0aGUgdmVjdG9ycworICAgIGJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBhbGxvY0hhbmRsZS5jbGVhcigpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFVuaXRUZXN0LCBSZWN5Y2xlQnVmZmVyKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlcklkPiBiaWR7fTsKKyAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBhbGxvY0hhbmRsZXt9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUl0ZXJhdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmhhbmRsZSwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJhbGxvY2F0ZSBmYWlsZWQgZm9yICIgPDwgaSA8PCAiaXRlcmF0aW9uIjsKKworICAgICAgICBiaWQucHVzaF9iYWNrKGJ1ZmZlci0+bUlkKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYWxsb2NIYW5kbGUucHVzaF9iYWNrKHN0ZDo6bW92ZShoYW5kbGUpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8QnVmZmVySWQ+IHNldChiaWQuYmVnaW4oKSwgYmlkLmVuZCgpKTsKKyAgICBBU1NFUlRfRVEoc2V0LnNpemUoKSwgMSkgPDwgImJ1ZmZlcnMgYXJlIG5vdCByZWN5Y2xlZCBwcm9wZXJseSI7CisKKyAgICAvLyBkZWxldGUgdGhlIGJ1ZmZlciBoYW5kbGVzCisgICAgZm9yIChhdXRvIGhhbmRsZSA6IGFsbG9jSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICB9CisgICAgYWxsb2NIYW5kbGUuY2xlYXIoKTsKK30KKworLy8gVmFsaWRhdGUgY2FjaGUgZXZpY3QgYW5kIGludmFsaWRhdGUgQVBJcy4KK1RFU1RfRihCdWZmZXJwb29sVW5pdFRlc3QsIEZsdXNoVGVzdCkgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihtTWFuYWdlciwgbUNvbm5lY3Rpb25JZCwgJm1SZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUyAmJiBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKworICAgIC8vIHRlc3RpbmcgZW1wdHkgZmx1c2gKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Zmx1c2gobUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImZhaWxlZCB0byBmbHVzaCBjb25uZWN0aW9uIDogIiA8PCBtQ29ubmVjdGlvbklkOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPj4gc2VuZGVyQnVmZmVye307CisgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gYWxsb2NIYW5kbGV7fTsKKyAgICBzdGQ6OnZlY3RvcjxUcmFuc2FjdGlvbklkPiB0aWR7fTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB0aW1lc3RhbXBVc3t9OworCisgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgQnVmZmVySWQ+IGJ1ZmZlck1hcHt9OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlcmF0aW9uQ291bnQ7IGkrKykgeworICAgICAgICBpbnQ2NF90IHBvc3RVczsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVye307CisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZoYW5kbGUsICZidWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYWxsb2NhdGUgZmFpbGVkIGZvciAiIDw8IGkgPDwgIiBpdGVyYXRpb24iOworCisgICAgICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGhhbmRsZSwgaSkpOworCisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJ1bmFibGUgdG8gcG9zdCBzZW5kIHRyYW5zYWN0aW9uIG9uIGJ1ZmZlcnBvb2wiOworCisgICAgICAgIHRpbWVzdGFtcFVzLnB1c2hfYmFjayhwb3N0VXMpOworICAgICAgICB0aWQucHVzaF9iYWNrKHRyYW5zYWN0aW9uSWQpOworICAgICAgICBidWZmZXJNYXAuaW5zZXJ0KHt0cmFuc2FjdGlvbklkLCBidWZmZXItPm1JZH0pOworCisgICAgICAgIHNlbmRlckJ1ZmZlci5wdXNoX2JhY2soc3RkOjptb3ZlKGJ1ZmZlcikpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBhbGxvY0hhbmRsZS5wdXNoX2JhY2soc3RkOjptb3ZlKGhhbmRsZSkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5mbHVzaChtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiZmFpbGVkIHRvIGZsdXNoIGNvbm5lY3Rpb24gOiAiIDw8IG1Db25uZWN0aW9uSWQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJlY2VpdmVyQnVmZmVye307CisgICAgbmF0aXZlX2hhbmRsZV90KiByZWN2SGFuZGxlID0gbnVsbHB0cjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyYXRpb25Db3VudDsgaSsrKSB7CisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0aWRbaV0sIHNlbmRlckJ1ZmZlcltpXS0+bUlkLCB0aW1lc3RhbXBVc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyZWNlaXZlckJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJyZWNlaXZlIGZhaWxlZCBmb3IgYnVmZmVyICIgPDwgc2VuZGVyQnVmZmVyW2ldLT5tSWQ7CisKKyAgICAgICAgLy8gZmluZCB0aGUgYnVmZmVyIGlkIGZyb20gdHJhbnNhY3Rpb24gaWQKKyAgICAgICAgYXV0byBmaW5kSXQgPSBidWZmZXJNYXAuZmluZCh0aWRbaV0pOworICAgICAgICBBU1NFUlRfTkUoZmluZEl0LCBidWZmZXJNYXAuZW5kKCkpIDw8ICJpbmNvbnNpc3RlbnQgYnVmZmVyIG1hcHBpbmciOworCisgICAgICAgIC8vIGJ1ZmZlciBpZCByZWNlaXZlZCBtdXN0IGJlIHNhbWUgYXMgdGhlIGJ1ZmZlciBpZCBzZW50CisgICAgICAgIEFTU0VSVF9FUShmaW5kSXQtPnNlY29uZCwgcmVjZWl2ZXJCdWZmZXItPm1JZCkgPDwgImludmFsaWQgYnVmZmVyIHJlY2VpdmVkIjsKKworICAgICAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIGkpKQorICAgICAgICAgICAgICAgIDw8ICJNZXNzYWdlIHJlY2VpdmVkIG5vdCBzYW1lIGFzIHRoYXQgc2VudCI7CisKKyAgICAgICAgYnVmZmVyTWFwLmVyYXNlKGZpbmRJdCk7CisgICAgICAgIGlmIChyZWN2SGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKHJlY3ZIYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUocmVjdkhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVjdkhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIHJlY2VpdmVyQnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKGJ1ZmZlck1hcC5zaXplKCksIDApIDw8ICJidWZmZXJzIHJlY2VpdmVkIGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgc2VudCI7CisKKyAgICBmb3IgKGF1dG8gaGFuZGxlIDogYWxsb2NIYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIH0KKyAgICBhbGxvY0hhbmRsZS5jbGVhcigpOworICAgIHNlbmRlckJ1ZmZlci5jbGVhcigpOworICAgIHRpbWVzdGFtcFVzLmNsZWFyKCk7Cit9CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xGdW5jdGlvbmFsaXR5VGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgICAvLyBpbml0aWFsaXplIHRoZSByZWNlaXZlcgorICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVDsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICAgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpIDw8ICJyZWNlaXZlTWVzc2FnZSBmYWlsZWRcbiI7CisgICAgQVNTRVJUX0VRKG1lc3NhZ2UuZGF0YS5jb21tYW5kLCBQaXBlQ29tbWFuZDo6SU5JVF9PSykgPDwgInJlY2VpdmVyIGluaXQgZmFpbGVkIjsKKworICAgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgICAgQVNTRVJUX05FKHJlY2VpdmVyLCBudWxscHRyKSA8PCAiZ2V0U2VydmljZSBmYWlsZWQgZm9yIHJlY2VpdmVyXG4iOworCisgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spCisgICAgICAgICAgICA8PCAicmVnaXN0ZXJTZW5kZXIgZmFpbGVkIGZvciBjb25uZWN0aW9uIGlkICIgPDwgbUNvbm5lY3Rpb25JZCA8PCAiXG4iOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZoYW5kbGUsICZidWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYWxsb2NhdGUgZmFpbGVkIGZvciAiIDw8IGkgPDwgIml0ZXJhdGlvbiI7CisKKyAgICAgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoaGFuZGxlLCBpKSkKKyAgICAgICAgICAgICAgICA8PCAiRmlsbCBmYWlsIGZvciBidWZmZXIgaGFuZGxlICIgPDwgaGFuZGxlIDw8ICJcbiI7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgYnVmZmVyIHRvIHRoZSByZWNlaXZlcgorICAgICAgICBpbnQ2NF90IHBvc3RVczsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spCisgICAgICAgICAgICAgICAgPDwgInBvc3RTZW5kIGZhaWxlZCBmb3IgcmVjZWl2ZXIgIiA8PCByZWNlaXZlcklkIDw8ICJcbiI7CisKKyAgICAgICAgLy8gUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6VFJBTlNGRVI7CisgICAgICAgIG1lc3NhZ2UuZGF0YS5tZW1zZXRWYWx1ZSA9IGk7CisgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICAgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgIC8vIGRlbGV0ZSBidWZmZXIgaGFuZGxlCisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSkgPDwgInJlY2VpdmVNZXNzYWdlIGZhaWxlZFxuIjsKKyAgICAgICAgQVNTRVJUX0VRKG1lc3NhZ2UuZGF0YS5jb21tYW5kLCBQaXBlQ29tbWFuZDo6VFJBTlNGRVJfT0spCisgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGVycm9yIGR1cmluZyBidWZmZXIgdHJhbnNmZXJcbiI7CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNUT1A7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKSA8PCAicmVjZWl2ZU1lc3NhZ2UgZmFpbGVkXG4iOworICAgIEFTU0VSVF9FUShtZXNzYWdlLmRhdGEuY29tbWFuZCwgUGlwZUNvbW1hbmQ6OlNUT1BfT0spCisgICAgICAgICAgICA8PCAicmVjZWl2ZWQgZXJyb3IgZHVyaW5nIGJ1ZmZlciB0cmFuc2ZlclxuIjsKK30KKworLyogVmFsaWRhdGUgYnVmZmVycG9vbCBmb3IgZm9sbG93aW5nIGNvcm5lciBjYXNlczoKKyAxLiBpbnZhbGlkIGNvbm5lY3Rpb25JRAorIDIuIGludmFsaWQgcmVjZWl2ZXIKKyAzLiB3aGVuIHNlbmRlciBpcyBub3QgcmVnaXN0ZXJlZAorIDQuIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQKKyovCisvLyBUT0RPOiBFbmFibGUgd2hlbiB0aGUgaXNzdWUgaW4gYi8yMTIxOTY0OTUgaXMgZml4ZWQKK1RFU1RfRihCdWZmZXJwb29sRnVuY3Rpb25hbGl0eVRlc3QsIERJU0FCTEVEX1ZhbGlkaXR5VGVzdCkgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzZW5kZXJCdWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90KiBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisKKyAgICAvLyBjYWxsIGFsbG9jYXRlKCkgb24gYSByYW5kb20gY29ubmVjdGlvbiBpZAorICAgIENvbm5lY3Rpb25JZCByYW5kb21JZCA9IHJhbmQoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKHJhbmRvbUlkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNlbmRlckJ1ZmZlcik7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EKTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIHJlY2VpdmVyCisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSkgPDwgInJlY2VpdmVNZXNzYWdlIGZhaWxlZFxuIjsKKyAgICBBU1NFUlRfRVEobWVzc2FnZS5kYXRhLmNvbW1hbmQsIFBpcGVDb21tYW5kOjpJTklUX09LKSA8PCAicmVjZWl2ZXIgaW5pdCBmYWlsZWQiOworCisgICAgYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHNlbmRlckJ1ZmZlci5yZXNldCgpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNlbmRlckJ1ZmZlcik7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg3NykpOworCisgICAgLy8gc2VuZCBidWZmZXJzIHcvbyByZWdpc3RlcmluZyBzZW5kZXIKKyAgICBpbnQ2NF90IHBvc3RVczsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisKKyAgICAvLyByYW5kb20gcmVjZWl2ZXIKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmFuZG9tSWQsIHNlbmRlckJ1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9ORShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJidWZmZXJwb29sIHNob3VsZG4ndCBhbGxvdyBzZW5kIG9uIHJhbmRvbSByZWNlaXZlciI7CisKKyAgICAvLyBlc3RhYmxpc2ggY29ubmVjdGlvbgorICAgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgICAgQVNTRVJUX05FKHJlY2VpdmVyLCBudWxscHRyKSA8PCAiZ2V0U2VydmljZSBmYWlsZWQgZm9yIHJlY2VpdmVyXG4iOworCisgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykKKyAgICAgICAgICAgIDw8ICJyZWdpc3RlclNlbmRlciBmYWlsZWQgZm9yIGNvbm5lY3Rpb24gaWQgIiA8PCBtQ29ubmVjdGlvbklkIDw8ICJcbiI7CisKKyAgICBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc2VuZGVyQnVmZmVyLnJlc2V0KCk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2VuZGVyQnVmZmVyKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYWxsb2NhdGUgZmFpbGVkIGZvciBjb25uZWN0aW9uICIgPDwgbUNvbm5lY3Rpb25JZDsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDg4KSk7CisKKyAgICAvLyBzZW5kIHRoZSBidWZmZXIgdG8gdGhlIHJlY2VpdmVyCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNlbmRlckJ1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJwb3N0U2VuZCBmYWlsZWQgZm9yIHJlY2VpdmVyICIgPDwgcmVjZWl2ZXJJZCA8PCAiXG4iOworCisgICAgLy8gUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpUUkFOU0ZFUjsKKyAgICBtZXNzYWdlLmRhdGEubWVtc2V0VmFsdWUgPSAweDg4OworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNlbmRlckJ1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKSA8PCAicmVjZWl2ZU1lc3NhZ2UgZmFpbGVkXG4iOworICAgIEFTU0VSVF9FUShtZXNzYWdlLmRhdGEuY29tbWFuZCwgUGlwZUNvbW1hbmQ6OlRSQU5TRkVSX09LKQorICAgICAgICAgICAgPDwgInJlY2VpdmVkIGVycm9yIGR1cmluZyBidWZmZXIgdHJhbnNmZXJcbiI7CisKKyAgICBpZiAoYWxsb2NIYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShhbGxvY0hhbmRsZSk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGFsbG9jSGFuZGxlKTsKKyAgICB9CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTVE9QOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSkgPDwgInJlY2VpdmVNZXNzYWdlIGZhaWxlZFxuIjsKKyAgICBBU1NFUlRfRVEobWVzc2FnZS5kYXRhLmNvbW1hbmQsIFBpcGVDb21tYW5kOjpTVE9QX09LKQorICAgICAgICAgICAgPDwgInJlY2VpdmVkIGVycm9yIGR1cmluZyBidWZmZXIgdHJhbnNmZXJcbiI7CisKKyAgICAvLyB0cnkgdG8gc2VuZCBtc2cgdG8gY2xvc2VkIGNvbm5lY3Rpb24KKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2VuZGVyQnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX05FKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImJ1ZmZlcnBvb2wgc2hvdWxkbid0IGFsbG93IHNlbmQgb24gY2xvc2VkIGNvbm5lY3Rpb24iOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6ZGV0YWlsczo6c2V0VHJlYmxlVGVzdGluZ092ZXJyaWRlKHRydWUpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwppbmRleCA2NzMzZTBjLi5kYjU0ZDQ1IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCkBAIC0xLDYgKzEsNSBAQAogIyBNZWRpYSB0ZWFtCiBsYWpvc0Bnb29nbGUuY29tCi1wYXdpbkBnb29nbGUuY29tCiB0YWtsZWVAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KIApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvUkVBRE1FLm1kIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmQ5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9SRUFETUUubWQKQEAgLTAsMCArMSwzMyBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEJ1ZmZlcnBvb2wgOgorVGhlIEJ1ZmZlcnBvb2wgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgYnVmZmVycG9vbCBsaWJyYXJ5IGluIGFuZHJvaWQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEJ1ZmZlcnBvb2xVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9CdWZmZXJwb29sVW5pdFRlc3QvQnVmZmVycG9vbFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQnVmZmVycG9vbFVuaXRUZXN0L0J1ZmZlcnBvb2xVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IEJ1ZmZlcnBvb2xVbml0VGVzdAorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0J1ZmZlcnBvb2xVbml0VGVzdAorYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBCdWZmZXJwb29sVW5pdFRlc3QKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL09XTkVSUyBiL21lZGlhL2NvZGVjMi9PV05FUlMKaW5kZXggNDZhOWZjYS4uN2Q0MDA0MSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL09XTkVSUworKysgYi9tZWRpYS9jb2RlYzIvT1dORVJTCkBAIC0xLDUgKzEsNCBAQAogc2V0IG5vcGFyZW50CiB3b25zaWtAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQotcGF3aW5AZ29vZ2xlLmNvbQogdGFrbGVlQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcgYi9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HCmluZGV4IDZhYzQyMTAuLjkwYmIwNTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORwpAQCAtOCw3ICs4LDE4IEBACiAgIF0sCiAgICJwcmVzdWJtaXQtbGFyZ2UiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFNaXNjVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhQXVkaW9UZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgIHsKICAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCkBAIC0xOCwxMCArMjksNTQgQEAKICAgICAgICAgfSwKICAgICAgICAgLy8gVE9ETzogYi8xNDkzMTQ0MTkKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUGxheWJhY2tDYXB0dXJlVGVzdCIKICAgICAgICAgfSwKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUmVjb3JkVGVzdCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFEZWNvZGVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhRW5jb2RlclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUNvZGVjVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhUGxheWVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCmluZGV4IDU3Y2RjZDAuLjRlNGE5YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCkBAIC0yMjEsNiArMjIxLDEyIEBACiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjT3V0cHV0TG91ZG5lc3MsIHZhbHVlKS5pblJhbmdlKC01Ny43NSwgMC4yNSl9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY091dHB1dExvdWRuZXNzKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1DaGFubmVsTWFzaywgQzJfUEFSQU1LRVlfQ0hBTk5FTF9NQVNLKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsTWFza0luZm86Om91dHB1dCgwdSwgMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbE1hc2ssIHZhbHVlKS5pblJhbmdlKDAsIDQyOTQ5NjcyOTIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsTWFzayk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgIH0KIAogICAgIGJvb2wgaXNBZHRzKCkgY29uc3QgeyByZXR1cm4gbUFhY0Zvcm1hdC0+dmFsdWUgPT0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsgfQpAQCAtMjU1LDYgKzI2MSw3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQWxidW1Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0FsYnVtTW9kZTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhDaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbU1heENoYW5uZWxDb3VudDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNPdXRwdXRMb3VkbmVzc1R1bmluZzo6b3V0cHV0PiBtRHJjT3V0cHV0TG91ZG5lc3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbE1hc2tJbmZvOjpvdXRwdXQ+IG1DaGFubmVsTWFzazsKICAgICAvLyBUT0RPIEFkZCA6IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZwogfTsKIApAQCAtODI5LDkgKzgzNiwxMSBAQAogCiAgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxNYXNrSW5mbzo6b3V0cHV0IGNoYW5uZWxNYXNrSW5mbygwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tGcm9tQ291bnQobVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSk7CiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOwogICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbywgJmNoYW5uZWxNYXNrSW5mbyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAogICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC04NDAsNiArODQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsTWFza0luZm8pKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTEwNTYsNiArMTA2Niw0NyBAQAogICAgIH0KIH0KIAorLy8gZGVmaW5pdGlvbnMgYmFzZWQgb24gYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF8qCisjZGVmaW5lIENIQU5ORUxfT1VUX0ZMICAweDQKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfRlIgIDB4OAorI2RlZmluZSBDSEFOTkVMX09VVF9GQyAgMHgxMAorI2RlZmluZSBDSEFOTkVMX09VVF9MRkUgMHgyMAorI2RlZmluZSBDSEFOTkVMX09VVF9CTCAgMHg0MAorI2RlZmluZSBDSEFOTkVMX09VVF9CUiAgMHg4MAorI2RlZmluZSBDSEFOTkVMX09VVF9TTCAgMHg4MDAKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfU1IgIDB4MTAwMAorCit1aW50MzJfdCBDMlNvZnRBYWNEZWM6Om1hc2tGcm9tQ291bnQodWludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgLy8gS0VZX0NIQU5ORUxfTUFTSyBleHBlY3RzIG1hc2tzIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSmF2YSBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0CisgICAgLy8gd2hlcmUgdGhlIHR3byBsZWZ0LW1vc3QgYml0cyBhcmUgMCBmb3Igb3V0cHV0IGNoYW5uZWwgbWFzaworICAgIHN3aXRjaCAoY2hhbm5lbENvdW50KSB7CisgICAgICAgIGNhc2UgMTogLy8gbW9ubyBpcyBmcm9udCBsZWZ0CisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMKTsKKyAgICAgICAgY2FzZSAyOiAvLyBzdGVyZW8KKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwgfCBDSEFOTkVMX09VVF9GUik7CisgICAgICAgIGNhc2UgNDogLy8gNC4wID0gc3RlcmVvIHdpdGggYmFja3MKKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwgfCBDSEFOTkVMX09VVF9GQworICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0JMIHwgQ0hBTk5FTF9PVVRfQlIpOworICAgICAgICBjYXNlIDU6IC8vIDUuMAorICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCB8IENIQU5ORUxfT1VUX0ZDIHwgQ0hBTk5FTF9PVVRfRlIKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9CTCB8IENIQU5ORUxfT1VUX0JSKTsKKyAgICAgICAgY2FzZSA2OiAvLyA1LjEgPSA1LjAgKyBMRkUKKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwgfCBDSEFOTkVMX09VVF9GQyB8IENIQU5ORUxfT1VUX0ZSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfQkwgfCBDSEFOTkVMX09VVF9CUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0xGRSk7CisgICAgICAgIGNhc2UgNzogLy8gNy4wID0gNS4wICsgU2lkZXMKKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwgfCBDSEFOTkVMX09VVF9GQyB8IENIQU5ORUxfT1VUX0ZSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfQkwgfCBDSEFOTkVMX09VVF9CUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX1NMIHwgQ0hBTk5FTF9PVVRfU1IpOworICAgICAgICBjYXNlIDg6IC8vIDcuMSA9IDcuMCArIExGRQorICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCB8IENIQU5ORUxfT1VUX0ZDIHwgQ0hBTk5FTF9PVVRfRlIKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9CTCB8IENIQU5ORUxfT1VUX0JSIHwgQ0hBTk5FTF9PVVRfU0wgfCBDSEFOTkVMX09VVF9TUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0xGRSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKIGNsYXNzIEMyU29mdEFhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKIHB1YmxpYzoKICAgICBDMlNvZnRBYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKaW5kZXggYTAzZmM3MC4uYjQ1ZjE0OCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApAQCAtMTAxLDYgKzEwMSw3IEBACiAgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKICAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKICAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworICAgIHVpbnQzMl90IG1hc2tGcm9tQ291bnQodWludDMyX3QgY2hhbm5lbENvdW50KTsKIAogICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0RlYyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKaW5kZXggYmI2M2UxZi4uN2FmZWE5MSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCkBAIC0yMjUsNyArMjI1LDcgQEAKICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgaW50NjRfdCBvdXRUaW1lU3RhbXAgPQogICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgc2l6ZV90IGluUG9zID0gMDsKICAgICBzaXplX3Qgb3V0UG9zID0gMDsKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKICAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKICAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpOwogICAgIH0KICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOwogICAgIGlmIChvdXRQb3MgIT0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaAppbmRleCA2YWIxNGRiLi40OTIwYjIzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApAQCAtNTQsNyArNTQsNyBAQAogICAgIGJvb2wgbUlzRmlyc3Q7CiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CiAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwotICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOwogICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOwogICAgIGludDMyX3QgbUZpbGxlZExlbjsKICAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKaW5kZXggODQ3MjhhZS4uMjliMTA0MCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgIGludDY0X3Qgb3V0VGltZVN0YW1wID0KICAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgIHNpemVfdCBpblBvcyA9IDA7CiAgICAgc2l6ZV90IG91dFBvcyA9IDA7CkBAIC0zNDEsNyArMzQxLDcgQEAKICAgICBBTE9HVigiY2F1c2FsIHNhbXBsZSBzaXplICVkIiwgbUZpbGxlZExlbik7CiAgICAgaWYgKG1Jc0ZpcnN0ICYmIG91dFBvcyAhPSAwKSB7CiAgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKTsKICAgICB9CiAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKICAgICBpZiAob3V0UG9zICE9IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKaW5kZXggMGNjOWU5Zi4uNzI5OTBjMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKQEAgLTU1LDcgKzU1LDcgQEAKICAgICBib29sIG1Jc0ZpcnN0OwogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwogICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKLSAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIGludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKICAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKICAgICBpbnQzMl90IG1GaWxsZWRMZW47CiAgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKaW5kZXggY2I5ODM3Zi4uYTJhNzlkNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKQEAgLTIyLDggKzIyLDQgQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0QW9tRGVjLmNwcCJdLAogICAgIHN0YXRpY19saWJzOiBbImxpYmFvbSJdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJhb20vIiwKLSAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcAppbmRleCBjMDhjZDU5Li45NmI4MWQ3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtMjYxLDggKzI2MSw3IEBACiAgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKIAotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBDMlNvZnRBb21EZWM6On5DMlNvZnRBb21EZWMoKSB7CkBAIC00NjMsMTkgKzQ2MiwxNyBAQAogICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKICAgICBpZiAoaW5TaXplKSB7CiAgICAgICAgIHVpbnQ4X3QqIGJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKLSAgICAgICAgaW50MzJfdCBkZWNvZGVUaW1lID0gMDsKLSAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CiAKICAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBiaXRzdHJlYW0sIGluU2l6ZSk7Ci0gICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwotICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbnNlY3NfdCBkZWxheSA9IG1UaW1lU3RhcnQgLSBtVGltZUVuZDsKIAogICAgICAgICBhb21fY29kZWNfZXJyX3QgZXJyID0KICAgICAgICAgICAgIGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgpOwogCi0gICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTRkIGRlbGF5PSU0ZFxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOworICAgICAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNCIgUFJJZDY0ICIgZGVsYXk9JTQiIFBSSWQ2NCAiXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CiAKICAgICAgICAgaWYgKGVyciAhPSBBT01fQ09ERUNfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lIGVycjogJWQiLCBlcnIpOwpAQCAtNTA1LDEyNCArNTAyLDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7Ci0gICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwotICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7Ci0gICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgewotICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKLSAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKLSAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOwotICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7Ci0gICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKLSAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOwotCi0gICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOwotICAgICAgICBzaXplX3QgeCA9IDA7Ci0gICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKLQotICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7Ci0gICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKLQotICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7Ci0gICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKLSAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOwotICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7Ci0KLSAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7Ci0gICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7Ci0KLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKLQotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKLSAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCi0gICAgICAgIGlmICh4IDwgd2lkdGgpIHsKLSAgICAgICAgICAgIHUwMSA9ICp1U3JjOwotICAgICAgICAgICAgdjAxID0gKnZTcmM7Ci0gICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7Ci0gICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7Ci0gICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOwotICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKLSAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgewotICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOwotICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotICAgIHJldHVybjsKLX0KIGJvb2wgQzJTb2Z0QW9tRGVjOjpvdXRwdXRCdWZmZXIoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQpAQCAtNjU3LDkgKzUzNiwxMCBAQAogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHM7CiAgICAgaWYgKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNikgewogICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CiAKICAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCiAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgpAQCAtNzA2LDI2ICs1ODYsMjEgQEAKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMigKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyQ29sb3JBc3BlY3RzU3RydWN0PihkZWZhdWx0Q29sb3JBc3BlY3RzKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lWMTIoZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ldOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKLSAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwKLSAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAotICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXI4VG9ZVjEyKGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgIH0KICAgICBmaW5pc2hXb3JrKCooaW50NjRfdCopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOwogICAgIGJsb2NrID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaAppbmRleCA0YzgyNjQ3Li44Yjk1M2ZlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCkBAIC0xNywxNSArMTcsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogI2luY2x1ZGUgImFvbS9hb21fZGVjb2Rlci5oIgogI2luY2x1ZGUgImFvbS9hb21keC5oIgogCi0jZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQzJTb2Z0QW9tRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKQEAgLTYwLDggKzU3LDggQEAKICAgICBjaGFyIG1PdXRGaWxlWzIwMF07CiAgICAgI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KIAotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorICAgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBuc2Vjc190IG1UaW1lRW5kID0gMDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQogCiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKICAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOwpAQCAtODUsMTQgKzgyLDEzIEBACiAjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAiYXYxIgogI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBBTE9HRCgiR0VORVJBVEVfRklMRV9OQU1FUyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCBtVGltZVN0YXJ0LnR2X3NlYywgXAotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lIiBQUklkNjQgIi4lcyIsIElOUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5vdywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorICAgICAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJSIgUFJJZDY0ICIuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5vdywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAogI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icAppbmRleCAwYmUxYmVkLi5hN2FlODViIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApAQCAtMTksMTAgKzE5LDcgQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0QXZjRGVjLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvZGVjb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKLSAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAogfQogCiBjY19saWJyYXJ5IHsKQEAgLTM3LDEwICszNCw3IEBACiAKICAgICBzcmNzOiBbIkMyU29mdEF2Y0VuYy5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIiLAotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCi0gICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcAppbmRleCBjYzQ1MTdkLi45NTNhZmM1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApAQCAtNjcwLDggKzY3MCw3IEBACiAKIHZvaWQgQzJTb2Z0QXZjRGVjOjpyZXNldFBsdWdpbigpIHsKICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKQEAgLTg2NiwxNCArODY1LDEzIEBACiAgICAgICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgV09SRDMyIGRlbGF5OwotICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgICAgIG1UaW1lU3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBuc2Vjc190IGRlbGF5ID0gbVRpbWVTdGFydCAtIG1UaW1lRW5kOwogICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19oMjY0ZF9kZWNvZGVfaXAsICZzX2gyNjRkX2RlY29kZV9vcCk7Ci0gICAgICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKLSAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKLSAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7Ci0gICAgICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorCisgICAgICAgICAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVjb2RlVGltZSA9IG1UaW1lRW5kIC0gbVRpbWVTdGFydDsKKyAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSUiIFBSSWQ2NCAiIGRlbGF5PSUiIFBSSWQ2NCAiIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAogICAgICAgICAgICAgICAgICAgcHNfZGVjb2RlX29wLT51NF9udW1fYnl0ZXNfY29uc3VtZWQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKaW5kZXggNTlkNTE4NC4uMzZhNDYzZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXwogCiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAKQEAgLTQzLDE5ICs0NCwxNSBAQAogI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CiAKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL2F2Y2RfaW5wdXQiCiAgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJoMjY0IgogICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lIiBQUklkNjQgImQuJXMiLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfUEFUSCwgbm93LCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KICAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKQEAgLTE4Myw4ICsxODAsOCBAQAogICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKIAogICAgIC8vIHByb2ZpbGUKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OwotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworICAgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7CisgICAgbnNlY3NfdCBtVGltZUVuZCA9IDA7CiAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQogICAgIGNoYXIgbUluRmlsZVsyMDBdOwogI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKaW5kZXggZDY1ZmZhNS4uOGI0NmQzZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKQEAgLTY1Niw4ICs2NTYsNyBAQAogICAgIG1FbnRyb3B5TW9kZSA9IERFRkFVTFRfRU5UUk9QWV9NT0RFOwogICAgIG1CZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKIAotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERpbWVuc2lvbnMoKSB7CkBAIC0xNTE1LDcgKzE1MTQsOCBAQAogICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CiAgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CiAgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOwotICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0KTsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sb3JBc3BlY3RzLT5tYXRyaXgsIG1Db2xvckFzcGVjdHMtPnJhbmdlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CkBAIC0xNjUwLDggKzE2NTAsNyBAQAogICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOwogCiAgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOwotICAgIFdPUkQzMiB0aW1lRGVsYXkgPSAwOwotICAgIFdPUkQzMiB0aW1lVGFrZW4gPSAwOworICAgIG5zZWNzX3QgdGltZURlbGF5ID0gMDsKICAgICB1aW50NjRfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpOwogCiAgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCkBAIC0xODE3LDEwICsxODE2LDEwIEBACiAgICAgICAgIC8vICAgICAgICAgbUluRmlsZSwgc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdLAogICAgICAgICAvLyAgICAgICAgIChtSGVpZ2h0ICogbVN0cmlkZSAqIDMgLyAyKSk7CiAKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CiAgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCiAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KLSAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworICAgICAgICBtVGltZVN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgICAgICB0aW1lRGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc192aWRlb19lbmNvZGVfaXAsICZzX3ZpZGVvX2VuY29kZV9vcCk7CiAKICAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CkBAIC0xODQ0LDExICsxODQzLDExIEBACiAgICAgICAgIG1CdWZmZXJzW3BzX2VuY29kZV9pcC0+c19pbnBfYnVmLmFwdl9idWZzWzBdXSA9IGlucHV0QnVmZmVyOwogICAgIH0KIAotICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCi0gICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworICAgIG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOworICAgIG5zZWNzX3QgdGltZVRha2VuID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OwogCi0gICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgIEFMT0dWKCJ0aW1lVGFrZW49JSIgUFJJZDY0ICJkIGRlbGF5PSUiIFBSSWQ2NCAiIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAogICAgICAgICAgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYudTRfYnl0ZXMpOwogCiAgICAgdm9pZCAqZnJlZWQgPSBwc19lbmNvZGVfb3AtPnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaAppbmRleCAxZmVjZDllLi4yOTM4NjdkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwogCiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApAQCAtMTE1LDE0ICsxMTYsNiBAQAogLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQogCi0vKiogR2V0IHRpbWUgKi8KLSNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7Ci0KLS8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCi0jZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7Ci0KICNkZWZpbmUgaXZlX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQogI2RlZmluZSBpdmVfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCiAKQEAgLTE0OCw2ICsxNDEsNyBAQAogICAgIHZpcnR1YWwgfkMyU29mdEF2Y0VuYygpOwogCiBwcml2YXRlOgorICAgIC8vIFJCRSBXaGF0IGRvZXMgT01YIGhhdmUgdG8gZG8gd2l0aCB0aGUgYzIgcGx1Z2luPwogICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CkBAIC0xNTgsOCArMTUyLDggQEAKIAogICAgIGludDMyX3QgbVN0cmlkZTsKIAotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorICAgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBuc2Vjc190IG1UaW1lRW5kID0gMDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQogCiAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQogICAgIGNoYXIgbUluRmlsZVsyMDBdOwpAQCAtMjU5LDE0ICsyNTMsMTQgQEAKICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKIAogI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKLSAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyUiIFBSSWQ2NCAiZC4lcyIsICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJTlBVVF9EVU1QX1BBVEgsIG5vdywgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKLSAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgIHNwcmludGYobU91dEZpbGUsICIlc18lIiBQUklkNjQgImQuJXMiLCAgICAgICAgICAgICBcCisgICAgICAgICAgICBPVVRQVVRfRFVNUF9QQVRILCBub3csICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKaW5kZXggMTYwZTI1MC4uNjY0NjQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icApAQCAtOSw2ICs5LDE2IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9jb21tb25faGVhZGVycyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCiAgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKQEAgLTI3LDYgKzM3LDExIEBACiAgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXJlY3RfaGVhZGVycyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3dfaGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcwogICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKQEAgLTM0LDYgKzQ5LDEyIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwgLy8gZm9yIE11dGV4ZWQKICAgICBdLAogCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtNjEsNiArODIsMTEgQEAKICAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhcmVjdF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvd19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCiAgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcwpAQCAtNzUsNiArMTAxLDEyIEBACiAgICAgXSwKIAogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKKworICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogfQogCiAvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKaW5kZXggNmM0YjdkOS4uOWQ0ZjA0OSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJDb21wb25lbnQiCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIApAQCAtMjYsMTAgKzI3LDM5MyBAQAogI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDb2RlYzJDb21tb25VdGlscy5oPgogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK2NvbnN0ZXhwciB1aW50OF90IGtOZXV0cmFsVVZCaXREZXB0aDggPSAxMjg7Citjb25zdGV4cHIgdWludDE2X3Qga05ldXRyYWxVVkJpdERlcHRoMTAgPSA1MTI7CiAKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDhfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGlmIChpc01vbm9jaHJvbWUpIHsKKyAgICAgICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgICAgIG1lbXNldChkc3RWLCBrTmV1dHJhbFVWQml0RGVwdGg4LCAod2lkdGggKyAxKSAvIDIpOworICAgICAgICAgICAgbWVtc2V0KGRzdFUsIGtOZXV0cmFsVVZCaXREZXB0aDgsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChoZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKyAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKWRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKShkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCAqKXNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90ICopKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QgKilzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCAqKXNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QgKil1U3JjKTsKKyAgICAgICAgICAgIHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90ICopdlNyYyk7CisgICAgICAgICAgICB2U3JjICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7CisgICAgICAgICAgICB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOworICAgICAgICAgICAgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKKyAgICAgICAgICAgIHlTcmNCb3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90ICopeVNyY0JvdCk7CisgICAgICAgICAgICB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9Cit9CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBDMkNvbG9yQXNwZWN0c1N0cnVjdCBGaWxsTWlzc2luZ0NvbG9yQXNwZWN0cygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29sb3JBc3BlY3RzU3RydWN0PiBhc3BlY3RzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0IF9hc3BlY3RzOworICAgIGlmIChhc3BlY3RzKSB7CisgICAgICAgIF9hc3BlY3RzID0gKmFzcGVjdHM7CisgICAgfQorCisgICAgLy8gdXNlIG1hdHJpeCBmb3IgY29udmVyc2lvbgorICAgIGlmIChfYXNwZWN0cy5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIC8vIGlmIG5vdCBzcGVjaWZpZWQsIGRlZHVjZSBtYXRyaXggZnJvbSBwcmltYXJpZXMKKyAgICAgICAgaWYgKF9hc3BlY3RzLnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIC8vIGlmIHRob3NlIGFyZSBhbHNvIG5vdCBzcGVjaWZpZWQsIGRlZHVjZSBwcmltYXJpZXMgZmlyc3QgZnJvbSB0cmFuc2ZlciwgdGhlbiBmcm9tCisgICAgICAgICAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICAgICAgICBpZiAoX2FzcGVjdHMudHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0CisgICAgICAgICAgICAgICAgICAgIHx8IF9hc3BlY3RzLnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX0hMRykgeworICAgICAgICAgICAgICAgIF9hc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID49IDM4NDAgfHwgaGVpZ2h0ID49IDM4NDAgfHwgd2lkdGggKiAoaW50NjRfdCloZWlnaHQgPj0gMzg0MCAqIDE2MzQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdGFnZWZyaWdodCBkZWZhdWx0cyB0byBCVC4yMDIwIGZvciBVSEQsIGJ1dCBwZXJoYXBzIHdlIHNob3VsZCBkZWZhdWx0IHRvCisgICAgICAgICAgICAgICAgLy8gQlQuNzA5IGZvciBub24tSERSIDEwLWJpdCBVSEQgY29udGVudAorICAgICAgICAgICAgICAgIC8vIChzZWUgbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcCkKKyAgICAgICAgICAgICAgICBfYXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwOworICAgICAgICAgICAgfSBlbHNlIGlmICgod2lkdGggPD0gNzIwICYmIGhlaWdodCA8PSA1NzYpCisgICAgICAgICAgICAgICAgICAgIHx8IChoZWlnaHQgPD0gNzIwICYmIHdpZHRoIDw9IDU3NikpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlOiBpdCBkb2VzIG5vdCBhY3R1YWxseSBtYXR0ZXIgd2hldGhlciB0byB1c2UgNTI1IG9yIDYyNSBoZXJlIGFzIHRoZQorICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gaXMgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICBfYXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNjI1OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfYXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKF9hc3BlY3RzLnByaW1hcmllcykgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV81MjU6CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNToKKyAgICAgICAgICAgIF9hc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9CVDYwMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5OgorICAgICAgICAgICAgX2FzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX0JUNzA5OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgX2FzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBfYXNwZWN0czsKK30KKworLy8gbWF0cml4IGNvbnZlcnNpb24gY29lZmZpY2llbnRzCisvLyAoc2VlIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVydGVyL0NvbG9yQ29udmVydGVyLmNwcCBmb3IgbW9yZSBkZXRhaWxzKQorc3RydWN0IENvZWZmcyB7CisgICAgaW50MzJfdCBfeSwgX2JfdSwgX2dfdSwgX2dfdiwgX3JfdiwgX2MxNjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQ29lZmZzIEdldENvZWZmc0ZvckFzcGVjdHMoY29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3QgJmFzcGVjdHMpIHsKKyAgICBib29sIGlzRnVsbFJhbmdlID0gYXNwZWN0cy5yYW5nZSA9PSBDMkNvbG9yOjpSQU5HRV9GVUxMOworCisgICAgc3dpdGNoIChhc3BlY3RzLm1hdHJpeCkgeworICAgIGNhc2UgQzJDb2xvcjo6TUFUUklYX0JUNjAxOgorICAgICAgICAvKioKKyAgICAgICAgICogQlQuNjAxOiAgS19SID0gMC4yOTk7ICBLX0IgPSAwLjExNAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGlzRnVsbFJhbmdlKSB7CisgICAgICAgICAgICByZXR1cm4gQ29lZmZzIHsgMTAyNCwgMTQzNiwgMzUyLCA3MzEsIDE4MTUsIDAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDb2VmZnMgeyAxMTk2LCAxNjM5LCA0MDIsIDgzNSwgMjA3MiwgNjQgfTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJDb2xvcjo6TUFUUklYX0JUNzA5OgorICAgICAgICAvKioKKyAgICAgICAgICogQlQuNzA5OiAgS19SID0gMC4yMTI2OyAgS19CID0gMC4wNzIyCisgICAgICAgICAqLworICAgICAgICBpZiAoaXNGdWxsUmFuZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2VmZnMgeyAxMDI0LCAxNjEzLCAxOTIsIDQ3OSwgMTkwMCwgMCB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIENvZWZmcyB7IDExOTYsIDE4NDEsIDIxOSwgNTQ3LCAyMTY5LCA2NCB9OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwOgorICAgIGRlZmF1bHQ6CisgICAgICAgIC8qKgorICAgICAgICAgKiBCVC4yMDIwOiAgS19SID0gMC4yNjI3OyAgS19CID0gMC4wNTkzCisgICAgICAgICAqLworICAgICAgICBpZiAoaXNGdWxsUmFuZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2VmZnMgeyAxMDI0LCAxNTEwLCAxNjksIDU4NSwgMTkyNywgMCB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIENvZWZmcyB7IDExOTYsIDE3MjQsIDE5MiwgNjY4LCAyMjAwLCA2NCB9OworICAgICAgICB9CisgICAgfQorfQorCit9CisKKyNkZWZpbmUgQ0xJUDMobWluLCB2LCBtYXgpICgoKHYpIDwgKG1pbikpID8gKG1pbikgOiAoKChtYXgpID4gKHYpKSA/ICh2KSA6IChtYXgpKSkKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9SR0JBMTAxMDEwMigKKyAgICAgICAgdWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAorICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLAorICAgICAgICBzaXplX3QgaGVpZ2h0LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+IGFzcGVjdHMpIHsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0IF9hc3BlY3RzID0gRmlsbE1pc3NpbmdDb2xvckFzcGVjdHMoYXNwZWN0cywgd2lkdGgsIGhlaWdodCk7CisKKyAgICBzdHJ1Y3QgQ29lZmZzIGNvZWZmcyA9IEdldENvZWZmc0ZvckFzcGVjdHMoX2FzcGVjdHMpOworCisgICAgaW50MzJfdCBfeSA9IGNvZWZmcy5feTsKKyAgICBpbnQzMl90IF9iX3UgPSBjb2VmZnMuX2JfdTsKKyAgICBpbnQzMl90IF9uZWdfZ191ID0gLWNvZWZmcy5fZ191OworICAgIGludDMyX3QgX25lZ19nX3YgPSAtY29lZmZzLl9nX3Y7CisgICAgaW50MzJfdCBfcl92ID0gY29lZmZzLl9yX3Y7CisgICAgaW50MzJfdCBfYzE2ID0gY29lZmZzLl9jMTY7CisKKyAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKWRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKShkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCAqKXNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90ICopKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QgKilzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCAqKXNyY1Y7CisKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICBpbnQzMl90IHUsIHYsIHkwMCwgeTAxLCB5MTAsIHkxMTsKKyAgICAgICAgICAgIHUgPSAqdVNyYyAtIDUxMjsKKyAgICAgICAgICAgIHVTcmMgKz0gMTsKKyAgICAgICAgICAgIHYgPSAqdlNyYyAtIDUxMjsKKyAgICAgICAgICAgIHZTcmMgKz0gMTsKKworICAgICAgICAgICAgeTAwID0gKnlTcmNUb3AgLSBfYzE2OworICAgICAgICAgICAgeVNyY1RvcCArPSAxOworICAgICAgICAgICAgeTAxID0gKnlTcmNUb3AgLSBfYzE2OworICAgICAgICAgICAgeVNyY1RvcCArPSAxOworICAgICAgICAgICAgeTEwID0gKnlTcmNCb3QgLSBfYzE2OworICAgICAgICAgICAgeVNyY0JvdCArPSAxOworICAgICAgICAgICAgeTExID0gKnlTcmNCb3QgLSBfYzE2OworICAgICAgICAgICAgeVNyY0JvdCArPSAxOworCisgICAgICAgICAgICBpbnQzMl90IHVfYiA9IHUgKiBfYl91OworICAgICAgICAgICAgaW50MzJfdCB1X2cgPSB1ICogX25lZ19nX3U7CisgICAgICAgICAgICBpbnQzMl90IHZfZyA9IHYgKiBfbmVnX2dfdjsKKyAgICAgICAgICAgIGludDMyX3Qgdl9yID0gdiAqIF9yX3Y7CisKKyAgICAgICAgICAgIGludDMyX3QgeU11bHQsIGIsIGcsIHI7CisgICAgICAgICAgICB5TXVsdCA9IHkwMCAqIF95ICsgNTEyOworICAgICAgICAgICAgYiA9ICh5TXVsdCArIHVfYikgLyAxMDI0OworICAgICAgICAgICAgZyA9ICh5TXVsdCArIHZfZyArIHVfZykgLyAxMDI0OworICAgICAgICAgICAgciA9ICh5TXVsdCArIHZfcikgLyAxMDI0OworICAgICAgICAgICAgYiA9IENMSVAzKDAsIGIsIDEwMjMpOworICAgICAgICAgICAgZyA9IENMSVAzKDAsIGcsIDEwMjMpOworICAgICAgICAgICAgciA9IENMSVAzKDAsIHIsIDEwMjMpOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8IChiIDw8IDIwKSB8IChnIDw8IDEwKSB8IHI7CisKKyAgICAgICAgICAgIHlNdWx0ID0geTAxICogX3kgKyA1MTI7CisgICAgICAgICAgICBiID0gKHlNdWx0ICsgdV9iKSAvIDEwMjQ7CisgICAgICAgICAgICBnID0gKHlNdWx0ICsgdl9nICsgdV9nKSAvIDEwMjQ7CisgICAgICAgICAgICByID0gKHlNdWx0ICsgdl9yKSAvIDEwMjQ7CisgICAgICAgICAgICBiID0gQ0xJUDMoMCwgYiwgMTAyMyk7CisgICAgICAgICAgICBnID0gQ0xJUDMoMCwgZywgMTAyMyk7CisgICAgICAgICAgICByID0gQ0xJUDMoMCwgciwgMTAyMyk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKGIgPDwgMjApIHwgKGcgPDwgMTApIHwgcjsKKworICAgICAgICAgICAgeU11bHQgPSB5MTAgKiBfeSArIDUxMjsKKyAgICAgICAgICAgIGIgPSAoeU11bHQgKyB1X2IpIC8gMTAyNDsKKyAgICAgICAgICAgIGcgPSAoeU11bHQgKyB2X2cgKyB1X2cpIC8gMTAyNDsKKyAgICAgICAgICAgIHIgPSAoeU11bHQgKyB2X3IpIC8gMTAyNDsKKyAgICAgICAgICAgIGIgPSBDTElQMygwLCBiLCAxMDIzKTsKKyAgICAgICAgICAgIGcgPSBDTElQMygwLCBnLCAxMDIzKTsKKyAgICAgICAgICAgIHIgPSBDTElQMygwLCByLCAxMDIzKTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoYiA8PCAyMCkgfCAoZyA8PCAxMCkgfCByOworCisgICAgICAgICAgICB5TXVsdCA9IHkxMSAqIF95ICsgNTEyOworICAgICAgICAgICAgYiA9ICh5TXVsdCArIHVfYikgLyAxMDI0OworICAgICAgICAgICAgZyA9ICh5TXVsdCArIHZfZyArIHVfZykgLyAxMDI0OworICAgICAgICAgICAgciA9ICh5TXVsdCArIHZfcikgLyAxMDI0OworICAgICAgICAgICAgYiA9IENMSVAzKDAsIGIsIDEwMjMpOworICAgICAgICAgICAgZyA9IENMSVAzKDAsIGcsIDEwMjMpOworICAgICAgICAgICAgciA9IENMSVAzKDAsIHIsIDEwMjMpOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8IChiIDw8IDIwKSB8IChnIDw8IDEwKSB8IHI7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxME9yUkdCQTEwMTAxMDIoCisgICAgICAgIHVpbnQzMl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwKKyAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29sb3JBc3BlY3RzU3RydWN0PiBhc3BlY3RzKSB7CisgICAgaWYgKGlzQXRMZWFzdFQoKSkgeworICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1JHQkExMDEwMTAyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNWU3RyaWRlLCBkc3RTdHJpZGUsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMChkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lWMTIodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDE2X3QgKnNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUpIHsKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGlmIChpc01vbm9jaHJvbWUpIHsKKyAgICAgICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KKyAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgICAgIG1lbXNldChkc3RWLCBrTmV1dHJhbFVWQml0RGVwdGg4LCAod2lkdGggKyAxKSAvIDIpOworICAgICAgICAgICAgbWVtc2V0KGRzdFUsIGtOZXV0cmFsVVZCaXREZXB0aDgsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1AwMTAodWludDE2X3QgKmRzdFksIHVpbnQxNl90ICpkc3RVViwgY29uc3QgdWludDE2X3QgKnNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUpIHsKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9IHNyY1lbeF0gPDwgNjsKKyAgICAgICAgfQorICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBpZiAoaXNNb25vY2hyb21lKSB7CisgICAgICAgIC8vIEZpbGwgd2l0aCBuZXV0cmFsIFUvViB2YWx1ZXMuCisgICAgICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICAgICAgZHN0VVZbMiAqIHhdID0ga05ldXRyYWxVVkJpdERlcHRoMTAgPDwgNjsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogeCArIDFdID0ga05ldXRyYWxVVkJpdERlcHRoMTAgPDwgNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFVWICs9IGRzdFVWU3RyaWRlOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVVlsyICogeF0gPSBzcmNVW3hdIDw8IDY7CisgICAgICAgICAgICBkc3RVVlsyICogeCArIDFdID0gc3JjVlt4XSA8PCA2OworICAgICAgICB9CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVViArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CiBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwb3BfZnJvbnQoKSB7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHN0ZDo6bW92ZShtUXVldWUuZnJvbnQoKS53b3JrKTsKICAgICBtUXVldWUucG9wX2Zyb250KCk7CkBAIC01OTEsNiArOTc1LDM3IEBACiAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CiB9CiAKK2ludCBTaW1wbGVDMkNvbXBvbmVudDo6Z2V0SGFsUGl4ZWxGb3JtYXRGb3JCaXREZXB0aDEwKGJvb2wgYWxsb3dSR0JBMTAxMDEwMikgeworICAgIC8vIFNhdmUgc3VwcG9ydGVkIGhhbCBwaXhlbCBmb3JtYXRzIGZvciBiaXQgZGVwdGggb2YgMTAsIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkCisgICAgaWYgKCFtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0cy5zaXplKCkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBoYWxQaXhlbEZvcm1hdHM7CisgICAgICAgIGhhbFBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKTsKKworICAgICAgICAvLyBzaW5jZSBhbGxvd1JHQkExMDEwMTAyIGNhbiBjaGFuY2UgaW4gZWFjaCBjYWxsLCBidXQgbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHMKKyAgICAgICAgLy8gaXMgcG9wdWxhdGVkIG9ubHkgb25jZSwgYWxsb3dSR0JBMTAxMDEwMiBpcyBub3QgY29uc2lkZXJlZCBhdCB0aGlzIHN0YWdlLgorICAgICAgICBoYWxQaXhlbEZvcm1hdHMucHVzaF9iYWNrKEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKTsKKworICAgICAgICBmb3IgKGludCBoYWxQaXhlbEZvcm1hdCA6IGhhbFBpeGVsRm9ybWF0cykgeworICAgICAgICAgICAgaWYgKGlzSGFsUGl4ZWxGb3JtYXRTdXBwb3J0ZWQoKEFIYXJkd2FyZUJ1ZmZlcl9Gb3JtYXQpaGFsUGl4ZWxGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHMucHVzaF9iYWNrKGhhbFBpeGVsRm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgWVYxMiBpbiB0aGUgZW5kIGFzIGEgZmFsbC1iYWNrIG9wdGlvbgorICAgICAgICBtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKKyAgICB9CisgICAgLy8gRnJvbSBBbmRyb2lkIFQgb253YXJkcywgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIgY29ycmVzcG9uZHMgdG8gdHJ1ZQorICAgIC8vIFJHQkEgMTAxMDEwMiBmb3JtYXQgdW5saWtlIGVhcmxpZXIgdmVyc2lvbnMgd2hlcmUgaXQgd2FzIHVzZWQgdG8gcmVwcmVzZW50CisgICAgLy8gWVVWQSAxMDEwMTAyIGRhdGEKKyAgICBpZiAoIWlzQXRMZWFzdFQoKSkgeworICAgICAgICAvLyBXaGVuIFJHQkExMDEwMTAyIGlzIG5vdCBhbGxvd2VkIGFuZCBpZiB0aGUgZmlyc3Qgc3VwcG9ydGVkIGhhbCBwaXhlbCBpcyBmb3JtYXQgaXMKKyAgICAgICAgLy8gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIsIHRoZW4gcmV0dXJuIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorICAgICAgICBpZiAoIWFsbG93UkdCQTEwMTAxMDIgJiYgbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHNbMF0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBmcm9tIHN1cHBvcnRlZCBmb3JtYXRzCisgICAgcmV0dXJuIG1CaXREZXB0aDEwSGFsUGl4ZWxGb3JtYXRzWzBdOworfQogc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewogICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZShvZmZzZXQsIHNpemUsIDo6QzJGZW5jZSgpKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCmluZGV4IDI5NzQwZDEuLjk5M2U2MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCkBAIC0yOCw2ICsyOCwxNCBAQAogCiAvKiBTaW1wbGVJbnRlcmZhY2UgKi8KIAorc3RhdGljIEMyUiBTdWJzY3JpYmVkUGFyYW1JbmRpY2VzU2V0dGVyKAorICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz4gJm1lKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpbWU7CisKKyAgICByZXR1cm4gQzJSOjpPaygpOworfQorCiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6OkJhc2VQYXJhbXMoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJnJlZmxlY3RvciwKICAgICAgICAgQzJTdHJpbmcgbmFtZSwKQEAgLTE4Niw3ICsxOTQsNyBAQAogICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQogICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzWzBdKS5hbnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlcykuYW55KCkgfSkKLSAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1NldHRlcikKICAgICAgICAgICAgIC5idWlsZCgpKTsKIAogICAgIC8qIFRPRE8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKaW5kZXggZTVlMTZkOC4uNzYwMGM1YiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKQEAgLTI2LDggKzI2LDM1IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CiAKK3N0cnVjdCBDMkNvbG9yQXNwZWN0c1N0cnVjdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXI4VG9ZVjEyKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2UpOworCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxME9yUkdCQTEwMTAxMDIoCisgICAgICAgIHVpbnQzMl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwKKyAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29sb3JBc3BlY3RzU3RydWN0PiBhc3BlY3RzID0gbnVsbHB0cik7CisKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVjEyKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2UpOworCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvUDAxMCh1aW50MTZfdCAqZHN0WSwgdWludDE2X3QgKmRzdFVWLCBjb25zdCB1aW50MTZfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlKTsKKwogY2xhc3MgU2ltcGxlQzJDb21wb25lbnQKICAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNpbXBsZUMyQ29tcG9uZW50PiB7CiBwdWJsaWM6CkBAIC0xNDksNiArMTc2LDcgQEAKICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE5PX0RSQUlOID0gfjB1OwogCiAgICAgQzJSZWFkVmlldyBtRHVtbXlSZWFkVmlldzsKKyAgICBpbnQgZ2V0SGFsUGl4ZWxGb3JtYXRGb3JCaXREZXB0aDEwKGJvb2wgYWxsb3dSR0JBMTAxMDEwMik7CiAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKQEAgLTIzMiw2ICsyNjAsNyBAQAogICAgIGNsYXNzIEJsb2NraW5nQmxvY2tQb29sOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxCbG9ja2luZ0Jsb2NrUG9vbD4gbU91dHB1dEJsb2NrUG9vbDsKIAorICAgIHN0ZDo6dmVjdG9yPGludD4gbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHM7CiAgICAgU2ltcGxlQzJDb21wb25lbnQoKSA9IGRlbGV0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKaW5kZXggMjA1MWQzZC4uOTE2ZjM5MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKQEAgLTIwOSw2ICsyMDksNyBAQAogICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOwogICAgIH0KIAorICAgIC8vIFRPRE8oYi8yMzAxNDY3NzEpOiBmaXggY3Jhc2gKICAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMoCiAgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgewogICAgICAgICAodm9pZCltYXlCbG9jazsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icAppbmRleCBkNmZmZDEyLi4yYTExYzAxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCkBAIC0xNSw5ICsxNSw2IEBACiAgICAgICAgICJjb2RlYzIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCmluZGV4IDc2OTJkMzcuLjE2MjMzOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKQEAgLTIyLDQgKzIyLDEwIEBACiAKICAgICBzcmNzOiBbIkMyU29mdEdhdjFEZWMuY3BwIl0sCiAgICAgc3RhdGljX2xpYnM6IFsibGliZ2F2MSJdLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKaW5kZXggMWNjZWFmMi4uNGRlYzU3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCkBAIC0yMCw2ICsyMCw4IEBACiAKICNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPENvZGVjMkNvbW1vblV0aWxzLmg+CiAjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CkBAIC0yNywxMSArMjksNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciB1aW50OF90IE5FVVRSQUxfVVZfVkFMVUUgPSAxMjg7Ci0KLX0gIC8vIG5hbWVzcGFjZQogCiAvLyBjb2RlY25hbWUgc2V0IGFuZCBwYXNzZWQgaW4gYXMgYSBjb21waWxlIGZsYWcgZnJvbSBBbmRyb2lkLmJwCiBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gQ09ERUNOQU1FOwpAQCAtMTk0LDExICsxOTEsMjMgQEAKICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQogICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGl4ZWxGb3JtYXRzID0ge0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OH07CisgICAgaWYgKGlzSGFsUGl4ZWxGb3JtYXRTdXBwb3J0ZWQoKEFIYXJkd2FyZUJ1ZmZlcl9Gb3JtYXQpSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKSkgeworICAgICAgICBwaXhlbEZvcm1hdHMucHVzaF9iYWNrKEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCk7CisgICAgfQorICAgIC8vIElmIGNvbG9yIGZvcm1hdCBzdXJmYWNlIGlzbid0IGFkZGVkIHRvIHN1cHBvcnRlZCBmb3JtYXRzLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdworICAgIC8vIHdoZW4gdGhlIGNvbG9yLWZvcm1hdCBpcyBjb25maWd1cmVkIHRvIHN1cmZhY2UuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJlIGFibGUgdG8KKyAgICAvLyBjaG9vc2UgMTAtYml0IGZvcm1hdCB3aGlsZSBkZWNvZGluZyAxMC1iaXQgY2xpcHMgaW4gc3VyZmFjZSBtb2RlLgorICAgIHBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKwogICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPwotICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKLSAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKLSAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGl4ZWxGb3JtYXQsIHZhbHVlKS5vbmVPZihwaXhlbEZvcm1hdHMpfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QaXhlbEZvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOwogICB9CiAKICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCkBAIC0zMTksNiArMzI4LDkgQEAKICAgICByZXR1cm4gQzJSOjpPaygpOwogICB9CiAKKyAgLy8gdW5zYWZlIGdldHRlcnMKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IGdldFBpeGVsRm9ybWF0X2woKSBjb25zdCB7IHJldHVybiBtUGl4ZWxGb3JtYXQ7IH0KKwogIHByaXZhdGU6CiAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOwogICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CkBAIC0zMzksOCArMzUxLDcgQEAKICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAogICAgICAgbUludGYoaW50ZkltcGwpLAogICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpIHsKLSAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgIG1UaW1lU3RhcnQgPSBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKIH0KIAogQzJTb2Z0R2F2MURlYzo6fkMyU29mdEdhdjFEZWMoKSB7IG9uUmVsZWFzZSgpOyB9CkBAIC00MDcsNiArNDE4LDExIEBACiBib29sIEMyU29mdEdhdjFEZWM6OmluaXREZWNvZGVyKCkgewogICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICBtSGFsUGl4ZWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgIHsKKyAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgbVBpeGVsRm9ybWF0SW5mbyA9IG1JbnRmLT5nZXRQaXhlbEZvcm1hdF9sKCk7CisgIH0KICAgbUNvZGVjQ3R4LnJlc2V0KG5ldyBsaWJnYXYxOjpEZWNvZGVyKCkpOwogCiAgIGlmIChtQ29kZWNDdHggPT0gbnVsbHB0cikgewpAQCAtNTEwLDE5ICs1MjYsMTcgQEAKICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOwogICBpZiAoaW5TaXplKSB7CiAgICAgdWludDhfdCAqYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKLSAgICBpbnQzMl90IGRlY29kZVRpbWUgPSAwOwotICAgIGludDMyX3QgZGVsYXkgPSAwOwogCi0gICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICBuc2Vjc190IGRlbGF5ID0gbVRpbWVTdGFydCAtIG1UaW1lRW5kOwogCiAgICAgY29uc3QgTGliZ2F2MVN0YXR1c0NvZGUgc3RhdHVzID0KICAgICAgICAgbUNvZGVjQ3R4LT5FbnF1ZXVlRnJhbWUoYml0c3RyZWFtLCBpblNpemUsIGZyYW1lSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYnVmZmVyX3ByaXZhdGVfZGF0YT0qL251bGxwdHIpOwogCi0gICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7Ci0gICAgQUxPR1YoImRlY29kZVRpbWU9JTRkIGRlbGF5PSU0ZFxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOworICAgIG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOworICAgIG5zZWNzX3QgZGVjb2RlVGltZSA9IG1UaW1lRW5kIC0gbVRpbWVTdGFydDsKKyAgICBBTE9HVigiZGVjb2RlVGltZT0lNCIgUFJJZDY0ICIgZGVsYXk9JTQiIFBSSWQ2NCAiXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CiAKICAgICBpZiAoc3RhdHVzICE9IGtMaWJnYXYxU3RhdHVzT2spIHsKICAgICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiBzdGF0dXM6ICVkLiIsIHN0YXR1cyk7CkBAIC01NDQsMTUwICs1NTgsNiBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUpIHsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKLSAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICB9Ci0KLSAgaWYgKGlzTW9ub2Nocm9tZSkgewotICAgIC8vIEZpbGwgd2l0aCBuZXV0cmFsIFUvViB2YWx1ZXMuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKLSAgICAgIG1lbXNldChkc3RWLCBORVVUUkFMX1VWX1ZBTFVFLCAod2lkdGggKyAxKSAvIDIpOwotICAgICAgbWVtc2V0KGRzdFUsIE5FVVRSQUxfVVZfVkFMVUUsICh3aWR0aCArIDEpIC8gMik7Ci0gICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0Viwgc3JjViwgKHdpZHRoICsgMSkgLyAyKTsKLSAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKGhlaWdodCArIDEpIC8gMjsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdFUsIHNyY1UsICh3aWR0aCArIDEpIC8gMik7Ci0gICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBoZWlnaHQpIHsKLSAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKLSAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgewotICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKilkc3Q7Ci0gICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKShkc3QgKyBkc3RTdHJpZGUpOwotICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90ICopc3JjWTsKLSAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCAqKShzcmNZICsgc3JjWVN0cmlkZSk7Ci0gICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QgKilzcmNVOwotICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90ICopc3JjVjsKLQotICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOwotICAgIHNpemVfdCB4ID0gMDsKLSAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7Ci0gICAgICB1MDEgPSAqKCh1aW50MzJfdCAqKXVTcmMpOwotICAgICAgdVNyYyArPSAyOwotICAgICAgdjAxID0gKigodWludDMyX3QgKil2U3JjKTsKLSAgICAgIHZTcmMgKz0gMjsKLQotICAgICAgeTAxID0gKigodWludDMyX3QgKil5U3JjVG9wKTsKLSAgICAgIHlTcmNUb3AgKz0gMjsKLSAgICAgIHkyMyA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7Ci0gICAgICB5U3JjVG9wICs9IDI7Ci0gICAgICB5NDUgPSAqKCh1aW50MzJfdCAqKXlTcmNCb3QpOwotICAgICAgeVNyY0JvdCArPSAyOwotICAgICAgeTY3ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKLSAgICAgIHlTcmNCb3QgKz0gMjsKLQotICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKLSAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKLQotICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOwotCi0gICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0gICAgfQotCi0gICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKLSAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KLSAgICBpZiAoeCA8IHdpZHRoKSB7Ci0gICAgICB1MDEgPSAqdVNyYzsKLSAgICAgIHYwMSA9ICp2U3JjOwotICAgICAgeTAxID0gKigodWludDMyX3QgKil5U3JjVG9wKTsKLSAgICAgIHk0NSA9ICooKHVpbnQzMl90ICopeVNyY0JvdCk7Ci0gICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOwotICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgfQotCi0gICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKLSAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCi0gICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKLSAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBib29sIGlzTW9ub2Nocm9tZSkgewotCi0gIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKLSAgICB9Ci0KLSAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICB9Ci0KLSAgaWYgKGlzTW9ub2Nocm9tZSkgewotICAgIC8vIEZpbGwgd2l0aCBuZXV0cmFsIFUvViB2YWx1ZXMuCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKLSAgICAgIG1lbXNldChkc3RWLCBORVVUUkFMX1VWX1ZBTFVFLCAod2lkdGggKyAxKSAvIDIpOwotICAgICAgbWVtc2V0KGRzdFUsIE5FVVRSQUxfVVZfVkFMVUUsICh3aWR0aCArIDEpIC8gMik7Ci0gICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7Ci0gICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7Ci0gICAgfQotCi0gICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gIH0KLX0KLQogdm9pZCBDMlNvZnRHYXYxRGVjOjpnZXRWdWlQYXJhbXMoY29uc3QgbGliZ2F2MTo6RGVjb2RlckJ1ZmZlciAqYnVmZmVyKSB7CiAgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gYnVmZmVyLT5jb2xvcl9wcmltYXJ5OwpAQCAtNzc2LDI0ICs2NDYsNDQgQEAKIAogICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOwogICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7Ci0gIGlmIChidWZmZXItPmJpdGRlcHRoID09IDEwKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gY29kZWRDb2xvckFzcGVjdHM7CisgIGlmIChidWZmZXItPmJpdGRlcHRoID09IDEwICYmIG1QaXhlbEZvcm1hdEluZm8tPnZhbHVlICE9IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkgewogICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gY29kZWRDb2xvckFzcGVjdHMgPQotICAgICAgICBtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKTsKLQorICAgIGNvZGVkQ29sb3JBc3BlY3RzID0gbUludGYtPmdldENvbG9yQXNwZWN0c19sKCk7CisgICAgYm9vbCBhbGxvd1JHQkExMDEwMTAyID0gZmFsc2U7CiAgICAgaWYgKGNvZGVkQ29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgogICAgICAgICBjb2RlZENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKICAgICAgICAgY29kZWRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgewotICAgICAgaWYgKGJ1ZmZlci0+aW1hZ2VfZm9ybWF0ICE9IGxpYmdhdjE6OmtJbWFnZUZvcm1hdFl1djQyMCkgeworICAgICAgYWxsb3dSR0JBMTAxMDEwMiA9IHRydWU7CisgICAgfQorICAgIGZvcm1hdCA9IGdldEhhbFBpeGVsRm9ybWF0Rm9yQml0RGVwdGgxMChhbGxvd1JHQkExMDEwMTAyKTsKKyAgICBpZiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgJiYKKyAgICAgICAgKGJ1ZmZlci0+aW1hZ2VfZm9ybWF0ICE9IGxpYmdhdjE6OmtJbWFnZUZvcm1hdFl1djQyMCkpIHsKICAgICAgICAgQUxPR0UoIk9ubHkgWVVWNDIwIG91dHB1dCBpcyBzdXBwb3J0ZWQgd2hlbiB0YXJnZXRpbmcgUkdCQV8xMDEwMTAyIik7Ci0gICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09NSVRURUQ7Ci0gICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09NSVRURUQ7CisgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQorCisgIGlmIChtSGFsUGl4ZWxGb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCBwaXhlbEZvcm1hdCgwdSwgZm9ybWF0KTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnBpeGVsRm9ybWF0IH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICBDMlBhcmFtOjpDb3B5KHBpeGVsRm9ybWF0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHBpeGVsRm9ybWF0IGZhaWxlZCIpOworICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbUhhbFBpeGVsRm9ybWF0ID0gZm9ybWF0OworICB9CisKICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKIAogICAvLyBXZSBhbHdheXMgY3JlYXRlIGEgZ3JhcGhpYyBibG9jayB0aGF0IGlzIHdpZHRoIGFsaWduZWQgdG8gMTYgYW5kIGhlaWdodApAQCAtODM3LDIyICs3MjcsMjYgQEAKICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWJ1ZmZlci0+cGxhbmVbMl07CiAKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7Ci0gICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCi0gICAgICAgICAgKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAotICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMigKKyAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+KGNvZGVkQ29sb3JBc3BlY3RzKSk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKSB7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvUDAxMCgodWludDE2X3QgKilkc3RZLCAodWludDE2X3QgKilkc3RVLCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RVVlN0cmlkZSAvIDIsIG1XaWR0aCwgbUhlaWdodCwgaXNNb25vY2hyb21lKTsKICAgICB9IGVsc2UgewotICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAotICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0LAotICAgICAgICAgIGlzTW9ub2Nocm9tZSk7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGlzTW9ub2Nocm9tZSk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMF07CiAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVsxXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzJdOwotICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSgKLSAgICAgICAgZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKLSAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCwgaXNNb25vY2hyb21lKTsKKyAgICBjb252ZXJ0WVVWNDIwUGxhbmFyOFRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQsIGlzTW9ub2Nocm9tZSk7CiAgIH0KICAgZmluaXNoV29yayhidWZmZXItPnVzZXJfcHJpdmF0ZV9kYXRhLCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKICAgYmxvY2sgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaAppbmRleCAxMzRmYTBkLi4zZDRkYjU1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfR0FWMV9ERUNfSF8KICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0dBVjFfREVDX0hfCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgpAQCAtMjQsMTEgKzI2LDYgQEAKICNpbmNsdWRlICJsaWJnYXYxL3NyYy9nYXYxL2RlY29kZXIuaCIKICNpbmNsdWRlICJsaWJnYXYxL3NyYy9nYXYxL2RlY29kZXJfc2V0dGluZ3MuaCIKIAotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEMyU29mdEdhdjFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewpAQCAtNTQsNiArNTEsMTEgQEAKICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKICAgc3RkOjp1bmlxdWVfcHRyPGxpYmdhdjE6OkRlY29kZXI+IG1Db2RlY0N0eDsKIAorICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXRJbmZvOworCisgIHVpbnQzMl90IG1IYWxQaXhlbEZvcm1hdDsKICAgdWludDMyX3QgbVdpZHRoOwogICB1aW50MzJfdCBtSGVpZ2h0OwogICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CkBAIC04MCw4ICs4Miw4IEBACiAgICAgICB9CiAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKIAotICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKLSAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOyAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgbnNlY3NfdCBtVGltZUVuZCA9IDA7ICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQogCiAgIGJvb2wgaW5pdERlY29kZXIoKTsKICAgdm9pZCBnZXRWdWlQYXJhbXMoY29uc3QgbGliZ2F2MTo6RGVjb2RlckJ1ZmZlciAqYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCmluZGV4IDJhNmFkY2EuLjVhNjYwYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApAQCAtNjYzLDggKzY2Myw3IEBACiAKIHZvaWQgQzJTb2Z0SGV2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CiAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgewpAQCAtODU4LDE0ICs4NTcsMTMgQEAKICAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCiAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOwogICAgICAgICB9Ci0gICAgICAgIFdPUkQzMiBkZWxheTsKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworCisgICAgICAgIG1UaW1lU3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgcHNfZGVjb2RlX2lwLCBwc19kZWNvZGVfb3ApOwotICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKLSAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOwotICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNiIgUFJJZDY0ICIgZGVsYXk9JTYiIFBSSWQ2NCAiIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAogICAgICAgICAgICAgICBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CiAgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKaW5kZXggYjkyOTZlOS4uNmFiZjY5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgpAQCAtNDEsMTAgKzQyLDYgQEAKICNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCiAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKICNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKIAogCiBzdHJ1Y3QgQzJTb2Z0SGV2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CkBAIC0xNDIsOCArMTM5LDggQEAKICAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CiAKICAgICAvLyBwcm9maWxlCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyAgICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOworICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOwogCiAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0SGV2Y0RlYyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKaW5kZXggNjRjYzE3NS4uNjBkNTg3NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCkBAIC0yNDUsNiArMjQ1LDE5IEBACiAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlciwgbUNvbG9yQXNwZWN0cykKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1FVQU5USVpBVElPTikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGV4Q291bnQgKi8sIDB1IC8qIHN0cmVhbSAqLykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGljdHVyZVF1YW50aXphdGlvbiwgbS52YWx1ZXNbMF0udHlwZV8pLm9uZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QzJDb25maWc6OnBpY3R1cmVfdHlwZV90KElfRlJBTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBtLnZhbHVlc1swXS5taW4pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVBpY3R1cmVRdWFudGl6YXRpb24sIG0udmFsdWVzWzBdLm1heCkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFBpY3R1cmVRdWFudGl6YXRpb25TZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgIH0KIAogICAgIHN0YXRpYyBDMlIgSW5wdXREZWxheVNldHRlcigKQEAgLTQ2NCw5ICs0NzcsNjkgQEAKICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXg7CiAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgfQorICAgIHN0YXRpYyBDMlIgUGljdHVyZVF1YW50aXphdGlvblNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKworICAgICAgICAvLyB0aGVzZSBhcmUgdGhlIG9uZXMgd2UncmUgZ29pbmcgdG8gc2V0LCBzbyB3YW50IHRoZW0gdG8gZGVmYXVsdAorICAgICAgICAvLyB0byB0aGUgREVGQVVMVCB2YWx1ZXMgZm9yIHRoZSBjb2RlYworICAgICAgICBpbnQzMl90IGlNaW4gPSBIRVZDX1FQX01JTiwgcE1pbiA9IEhFVkNfUVBfTUlOLCBiTWluID0gSEVWQ19RUF9NSU47CisgICAgICAgIGludDMyX3QgaU1heCA9IEhFVkNfUVBfTUFYLCBwTWF4ID0gSEVWQ19RUF9NQVgsIGJNYXggPSBIRVZDX1FQX01BWDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lLnYuZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0ICZsYXllciA9IG1lLnYubS52YWx1ZXNbaV07CisKKyAgICAgICAgICAgIC8vIGxheWVyTWluIGlzIGNsYW1wZWQgdG8gW0hFVkNfUVBfTUlOLCBsYXllck1heF0gdG8gYXZvaWQgZXJyb3IKKyAgICAgICAgICAgIC8vIGNhc2VzIHdoZXJlIGxheWVyLm1pbiA+IGxheWVyLm1heAorICAgICAgICAgICAgaW50MzJfdCBsYXllck1heCA9IHN0ZDo6Y2xhbXAobGF5ZXIubWF4LCBIRVZDX1FQX01JTiwgSEVWQ19RUF9NQVgpOworICAgICAgICAgICAgaW50MzJfdCBsYXllck1pbiA9IHN0ZDo6Y2xhbXAobGF5ZXIubWluLCBIRVZDX1FQX01JTiwgbGF5ZXJNYXgpOworICAgICAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIGlNYXggPSBsYXllck1heDsKKyAgICAgICAgICAgICAgICBpTWluID0gbGF5ZXJNaW47CisgICAgICAgICAgICAgICAgQUxPR1YoImlNaW4gJWQgaU1heCAlZCIsIGlNaW4sIGlNYXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBwTWF4ID0gbGF5ZXJNYXg7CisgICAgICAgICAgICAgICAgcE1pbiA9IGxheWVyTWluOworICAgICAgICAgICAgICAgIEFMT0dWKCJwTWluICVkIHBNYXggJWQiLCBwTWluLCBwTWF4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KEJfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgYk1heCA9IGxheWVyTWF4OworICAgICAgICAgICAgICAgIGJNaW4gPSBsYXllck1pbjsKKyAgICAgICAgICAgICAgICBBTE9HVigiYk1pbiAlZCBiTWF4ICVkIiwgYk1pbiwgYk1heCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiUGljdHVyZVF1YW50aXphdGlvblNldHRlcihlbnRyeSk6IGkgJWQtJWQgcCAlZC0lZCBiICVkLSVkIiwKKyAgICAgICAgICAgICAgaU1pbiwgaU1heCwgcE1pbiwgcE1heCwgYk1pbiwgYk1heCk7CisKKyAgICAgICAgaW50MzJfdCBtYXhGcmFtZVFQID0gc3RkOjptaW4oc3RkOjptaW4oaU1heCwgcE1heCksIGJNYXgpOworICAgICAgICBpbnQzMl90IG1pbkZyYW1lUVAgPSBzdGQ6Om1heChzdGQ6Om1heChpTWluLCBwTWluKSwgYk1pbik7CisgICAgICAgIGlmIChtaW5GcmFtZVFQID4gbWF4RnJhbWVRUCkgeworICAgICAgICAgICAgbWluRnJhbWVRUCA9IG1heEZyYW1lUVA7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXQgdGhlbSBiYWNrIGludG8gdGhlIHN0cnVjdHVyZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lLnYuZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0ICZsYXllciA9IG1lLnYubS52YWx1ZXNbaV07CisKKyAgICAgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSkgfHwKKyAgICAgICAgICAgICAgICBsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSkgfHwKKyAgICAgICAgICAgICAgICBsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tLnZhbHVlc1tpXS5tYXggPSBtYXhGcmFtZVFQOworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLm1pbiA9IG1pbkZyYW1lUVA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiUGljdHVyZVF1YW50aXphdGlvblNldHRlcihleGl0KTogaSA9IHAgPSBiID0gJWQtJWQiLAorICAgICAgICAgICAgICBtaW5GcmFtZVFQLCBtYXhGcmFtZVFQKTsKKworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvZGVkQ29sb3JBc3BlY3RzX2woKSB7CiAgICAgICAgIHJldHVybiBtQ29kZWRDb2xvckFzcGVjdHM7CiAgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gZ2V0UGljdHVyZVF1YW50aXphdGlvbl9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBpY3R1cmVRdWFudGl6YXRpb247CisgICAgfQogCiAgICBwcml2YXRlOgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOwpAQCAtNDgyLDYgKzU1NSw3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2xvckFzcGVjdHM7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBtUGljdHVyZVF1YW50aXphdGlvbjsKIH07CiAKIHN0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgewpAQCAtNTE3LDggKzU5MSw3IEBACiAgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKIAotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBDMlNvZnRIZXZjRW5jOjp+QzJTb2Z0SGV2Y0VuYygpIHsKQEAgLTY1NCwxMiArNzI3LDQxIEBACiAgICAgICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfdGVtcG9yYWxfbGF5ZXJzID0gMzsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG1CaXRyYXRlTW9kZS0+dmFsdWUpIHsKLSAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9JR05PUkU6Ci0gICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSAzOwotICAgICAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9mcmFtZV9xcFswXSA9Ci0gICAgICAgICAgICAgICAgZ2V0UXBGcm9tUXVhbGl0eShtUXVhbGl0eS0+dmFsdWUpOworICAgIC8vIHdlIHJlc29sdmVkIG91dC1vZi1ib3VuZCBhbmQgdW5zcGVjaWZpZWQgdmFsdWVzIGluIFBpY3R1cmVRdWFudGl6YXRpb25TZXR0ZXIoKQorICAgIC8vIHNvIHdlIGNhbiBzdGFydCB3aXRoIGRlZmF1bHRzIHRoYXQgYXJlIG92ZXJyaWRkZW4gYXMgbmVlZGVkLgorICAgIGludDMyX3QgbWF4RnJhbWVRUCA9IG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9tYXhfZnJhbWVfcXA7CisgICAgaW50MzJfdCBtaW5GcmFtZVFQID0gbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21pbl9mcmFtZV9xcDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVFwQm91bmRzLT5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEMyUGljdHVyZVF1YW50aXphdGlvblN0cnVjdCAmbGF5ZXIgPSBtUXBCb3VuZHMtPm0udmFsdWVzW2ldOworCisgICAgICAgIC8vIG5vIG5lZWQgdG8gbG9vcCwgaGV2YyBsaWJyYXJ5IHRha2VzIHNhbWUgcmFuZ2UgZm9yIEkvUC9CIHBpY3R1cmUgdHlwZQorICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KElfRlJBTUUpIHx8CisgICAgICAgICAgICBsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSkgfHwKKyAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKSkgeworCisgICAgICAgICAgICBtYXhGcmFtZVFQID0gbGF5ZXIubWF4OworICAgICAgICAgICAgbWluRnJhbWVRUCA9IGxheWVyLm1pbjsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9tYXhfZnJhbWVfcXAgPSBtYXhGcmFtZVFQOworICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9taW5fZnJhbWVfcXAgPSBtaW5GcmFtZVFQOworCisgICAgQUxPR1YoIk1heEZyYW1lUXA6ICVkIE1pbkZyYW1lUXA6ICVkIiwgbWF4RnJhbWVRUCwgbWluRnJhbWVRUCk7CisKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X2ZyYW1lX3FwWzBdID0KKyAgICAgICAgc3RkOjpjbGFtcChrRGVmYXVsdEluaXRRUCwgbWluRnJhbWVRUCwgbWF4RnJhbWVRUCk7CisKKyAgICBzd2l0Y2ggKG1CaXRyYXRlTW9kZS0+dmFsdWUpIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9JR05PUkU6IHsKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDM7CisgICAgICAgICAgICAvLyBlbnN1cmUgaW5pdGlhbCBxcCB2YWx1ZXMgYXJlIHdpdGhpbiBvdXIgbmV3bHkgY29uZmlndXJlZCBib3VuZHMKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVRcCA9IGdldFFwRnJvbVF1YWxpdHkobVF1YWxpdHktPnZhbHVlKTsKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfZnJhbWVfcXBbMF0gPQorICAgICAgICAgICAgICAgIHN0ZDo6Y2xhbXAoZnJhbWVRcCwgbWluRnJhbWVRUCwgbWF4RnJhbWVRUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUOgogICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gNTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzIzLDYgKzgyNSw3IEBACiAgICAgICAgIG1Hb3AgPSBtSW50Zi0+Z2V0R29wX2woKTsKICAgICAgICAgbVJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKICAgICAgICAgbUNvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXRDb2RlZENvbG9yQXNwZWN0c19sKCk7CisgICAgICAgIG1RcEJvdW5kcyA9IG1JbnRmLT5nZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKTs7CiAgICAgfQogCiAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gaW5pdEVuY1BhcmFtcygpOwpAQCAtNzk4LDcgKzkwMSw4IEBACiAgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CiAgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOwogICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbG9yQXNwZWN0cy0+bWF0cml4LCBtQ29sb3JBc3BlY3RzLT5yYW5nZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogewpAQCAtMTA5OSwxMSArMTIwMywxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdWludDY0X3QgdGltZURlbGF5ID0gMDsKLSAgICB1aW50NjRfdCB0aW1lVGFrZW4gPSAwOworICAgIG5zZWNzX3QgdGltZURlbGF5ID0gMDsKKyAgICBuc2Vjc190IHRpbWVUYWtlbiA9IDA7CiAgICAgbWVtc2V0KCZzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKHNfZW5jb2RlX29wKSk7Ci0gICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworICAgIG1UaW1lU3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgdGltZURlbGF5ID0gbVRpbWVTdGFydCAtIG1UaW1lRW5kOwogCiAgICAgaWYgKGlucHV0QnVmZmVyKSB7CiAgICAgICAgIGVyciA9IGloZXZjZV9lbmNvZGUobUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CkBAIC0xMTE4LDEyICsxMjIyLDEyIEBACiAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CiAgICAgfQogCi0gICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwogICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KLSAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgdGltZVRha2VuID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OwogCi0gICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIChpbnQpdGltZVRha2VuLAotICAgICAgICAgIChpbnQpdGltZURlbGF5LCBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworICAgIEFMT0dWKCJ0aW1lVGFrZW49JTYiIFBSSWQ2NCAiIGRlbGF5PSU2IiBQUklkNjQgIiBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sCisgICAgICAgICAgdGltZURlbGF5LCBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOwogCiAgICAgaWYgKHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCkgewogICAgICAgICBmaW5pc2hXb3JrKHNfZW5jb2RlX29wLnU4X3B0cywgd29yaywgcG9vbCwgJnNfZW5jb2RlX29wKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKaW5kZXggOWRiZjY4Mi4uY2U5Y2VjOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMjcsMTQgKzI4LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKiogR2V0IHRpbWUgKi8KLSNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYikKLQotLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOwotCiAjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgNAogI2RlZmluZSBNQVhfQl9GUkFNRVMgICAgIDEKICNkZWZpbmUgTUFYX1JDX0xPT0tBSEVBRCAxCkBAIC00Miw2ICszNSwxMSBAQAogI2RlZmluZSBERUZBVUxUX0JfRlJBTUVTICAgICAwCiAjZGVmaW5lIERFRkFVTFRfUkNfTE9PS0FIRUFEIDAKIAorI2RlZmluZSBIRVZDX1FQX01JTiAxCisjZGVmaW5lIEhFVkNfUVBfTUFYIDUxCisKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SW5pdFFQID0gMzI7CisKIHN0cnVjdCBDMlNvZnRIZXZjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKICAgICBjbGFzcyBJbnRmSW1wbDsKIApAQCAtOTAsMTQgKzg4LDE1IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gbVFwQm91bmRzOwogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICBjaGFyIG1JbkZpbGVbMjAwXTsKICAgICBjaGFyIG1PdXRGaWxlWzIwMF07CiAjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLwogCiAgICAgLy8gcHJvZmlsZQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7Ci0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsKKyAgICBuc2Vjc190IG1UaW1lRW5kID0gMDsKIAogICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKICAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOwpAQCAtMTIxLDE0ICsxMjAsMTIgQEAKICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJoMjY1IgogI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBBTE9HRCgiR0VORVJBVEVfRklMRV9OQU1FUyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsIG1UaW1lU3RhcnQudHZfc2VjLCBcCi0gICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3VzZWMsIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgIFwKKyAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lIiBQUklkNjQgIi4lcyIsIElOUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbVRpbWVTdGFydCwgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtdXRGaWxlLCAiJXNfJSIgUFJJZDY0ICIuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCiAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCmluZGV4IGRhYTEwYWUuLmE1ODA0NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApAQCAtMTcsOSArMTcsNCBAQAogICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzJEZWMuY3BwIl0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCi0gICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcAppbmRleCA1ZjliMzBiLi45YTQxOTEwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC03MzEsOCArNzMxLDcgQEAKIAogdm9pZCBDMlNvZnRNcGVnMkRlYzo6cmVzZXRQbHVnaW4oKSB7CiAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZGVsZXRlRGVjb2RlcigpIHsKQEAgLTkyOSwxNCArOTI4LDEyIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIHdyaXRlIHRvIGZpbGUKICAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjb2RlX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjb2RlX2lwLnU0X251bV9CeXRlcyk7Ci0gICAgICAgIFdPUkQzMiBkZWxheTsKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICBuc2Vjc190IGRlbGF5ID0gbVRpbWVTdGFydCAtIG1UaW1lRW5kOwogICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKLSAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7Ci0gICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQgIiwgZGVjb2RlVGltZSwgZGVsYXksCisKKyAgICAgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG5zZWNzX3QgZGVjb2RlVGltZSA9IG1UaW1lRW5kIC0gbVRpbWVTdGFydDsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JSIgUFJJZDY0ICIgZGVsYXk9JSIgUFJJZDY0ICIgbnVtQnl0ZXM9JTZkICIsIGRlY29kZVRpbWUsIGRlbGF5LAogICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOwogICAgICAgICBpZiAoSU1QRUcyRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpIHsKICAgICAgICAgICAgIEFMT0dWKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBzX2RlY29kZV9vcC51NF9waWNfd2QsIHNfZGVjb2RlX29wLnU0X3BpY19odCk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaAppbmRleCA4YTI5YzE0Li4zOTY1YmNjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXwogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtNDIsMTkgKzQzLDE0IEBACiAjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CiAKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL21wZWcyZF9pbnB1dCIKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgIm0ydiIKICAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKLSAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJSIgUFJJZDY0ICIuJXMiLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX1BBVEgsIG5vdywgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCkBAIC0xODMsOCArMTc5LDggQEAKICAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CiAKICAgICAvLyBwcm9maWxlCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyAgICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOworICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOwogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICBjaGFyIG1JbkZpbGVbMjAwXTsKICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCmluZGV4IDgxZjQ2NzkuLjU0YTFkMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCkBAIC00MTksNDAgKzQxOSw2IEBACiAgICAgcmV0dXJuIHJlc0NoYW5nZWQ7CiB9CiAKLS8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKLSAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLwotc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHVpbnQzMl90IHdpZHRoLAotICAgICAgICB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKLSAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKLQotICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24oaGVpZ2h0LCAxNik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdFksIHNyYywgd2lkdGgpOwotICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gICAgfQotCi0gICAgLyogVSBidWZmZXIgKi8KLSAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0VSwgc3JjLCB3aWR0aCAvIDIpOwotICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0KLSAgICAvKiBWIGJ1ZmZlciAqLwotICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdFYsIHNyYywgd2lkdGggLyAyKTsKLSAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotfQotCiB2b2lkIEMyU29mdE1wZWc0RGVjOjpwcm9jZXNzKAogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgewpAQCAtNjM2LDExICs2MDIsMTcgQEAKICAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOwogICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7Ci0gICAgICAgICh2b2lkKWNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlclksIG91dHB1dEJ1ZmZlclUsIG91dHB1dEJ1ZmZlclYsCi0gICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdLAotICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGFsaWduKG1XaWR0aCwgMTYpOworICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOworICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOworICAgICAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKG1IZWlnaHQsIDE2KTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNZICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKXNyY1kgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OworCisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXI4VG9ZVjEyKG91dHB1dEJ1ZmZlclksIG91dHB1dEJ1ZmZlclUsIG91dHB1dEJ1ZmZlclYsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgICAgIGluUG9zICs9IGluU2l6ZSAtIChzaXplX3QpdG1wSW5TaXplOwogICAgICAgICBmaW5pc2hXb3JrKHdvcmtJbmRleCwgd29yayk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5icAppbmRleCAzYzY4ZWVlLi5iZTJhYmYyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTksNDQgKzksMTMgQEAKIAogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJDMlNvZnRDb2RlY1Rlc3QtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbICJsaWJjb2RlYzItc3RhdGljLWRlZmF1bHRzIiBdLAogICAgIGd0ZXN0OiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKICAgICBzcmNzOiBbCiAgICAgICAgICJDMlNvZnRDb2RlY1Rlc3QuY3BwIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJpb24iLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmNvZGVjMiIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJkbWFidWZoZWFwIiwKLSAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCi0gICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAotICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJ1aSIsCi0gICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCi0gICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcAppbmRleCA0NWUyY2E4Li44MDg3Mzk2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMTksMTIgKzE5LDEzIEBACiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogCiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDb2RlYzJDb21tb25VdGlscy5oPgogI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKQEAgLTIxNywxMSArMjE4LDI0IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGl4ZWxGb3JtYXRzID0ge0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OH07CisjaWZkZWYgVlA5CisgICAgICAgIGlmIChpc0hhbFBpeGVsRm9ybWF0U3VwcG9ydGVkKChBSGFyZHdhcmVCdWZmZXJfRm9ybWF0KUhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCkpIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBjb2xvciBmb3JtYXQgc3VyZmFjZSBpc24ndCBhZGRlZCB0byBzdXBwb3J0ZWQgZm9ybWF0cywgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cKKyAgICAgICAgLy8gd2hlbiB0aGUgY29sb3ItZm9ybWF0IGlzIGNvbmZpZ3VyZWQgdG8gc3VyZmFjZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0bworICAgICAgICAvLyBjaG9vc2UgMTAtYml0IGZvcm1hdCB3aGlsZSBkZWNvZGluZyAxMC1iaXQgY2xpcHMgaW4gc3VyZmFjZSBtb2RlCisgICAgICAgIHBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKyNlbmRpZgogICAgICAgICBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCi0gICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QaXhlbEZvcm1hdCwgdmFsdWUpLm9uZU9mKHBpeGVsRm9ybWF0cyl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QaXhlbEZvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKwogICAgIH0KIAogICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLApAQCAtMjk3LDYgKzMxMSwxMSBAQAogICAgICAgICByZXR1cm4gQzJSOjpPaygpOwogICAgIH0KIAorICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IGdldFBpeGVsRm9ybWF0X2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGl4ZWxGb3JtYXQ7CisgICAgfQorCiBwcml2YXRlOgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKQEAgLTQyMyw2ICs0NDIsMTEgQEAKICNlbHNlCiAgICAgbU1vZGUgPSBNT0RFX1ZQODsKICNlbmRpZgorICAgIG1IYWxQaXhlbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtUGl4ZWxGb3JtYXRJbmZvID0gbUludGYtPmdldFBpeGVsRm9ybWF0X2woKTsKKyAgICB9CiAKICAgICBtV2lkdGggPSAzMjA7CiAgICAgbUhlaWdodCA9IDI0MDsKQEAgLTYzOCwxMjUgKzY2Miw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKLSAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKLSAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7Ci0gICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKLSAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgewotICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKLSAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKLSAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOwotICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7Ci0gICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKLSAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOwotCi0gICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOwotICAgICAgICBzaXplX3QgeCA9IDA7Ci0gICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKLQotICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7Ci0gICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKLQotICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7Ci0gICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKLSAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOwotICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7Ci0KLSAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7Ci0gICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7Ci0KLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKLQotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKLSAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCi0gICAgICAgIGlmICh4IDwgd2lkdGgpIHsKLSAgICAgICAgICAgIHUwMSA9ICp1U3JjOwotICAgICAgICAgICAgdjAxID0gKnZTcmM7Ci0gICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7Ci0gICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7Ci0gICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOwotICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKLSAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgewotICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOwotICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotICAgIHJldHVybjsKLX0KIHN0YXR1c190IEMyU29mdFZweERlYzo6b3V0cHV0QnVmZmVyKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKQEAgLTc5NywxNiArNzAyLDM3IEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOwogICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKLSAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgaWYgKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNiAmJgorICAgICAgICAgICAgbVBpeGVsRm9ybWF0SW5mby0+dmFsdWUgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSB7CiAgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOwotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKLQorICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworICAgICAgICBib29sIGFsbG93UkdCQTEwMTAxMDIgPSBmYWxzZTsKICAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCiAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgogICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgIGFsbG93UkdCQTEwMTAxMDIgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIGZvcm1hdCA9IGdldEhhbFBpeGVsRm9ybWF0Rm9yQml0RGVwdGgxMChhbGxvd1JHQkExMDEwMTAyKTsKICAgICB9CisKKyAgICBpZiAobUhhbFBpeGVsRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0IHBpeGVsRm9ybWF0KDB1LCBmb3JtYXQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZwaXhlbEZvcm1hdCB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkocGl4ZWxGb3JtYXQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHBpeGVsRm9ybWF0IGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtSGFsUGl4ZWxGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCiAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OwogICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOwogICAgIGlmIChlcnIgIT0gQzJfT0spIHsKQEAgLTg1MCwxMSArNzc2LDE0IEBACiAgICAgICAgICAgICAgICAgcXVldWUtPmVudHJpZXMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgW2RzdFksIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG1XaWR0aCwgaGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodCAtIGksIGtIZWlnaHQpXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVdpZHRoLCBoZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0IC0gaSwga0hlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0c10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxME9yUkdCQTEwMTAxMDIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgLyAyICoga0hlaWdodDsKICAgICAgICAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKQEAgLTg2NywyNCArNzk2LDIyIEBACiAgICAgICAgICAgICAgICAgcXVldWUtPmNvbmQuc2lnbmFsKCk7CiAgICAgICAgICAgICAgICAgcXVldWUud2FpdEZvckNvbmRpdGlvbihxdWV1ZS0+Y29uZCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCkgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9QMDEwKCh1aW50MTZfdCAqKWRzdFksICh1aW50MTZfdCAqKWRzdFUsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gMiwgZHN0VVZTdHJpZGUgLyAyLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVjEyKGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CiAKLSAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0WSwgZHN0VSwgZHN0ViwKLSAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAotICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCi0gICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIoZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfQogICAgIGZpbmlzaFdvcmsoKChjMl9jbnRyNjRfdCAqKWltZy0+dXNlcl9wcml2KS0+cGVla3VsbCgpLCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKaW5kZXggMjA2NTE2NS4uZTlkNmRjOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApAQCAtNjMsMTAgKzYzLDE1IEBACiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNdXRleGVkPENvbnZlcnNpb25RdWV1ZT4+IG1RdWV1ZTsKICAgICB9OwogCisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdEluZm87CisKICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOwogICAgIHZweF9jb2RlY19jdHhfdCAqbUNvZGVjQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCiAKKyAgICB1aW50MzJfdCBtSGFsUGl4ZWxGb3JtYXQ7CiAgICAgdWludDMyX3QgbVdpZHRoOwogICAgIHVpbnQzMl90IG1IZWlnaHQ7CiAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcAppbmRleCA2MTc3NjliLi5mOTllZTI0IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApAQCAtNzMzLDggKzczMywxNCBAQAogICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CiAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBjb2xvckFzcGVjdHM7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgICAgICAgICAgY29sb3JBc3BlY3RzID0gbUludGYtPmdldENvZGVkQ29sb3JBc3BlY3RzX2woKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVihtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIHN0cmlkZSwgdnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JBc3BlY3RzLT5tYXRyaXgsIGNvbG9yQXNwZWN0cy0+cmFuZ2UpOwogICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCBtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCkpOwogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKaW5kZXggZTI5NmM4Zi4uNzE0ZmFkYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaApAQCAtMjY1LDYgKzI2NSw5IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBnZXRUZW1wb3JhbExheWVyc19sKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUxheWVyaW5nOwogICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvZGVkQ29sb3JBc3BlY3RzX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgfQogICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0OwogICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpOwogICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icAppbmRleCA2NDk5OWI3Li43ZDU3NDBiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDEwIEBACiAgICAgbmFtZTogImxpYmNvZGVjMl9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCkBAIC0xOCw2ICsyMiwxMCBAQAogICAgIG5hbWU6ICJsaWJjb2RlYzIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKaW5kZXggMmNjN2FiNy4uNmZmM2RiYyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApAQCAtNTksNiArNTksOCBAQAogICAgIGVudW0gZHJjX2NvbXByZXNzaW9uX21vZGVfdCA6IGludDMyX3Q7ICAvLy88IERSQyBjb21wcmVzc2lvbiBtb2RlCiAgICAgZW51bSBkcmNfZWZmZWN0X3R5cGVfdCA6IGludDMyX3Q7ICAgICAgIC8vLzwgRFJDIGVmZmVjdCB0eXBlCiAgICAgZW51bSBkcmNfYWxidW1fbW9kZV90IDogaW50MzJfdDsgICAgICAgIC8vLzwgRFJDIGFsYnVtIG1vZGUKKyAgICBlbnVtIGhkcl9keW5hbWljX21ldGFkYXRhX3R5cGVfdCA6IHVpbnQzMl90OyAgLy8vPCBIRFIgZHluYW1pYyBtZXRhZGF0YSB0eXBlCisgICAgZW51bSBoZHJfZm9ybWF0X3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgSERSIGZvcm1hdAogICAgIGVudW0gaW50cmFfcmVmcmVzaF9tb2RlX3QgOiB1aW50MzJfdDsgICAvLy88IGludHJhIHJlZnJlc2ggbW9kZXMKICAgICBlbnVtIGxldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAgICAgLy8vPCBjb2RpbmcgbGV2ZWwKICAgICBlbnVtIG9yZGluYWxfa2V5X3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCB3b3JrIG9yZGVyaW5nIGtleXMKQEAgLTc3LDYgKzc5LDcgQEAKIAogc3RydWN0IEMyUGxhdGZvcm1Db25maWcgewogICAgIGVudW0gZW5jb2RpbmdfcXVhbGl0eV9sZXZlbF90IDogdWludDMyX3Q7IC8vLzwgZW5jb2RpbmcgcXVhbGl0eSBsZXZlbAorICAgIGVudW0gdHVubmVsX3BlZWtfbW9kZV90OiB1aW50MzJfdDsgICAgICAvLy88IHR1bm5lbCBwZWVrIG1vZGUKIH07CiAKIG5hbWVzcGFjZSB7CkBAIC0xODksOSArMTkyLDExIEBACiAKICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlTWFzaywKICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlLAorICAgIC8vIGRlcHJlY2F0ZWQKICAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAotCiAgICAga1BhcmFtSW5kZXhQaWN0dXJlUXVhbnRpemF0aW9uLAorICAgIGtQYXJhbUluZGV4SGRyRHluYW1pY01ldGFkYXRhLAorICAgIGtQYXJhbUluZGV4SGRyRm9ybWF0LAogCiAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTI3MCw2ICsyNzUsMTUgQEAKIAogICAgIC8vIGVuY29kaW5nIHF1YWxpdHkgcmVxdWlyZW1lbnRzCiAgICAga1BhcmFtSW5kZXhFbmNvZGluZ1F1YWxpdHlMZXZlbCwgLy8gZW5jb2RlcnMsIGVudW0KKworICAgIC8vIGVuY29kaW5nIHN0YXRpc3RpY3MsIGF2ZXJhZ2UgYmxvY2sgcXAgb2YgYSBmcmFtZQorICAgIGtQYXJhbUluZGV4QXZlcmFnZUJsb2NrUXVhbnRpemF0aW9uLCAvLyBpbnQzMgorCisgICAgLy8gY2hhbm5lbCBtYXNrIGZvciBkZWNvZGVkIGF1ZGlvCisgICAga1BhcmFtSW5kZXhBbmRyb2lkQ2hhbm5lbE1hc2ssIC8vIHVpbnQzMgorCisgICAgLy8gYWxsb3cgdHVubmVsIHBlZWsgYmVoYXZpb3IgdG8gYmUgdW5zcGVjaWZpZWQgZm9yIGFwcCBjb21wYXRpYmlsaXR5CisgICAga1BhcmFtSW5kZXhUdW5uZWxQZWVrTW9kZSwgLy8gdHVubmVsIG1vZGUsIGVudW0KIH07CiAKIH0KQEAgLTY4MCw2ICs2OTQsOSBAQAogICAgIExFVkVMX0RWX01BSU5fVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDMwCiAgICAgTEVWRUxfRFZfTUFJTl9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNDgKICAgICBMRVZFTF9EVl9NQUlOX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQ2MAorICAgIExFVkVMX0RWX01BSU5fVUhEXzEyMCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDEyMAorICAgIExFVkVMX0RWX01BSU5fOEtfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIDhrMzAKKyAgICBMRVZFTF9EVl9NQUlOXzhLXzYwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciA4azYwCiAKICAgICBMRVZFTF9EVl9ISUdIX0hEXzI0ID0gX0MyX1BMX0RWX0JBU0UgKyAweDEwMCwgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDI0CiAgICAgTEVWRUxfRFZfSElHSF9IRF8zMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgaGQzMApAQCAtNjkwLDYgKzcwNyw5IEBACiAgICAgTEVWRUxfRFZfSElHSF9VSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMzAKICAgICBMRVZFTF9EVl9ISUdIX1VIRF80OCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQ0OAogICAgIExFVkVMX0RWX0hJR0hfVUhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDYwCisgICAgTEVWRUxfRFZfSElHSF9VSERfMTIwLCAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMTIwCisgICAgTEVWRUxfRFZfSElHSF84S18zMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgOGszMAorICAgIExFVkVMX0RWX0hJR0hfOEtfNjAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIDhrNjAKIAogICAgIC8vIEFWMSBsZXZlbHMKICAgICBMRVZFTF9BVjFfMiAgICA9IF9DMl9QTF9BVjFfQkFTRSAsICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIKQEAgLTE2MDIsMTYgKzE2MjIsODIgQEAKICAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCiB9OwogdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KLSAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworICAgICAgICBDMlN0cmVhbUhkclN0YXRpY01ldGFkYXRhSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QsIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGE+CisgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzsgIC8vIGRlcHJlY2F0ZWQKIGNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GT1tdID0gInJhdy5oZHItc3RhdGljLWluZm8iOwogCiAvKioKICAqIEhEUjEwKyBNZXRhZGF0YSBJbmZvLgorICoKKyAqIERlcHJlY2F0ZWQuIFVzZSBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm8gd2l0aAorICogSERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwCiAgKi8KIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgotICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Ci1jb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOwotY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87ICAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOyAgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOyAgLy8gZGVwcmVjYXRlZAorCisvKioKKyAqIEhEUiBkeW5hbWljIG1ldGFkYXRhIHR5cGVzCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6aGRyX2R5bmFtaWNfbWV0YWRhdGFfdHlwZV90LCB1aW50MzJfdCwKKyAgICBIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfMTAsICAvLy88IFNNUFRFIFNUIDIwOTQtMTAKKyAgICBIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDAsICAvLy88IFNNUFRFIFNUIDIwOTQtNDAKKykKKworc3RydWN0IEMySGRyRHluYW1pY01ldGFkYXRhU3RydWN0IHsKKyAgICBpbmxpbmUgQzJIZHJEeW5hbWljTWV0YWRhdGFTdHJ1Y3QoKSB7IG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsgfQorCisgICAgaW5saW5lIEMySGRyRHluYW1pY01ldGFkYXRhU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IGZsZXhDb3VudCwgQzJDb25maWc6Omhkcl9keW5hbWljX21ldGFkYXRhX3R5cGVfdCB0eXBlKQorICAgICAgICA6IHR5cGVfKHR5cGUpIHsKKyAgICAgICAgbWVtc2V0KGRhdGEsIDAsIGZsZXhDb3VudCk7CisgICAgfQorCisgICAgQzJDb25maWc6Omhkcl9keW5hbWljX21ldGFkYXRhX3R5cGVfdCB0eXBlXzsKKyAgICB1aW50OF90IGRhdGFbXTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChIZHJEeW5hbWljTWV0YWRhdGEsIGRhdGEpCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQoZGF0YSwgImRhdGEiKQorfTsKKworLyoqCisgKiBEeW5hbWljIEhEUiBNZXRhZGF0YSBJbmZvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkhkckR5bmFtaWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJEeW5hbWljTWV0YWRhdGE+CisgICAgICAgIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0hEUl9EWU5BTUlDX0lORk9bXSA9ICJpbnB1dC5oZHItZHluYW1pYy1pbmZvIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPW10gPSAib3V0cHV0Lmhkci1keW5hbWljLWluZm8iOworCisvKioKKyAqIEhEUiBGb3JtYXQKKyAqLworQzJFTlVNKEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QsIHVpbnQzMl90LAorICAgIFVOS05PV04sICAgICAvLy88IEhEUiBmb3JtYXQgbm90IGtub3duIChkZWZhdWx0KQorICAgIFNEUiwgICAgICAgICAvLy88IG5vdCBIRFIgKFNEUikKKyAgICBITEcsICAgICAgICAgLy8vPCBITEcKKyAgICBIRFIxMCwgICAgICAgLy8vPCBIRFIxMAorICAgIEhEUjEwX1BMVVMsICAvLy88IEhEUjEwKworKTsKKworLyoqCisgKiBIRFIgRm9ybWF0IEluZm8KKyAqCisgKiBUaGlzIGluZm9ybWF0aW9uIG1heSBiZSBwcmVzZW50IGR1cmluZyBjb25maWd1cmF0aW9uIHRvIGFsbG93IGVuY29kZXJzIHRvCisgKiBwcmVwYXJlIGVuY29kaW5nIGNlcnRhaW4gSERSIGZvcm1hdHMuIFdoZW4gdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgcHJlc2VudAorICogYmVmb3JlIHN0YXJ0LCBlbmNvZGVycyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBIRFIgZm9ybWF0IGJhc2VkIG9uIHRoZSBhdmFpbGFibGUKKyAqIEhEUiBtZXRhZGF0YSBvbiB0aGUgZmlyc3QgaW5wdXQgZnJhbWUuCisgKgorICogV2hpbGUgdGhpcyBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgaXQgaXMgbm90IGEgaGludC4gV2hlbiBwcmVzZW50LCBlbmNvZGVycworICogdGhhdCBkbyBub3Qgc3VwcG9ydCBkeW5hbWljIHJlY29uZmlndXJhdGlvbiBkbyBub3QgbmVlZCB0byBzd2l0Y2ggdG8gdGhlIEhEUgorICogZm9ybWF0IGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvbiB0aGUgZmlyc3QgaW5wdXQgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6aGRyX2Zvcm1hdF90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhIZHJGb3JtYXQ+CisgICAgICAgIEMyU3RyZWFtSGRyRm9ybWF0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0hEUl9GT1JNQVRbXSA9ICJjb2RlZC5oZHItZm9ybWF0IjsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJsb2NrLWJhc2VkIGNvZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xNjczLDcgKzE3NTksNyBAQAogICAgIFNZTkNfRlJBTUUgPSAoMSA8PCAwKSwgIC8vLzwgc3luYyBmcmFtZSwgZS5nLiBJRFIKICAgICBJX0ZSQU1FICAgID0gKDEgPDwgMSksICAvLy88IGludHJhIGZyYW1lIHRoYXQgaXMgY29tcGxldGVseSBlbmNvZGVkCiAgICAgUF9GUkFNRSAgICA9ICgxIDw8IDIpLCAgLy8vPCBpbnRlciBwcmVkaWN0ZWQgZnJhbWUgZnJvbSBwcmV2aW91cyBmcmFtZXMKLSAgICBCX0ZSQU1FICAgID0gKDEgPDwgMyksICAvLy88IGJhY2t3YXJkIHByZWRpY3RlZCAob3V0LW9mLW9yZGVyKSBmcmFtZQorICAgIEJfRlJBTUUgICAgPSAoMSA8PCAzKSwgIC8vLzwgYmlkaXJlY3Rpb25hbCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKICkKIAogLyoqCkBAIC0xOTMwLDYgKzIwMTYsMTQgQEAKIGNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQubWF4LWNoYW5uZWwtY291bnQiOwogCiAvKioKKyAqIEF1ZGlvIGNoYW5uZWwgbWFzay4gVXNlZCBieSBkZWNvZGVyIHRvIGV4cHJlc3MgYXVkaW8gY2hhbm5lbCBtYXNrIG9mIGRlY29kZWQgY29udGVudC4KKyAqIENoYW5uZWwgcmVwcmVzZW50YXRpb24gaXMgc3BlY2lmaWVkIGFjY29yZGluZyB0byB0aGUgSmF2YSBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0CisgKiBDSEFOTkVMX09VVF8qIGNvbnN0YW50cy4KKyAqLworIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4QW5kcm9pZENoYW5uZWxNYXNrPiBDMlN0cmVhbUNoYW5uZWxNYXNrSW5mbzsKKyBjb25zdCBjaGFyIEMyX1BBUkFNS0VZX0NIQU5ORUxfTUFTS1tdID0gInJhdy5jaGFubmVsLW1hc2siOworCisvKioKICAqIEF1ZGlvIHNhbXBsZSBmb3JtYXQgKFBDTSBlbmNvZGluZykKICAqLwogQzJFTlVNKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgdWludDMyX3QsCkBAIC0yMzkyLDYgKzI0ODYsMjggQEAKICAgICAgICAgQzJTdHJlYW1UdW5uZWxTdGFydFJlbmRlcjsKIGNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RVTk5FTF9TVEFSVF9SRU5ERVJbXSA9ICJvdXRwdXQudHVubmVsLXN0YXJ0LXJlbmRlciI7CiAKKy8qKiBUdW5uZWwgUGVlayBNb2RlLiAqLworQzJFTlVNKEMyUGxhdGZvcm1Db25maWc6OnR1bm5lbF9wZWVrX21vZGVfdCwgdWludDMyX3QsCisgICAgVU5TUEVDSUZJRURfUEVFSyA9IDAsCisgICAgU1BFQ0lGSUVEX1BFRUsgPSAxCispOworCisvKioKKyAqIFR1bm5lbCBQZWVrIE1vZGUgVHVuaW5nIHBhcmFtZXRlci4KKyAqCisgKiBJZiBzZXQgdG8gVU5TUEVDSUZJRURfUEVFS19NT0RFLCB0aGUgZGVjb2RlciBpcyBmcmVlIHRvIGlnbm9yZSB0aGUKKyAqIEMyU3RyZWFtVHVubmVsSG9sZFJlbmRlciBhbmQgQzJTdHJlYW1UdW5uZWxTdGFydFJlbmRlciBmbGFncyBhbmQgYXNzb2NpYXRlZAorICogZmVhdHVyZXMuIEFkZGl0aW9uYWxseSwgaXQgYmVjb21lcyB1cCB0byB0aGUgZGVjb2RlciB0byBkaXNwbGF5IGFueSBmcmFtZQorICogYmVmb3JlIHJlY2VpdmluZyBzeW5jaHJvbml6YXRpb24gaW5mb3JtYXRpb24uCisgKgorICogTm90ZTogVGhpcyBwYXJhbWV0ZXIgYWxsb3dzIGEgZGVjb2RlciB0byBpZ25vcmUgdGhlIHZpZGVvIHBlZWsgbWFjaGluZXJ5IGFuZAorICogdG8gcmV2ZXJ0IHRvIGl0cyBwcmVmZXJyZWQgYmVoYXZpb3IuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJFYXN5RW51bTxDMlBsYXRmb3JtQ29uZmlnOjp0dW5uZWxfcGVla19tb2RlX3Q+LAorICAgICAgICBrUGFyYW1JbmRleFR1bm5lbFBlZWtNb2RlPiBDMlN0cmVhbVR1bm5lbFBlZWtNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVFVOTkVMX1BFRUtfTU9ERVtdID0KKyAgICAgICAgIm91dHB1dC50dW5uZWwtcGVlay1tb2RlIjsKKwogLyoqCiAgKiBFbmNvZGluZyBxdWFsaXR5IGxldmVsIHNpZ25hbGluZy4KICAqCkBAIC0yNDExLDYgKzI1MjcsMTcgQEAKICAgICBTX0hBTkRIRUxEID0gMSAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gVk1BRj03MAogKTsKIAorLyoqCisgKiBWaWRlbyBFbmNvZGluZyBTdGF0aXN0aWNzIEV4cG9ydAorICovCisKKy8qKgorICogQXZlcmFnZSBibG9jayBRUCBleHBvcnRlZCBmcm9tIHZpZGVvIGVuY29kZXIuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50MzJfdD4sIGtQYXJhbUluZGV4QXZlcmFnZUJsb2NrUXVhbnRpemF0aW9uPgorICAgICAgICBDMkFuZHJvaWRTdHJlYW1BdmVyYWdlQmxvY2tRdWFudGl6YXRpb25JbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVZFUkFHRV9RUFtdID0gImNvZGVkLmF2ZXJhZ2UtcXAiOworCiAvLy8gQH0KIAogI2VuZGlmICAvLyBDMkNPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IGJkMWZhYzYuLjE0N2E1MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTI4LDQ3ICsyOCwyMiBAQAogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJDMkZ1enplci1kZWZhdWx0cyIsCiAKKyAgICBkZWZhdWx0czogWyAibGliY29kZWMyLXN0YXRpYy1kZWZhdWx0cyIgXSwKKwogICAgIHNyY3M6IFsKICAgICAgICAgIkMyRnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliaW9uIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJjb2RlYzIiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliZG1hYnVmaGVhcCIsCi0gICAgICAgICJsaWJjb2RlYzJfdm5kayIsCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAotICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKLSAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDMuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAzLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlidWkiLAotICAgICAgICAibGliZGwiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAid29uc2lrQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgIH0sCiB9CiAKIGNjX2Z1enogewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcAppbmRleCA1MWUxMDEzLi5lNDY5ZDhiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcApAQCAtMTk0LDEyICsxOTQsMTIgQEAKICAgfQogCiAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXM7CisgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIGtXaWR0aE9mVmlkZW8sIGtIZWlnaHRPZlZpZGVvKTsKKyAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBrU2FtcGxpbmdSYXRlT2ZBdWRpbyk7CisgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGtDaGFubmVsc09mQXVkaW8pOwogICBpZiAoZG9tYWluLnZhbHVlID09IERPTUFJTl9WSURFTykgewotICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIGtXaWR0aE9mVmlkZW8sIGtIZWlnaHRPZlZpZGVvKTsKICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZpbnB1dFNpemUpOwogICB9IGVsc2UgaWYgKGRvbWFpbi52YWx1ZSA9PSBET01BSU5fQVVESU8pIHsKLSAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtTYW1wbGluZ1JhdGVPZkF1ZGlvKTsKLSAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBrQ2hhbm5lbHNPZkF1ZGlvKTsKICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZzYW1wbGVSYXRlSW5mbyk7CiAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjaygmY2hhbm5lbENvdW50SW5mbyk7CiAgIH0KQEAgLTIzOSwxNyArMjM5LDE3IEBACiB9CiAKIHZvaWQgQ29kZWMyRnV6emVyOjpkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgbUJ1ZmZlclNvdXJjZSA9IG5ldyBCdWZmZXJTb3VyY2UoZGF0YSwgc2l6ZSk7Ci0gIGlmICghbUJ1ZmZlclNvdXJjZSkgeworICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU291cmNlPiBidWZmZXJTb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclNvdXJjZT4oZGF0YSwgc2l6ZSk7CisgIGlmICghYnVmZmVyU291cmNlKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIG1CdWZmZXJTb3VyY2UtPnBhcnNlKCk7CisgIGJ1ZmZlclNvdXJjZS0+cGFyc2UoKTsKICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CiAgIHNpemVfdCBudW1GcmFtZXMgPSAwOwotICB3aGlsZSAoIW1CdWZmZXJTb3VyY2UtPmlzRW9zKCkpIHsKKyAgd2hpbGUgKCFidWZmZXJTb3VyY2UtPmlzRW9zKCkpIHsKICAgICB1aW50OF90KiBmcmFtZSA9IG51bGxwdHI7CiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7Ci0gICAgRnJhbWVEYXRhIGZyYW1lRGF0YSA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lKCk7CisgICAgRnJhbWVEYXRhIGZyYW1lRGF0YSA9IGJ1ZmZlclNvdXJjZS0+Z2V0RnJhbWUoKTsKICAgICBmcmFtZSA9IHN0ZDo6Z2V0PDA+KGZyYW1lRGF0YSk7CiAgICAgZnJhbWVTaXplID0gc3RkOjpnZXQ8MT4oZnJhbWVEYXRhKTsKIApAQCAtMjk4LDcgKzI5OCw2IEBACiAgIG1Db25kaXRpb25hbFZhcmlhYmxlLndhaXRfZm9yKHdhaXRGb3JEZWNvZGVDb21wbGV0ZSwga0MyRnV6emVyVGltZU91dCwgW3RoaXNdIHsgcmV0dXJuIG1Fb3M7IH0pOwogICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyZmx1c2hlZFdvcmtzOwogICBtQ29tcG9uZW50LT5mbHVzaF9zbShDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmYzJmbHVzaGVkV29ya3MpOwotICBkZWxldGUgbUJ1ZmZlclNvdXJjZTsKIH0KIAogZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oCmluZGV4IGQ1YWM4MWEuLmRhNzY4ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmgKQEAgLTEwNCw3ICsxMDQsNiBAQAogICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXJrZXJTdWZmaXhTaXplID0gMzsKICAgfTsKIAotICBCdWZmZXJTb3VyY2UqIG1CdWZmZXJTb3VyY2U7CiAgIGJvb2wgbUVvcyA9IGZhbHNlOwogICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggMTIyYWFjZC4uZGI3ODc0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTU3LDYgKzU3LDEwIEBACiAgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsQDEuMCIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAogICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcAppbmRleCAwODJjNWUzLi5kZjMwZGJhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtNDgyLDYgKzQ4MiwzNyBAQAogICAgIGlmIChyZXMgIT0gQzJfT0spIHsKICAgICAgICAgbUluaXQgPSByZXM7CiAgICAgfQorCisgICAgc3RydWN0IExpc3RlbmVyRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSHdEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIExpc3RlbmVyRGVhdGhSZWNpcGllbnQoY29uc3Qgd3A8Q29tcG9uZW50PiYgY29tcCkKKyAgICAgICAgICAgIDogbUNvbXBvbmVudHtjb21wfSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGF1dG8gc3Ryb25nQ29tcG9uZW50ID0gbUNvbXBvbmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDbGllbnQgZGllZCAhIHJlbGVhc2UgdGhlIGNvbXBvbmVudCAhISI7CisgICAgICAgICAgICAgICAgc3Ryb25nQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudCBkaWVkICEgbm8gY29tcG9uZW50IHRvIHJlbGVhc2UgISEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd3A8Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIH07CisKKyAgICBtRGVhdGhSZWNpcGllbnQgPSBuZXcgTGlzdGVuZXJEZWF0aFJlY2lwaWVudChzZWxmKTsKKyAgICBSZXR1cm48Ym9vbD4gdHJhbnNTdGF0dXMgPSBtTGlzdGVuZXItPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgbURlYXRoUmVjaXBpZW50LCAwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJMaXN0ZW5lciBsaW5rVG9EZWF0aCgpIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0KKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHRyYW5zU3RhdHVzKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJMaXN0ZW5lciBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgfQogfQogCiBDb21wb25lbnQ6On5Db21wb25lbnQoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmgKaW5kZXggODZkY2NkMC4uZTM0MzY1NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApAQCAtMTMyLDYgKzEzMiw5IEBACiAgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKIAogICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHVzaW5nIEh3RGVhdGhSZWNpcGllbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudDsKKyAgICBzcDxId0RlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCmluZGV4IDcyZjdjNDMuLjVjMjRiZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CiAjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkZlbmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPEMyUGFyYW0uaD4KICNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgpAQCAtNzU5LDE3ICs3NjAsMTQgQEAKIC8vIE5vdGU6IEZpbGUgZGVzY3JpcHRvcnMgYXJlIG5vdCBkdXBsaWNhdGVkLiBUaGUgb3JpZ2luYWwgZmlsZSBkZXNjcmlwdG9yIG11c3QKIC8vIG5vdCBiZSBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KIGJvb2wgb2JqY3B5KGhpZGxfaGFuZGxlKiBkLCBjb25zdCBDMkZlbmNlJiBzKSB7Ci0gICAgKHZvaWQpczsgLy8gVE9ETzogaW1wbGVtZW50IHMuZmQoKQotICAgIGludCBmZW5jZUZkID0gLTE7CiAgICAgZC0+c2V0VG8obnVsbHB0cik7Ci0gICAgaWYgKGZlbmNlRmQgPj0gMCkgewotICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgICAgICBpZiAoIWhhbmRsZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUuIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZW5jZUZkOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gX0MyRmVuY2VGYWN0b3J5OjpDcmVhdGVOYXRpdmVIYW5kbGUocyk7CisgICAgaWYgKGhhbmRsZSkgewogICAgICAgICBkLT5zZXRUbyhoYW5kbGUsIHRydWUgLyogb3ducyAqLyk7CisvLyAgfSBlbHNlIGlmICghcy5yZWFkeSgpKSB7CisvLyAgICAgIC8vIFRPRE86IHdlIHNob3VsZCB3YWl0IGZvciB1bm1hcnNoYWxsYWJsZSBmZW5jZXMgYnV0IHRoaXMgbWF5IG5vdCBiZQorLy8gICAgICAvLyB0aGUgYmVzdCBwbGFjZSBmb3IgaXQuIFdlIGNhbiBzYWZlbHkgaWdub3JlIGhlcmUgYXMgYXQgdGhpcyB0aW1lCisvLyAgICAgIC8vIGFsbCBmZW5jZXMgdXNlZCBoZXJlIGFyZSBtYXJzaGFsbGFibGUuCiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMTE4NCw5ICsxMTgyLDggQEAKIC8vIE5vdGU6IEZpbGUgZGVzY3JpcHRvcnMgYXJlIG5vdCBkdXBsaWNhdGVkLiBUaGUgb3JpZ2luYWwgZmlsZSBkZXNjcmlwdG9yIG11c3QKIC8vIG5vdCBiZSBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KIGJvb2wgb2JqY3B5KEMyRmVuY2UqIGQsIGNvbnN0IGhpZGxfaGFuZGxlJiBzKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50LgotICAgICh2b2lkKXM7Ci0gICAgKmQgPSBDMkZlbmNlKCk7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBzLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICpkID0gX0MyRmVuY2VGYWN0b3J5OjpDcmVhdGVGcm9tTmF0aXZlSGFuZGxlKGhhbmRsZSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvLmNsYW5nLWZvcm1hdCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvLmNsYW5nLWZvcm1hdApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMTM2Mjc5Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi8uLi8uLi8uLi9idWlsZC9zb29uZy9zY3JpcHRzL3N5c3RlbS1jbGFuZy1mb3JtYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCmluZGV4IGRiZTg5Y2YuLjMyYjExYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCkBAIC0xLDggKzEsNSBAQAorIyBCdWcgY29tcG9uZW50OiAyNTY5MAogIyBNZWRpYSB0ZWFtCiBsYWpvc0Bnb29nbGUuY29tCi1wYXdpbkBnb29nbGUuY29tCiB0YWtsZWVAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KLQotIyBWVFMgdGVhbQotZHNoaUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcAppbmRleCA5ZTNhODIzLi5kNDdlZjY3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTQ2NSw2ICs0NjUsMTEgQEAKICAgICBpZiAobU1pbWUuZmluZCgicmF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSBpZiAoKG1NaW1lLmZpbmQoImc3MTEtYWxhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorICAgICAgICAgICAgICAgKG1NaW1lLmZpbmQoImc3MTEtbWxhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAvLyBnNzExIHRlc3QgZGF0YSBpcyBhbGwgMS1jaGFubmVsIGFuZCBoYXMgbm8gZW1iZWRkZWQgY29uZmlnIGluZm8uCisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDQxMDZiZTguLmJlNGJhZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTE0LDggKzE0LDggQEAKICAgICAgICAgImxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZSIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9jbGllbnRfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcAppbmRleCBmZmVjODk3Li4yNzVhNzIxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC02MSw2ICs2MSw3IEBACiAgIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CiAgICAgICAgIGdldFBhcmFtcygpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKICAgICAgICAgbUVvcyA9IGZhbHNlOwogICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZShtSW5zdGFuY2VOYW1lLmNfc3RyKCkpOwogICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CkBAIC03Myw2ICs3NCwxNCBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKICAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOwogICAgICAgICB9CisKKyAgICAgICAgQzJTZWN1cmVNb2RlVHVuaW5nIHNlY3VyZU1vZGVUdW5pbmd7fTsKKyAgICAgICAgbUNvbXBvbmVudC0+cXVlcnkoeyZzZWN1cmVNb2RlVHVuaW5nfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7CisgICAgICAgIGlmIChzZWN1cmVNb2RlVHVuaW5nLnZhbHVlICE9IEMyQ29uZmlnOjpTTV9VTlBST1RFQ1RFRCkgeworICAgICAgICAgICAgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKQEAgLTEwNSw2ICsxMTQsNyBAQAogICAgIHN0ZDo6c3RyaW5nIG1JbnN0YW5jZU5hbWU7CiAgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7CiAgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OwogICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CiAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOwpAQCAtMzI0LDYgKzMzNCw3IEBACiB9OwogCiBURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKICAgICBkZXNjcmlwdGlvbigiVGVzdHMgZm9yIGRpZmZlcmVudCBpbnB1dHMiKTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCmluZGV4IDBlZWVkYjYuLmVkNzdhMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCkBAIC02Nyw2ICs2NywxMSBAQAogICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbEAxLjEiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKIAogICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcAppbmRleCAxZDdkM2Q4Li4yZGQ5MjJmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtNDg5LDYgKzQ4OSwzNyBAQAogICAgIGlmIChyZXMgIT0gQzJfT0spIHsKICAgICAgICAgbUluaXQgPSByZXM7CiAgICAgfQorCisgICAgc3RydWN0IExpc3RlbmVyRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSHdEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIExpc3RlbmVyRGVhdGhSZWNpcGllbnQoY29uc3Qgd3A8Q29tcG9uZW50PiYgY29tcCkKKyAgICAgICAgICAgIDogY29tcG9uZW50e2NvbXB9IHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byBzdHJvbmdDb21wb25lbnQgPSBjb21wb25lbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHN0cm9uZ0NvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ2xpZW50IGRpZWQgISByZWxlYXNlIHRoZSBjb21wb25lbnQgISEiOworICAgICAgICAgICAgICAgIHN0cm9uZ0NvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDbGllbnQgZGllZCAhIG5vIGNvbXBvbmVudCB0byByZWxlYXNlICEhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdwPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIH07CisKKyAgICBtRGVhdGhSZWNpcGllbnQgPSBuZXcgTGlzdGVuZXJEZWF0aFJlY2lwaWVudChzZWxmKTsKKyAgICBSZXR1cm48Ym9vbD4gdHJhbnNTdGF0dXMgPSBtTGlzdGVuZXItPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgbURlYXRoUmVjaXBpZW50LCAwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJMaXN0ZW5lciBsaW5rVG9EZWF0aCgpIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0KKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHRyYW5zU3RhdHVzKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJMaXN0ZW5lciBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgfQogfQogCiBDb21wb25lbnQ6On5Db21wb25lbnQoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50LmgKaW5kZXggMTZjODFkNC4uMWM4YzIwYyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4xL0NvbXBvbmVudC5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnQuaApAQCAtMTM3LDYgKzEzNyw5IEBACiAgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKIAogICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHVzaW5nIEh3RGVhdGhSZWNpcGllbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudDsKKyAgICBzcDxId0RlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSB1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29tcG9uZW50LmNwcAppbmRleCA4OTI0ZTZkLi43OTk0ZDMyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtNTIwLDYgKzUyMCwzNyBAQAogICAgIGlmIChyZXMgIT0gQzJfT0spIHsKICAgICAgICAgbUluaXQgPSByZXM7CiAgICAgfQorCisgICAgc3RydWN0IExpc3RlbmVyRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSHdEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIExpc3RlbmVyRGVhdGhSZWNpcGllbnQoY29uc3Qgd3A8Q29tcG9uZW50PiYgY29tcCkKKyAgICAgICAgICAgIDogY29tcG9uZW50e2NvbXB9IHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byBzdHJvbmdDb21wb25lbnQgPSBjb21wb25lbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHN0cm9uZ0NvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ2xpZW50IGRpZWQgISByZWxlYXNlIHRoZSBjb21wb25lbnQgISEiOworICAgICAgICAgICAgICAgIHN0cm9uZ0NvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDbGllbnQgZGllZCAhIG5vIGNvbXBvbmVudCB0byByZWxlYXNlICEhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdwPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIH07CisKKyAgICBtRGVhdGhSZWNpcGllbnQgPSBuZXcgTGlzdGVuZXJEZWF0aFJlY2lwaWVudChzZWxmKTsKKyAgICBSZXR1cm48Ym9vbD4gdHJhbnNTdGF0dXMgPSBtTGlzdGVuZXItPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgbURlYXRoUmVjaXBpZW50LCAwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJMaXN0ZW5lciBsaW5rVG9EZWF0aCgpIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0KKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHRyYW5zU3RhdHVzKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJMaXN0ZW5lciBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgfQogfQogCiBDb21wb25lbnQ6On5Db21wb25lbnQoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvQ29tcG9uZW50LmgKaW5kZXggNzkzNzY2NC4uZDA5NzJlZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudC5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnQuaApAQCAtMTQyLDYgKzE0MiwxMCBAQAogICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CiAKICAgICBzdHJ1Y3QgTGlzdGVuZXI7CisKKyAgICB1c2luZyBId0RlYXRoUmVjaXBpZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ7CisgICAgc3A8SHdEZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworCiB9OwogCiB9IC8vIG5hbWVzcGFjZSB1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icAppbmRleCAwZTUyODEzLi5mMzI3MTFkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApAQCAtNyw2ICs3LDI0IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfY2xpZW50X2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCmluZGV4IDQyYjNjNDMuLjBhY2Y3ZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCkBAIC0xNTAyLDYgKzE1MDIsNyBAQAogICAgICAgICBpZ2JwID0gbmV3IEIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcjIoc3VyZmFjZSk7CiAgICAgfQogCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1PdXRwdXRNdXRleCk7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFN1cmZhY2VTeW5jT2JqPiBzeW5jT2JqOwogCiAgICAgaWYgKCFzdXJmYWNlKSB7CkBAIC0xNTg2LDYgKzE1ODcsMjQgQEAKICAgICBtT3V0cHV0QnVmZmVyUXVldWUtPnVwZGF0ZU1heERlcXVldWVCdWZmZXJDb3VudChtYXhEZXF1ZXVlQ291bnQpOwogfQogCit2b2lkIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzdG9wVXNpbmdPdXRwdXRTdXJmYWNlKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtT3V0cHV0TXV0ZXgpOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS0+c3RvcCgpOworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UxXzAtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYmxvY2tQb29sSWQpLCBudWxscHRyKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlKHN0b3BVc2luZ091dHB1dFN1cmZhY2UpIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAic2V0T3V0cHV0U3VyZmFjZShzdG9wVXNpbmdPdXRwdXRTdXJmYWNlKSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICB9CisgICAgfQorfQorCiBjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKaW5kZXggMzQ3ZTU4YS4uNDlkOWIyOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTQxMSw2ICs0MTEsMTAgQEAKICAgICAvLyBTZXQgbWF4IGRlcXVldWUgY291bnQgZm9yIG91dHB1dCBzdXJmYWNlLgogICAgIHZvaWQgc2V0T3V0cHV0U3VyZmFjZU1heERlcXVldWVDb3VudChpbnQgbWF4RGVxdWV1ZUNvdW50KTsKIAorICAgIC8vIFN0b3AgdXNpbmcgdGhlIGN1cnJlbnQgb3V0cHV0IHN1cmZhY2UuCisgICAgdm9pZCBzdG9wVXNpbmdPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQpOworCiAgICAgLy8gQ29ubmVjdCB0byBhIGdpdmVuIElucHV0U3VyZmFjZS4KICAgICBjMl9zdGF0dXNfdCBjb25uZWN0VG9JbnB1dFN1cmZhY2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLApAQCAtNDQxLDYgKzQ0NSwxMSBAQAogICAgIHN0cnVjdCBPdXRwdXRCdWZmZXJRdWV1ZTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVyUXVldWU+IG1PdXRwdXRCdWZmZXJRdWV1ZTsKIAorICAgIC8vIChiLzIwMjkwMzExNykgU29tZXRpbWVzIE1lZGlhQ29kZWM6OnNldFN1cmZhY2UgcmFjZXMgYmV0d2VlbiBub3JtYWwKKyAgICAvLyBzZXRTdXJmYWNlIGFuZCBzZXRTdXJmYWNlIHdpdGggUmVsZWFzZVN1cmZhY2UgZHVlIHRvIHRpbWluZyBpc3N1ZXMuCisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCB0aGUgcmFjZSBjb25kaXRpb24gbXV0ZXggaXMgYWRkZWQuCisgICAgc3RkOjptdXRleCBtT3V0cHV0TXV0ZXg7CisKICAgICBzdGF0aWMgYzJfc3RhdHVzX3Qgc2V0RGVhdGhMaXN0ZW5lcigKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9vdXRwdXQuaCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL291dHB1dC5oCmluZGV4IDg3NzE0OGEuLmExM2VkZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL291dHB1dC5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL291dHB1dC5oCkBAIC01MCw2ICs1MCwxMCBAQAogICAgICAgICAgICAgICAgICAgIGludCBtYXhEZXF1ZXVlQnVmZmVyQ291bnQsCiAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFYxXzI6OlN1cmZhY2VTeW5jT2JqPiAqc3luY09iaik7CiAKKyAgICAvLyBTdG9wIHVzaW5nIHRoZSBjdXJyZW50IG91dHB1dCBzdXJmYWNlLiBQZW5kaW5nIGJ1ZmZlciBvcGVhdGlvbnMgd2lsbCBub3QKKyAgICAvLyBwZXJmb3JtIGFueW1vcmUuCisgICAgdm9pZCBzdG9wKCk7CisKICAgICAvLyBSZW5kZXIgYSBncmFwaGljIGJsb2NrIHRvIGN1cnJlbnQgc3VyZmFjZS4KICAgICBzdGF0dXNfdCBvdXRwdXRCdWZmZXIoCiAgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKQEAgLTgxLDYgKzg1LDcgQEAKICAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOyAvLyBmaW5kIGEgYmV0dGVyIHdheQogICAgIHN0ZDo6d2Vha19wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBtU3luY01lbTsKKyAgICBib29sIG1TdG9wcGVkOwogCiAgICAgYm9vbCByZWdpc3RlckJ1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L291dHB1dC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvb3V0cHV0LmNwcAppbmRleCBkZTM0YzI0Li5mNzg5MDMwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvb3V0cHV0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvb3V0cHV0LmNwcApAQCAtMTY5LDcgKzE2OSw3IEBACiB9IC8vIHVubmFtZWQgbmFtZXNwYWNlCiAKIE91dHB1dEJ1ZmZlclF1ZXVlOjpPdXRwdXRCdWZmZXJRdWV1ZSgpCi0gICAgICA6IG1HZW5lcmF0aW9uezB9LCBtQnFJZHswfSB7CisgICAgICA6IG1HZW5lcmF0aW9uezB9LCBtQnFJZHswfSwgbVN0b3BwZWR7ZmFsc2V9IHsKIH0KIAogT3V0cHV0QnVmZmVyUXVldWU6On5PdXRwdXRCdWZmZXJRdWV1ZSgpIHsKQEAgLTIxOSw2ICsyMTksOCBAQAogICAgICAgICAgICAgcG9vbERhdGFzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107CiAgICAgewogICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKKyAgICAgICAgYm9vbCBzdG9wcGVkID0gbVN0b3BwZWQ7CisgICAgICAgIG1TdG9wcGVkID0gZmFsc2U7CiAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1HZW5lcmF0aW9uKSB7CiAgICAgICAgICAgICAvLyBjYXNlIG9mIG9sZCBCbG9ja1Bvb2wgZGVzdHJ1Y3Rpb24KICAgICAgICAgICAgIEMyU3luY1ZhcmlhYmxlcyAqdmFyID0gbVN5bmNNZW0gPyBtU3luY01lbS0+bWVtKCkgOiBudWxscHRyOwpAQCAtMjU4LDcgKzI2MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFM7ICsraSkgewotICAgICAgICAgICAgaWYgKG1CcUlkID09IDAgfHwgIW1CdWZmZXJzW2ldKSB7CisgICAgICAgICAgICBpZiAobUJxSWQgPT0gMCB8fCAhbUJ1ZmZlcnNbaV0gfHwgc3RvcHBlZCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPSBtUG9vbERhdGFzW2ldLmxvY2soKTsKQEAgLTMxNyw2ICszMTksMTIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBPdXRwdXRCdWZmZXJRdWV1ZTo6c3RvcCgpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKKyAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgbU93bmVyLnJlc2V0KCk7IC8vIGRlc3RydWN0b3Igb2YgdGhlIGJsb2NrIHdpbGwgbm90IHRyaWdlciBJR0JQOjpjYW5jZWwoKQorfQorCiBib29sIE91dHB1dEJ1ZmZlclF1ZXVlOjpyZWdpc3RlckJ1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgewogICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOwpAQCAtMzI1LDcgKzMzMyw3IEBACiAgICAgfQogICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOwogCi0gICAgaWYgKCFtSWdicCkgeworICAgIGlmICghbUlnYnAgfHwgbVN0b3BwZWQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzcxLDExICszNzksMTcgQEAKIAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbTsKICAgICAgICAgbU11dGV4LmxvY2soKTsKKyAgICAgICAgYm9vbCBzdG9wcGVkID0gbVN0b3BwZWQ7CiAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dElnYnAgPSBtSWdicDsKICAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOwogICAgICAgICBzeW5jTWVtID0gbVN5bmNNZW07CiAgICAgICAgIG1NdXRleC51bmxvY2soKTsKIAorICAgICAgICBpZiAoc3RvcHBlZCkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJvdXRwdXRCdWZmZXIgLS0gYWxyZWFkeSBzdG9wcGVkLiI7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2hUb0J1ZmZlclF1ZXVlKAogICAgICAgICAgICAgICAgIGJsb2NrLCBvdXRwdXRJZ2JwLCBvdXRwdXRHZW5lcmF0aW9uLCAmYnFTbG90LCBzeW5jTWVtKTsKIApAQCAtNDA4LDEyICs0MjIsMTggQEAKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtOwogICAgIG1NdXRleC5sb2NrKCk7CisgICAgYm9vbCBzdG9wcGVkID0gbVN0b3BwZWQ7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1JZ2JwOwogICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKICAgICB1aW50NjRfdCBvdXRwdXRCcUlkID0gbUJxSWQ7CiAgICAgc3luY01lbSA9IG1TeW5jTWVtOwogICAgIG1NdXRleC51bmxvY2soKTsKIAorICAgIGlmIChzdG9wcGVkKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAib3V0cHV0QnVmZmVyIC0tIGFscmVhZHkgc3RvcHBlZC4iOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgaWYgKCFvdXRwdXRJZ2JwKSB7CiAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAib3V0cHV0QnVmZmVyIC0tIG91dHB1dCBzdXJmYWNlIGlzIG51bGwuIjsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00NjcsNyArNDg3LDcgQEAKICAgICBtTXV0ZXgubG9jaygpOwogICAgIG1NYXhEZXF1ZXVlQnVmZmVyQ291bnQgPSBtYXhEZXF1ZXVlQnVmZmVyQ291bnQ7CiAgICAgYXV0byBzeW5jVmFyID0gbVN5bmNNZW0gPyBtU3luY01lbS0+bWVtKCkgOiBudWxscHRyOwotICAgIGlmIChzeW5jVmFyKSB7CisgICAgaWYgKHN5bmNWYXIgJiYgIW1TdG9wcGVkKSB7CiAgICAgICAgIHN5bmNWYXItPmxvY2soKTsKICAgICAgICAgc3luY1Zhci0+dXBkYXRlTWF4RGVxdWV1ZUNvdW50TG9ja2VkKG1heERlcXVldWVCdWZmZXJDb3VudCk7CiAgICAgICAgIHN5bmNWYXItPnVubG9jaygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwCmluZGV4IDcwYzYzZjIuLmQ1MTI0ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAKQEAgLTQ5LDYgKzQ5LDExIEBACiAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEZpbHRlcldyYXBwZXI+IGZpbHRlcldyYXBwZXIpCiAgICAgICAgIDogbUludGYoaW50ZiksIG1GaWx0ZXJXcmFwcGVyKGZpbHRlcldyYXBwZXIpIHsKICAgICAgICAgdGFrZUZpbHRlcnMoc3RkOjptb3ZlKGZpbHRlcnMpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmlsdGVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbUNvbnRyb2xQYXJhbVR5cGVzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgbUZpbHRlcnNbaV0uZGVzYy5jb250cm9sUGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJzW2ldLmRlc2MuY29udHJvbFBhcmFtcy5lbmQoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICB+V3JhcHBlZERlY29kZXJJbnRlcmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CkBAIC0xODcsNyArMTkyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHN0YWNrUGFyYW1zRm9ySW50ZjsKLSAgICAgICAgc3RkOjpjb3B5X24oc3RhY2tQYXJhbXNMaXN0LmJlZ2luKCksIHN0YWNrUGFyYW1zTGlzdC5zaXplKCksIHN0YWNrUGFyYW1zRm9ySW50Zi5iZWdpbigpKTsKKyAgICAgICAgZm9yIChDMlBhcmFtICpwYXJhbSA6IHN0YWNrUGFyYW1zTGlzdCkgeworICAgICAgICAgICAgaWYgKG1Db250cm9sUGFyYW1UeXBlcy5jb3VudChwYXJhbS0+dHlwZSgpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFja1BhcmFtc0ZvckludGYucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIEdhdGhlciBoZWFwIHBhcmFtcyB0aGF0IGRpZCBub3QgZ2V0IHF1ZXJpZWQgZnJvbSB0aGUgZmlsdGVyIGludGVyZmFjZXMgYWJvdmUuCiAgICAgICAgIC8vIFRoZXNlIG5lZWQgdG8gYmUgcXVlcmllZCBmcm9tIHRoZSBkZWNvZGVyIGludGVyZmFjZS4KQEAgLTE5Nyw2ICsyMDcsOSBAQAogICAgICAgICAgICAgaWYgKG1UeXBlVG9JbmRleEZvclF1ZXJ5LmZpbmQodHlwZSkgIT0gbVR5cGVUb0luZGV4Rm9yUXVlcnkuZW5kKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ29udHJvbFBhcmFtVHlwZXMuY291bnQodHlwZSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaGVhcFBhcmFtSW5kaWNlc0ZvckludGYucHVzaF9iYWNrKGhlYXBQYXJhbUluZGljZXNbal0pOwogICAgICAgICB9CiAKQEAgLTI1MSwxMSArMjY0LDE0IEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtc0ZvckZpbHRlcjsKICAgICAgICAgICAgIGZvciAoQzJQYXJhbSogcGFyYW0gOiBwYXJhbXMpIHsKICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmZpbmQocGFyYW0tPnR5cGUoKS50eXBlKCkpOwotICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtVHlwZVRvSW5kZXhGb3JDb25maWcuZW5kKCkgJiYgaXQtPnNlY29uZCAhPSBpKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ID09IG1UeXBlVG9JbmRleEZvckNvbmZpZy5lbmQoKSB8fCBpdC0+c2Vjb25kICE9IGkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBhcmFtc0ZvckZpbHRlci5wdXNoX2JhY2socGFyYW0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtc0ZvckZpbHRlci5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXItPmNvbmZpZ192YihwYXJhbXNGb3JGaWx0ZXIsIG1heUJsb2NrLCAmZmlsdGVyRmFpbHVyZXMpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgewogICAgICAgICAgICAgICAgIExPRyhlcnIgPT0gQzJfQkFEX0lOREVYID8gVkVSQk9TRSA6IFdBUk5JTkcpCkBAIC0zNTYsNiArMzcyLDcgQEAKICAgICBzdGQ6OndlYWtfcHRyPEZpbHRlcldyYXBwZXI+IG1GaWx0ZXJXcmFwcGVyOwogICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzaXplX3Q+IG1UeXBlVG9JbmRleEZvclF1ZXJ5OwogICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzaXplX3Q+IG1UeXBlVG9JbmRleEZvckNvbmZpZzsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpUeXBlPiBtQ29udHJvbFBhcmFtVHlwZXM7CiAKICAgICBjMl9zdGF0dXNfdCB0cmFuc2ZlclBhcmFtc19sKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmY3VyciwKQEAgLTQzMCw2ICs0NDcsMTAgQEAKICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiBGaWx0ZXJXcmFwcGVyIG5vdCBmb3VuZCI7CiAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWx0ZXJXcmFwcGVyLT5pc0ZpbHRlcmluZ0VuYWJsZWQobmV4dCkpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6IGZpbHRlcmluZyBub3QgZW5hYmxlZCI7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGZpbHRlcldyYXBwZXItPnF1ZXJ5UGFyYW1zRm9yUHJldmlvdXNDb21wb25lbnQobmV4dCwgJnBhcmFtcyk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKQEAgLTU5NCw2ICs2MTUsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1SdW5uaW5nRmlsdGVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IGZpbHRlcnMobUZpbHRlcnMpOworICAgICAgICBtSW50Zi0+dGFrZUZpbHRlcnMoc3RkOjptb3ZlKGZpbHRlcnMpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9zYW1wbGVzL1NhbXBsZUZpbHRlclBsdWdpbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9TYW1wbGVGaWx0ZXJQbHVnaW4uY3BwCmluZGV4IGI5NDJiZTcuLjVjMTNiMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9zYW1wbGVzL1NhbXBsZUZpbHRlclBsdWdpbi5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL3NhbXBsZXMvU2FtcGxlRmlsdGVyUGx1Z2luLmNwcApAQCAtODA3LDcgKzgwNyw4IEBACiAgICAgLy8gYWZmZWN0ZWRQYXJhbXMKICAgICB7CiAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAotICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsICAvLyB3aWxsIGJlIGRlcHJlY2F0ZWQKKyAgICAgICAgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgIH0sCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKaW5kZXggYmI5ZjUxZi4uYjM2ZTgwYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICAvLyBtaW5pamFpbCBpcyB1c2VkIHRvIHByb3RlY3QgYWdhaW5zdCB1bmV4cGVjdGVkIHN5c3RlbSBjYWxscy4KICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IiLAorICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgIF0sCiAgICAgcmVxdWlyZWQ6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZWNjb21wX3BvbGljeSJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjCmluZGV4IDAzZjZlM2QuLjEyZGE1OTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VydmljZS5yYworKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMKQEAgLTMsNSArMyw1IEBACiAgICAgdXNlciBtZWRpYWNvZGVjCiAgICAgZ3JvdXAgY2FtZXJhIG1lZGlhZHJtIGRybXJwYwogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCmluZGV4IDJiYzc0OGYuLjVhNjUyYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCkBAIC03LDYgKzcsMTIgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlY19pbnRlcm5hbF9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKyAgICAvLyBvbmx5IGZvciBpbnRlcm5hbCB0ZXN0cywgcGVyaGFwcyByZXN0cmljdCB2aWEgdmlzaWJpbGl0eSBjbGF1c2UKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWMiLAogCkBAIC0zNywxNyArNDMsMjMgQEAKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlN1cmZhY2VGbGluZ2VyUHJvcGVydGllcyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJANC4wIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNvZGVjMiIsCiAgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKICAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJncmFsbG9jdHlwZXMiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC01OSw2ICs3MSw3IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAorCSJsaWJzdGFnZWZyaWdodF9zdXJmYWNlX3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCmluZGV4IGMwNDkxODcuLmVkN2Q2OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCkBAIC00Miw2ICs0Miw3IEBACiAKICNpbmNsdWRlICJ1dGlscy9Db2RlYzJNYXBwZXIuaCIKICNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NjYsNiArNDY3LDE4IEBACiAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSk7CiAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6aW5wdXQ+IHN0YXRpY0luZm87CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86OmlucHV0PiBkeW5hbWljSW5mbzsKKyAgICAgICAgR2V0SGRyTWV0YWRhdGFGcm9tR3JhbGxvYzRIYW5kbGUoCisgICAgICAgICAgICAgICAgYmxvY2stPmhhbmRsZSgpLAorICAgICAgICAgICAgICAgICZzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgICZkeW5hbWljSW5mbyk7CisgICAgICAgIGlmIChzdGF0aWNJbmZvICYmICpzdGF0aWNJbmZvKSB7CisgICAgICAgICAgICBjMkJ1ZmZlci0+c2V0SW5mbyhzdGF0aWNJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHluYW1pY0luZm8gJiYgKmR5bmFtaWNJbmZvKSB7CisgICAgICAgICAgICBjMkJ1ZmZlci0+c2V0SW5mbyhkeW5hbWljSW5mbyk7CisgICAgICAgIH0KICAgICB9CiAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCmluZGV4IDgyNDYwYzkuLjI5NmQ3ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgpAQCAtMjEyLDkgKzIxMyw4IEBACiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKICAgICAgICAgICAgICAgICAmdXNhZ2UsIHNpemVvZih1c2FnZSkpOwogCi0gICAgICAgIG1Tb3VyY2UtPmNvbmZpZ3VyZSgKLSAgICAgICAgICAgICAgICBtT214Tm9kZSwgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkRhdGFzcGFjZT4obURhdGFTcGFjZSkpOwotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBHZXRTdGF0dXMobVNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIG1PbXhOb2RlLCBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6RGF0YXNwYWNlPihtRGF0YVNwYWNlKSkpOwogICAgIH0KIAogICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKQEAgLTg3Miw2ICs4NzIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bVR1bm5lbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHVzaEJsYW5rQnVmZmVyc09uU3RvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AsICZwdXNoQmxhbmtCdWZmZXJzT25TdG9wKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tUHVzaEJsYW5rQnVmZmVyc09uU3RvcCA9IHB1c2hCbGFua0J1ZmZlcnNPblN0b3AgPT0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldFN1cmZhY2Uoc3VyZmFjZSk7CkBAIC0xMDA3LDcgKzEwMTIsOSBAQAogICAgICAgICAgICAgLy8gUXVlcnkgdmVuZG9yIGZvcm1hdCBmb3IgRmxleGlibGUgWVVWCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CiAgICAgICAgICAgICBDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbyAqcGl4ZWxGb3JtYXRJbmZvID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmIChtQ2xpZW50LT5xdWVyeSgKKyAgICAgICAgICAgIGludCB2ZW5kb3JTZGtWZXJzaW9uID0gYmFzZTo6R2V0SW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICJyby52ZW5kb3IuYnVpbGQudmVyc2lvbi5zZGsiLCBhbmRyb2lkX2dldF9kZXZpY2VfYXBpX2xldmVsKCkpOworICAgICAgICAgICAgaWYgKHZlbmRvclNka1ZlcnNpb24gPj0gX19BTkRST0lEX0FQSV9TX18gJiYgbUNsaWVudC0+cXVlcnkoCiAgICAgICAgICAgICAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgIHtDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzo6UEFSQU1fVFlQRX0sCiAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCkBAIC0xMDE4LDI5ICsxMDI1LDMxIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mbyA9IG51bGxwdHI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBmbGV4UGl4ZWxGb3JtYXR7fTsKLSAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IGZsZXhQbGFuYXJQaXhlbEZvcm1hdHt9OwotICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdHt9OworICAgICAgICAgICAgLy8gYml0IGRlcHRoIC0+IGZvcm1hdAorICAgICAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBmbGV4UGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IGZsZXhQbGFuYXJQaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdDsKICAgICAgICAgICAgIGlmIChwaXhlbEZvcm1hdEluZm8gJiYgKnBpeGVsRm9ybWF0SW5mbykgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGl4ZWxGb3JtYXRJbmZvLT5mbGV4Q291bnQoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgJmRlc2MgPQogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvLT5tLnZhbHVlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuYml0RGVwdGggIT0gOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc2Muc3Vic2FtcGxpbmcgIT0gQzJDb2xvcjo6WVVWXzQyMAorICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5zdWJzYW1wbGluZyAhPSBDMkNvbG9yOjpZVVZfNDIwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE4MDA3NjEwNSk6IHNvbWUgZGV2aWNlIHJlcG9ydCB3cm9uZyBsYXlvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpJTlRFUkxFQVZFRF9QQUNLRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpJTlRFUkxFQVZFRF9BTElHTkVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6VU5LTk9XTl9MQVlPVVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmxleFBpeGVsRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXQgPSBkZXNjLnBpeGVsRm9ybWF0OworICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFBpeGVsRm9ybWF0LmNvdW50KGRlc2MuYml0RGVwdGgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQaXhlbEZvcm1hdC5lbXBsYWNlKGRlc2MuYml0RGVwdGgsIGRlc2MucGl4ZWxGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpQTEFOQVJfUEFDS0VEICYmICFmbGV4UGxhbmFyUGl4ZWxGb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQbGFuYXJQaXhlbEZvcm1hdCA9IGRlc2MucGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpQTEFOQVJfUEFDS0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmxleFBsYW5hclBpeGVsRm9ybWF0LmNvdW50KGRlc2MuYml0RGVwdGgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQbGFuYXJQaXhlbEZvcm1hdC5lbXBsYWNlKGRlc2MuYml0RGVwdGgsIGRlc2MucGl4ZWxGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRCAmJiAhZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdCA9IGRlc2MucGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQuY291bnQoZGVzYy5iaXREZXB0aCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdC5lbXBsYWNlKGRlc2MuYml0RGVwdGgsIGRlc2MucGl4ZWxGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTA1MCw3ICsxMDU5LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoIShjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LmNvdW50KDgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJzZW1pLSI7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTA2NSwxOSArMTA3NCw0NyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHx8ICFzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZW5kb3JTZGtWZXJzaW9uIDwgX19BTkRST0lEX0FQSV9TX18gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZS1TIGZyYW1ld29yayB1c2VkIHRvIG1hcCB0aGVzZSBjb2xvciBmb3JtYXRzIGludG8gWVYxMi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjcyBmcm9tIG9sZGVyIHZlbmRvciBwYXJ0aXRpb24gbWF5IGJlIHJlbHlpbmcgb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYXNzdW1wdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGl4ZWxGb3JtYXQudmFsdWVfb3IoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhQaXhlbEZvcm1hdC5jb3VudCg4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQaXhlbEZvcm1hdFs4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQbGFuYXJQaXhlbEZvcm1hdC52YWx1ZV9vcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQaXhlbEZvcm1hdC52YWx1ZV9vcihmb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFBsYW5hclBpeGVsRm9ybWF0LmNvdW50KDgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBsYW5hclBpeGVsRm9ybWF0WzhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxleFBpeGVsRm9ybWF0LmNvdW50KDgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBpeGVsRm9ybWF0WzhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LnZhbHVlX29yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0LnZhbHVlX29yKGZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LmNvdW50KDgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdFs4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsZXhQaXhlbEZvcm1hdC5jb3VudCg4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQaXhlbEZvcm1hdFs4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWUDAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdC5jb3VudCgxMCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0WzEwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsZXhQaXhlbEZvcm1hdC5jb3VudCgxMCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGl4ZWxGb3JtYXRbMTBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8tb3AKQEAgLTEyMTMsMTEgKzEyNTAsMjUgQEAKICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzIHsKICAgICAgICAgICAgIGNvbG9yQXNwZWN0c1JlcXVlc3RJbmRleC53aXRoU3RyZWFtKDB1KSwKICAgICAgICAgfTsKLSAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wLT5xdWVyeSgKLSAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSwgJnByZXBlbmQgfSwKLSAgICAgICAgICAgICAgICBpbmRpY2VzLAotICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCi0gICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIGludDMyX3QgY29sb3JUcmFuc2ZlclJlcXVlc3QgPSAwOworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfSU1BR0UgfCBDb25maWc6OklTX1ZJREVPKQorICAgICAgICAgICAgICAgICYmICFzZGtQYXJhbXMtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXItcmVxdWVzdCIsICZjb2xvclRyYW5zZmVyUmVxdWVzdCkpIHsKKyAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IEMyX09LOworICAgICAgICBpZiAoY29sb3JUcmFuc2ZlclJlcXVlc3QgIT0gMCkgeworICAgICAgICAgICAgYzJlcnIgPSBjb21wLT5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUsICZwcmVwZW5kIH0sCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYzJlcnIgPSBjb21wLT5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUsICZwcmVwZW5kIH0sCisgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgYzJlcnIgIT0gQzJfQkFEX0lOREVYKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGNvbXBvbmVudCBpbnRlcmZhY2U6ICVkIiwgYzJlcnIpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xMzMyLDggKzEzODMsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2V0IGNoYW5uZWwtbWFzawogICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgLy8gc2V0IGNoYW5uZWwtbWFzawogICAgICAgICAgICAgaW50MzJfdCBtYXNrOwogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX01BU0ssICZtYXNrKSkgewogICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKQEAgLTEzNDIsNiArMTM5MywxNSBAQAogICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2V0IFBDTSBlbmNvZGluZworICAgICAgICAgICAgaW50MzJfdCBwY21FbmNvZGluZyA9IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ7CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpOworICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX2NvbmZpZy1wY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX2NvbmZpZy1wY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbTsKQEAgLTEzNTEsMTEgKzE0MTEsNiBAQAogICAgICAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0gPSBzdGQ6Om1vdmUocGFyYW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY29sb3JUcmFuc2ZlclJlcXVlc3QgPSAwOwotICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfSU1BR0UgfCBDb25maWc6OklTX1ZJREVPKQotICAgICAgICAgICAgICAgICYmICFzZGtQYXJhbXMtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXItcmVxdWVzdCIsICZjb2xvclRyYW5zZmVyUmVxdWVzdCkpIHsKLSAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChjb2xvclRyYW5zZmVyUmVxdWVzdCAhPSAwKSB7CiAgICAgICAgICAgICBpZiAoY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbSAmJiAqY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbSkgewpAQCAtMTM4MCw3ICsxNDM1LDcgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGJsb2NrVXNhZ2UgPQogICAgICAgICAgICAgICAgICAgICB1c2FnZS52YWx1ZSB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFOwogICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPSBGZXRjaEdyYXBoaWNCbG9jaygKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCBibG9ja1VzYWdlLCB7Y29tcC0+Z2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjb21wb25lbnRDb2xvckZvcm1hdCwgYmxvY2tVc2FnZSwge2NvbXAtPmdldE5hbWUoKX0pOwogICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gYnVmZmVyOwogICAgICAgICAgICAgICAgIGlmIChibG9jaykgewogICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKApAQCAtMTQyMSw2ICsxNDc2LDM1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoY29uZmlnLT5tVHVubmVsZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX3R1bm5lbGVkIiwgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGFuIGVuY29kaW5nIHN0YXRpc3RpY3MgbGV2ZWwgdG8gY29ycmVzcG9uZGluZyBlbmNvZGluZyBzdGF0aXN0aWNzCisgICAgICAgIC8vIGtpbmRzCisgICAgICAgIGludDMyX3QgZW5jb2RpbmdTdGF0aXN0aWNzTGV2ZWwgPSBWSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMX05PTkU7CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQorICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMihLRVlfVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTCwgJmVuY29kaW5nU3RhdGlzdGljc0xldmVsKSkgeworICAgICAgICAgICAgLy8gSGlnaGVyIGxldmVsIGluY2x1ZGUgYWxsIHRoZSBlbmMgc3RhdHMgYmVsb25nIHRvIGxvd2VyIGxldmVsLgorICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZ1N0YXRpc3RpY3NMZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIGNhc2UgVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTF8yOiAvLyByZXNlcnZlZCBmb3IgdGhlIGZ1dHVyZSBsZXZlbCAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbW9yZSBlbmMgc3RhdCBraW5kcworICAgICAgICAgICAgICAgIC8vIEZ1dHVyZSBleHRlbmRlZCBlbmNvZGluZyBzdGF0aXN0aWNzIGZvciB0aGUgbGV2ZWwgMiBzaG91bGQgYmUgYWRkZWQgaGVyZQorICAgICAgICAgICAgICAgIGNhc2UgVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTF8xOgorICAgICAgICAgICAgICAgICAgICBjb25maWctPnN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkFuZHJvaWRTdHJlYW1BdmVyYWdlQmxvY2tRdWFudGl6YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTF9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiZW5jb2Rpbmcgc3RhdGlzdGljcyBsZXZlbCA9ICVkIiwgZW5jb2RpbmdTdGF0aXN0aWNzTGV2ZWwpOworCiAgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyIsCiAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIG91dHB1dDogJXMiLApAQCAtMTQ2NSw2ICsxNTQ5LDkgQEAKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM7CiAgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6U3RhdHVzIE9teFN0YXR1czsKICAgICBhbmRyb2lkOjpzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG9teCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KICAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgogICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgpAQCAtMTc0Miw5ICsxODI5LDIxIEBACiAgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UnVubmluZykgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIC8vIHByZXBhcmF0aW9uIG9mIGlucHV0IGJ1ZmZlcnMgbWF5IG5vdCBzdWNjZWVkIGR1ZSB0byB0aGUgbGFjayBvZgorICAgIC8vIG1lbW9yeTsgcmV0dXJuaW5nIGNvcnJlY3QgZXJyb3IgY29kZSAoTk9fTUVNT1JZKSBhcyBhbiBlcnJvciBhbGxvd3MKKyAgICAvLyBNZWRpYUNvZGVjIHRvIHRyeSByZWNsYWltIGFuZCByZXN0YXJ0IGNvZGVjIGdyYWNlZnVsbHkuCisgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gY2xpZW50SW5wdXRCdWZmZXJzOworICAgIGVycjIgPSBtQ2hhbm5lbC0+cHJlcGFyZUluaXRpYWxJbnB1dEJ1ZmZlcnMoJmNsaWVudElucHV0QnVmZmVycyk7CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkluaXRpYWwgcHJlcGFyYXRpb24gZm9yIElucHV0IEJ1ZmZlcnMgZmFpbGVkIik7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBtQ2FsbGJhY2stPm9uU3RhcnRDb21wbGV0ZWQoKTsKIAotICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworICAgIG1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyhzdGQ6Om1vdmUoY2xpZW50SW5wdXRCdWZmZXJzKSk7CiB9CiAKIHZvaWQgQ0NvZGVjOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewpAQCAtMTc3MCw3ICsxODY5LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgc3RhdGUtPnNldChTVE9QUElORyk7CiAgICAgfQotCisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlmIChjb25maWctPm1QdXNoQmxhbmtCdWZmZXJzT25TdG9wKSB7CisgICAgICAgICAgICBtQ2hhbm5lbC0+cHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgbUNoYW5uZWwtPnJlc2V0KCk7CiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpKS0+cG9zdCgpOwogfQpAQCAtMTg1OCw2ICsxOTYzLDEzIEBACiAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2VEYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlmIChjb25maWctPm1QdXNoQmxhbmtCdWZmZXJzT25TdG9wKSB7CisgICAgICAgICAgICBtQ2hhbm5lbC0+cHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBtQ2hhbm5lbC0+cmVzZXQoKTsKICAgICAvLyB0aGl6IGhvbGRzIHN0cm9uZyByZWYgdG8gdGhpcyB3aGlsZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCkBAIC0xODk2LDkgKzIwMDgsMTEgQEAKICAgICB7CiAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyAqPihzdXJmYWNlLmdldCgpKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKICAgICAgICAgaWYgKGNvbmZpZy0+bVR1bm5lbGVkICYmIGNvbmZpZy0+bVNpZGViYW5kSGFuZGxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cgKj4oc3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oCisgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUtPmhhbmRsZSgpKSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xOTA2LDYgKzIwMjAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwgY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUtPmhhbmRsZSgpLCBlcnIpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHJlc2V0IHRoZSBzaWRlYmFuZCBoYW5kbGUgb2YgdGhlIHdpbmRvdyBmb3IKKyAgICAgICAgICAgIC8vIG5vbi10dW5uZWxlZCB2aWRlbyBpbiBjYXNlIHRoZSB3aW5kb3cgd2FzIHByZXZpb3VzbHkgdXNlZAorICAgICAgICAgICAgLy8gZm9yIGEgdHVubmVsZWQgdmlkZW8gcGxheWJhY2suCisgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0obmF0aXZlV2luZG93LmdldCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfc2lkZWJhbmRfc3RyZWFtKG51bGxwdHIpIGZhaWxlZCEgKGVyciAlZCkuIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBtQ2hhbm5lbC0+c2V0U3VyZmFjZShzdXJmYWNlKTsKQEAgLTIwMTQsNyArMjEzNywxNCBAQAogICAgICAgICBzdGF0ZS0+c2V0KFJVTk5JTkcpOwogICAgIH0KIAotICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+IGNsaWVudElucHV0QnVmZmVyczsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2hhbm5lbC0+cHJlcGFyZUluaXRpYWxJbnB1dEJ1ZmZlcnMoJmNsaWVudElucHV0QnVmZmVycyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiUmVzdW1lIHJlcXVlc3QgZm9yIElucHV0IEJ1ZmZlcnMgZmFpbGVkIik7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoc3RkOjptb3ZlKGNsaWVudElucHV0QnVmZmVycykpOwogfQogCiB2b2lkIENDb2RlYzo6c2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMjI5OSw3ICsyNDI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsICAvLyB3aWxsIGJlIGRlcHJlY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRQogICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMjU0Niw3ICsyNjc3LDEwIEBACiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOwogICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeSgKICAgICAgICAgICAgICAgICB7Jm1BcGlGZWF0dXJlc30sCi0gICAgICAgICAgICAgICAge0MyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRQorICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAogICAgICAgICAgICAgICAgICZwYXJhbXMpOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKQEAgLTI1NTksNyArMjY5MywxMCBAQAogICAgICAgICAgICAgaWYgKCFwYXJhbSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLT50eXBlKCkgPT0gQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dHlwZSgpID09IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtRm9ybWF0LnJlc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ6OkZyb20ocGFyYW0pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0tPnR5cGUoKSA9PSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSkgewogICAgICAgICAgICAgICAgIG1JbnB1dEFsbG9jYXRvcnMucmVzZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6RnJvbShwYXJhbSkpOwogICAgICAgICAgICAgfQpAQCAtMjU3OSw2ICsyNzE2LDE2IEBACiAgICAgICAgIHJldHVybiBtQXBpRmVhdHVyZXM7CiAgICAgfQogCisgICAgY29uc3QgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQgJmdldElucHV0U3RyZWFtRm9ybWF0KCkgY29uc3QgeworICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBzSW52YWxpZGF0ZWQgPSBbXXsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gcGFyYW07CisgICAgICAgICAgICBwYXJhbS5yZXNldChuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6SU5WQUxJRCkpOworICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbTsKKyAgICAgICAgfSgpOworICAgICAgICByZXR1cm4gbUlucHV0U3RyZWFtRm9ybWF0ID8gKm1JbnB1dFN0cmVhbUZvcm1hdCA6ICpzSW52YWxpZGF0ZWQ7CisgICAgfQorCiAgICAgY29uc3QgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgJmdldElucHV0QWxsb2NhdG9ycygpIGNvbnN0IHsKICAgICAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gc0ludmFsaWRhdGVkID0gW117CiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+IHBhcmFtID0KQEAgLTI1OTQsNiArMjc0MSw3IEBACiAKICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IG1GaWVsZHM7CiAgICAgQzJBcGlGZWF0dXJlc1NldHRpbmcgbUFwaUZlYXR1cmVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0U3RyZWFtRm9ybWF0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gbUlucHV0QWxsb2NhdG9yczsKIH07CiAKQEAgLTI2MzUsNiArMjc4MywyNCBAQAogICAgICAgICBpZiAoaW50ZkNhY2hlLmluaXRDaGVjaygpICE9IE9LKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBjb25zdCBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCAmc3RyZWFtRm9ybWF0ID0gaW50ZkNhY2hlLmdldElucHV0U3RyZWFtRm9ybWF0KCk7CisgICAgICAgIGlmIChzdHJlYW1Gb3JtYXQpIHsKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjp0eXBlX3QgYWxsb2NhdG9yVHlwZSA9IEMyQWxsb2NhdG9yOjpMSU5FQVI7CisgICAgICAgICAgICBpZiAoc3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgICAgICAgICB8fCBzdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUykgeworICAgICAgICAgICAgICAgIGFsbG9jYXRvclR5cGUgPSBDMkFsbG9jYXRvcjo6R1JBUEhJQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gYWxsb2NhdG9yVHlwZSkgeworICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXQgaW5wdXQgYWxsb2NhdG9ycworICAgICAgICAgICAgICAgIGlkcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZHMtPmluc2VydChkZWZhdWx0QWxsb2NhdG9ySWQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJuYW1lKCVzKSBkb2VzIG5vdCBzdXBwb3J0IGEgdHlwZSgweCV4KSBhcyBpbnB1dCBhbGxvY2F0b3IuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2VzIGRlZmF1bHQgYWxsb2NhdG9yIGlkKCVkKSIsIG5hbWUuY19zdHIoKSwgdHlwZSwgZGVmYXVsdEFsbG9jYXRvcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGNvbnN0IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0ICZhbGxvY2F0b3JzID0gaW50ZkNhY2hlLmdldElucHV0QWxsb2NhdG9ycygpOwogICAgICAgICBpZiAoZmlyc3RJdGVyYXRpb24pIHsKICAgICAgICAgICAgIGZpcnN0SXRlcmF0aW9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggZTlhZGZjOS4uNWVjYjEzMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMTUsMTAgKzE1LDE0IEBACiAgKi8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2RlZmluZSBMT0dfVEFHICJDQ29kZWNCdWZmZXJDaGFubmVsIgorI2RlZmluZSBBVFJBQ0VfVEFHICBBVFJBQ0VfVEFHX1ZJREVPCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxudW1lcmljPgogCkBAIC00Myw5ICs0Nyw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CkBAIC0xNTUsNiArMTU5LDcgQEAKICAgICAgICAgaW5wdXQtPnBpcGVsaW5lRGVsYXkgPSAwdTsKICAgICAgICAgaW5wdXQtPm51bVNsb3RzID0ga1Ntb290aG5lc3NGYWN0b3I7CiAgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gMHU7CisgICAgICAgIGlucHV0LT5sYXN0Rmx1c2hJbmRleCA9IDB1OwogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKQEAgLTI1Miw3ICsyNTcsNyBAQAogICAgICAgICAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlciBjb3BpZWQ7ICVzcmVsZWFzZWQiLAogICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb3B5OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBmYWlsZWQgdG8gY29weSBhIGJ1ZmZlcjsgdGhpcyBtYXkgY2F1c2UgaW5wdXQgIgogICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc3RhcnZhdGlvbiBvbiBjb21wb25lbnQuIiwgbU5hbWUpOwpAQCAtMjgwLDYgKzI4NSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlb3MpIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBpZiAoaW5wdXQtPmZyYW1lUmVhc3NlbWJsZXIpIHsKKyAgICAgICAgICAgIHVzZXNGcmFtZVJlYXNzZW1ibGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIGRyYWluIGFueSBwZW5kaW5nIGl0ZW1zIHdpdGggZW9zCisgICAgICAgICAgICBpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKTsKKyAgICAgICAgfQogICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOwogICAgIH0KICAgICBpZiAodXNlc0ZyYW1lUmVhc3NlbWJsZXIpIHsKQEAgLTMxOSw2ICszMzAsOCBAQAogICAgIH0KICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKICAgICBpZiAoIWl0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICJDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZSglc0B0cz0lbGxkKSIsIG1OYW1lLCAobG9uZyBsb25nKXRpbWVVcykuY19zdHIoKSk7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CiAgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjp0aW1lX3BvaW50IG5vdyA9IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpOwpAQCAtMzM5LDEwICszNTIsMTAgQEAKICAgICB9IGVsc2UgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CiAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGJ1ZmZlcikgewotICAgICAgICAgICAgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKGNvcHkpIHsKKyAgICAgICAgaWYgKGNvcHkpIHsKICAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmV4dHJhQnVmZmVycy5yZWxlYXNlU2xvdChjb3B5LCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKICAgICAgICAgfQogICAgICAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXIlcyAlc3JlbGVhc2VkIiwKICAgICAgICAgICAgICAgbU5hbWUsIChidWZmZXIgPT0gbnVsbHB0cikgPyAiKGNvcHkpIiA6ICIiLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKQEAgLTQxOSw2ICs0MzIsMTAgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7ICsraSkgewogICAgICAgICBzaXplICs9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgKyBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKICAgICB9CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbCA9IG1CbG9ja1Bvb2xzLmxvY2soKS0+aW5wdXRQb29sOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKApAQCAtNDI2LDYgKzQ0Myw4IEBACiAgICAgICAgICAgICBzZWN1cmUgPyBrU2VjdXJlVXNhZ2UgOiBrRGVmYXVsdFJlYWRXcml0ZVVzYWdlLAogICAgICAgICAgICAgJmJsb2NrKTsKICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dJKCJbJXNdIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlcjogZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQ6IHNpemUgPSAlenUgKCVzKSBlcnIgPSAlZCIsCisgICAgICAgICAgICAgIG1OYW1lLCBzaXplLCBzZWN1cmUgPyAic2VjdXJlIiA6ICJub24tc2VjdXJlIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAgICAgaWYgKCFzZWN1cmUpIHsKQEAgLTQ1MCwxOCArNDY5LDkgQEAKICAgICAgICAgICAgICAgICBrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzcmMsIDAsIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgZHN0LCAmZXJyb3JEZXRhaWxNc2cpOwogICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBkZWNyeXB0IGZhaWxlZDogcmVzdWx0ID0gJXpkIiwgbU5hbWUsIHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChkc3QudHlwZSA9PSBEcm1CdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7Ci0gICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2aWV3LnNpemUoKSA8IHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSh2aWV3LmRhdGEoKSwgbURlY3J5cHREZXN0aW5hdGlvbi0+dW5zZWN1cmVQb2ludGVyKCksIHJlc3VsdCk7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKICAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KQEAgLTUxMCwxNiArNTIwLDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmVzdWx0IDwgY29kZWNEYXRhT2Zmc2V0KSB7Ci0gICAgICAgICAgICBBTE9HRCgiaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwgY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQpOworICAgICAgICAgICAgQUxPR0QoIlslc10gaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghc2VjdXJlKSB7CiAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CiAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlcjogYmxvY2sgbWFwIGVycm9yOiAlZCAobm9uLXNlY3VyZSkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIHZpZXcuZXJyb3IoKSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBpZiAodmlldy5zaXplKCkgPCByZXN1bHQpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlcjogYmxvY2sgc2l6ZSB0b28gc21hbGw6IHNpemU9JXUgcmVzdWx0PSV6ZCAiCisgICAgICAgICAgICAgICAgICAiKG5vbi1zZWN1cmUpIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCB2aWV3LnNpemUoKSwgcmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIG1lbWNweSh2aWV3LmRhdGEoKSwgbURlY3J5cHREZXN0aW5hdGlvbi0+dW5zZWN1cmVQb2ludGVyKCksIHJlc3VsdCk7CkBAIC01MjcsNiArNTQzLDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVye0MyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCiAgICAgICAgICAgICBibG9jay0+c2hhcmUoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQsIEMyRmVuY2V7fSkpfTsKICAgICBpZiAoIWJ1ZmZlci0+Y29weShjMkJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBidWZmZXIgY29weSBmYWlsZWQiLCBtTmFtZSk7CiAgICAgICAgIHJldHVybiAtRU5PU1lTOwogICAgIH0KICAgICByZXR1cm4gT0s7CkBAIC04MzIsMTIgKzg0OSw1NCBAQAogICAgICAgICBoZHIxMFBsdXNJbmZvLnJlc2V0KCk7CiAgICAgfQogCisgICAgLy8gSERSIGR5bmFtaWMgaW5mbworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dD4gaGRyRHluYW1pY0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisgICAgLy8gVE9ETzogbWFrZSB0aGlzIHN0aWNreSAmIGVuYWJsZSB1bnNldAorICAgIGlmIChoZHJEeW5hbWljSW5mbyAmJiBoZHJEeW5hbWljSW5mby0+ZmxleENvdW50KCkgPT0gMCkgeworICAgICAgICBoZHJEeW5hbWljSW5mby5yZXNldCgpOworICAgIH0KKworICAgIGlmIChoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgIC8vIEMyU3RyZWFtSGRyMTBQbHVzSW5mbyBpcyBkZXByZWNhdGVkOyBjb21wb25lbnRzIHNob3VsZCB1c2UKKyAgICAgICAgLy8gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvCisgICAgICAgIC8vIFRPRE86ICNtZXRyaWMKKyAgICAgICAgaWYgKGhkckR5bmFtaWNJbmZvKSB7CisgICAgICAgICAgICAvLyBJdCBpcyB1bmV4cGVjdGVkIHRoYXQgQzJTdHJlYW1IZHIxMFBsdXNJbmZvIGFuZAorICAgICAgICAgICAgLy8gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvIGlzIGJvdGggcHJlc2VudC4KKyAgICAgICAgICAgIC8vIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbyB0YWtlcyBwcmlvcml0eS4KKyAgICAgICAgICAgIC8vIFRPRE86ICNtZXRyaWMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dD4gaW5mbyA9CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5mbGV4Q291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6SERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwKTsKKyAgICAgICAgICAgIG1lbWNweShpbmZvLT5tLmRhdGEsIGhkcjEwUGx1c0luZm8tPm0udmFsdWUsIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIGhkckR5bmFtaWNJbmZvID0gaW5mbzsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGMyQnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpOwogICAgIGlmIChibG9ja3Muc2l6ZSgpICE9IDF1KSB7CiAgICAgICAgIEFMT0dEKCJbJXNdIGV4cGVjdGVkIDEgZ3JhcGhpYyBibG9jaywgYnV0IGdvdCAlenUiLCBtTmFtZSwgYmxvY2tzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrcy5mcm9udCgpOworICAgIEMyRmVuY2UgYzJmZW5jZSA9IGJsb2NrLmZlbmNlKCk7CisgICAgc3A8RmVuY2U+IGZlbmNlID0gRmVuY2U6Ok5PX0ZFTkNFOworICAgIC8vIFRPRE86IGl0J3Mgbm90IHN1ZmZpY2llbnQgdG8ganVzdCBjaGVjayBpc0hXKCkgYW5kIHRoZW4gY29uc3RydWN0IGFuZHJvaWQ6OmZlbmNlIGZyb20gaXQuCisgICAgLy8gT25jZSBDMkZlbmNlOjp0eXBlKCkgaXMgYWRkZWQsIGNoZWNrIHRoZSBleGFjdCBDMkZlbmNlIHR5cGUKKyAgICBpZiAoYzJmZW5jZS5pc0hXKCkpIHsKKyAgICAgICAgaW50IGZlbmNlRmQgPSBjMmZlbmNlLmZkKCk7CisgICAgICAgIGZlbmNlID0gc3A8RmVuY2U+OjptYWtlKGZlbmNlRmQpOworICAgICAgICBpZiAoIWZlbmNlKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBGYWlsZWQgdG8gYWxsb2NhdGUgYSBmZW5jZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIGNsb3NlKGZlbmNlRmQpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgogICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKApAQCAtODUwLDggKzkwOSw4IEBACiAgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5ib3R0b20oKSksCiAgICAgICAgICAgICB2aWRlb1NjYWxpbmdNb2RlLAogICAgICAgICAgICAgdHJhbnNmb3JtLAotICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFLCAwKTsKLSAgICBpZiAoaGRyU3RhdGljSW5mbyB8fCBoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgICAgICBmZW5jZSwgMCk7CisgICAgaWYgKGhkclN0YXRpY0luZm8gfHwgaGRyRHluYW1pY0luZm8pIHsKICAgICAgICAgSGRyTWV0YWRhdGEgaGRyOwogICAgICAgICBpZiAoaGRyU3RhdGljSW5mbykgewogICAgICAgICAgICAgLy8gSWYgbWFzdGVyaW5nIG1heCBhbmQgbWluIGx1bWluYW5jZSBmaWVsZHMgYXJlIDAsIGRvIG5vdCB1c2UgdGhlbS4KQEAgLTg4NywxNCArOTQ2LDIyIEBACiAgICAgICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgfD0gSGRyTWV0YWRhdGE6OkNUQTg2MV8zOwogICAgICAgICAgICAgICAgIGhkci5jdGE4NjEzID0gY3RhODYxX21ldGE7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvZXMgbm90IGhhdmUgdmFsaWQgaW5mbworICAgICAgICAgICAgaWYgKCEoaGRyLnZhbGlkVHlwZXMgJiAoSGRyTWV0YWRhdGE6OlNNUFRFMjA4NiB8IEhkck1ldGFkYXRhOjpDVEE4NjFfMykpKSB7CisgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby5yZXNldCgpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgIGlmIChoZHJEeW5hbWljSW5mbworICAgICAgICAgICAgICAgICYmIGhkckR5bmFtaWNJbmZvLT5tLnR5cGVfID09IEMyQ29uZmlnOjpIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDApIHsKICAgICAgICAgICAgIGhkci52YWxpZFR5cGVzIHw9IEhkck1ldGFkYXRhOjpIRFIxMFBMVVM7CiAgICAgICAgICAgICBoZHIuaGRyMTBwbHVzLmFzc2lnbigKLSAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSArIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaGRyRHluYW1pY0luZm8tPm0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaGRyRHluYW1pY0luZm8tPm0uZGF0YSArIGhkckR5bmFtaWNJbmZvLT5mbGV4Q291bnQoKSk7CiAgICAgICAgIH0KICAgICAgICAgcWJpLnNldEhkck1ldGFkYXRhKGhkcik7CisKKyAgICAgICAgU2V0SGRyTWV0YWRhdGFUb0dyYWxsb2M0SGFuZGxlKGhkclN0YXRpY0luZm8sIGhkckR5bmFtaWNJbmZvLCBibG9jay5oYW5kbGUoKSk7CiAgICAgfQogICAgIC8vIHdlIGRvbid0IGhhdmUgZGlydHkgcmVnaW9ucwogICAgIHFiaS5zZXRTdXJmYWNlRGFtYWdlKFJlZ2lvbjo6SU5WQUxJRF9SRUdJT04pOwpAQCAtOTQ5LDYgKzEwMTYsMTAgQEAKICAgICBhcnJheS0+Y2xlYXIoKTsKICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CiAKKyAgICBpZiAoIWlucHV0LT5idWZmZXJzKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dEJ1ZmZlckFycmF5OiBObyBJbnB1dCBCdWZmZXJzIGFsbG9jYXRlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMgPSBpbnB1dC0+YnVmZmVycy0+dG9BcnJheU1vZGUoaW5wdXQtPm51bVNsb3RzKTsKICAgICB9CkBAIC05NTksNyArMTAzMCwxMCBAQAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgewogICAgIGFycmF5LT5jbGVhcigpOwogICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKLQorICAgIGlmICghb3V0cHV0LT5idWZmZXJzKSB7CisgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRCdWZmZXJBcnJheTogTm8gT3V0cHV0IEJ1ZmZlcnMgYWxsb2NhdGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKICAgICAgICAgb3V0cHV0LT5idWZmZXJzID0gb3V0cHV0LT5idWZmZXJzLT50b0FycmF5TW9kZShvdXRwdXQtPm51bVNsb3RzKTsKICAgICB9CkBAIC0xMTE2LDYgKzExOTAsNyBAQAogICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBudW1JbnB1dFNsb3RzOwogICAgICAgICBpbnB1dC0+ZXh0cmFCdWZmZXJzLmZsdXNoKCk7CiAgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gMHU7CisgICAgICAgIGlucHV0LT5sYXN0Rmx1c2hJbmRleCA9IG1GcmFtZUluZGV4LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CiAgICAgICAgIGlmIChhdWRpb0VuY29kZXIgJiYgZW5jb2RlckZyYW1lU2l6ZSAmJiBzYW1wbGVSYXRlICYmIGNoYW5uZWxDb3VudCkgewogICAgICAgICAgICAgaW5wdXQtPmZyYW1lUmVhc3NlbWJsZXIuaW5pdCgKICAgICAgICAgICAgICAgICAgICAgcG9vbCwKQEAgLTEzNzksNiArMTQ1NCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdHVubmVsZWQgPSAwOworICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl90dW5uZWxlZCIsICZ0dW5uZWxlZCkpIHsKKyAgICAgICAgICAgIHR1bm5lbGVkID0gMDsKKyAgICAgICAgfQorICAgICAgICBtVHVubmVsZWQgPSAodHVubmVsZWQgIT0gMCk7CiAgICAgfQogCiAgICAgLy8gU2V0IHVwIHBpcGVsaW5lIGNvbnRyb2wuIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgbUlucHV0QnVmZmVycyBhbmQKQEAgLTE0MDAsNTggKzE0ODEsNjEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCkgeworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cHJlcGFyZUluaXRpYWxJbnB1dEJ1ZmZlcnMoCisgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICpjbGllbnRJbnB1dEJ1ZmZlcnMpIHsKICAgICBpZiAobUlucHV0U3VyZmFjZSkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICB3aGlsZSAoY2xpZW50SW5wdXRCdWZmZXJzLT5zaXplKCkgPCBudW1JbnB1dFNsb3RzKSB7CisgICAgICAgICAgICBzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBpZiAoIWlucHV0LT5idWZmZXJzLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudElucHV0QnVmZmVycy0+ZW1wbGFjZShpbmRleCwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2xpZW50SW5wdXRCdWZmZXJzLT5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGF0IGFsbCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9IGVsc2UgaWYgKGNsaWVudElucHV0QnVmZmVycy0+c2l6ZSgpIDwgbnVtSW5wdXRTbG90cykgeworICAgICAgICBBTE9HRCgiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIHNsb3RzLCAiCisgICAgICAgICAgICAgICJvbmx5ICV6dSBidWZmZXJzIGFsbG9jYXRlZCIsCisgICAgICAgICAgICAgIG1OYW1lLCBjbGllbnRJbnB1dEJ1ZmZlcnMtPnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlslc10gJXp1IGluaXRpYWwgaW5wdXQgYnVmZmVycyBhdmFpbGFibGUiLAorICAgICAgICAgICAgICBtTmFtZSwgY2xpZW50SW5wdXRCdWZmZXJzLT5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKAorICAgICAgICBzdGQ6Om1hcDxzaXplX3QsIHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAmJmNsaWVudElucHV0QnVmZmVycykgewogICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCBvU3RyZWFtRm9ybWF0KDB1KTsKICAgICBDMlByZXBlbmRIZWFkZXJNb2RlU2V0dGluZyBwcmVwZW5kKFBSRVBFTkRfSEVBREVSX1RPX05PTkUpOwogICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQsICZwcmVwZW5kIH0sIHt9LCBDMl9ET05UX0JMT0NLLCBudWxscHRyKTsKICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQotICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gbUlucHV0LmxvY2soKS0+bnVtU2xvdHM7Ci0KLSAgICBzdHJ1Y3QgQ2xpZW50SW5wdXRCdWZmZXIgewotICAgICAgICBzaXplX3QgaW5kZXg7Ci0gICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgICAgc2l6ZV90IGNhcGFjaXR5OwotICAgIH07Ci0gICAgc3RkOjpsaXN0PENsaWVudElucHV0QnVmZmVyPiBjbGllbnRJbnB1dEJ1ZmZlcnM7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKLSAgICAgICAgd2hpbGUgKGNsaWVudElucHV0QnVmZmVycy5zaXplKCkgPCBudW1JbnB1dFNsb3RzKSB7Ci0gICAgICAgICAgICBDbGllbnRJbnB1dEJ1ZmZlciBjbGllbnRJbnB1dEJ1ZmZlcjsKLSAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmNsaWVudElucHV0QnVmZmVyLmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50SW5wdXRCdWZmZXIuYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXIuY2FwYWNpdHkgPSBjbGllbnRJbnB1dEJ1ZmZlci5idWZmZXItPmNhcGFjaXR5KCk7Ci0gICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjbGllbnRJbnB1dEJ1ZmZlcikpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjbGllbnRJbnB1dEJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICBBTE9HVygiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBhdCBhbGwiLCBtTmFtZSk7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfSBlbHNlIGlmIChjbGllbnRJbnB1dEJ1ZmZlcnMuc2l6ZSgpIDwgbnVtSW5wdXRTbG90cykgewotICAgICAgICBBTE9HRCgiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIHNsb3RzLCAiCi0gICAgICAgICAgICAgICJvbmx5ICV6dSBidWZmZXJzIGFsbG9jYXRlZCIsCi0gICAgICAgICAgICAgIG1OYW1lLCBjbGllbnRJbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiWyVzXSAlenUgaW5pdGlhbCBpbnB1dCBidWZmZXJzIGF2YWlsYWJsZSIsCi0gICAgICAgICAgICAgIG1OYW1lLCBjbGllbnRJbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICB9Ci0gICAgLy8gU29ydCBpbnB1dCBidWZmZXJzIGJ5IHRoZWlyIGNhcGFjaXRpZXMgaW4gaW5jcmVhc2luZyBvcmRlci4KLSAgICBjbGllbnRJbnB1dEJ1ZmZlcnMuc29ydCgKLSAgICAgICAgICAgIFtdKGNvbnN0IENsaWVudElucHV0QnVmZmVyJiBhLCBjb25zdCBDbGllbnRJbnB1dEJ1ZmZlciYgYikgewotICAgICAgICAgICAgICAgIHJldHVybiBhLmNhcGFjaXR5IDwgYi5jYXBhY2l0eTsKLSAgICAgICAgICAgIH0pOwogCiAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkQ29uZmlnczsKICAgICBtRmx1c2hlZENvbmZpZ3MubG9jaygpLT5zd2FwKGZsdXNoZWRDb25maWdzKTsKICAgICBpZiAoIWZsdXNoZWRDb25maWdzLmVtcHR5KCkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKKyAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgbm93ID0gUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZENvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yKHdvcmstPmlucHV0LmJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmZmx1c2hlZENvbmZpZ3MpOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CiAgICAgICAgICAgICBBTE9HVygiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBhIGZsdXNoZWQgY29uZmlnIiwgbU5hbWUpOwpAQCAtMTQ1OSwyNSArMTU0MywzMSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSICYmCi0gICAgICAgICAgICAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSA9PSBQUkVQRU5EX0hFQURFUl9UT19OT05FKSkgewotICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBjbGllbnRJbnB1dEJ1ZmZlcnMuZnJvbnQoKS5idWZmZXI7CisgICAgICAgICAgICAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSA9PSBQUkVQRU5EX0hFQURFUl9UT19OT05FKSAmJgorICAgICAgICAgICAgIWNsaWVudElucHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBtaW5JbmRleCA9IGNsaWVudElucHV0QnVmZmVycy5iZWdpbigpLT5maXJzdDsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gbWluQnVmZmVyID0gY2xpZW50SW5wdXRCdWZmZXJzLmJlZ2luKCktPnNlY29uZDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZbaW5kZXgsIGJ1ZmZlcl0gOiBjbGllbnRJbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGlmIChtaW5CdWZmZXItPmNhcGFjaXR5KCkgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIG1pbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAvLyBXT1JLQVJPVU5EOiBTb21lIGFwcHMgZXhwZWN0IENTRCBhdmFpbGFibGUgd2l0aG91dCBxdWV1ZWluZwogICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KLSAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgeworICAgICAgICBtaW5CdWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICBtaW5CdWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgbWluQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChtaW5CdWZmZXIpICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IENTRCIsCiAgICAgICAgICAgICAgICAgICBtTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgIGNsaWVudElucHV0QnVmZmVycy5lcmFzZShtaW5JbmRleCk7CiAgICAgfQogCi0gICAgZm9yIChjb25zdCBDbGllbnRJbnB1dEJ1ZmZlciYgY2xpZW50SW5wdXRCdWZmZXI6IGNsaWVudElucHV0QnVmZmVycykgewotICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoCi0gICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXIuaW5kZXgsCi0gICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXIuYnVmZmVyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJltpbmRleCwgYnVmZmVyXSA6IGNsaWVudElucHV0QnVmZmVycykgeworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTUwMyw2ICsxNTkzLDE0IEBACiAgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKICAgICAgICAgb3V0cHV0LT5idWZmZXJzLnJlc2V0KCk7CiAgICAgfQorICAgIGlmIChtT3V0cHV0U3VyZmFjZS5sb2NrKCktPnN1cmZhY2UpIHsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworICAgICAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50LT5zdG9wVXNpbmdPdXRwdXRTdXJmYWNlKG91dHB1dFBvb2xJZCk7CisgICAgfQogfQogCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlbGVhc2UoKSB7CkBAIC0xNTE4LDQwICsxNjE2LDQ1IEBACiAgICAgc2V0RGVzY3JhbWJsZXIobnVsbHB0cik7CiB9CiAKLQogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgewogICAgIEFMT0dWKCJbJXNdIGZsdXNoIiwgbU5hbWUpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBpbmRpY2VzOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gY29uZmlnczsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZFdvcmspIHsKLSAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2sod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOwotICAgICAgICBpZiAoISh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIG1JbnB1dC5sb2NrKCktPmxhc3RGbHVzaEluZGV4ID0gbUZyYW1lSW5kZXgubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrRG9uZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gY29weShuZXcgQzJXb3JrKTsKKyAgICAgICAgICAgIGNvcHktPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OmZsYWdzX3QoCisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmZsYWdzIHwgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSk7CisgICAgICAgICAgICBjb3B5LT5pbnB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayh3YXRjaGVyLT5vbklucHV0QnVmZmVyUmVsZWFzZWQoZnJhbWVJbmRleCwgaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgY29weS0+aW5wdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weS0+aW5wdXQuaW5mb0J1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5lbmQoKSk7CisgICAgICAgICAgICBjb3B5LT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgICAgICBjb25maWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY29weSkpOworICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrRG9uZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSIsIG1OYW1lKTsKICAgICAgICAgfQotICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpCi0gICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRCgiWyVzXSBubyBsaW5lYXIgY29kZWMgY29uZmlnIGRhdGEgZm91bmQiLCBtTmFtZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBjb3B5KG5ldyBDMldvcmspOwotICAgICAgICBjb3B5LT5pbnB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpmbGFnc190KHdvcmstPmlucHV0LmZsYWdzIHwgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSk7Ci0gICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOwotICAgICAgICBjb3B5LT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOwotICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLmluc2VydCgKLSAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW5kKCkpOwotICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKLSAgICAgICAgICAgIGNvcHktPmlucHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKLSAgICAgICAgfQotICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5pbnNlcnQoCi0gICAgICAgICAgICAgICAgY29weS0+aW5wdXQuaW5mb0J1ZmZlcnMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmVuZCgpKTsKLSAgICAgICAgY29weS0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOwotICAgICAgICBjb25maWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY29weSkpOwotICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEiLCBtTmFtZSk7CiAgICAgfQogICAgIG1GbHVzaGVkQ29uZmlncy5sb2NrKCktPnN3YXAoY29uZmlncyk7CiAgICAgewpAQCAtMTU2NiwxMiArMTY2OSw2IEBACiAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmZsdXNoU3Rhc2goKTsKICAgICAgICAgfQogICAgIH0KLSAgICB7Ci0gICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7Ci0gICAgICAgIGZvciAodWludDY0X3QgaW5kZXggOiBpbmRpY2VzKSB7Ci0gICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KIH0KIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKApAQCAtMTU4OSwxMiArMTY4NiwxOCBAQAogICAgIH0KICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CiAgICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25JbnB1dEJ1ZmZlclJlbGVhc2VkKGZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOwotICAgIGJvb2wgbmV3SW5wdXRTbG90QXZhaWxhYmxlOworICAgIGJvb2wgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gZmFsc2U7CiAgICAgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7Ci0gICAgICAgIG5ld0lucHV0U2xvdEF2YWlsYWJsZSA9IGlucHV0LT5idWZmZXJzLT5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKLSAgICAgICAgaWYgKCFuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICh2b2lkKWlucHV0LT5leHRyYUJ1ZmZlcnMuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIGlmIChpbnB1dC0+bGFzdEZsdXNoSW5kZXggPj0gZnJhbWVJbmRleCkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gSWdub3Jpbmcgc3RhbGUgaW5wdXQgYnVmZmVyIGRvbmUgY2FsbGJhY2s6ICIKKyAgICAgICAgICAgICAgICAgICJsYXN0IGZsdXNoIGluZGV4ID0gJWxsZCwgZnJhbWVJbmRleCA9ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIGlucHV0LT5sYXN0Rmx1c2hJbmRleC5wZWVrbGwoKSwgKGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0lucHV0U2xvdEF2YWlsYWJsZSA9IGlucHV0LT5idWZmZXJzLT5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICghbmV3SW5wdXRTbG90QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpaW5wdXQtPmV4dHJhQnVmZmVycy5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAobmV3SW5wdXRTbG90QXZhaWxhYmxlKSB7CkBAIC0xODMwLDcgKzE5MzMsNyBAQAogCiAgICAgaW50MzJfdCBmbGFncyA9IDA7CiAgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOwogICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgRU9TIiwgbU5hbWUpOwogICAgIH0KIApAQCAtMTg0Nyw2ICsxOTUwLDggQEAKICAgICAgICAgLy8gV2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5wdXQgdGltZXN0YW1wLgogICAgICAgICB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CiAgICAgfQorICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICJDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKCVzQHRzPSVsbGQpIiwgbU5hbWUsIHRpbWVzdGFtcC5wZWVrbGwoKSkuY19zdHIoKSk7CiAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogaW5wdXQgJWxsZCwgY29kZWMgJWxsZCA9PiBvdXRwdXQgJWxsZCA9PiAlbGxkIiwKICAgICAgICAgICBtTmFtZSwKICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCkBAIC0xODY4LDcgKzE5NzMsNyBAQAogICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CiAgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMgJiYgb3V0cHV0LT5idWZmZXJzLT5yZWdpc3RlckNzZChpbml0RGF0YSwgJmluZGV4LCAmb3V0QnVmZmVyKSA9PSBPSykgewogICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lc3RhbXAucGVlaygpKTsKLSAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyk7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHKTsKICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGNzZCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCkpOwogCiAgICAgICAgICAgICBvdXRwdXQudW5sb2NrKCk7CkBAIC0xODgxLDEwICsxOTg2LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBib29sIGRyb3AgPSBmYWxzZTsKKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSkgeworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBkcm9wIGJ1ZmZlciBidXQga2VlcCBtZXRhZGF0YSIsIG1OYW1lKTsKKyAgICAgICAgZHJvcCA9IHRydWU7CisgICAgfQorCiAgICAgaWYgKG5vdGlmeUNsaWVudCAmJiAhYnVmZmVyICYmICFmbGFncykgewotICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKLSAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOwotICAgICAgICBub3RpZnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1UdW5uZWxlZCAmJiBkcm9wICYmIG91dHB1dEZvcm1hdCkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogS2VlcCB0dW5uZWxlZCwgZHJvcCBmcmFtZSB3aXRoIGZvcm1hdCBjaGFuZ2UgKCVsbGQpIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOworICAgICAgICAgICAgbm90aWZ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoYnVmZmVyKSB7CkBAIC0xODkzLDcgKzIwMDksNyBAQAogICAgICAgICAgICAgc3dpdGNoIChpbmZvLT5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpDT1JFX0lOREVYOgogICAgICAgICAgICAgICAgICAgICBpZiAoKChDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm8gKilpbmZvLmdldCgpKS0+dmFsdWUgJiBDMkNvbmZpZzo6U1lOQ19GUkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfS0VZX0ZSQU1FOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xOTI1LDYgKzIwNDEsOSBAQAogICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyOwogCisgICAgY29uc3RleHByIGludCBrTWF4UmVhbGxvY1RyeSA9IDU7CisgICAgaW50IHJlYWxsb2NUcnlOdW0gPSAwOworCiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwogICAgICAgICBpZiAoIW91dHB1dC0+YnVmZmVycykgewpAQCAtMTkzMiw2ICsyMDUxLDkgQEAKICAgICAgICAgfQogICAgICAgICBhY3Rpb24gPSBvdXRwdXQtPmJ1ZmZlcnMtPnBvcEZyb21TdGFzaEFuZFJlZ2lzdGVyKAogICAgICAgICAgICAgICAgICZjMkJ1ZmZlciwgJmluZGV4LCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKGFjdGlvbiAhPSBPdXRwdXRCdWZmZXJzOjpSRUFMTE9DQVRFKSB7CisgICAgICAgICAgICByZWFsbG9jVHJ5TnVtID0gMDsKKyAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgICBjYXNlIE91dHB1dEJ1ZmZlcnM6OlNLSVA6CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xOTQyLDYgKzIwNjQsMTMgQEAKICAgICAgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBPdXRwdXRCdWZmZXJzOjpSRUFMTE9DQVRFOgorICAgICAgICAgICAgaWYgKCsrcmVhbGxvY1RyeU51bSA+IGtNYXhSZWFsbG9jVHJ5KSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LnVubG9jaygpOworICAgICAgICAgICAgICAgIEFMT0dFKCJbJXNdIHNlbmRPdXRwdXRCdWZmZXJzOiB0cmllZCAlZCByZWFsbG9jIGFuZCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwga01heFJlYWxsb2NUcnkpOworICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKICAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMgPQogICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKG91dHB1dC0+bnVtU2xvdHMpOwpAQCAtMjAxMywxMiArMjE0MiwxMyBAQAogfQogCiBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBDQ29kZWNCdWZmZXJDaGFubmVsOjplbGFwc2VkKCkgewotICAgIC8vIFdoZW4gY2xpZW50IHB1c2hlZCBFT1MsIHdlIHdhbnQgYWxsIHRoZSB3b3JrIHRvIGJlIGRvbmUgcXVpY2tseS4KICAgICAvLyBPdGhlcndpc2UsIGNvbXBvbmVudCBtYXkgaGF2ZSBzdGFsbGVkIHdvcmsgZHVlIHRvIGlucHV0IHN0YXJ2YXRpb24gdXAgdG8KICAgICAvLyB0aGUgc3VtIG9mIHRoZSBkZWxheSBpbiB0aGUgcGlwZWxpbmUuCisgICAgLy8gVE9ETyhiLzIzMTI1MzMwMSk6IFdoZW4gY2xpZW50IHB1c2hlZCBFT1MsIHRoZSBwaXBlbGluZSBjb3VsZCBoYXZlIGxlc3MKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGZyYW1lcy4KICAgICBzaXplX3QgbiA9IDA7Ci0gICAgaWYgKCFtSW5wdXRNZXRFb3MpIHsKLSAgICAgICAgc2l6ZV90IG91dHB1dERlbGF5ID0gbU91dHB1dC5sb2NrKCktPm91dHB1dERlbGF5OworICAgIHNpemVfdCBvdXRwdXREZWxheSA9IG1PdXRwdXQubG9jaygpLT5vdXRwdXREZWxheTsKKyAgICB7CiAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKICAgICAgICAgbiA9IGlucHV0LT5pbnB1dERlbGF5ICsgaW5wdXQtPnBpcGVsaW5lRGVsYXkgKyBvdXRwdXREZWxheTsKICAgICB9CkBAIC0yMDk3LDQgKzIyMjcsMTMgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnB1c2hCbGFua0J1ZmZlclRvT3V0cHV0U3VyZmFjZSgpIHsKKyAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cgKj4ob3V0cHV0LT5zdXJmYWNlLmdldCgpKTsKKyAgaWYgKG5hdGl2ZVdpbmRvdyA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgIH0KKyAgcmV0dXJuIHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cuZ2V0KCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKaW5kZXggNWEyYWNhMi4uZjI5YTIyNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCkBAIC0xMzAsOSArMTMwLDIzIEBACiAgICAgICAgICAgICBib29sIGJ1ZmZlcnNCb3VuZFRvQ29kZWMpOwogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IGNsaWVudC4KKyAgICAgKiBQcmVwYXJlIGluaXRpYWwgaW5wdXQgYnVmZmVycyB0byBiZSBmaWxsZWQgYnkgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtIGNsaWVudElucHV0QnVmZmVyc1tvdXRdICAgcG9pbnRlciB0byBzbG90IGluZGV4IC0+IGJ1ZmZlciBtYXAuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gc3VjY2VzcywgaXQgY29udGFpbnMgcHJlcGFyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGlucHV0IGJ1ZmZlcnMuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlSW5pdGlhbElucHV0QnVmZmVycygKKyAgICAgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICpjbGllbnRJbnB1dEJ1ZmZlcnMpOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgYXMgcHJlcGFyZWQgaW4gY2xpZW50SW5wdXRCdWZmZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGNsaWVudElucHV0QnVmZmVyc1tpbl0gICAgc2xvdCBpbmRleCAtPiBidWZmZXIgbWFwIHdpdGggcHJlcGFyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGlucHV0IGJ1ZmZlcnMuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBzdGQ6Om1hcDxzaXplX3QsIHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAmJmNsaWVudElucHV0QnVmZmVycyk7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCkBAIC0xODEsNiArMTk1LDExIEBACiAKICAgICB2b2lkIHNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpOwogCisgICAgLyoqCisgICAgICogUHVzaCBhIGJsYW5rIGJ1ZmZlciB0byB0aGUgY29uZmlndXJlZCBuYXRpdmUgb3V0cHV0IHN1cmZhY2UuCisgICAgICovCisgICAgc3RhdHVzX3QgcHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCk7CisKIHByaXZhdGU6CiAgICAgY2xhc3MgUXVldWVHdWFyZDsKIApAQCAtMjczLDYgKzI5Miw3IEBACiAgICAgICAgIHNpemVfdCBudW1FeHRyYVNsb3RzOwogICAgICAgICB1aW50MzJfdCBpbnB1dERlbGF5OwogICAgICAgICB1aW50MzJfdCBwaXBlbGluZURlbGF5OworICAgICAgICBjMl9jbnRyNjRfdCBsYXN0Rmx1c2hJbmRleDsKIAogICAgICAgICBGcmFtZVJlYXNzZW1ibGVyIGZyYW1lUmVhc3NlbWJsZXI7CiAgICAgfTsKQEAgLTMyMyw2ICszNDMsOCBAQAogICAgICAgICByZXR1cm4gbUNyeXB0byAhPSBudWxscHRyIHx8IG1EZXNjcmFtYmxlciAhPSBudWxscHRyOwogICAgIH0KICAgICBzdGQ6OmF0b21pY19ib29sIG1TZW5kRW5jcnlwdGVkSW5mb0J1ZmZlcjsKKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbVR1bm5lbGVkOwogfTsKIAogLy8gQ29udmVyc2lvbiBvZiBhIGMyX3N0YXR1c190IHZhbHVlIHRvIGEgc3RhdHVzX3QgdmFsdWUgbWF5IGRlcGVuZCBvbiB0aGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcAppbmRleCAzMzNhMmNhLi4wZjRhOGQ4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CkBAIC0zMyw3ICszMyw5IEBACiAKIG5hbWVzcGFjZSB7CiAKLXNwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorY29uc3RleHByIHVpbnQzMl90IFBJWEVMX0ZPUk1BVF9VTktOT1dOID0gMDsKKworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUlucHV0R3JhcGhpY0J1ZmZlcigKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0LApAQCAtNDUsOSArNDcsMTMgQEAKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCisgICAgaW50NjRfdCB1c2FnZVZhbHVlID0gMDsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQ2NCgiYW5kcm9pZC5fQzJNZW1vcnlVc2FnZSIsICZ1c2FnZVZhbHVlKTsKKyAgICBDMk1lbW9yeVVzYWdlIGZ1bGxVc2FnZXt1c2FnZVZhbHVlIHwgdXNhZ2UuZXhwZWN0ZWR9OworCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKLSAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCBmdWxsVXNhZ2UsICZibG9jayk7CiAgICAgaWYgKGVyciAhPSBDMl9PSykgewogICAgICAgICBBTE9HRCgiZmV0Y2ggZ3JhcGhpYyBibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xMzIsNiArMTM4LDcgQEAKICAgICBpZiAoIWNvcHktPmNvcHkoYzJidWZmZXIpKSB7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKyAgICBjb3B5LT5tZXRhKCktPmV4dGVuZChidWZmZXItPm1ldGEoKSk7CiAgICAgcmV0dXJuIGNvcHk7CiB9CiAKQEAgLTE5OSw2ICsyMDYsNjEgQEAKICAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKHNraXAsIGN1dCwgbUNoYW5uZWxDb3VudCk7CiB9CiAKK2Jvb2wgT3V0cHV0QnVmZmVyczo6Y29udmVydCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmc3JjLCBzcDxDb2RlYzJCdWZmZXI+ICpkc3QpIHsKKyAgICBpZiAoc3JjICYmIHNyYy0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludDMyX3QgY29uZmlnRW5jb2RpbmcgPSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OworICAgIGludDMyX3QgY29kZWNFbmNvZGluZyA9IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ7CisgICAgaWYgKG1Gb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fY29kZWMtcGNtLWVuY29kaW5nIiwgJmNvZGVjRW5jb2RpbmcpCisgICAgICAgICAgICAmJiBtRm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2NvbmZpZy1wY20tZW5jb2RpbmciLCAmY29uZmlnRW5jb2RpbmcpKSB7CisgICAgICAgIGlmIChtU3JjRW5jb2RpbmcgIT0gY29kZWNFbmNvZGluZyB8fCBtRHN0RW5jb2RpbmcgIT0gY29uZmlnRW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGlmIChjb2RlY0VuY29kaW5nICE9IGNvbmZpZ0VuY29kaW5nKSB7CisgICAgICAgICAgICAgICAgbURhdGFDb252ZXJ0ZXIgPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvRW5jb2RpbmcpY29kZWNFbmNvZGluZywgKEF1ZGlvRW5jb2RpbmcpY29uZmlnRW5jb2RpbmcpOworICAgICAgICAgICAgICAgIEFMT0dEX0lGKG1EYXRhQ29udmVydGVyLCAiWyVzXSBDb252ZXJ0ZXIgY3JlYXRlZCBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgY29kZWNFbmNvZGluZywgY29uZmlnRW5jb2RpbmcpOworICAgICAgICAgICAgICAgIG1Gb3JtYXRXaXRoQ29udmVydGVyID0gbUZvcm1hdC0+ZHVwKCk7CisgICAgICAgICAgICAgICAgbUZvcm1hdFdpdGhDb252ZXJ0ZXItPnNldEludDMyKEtFWV9QQ01fRU5DT0RJTkcsIGNvbmZpZ0VuY29kaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURhdGFDb252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIG1Gb3JtYXRXaXRoQ29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TcmNFbmNvZGluZyA9IGNvZGVjRW5jb2Rpbmc7CisgICAgICAgICAgICBtRHN0RW5jb2RpbmcgPSBjb25maWdFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50IGVuY29kaW5nOyAhbUZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZlbmNvZGluZykKKyAgICAgICAgICAgICAgICB8fCBlbmNvZGluZyAhPSBtRHN0RW5jb2RpbmcpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1EYXRhQ29udmVydGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gc3JjQnVmZmVyOworICAgIGlmIChzcmMpIHsKKyAgICAgICAgc3JjQnVmZmVyID0gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUobUZvcm1hdCwgc3JjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcmNCdWZmZXIgPSBuZXcgTWVkaWFDb2RlY0J1ZmZlcihtRm9ybWF0LCBuZXcgQUJ1ZmZlcigwKSk7CisgICAgfQorICAgIGlmICghc3JjQnVmZmVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCEqZHN0KSB7CisgICAgICAgICpkc3QgPSBuZXcgQ29kZWMyQnVmZmVyKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgbmV3IEFCdWZmZXIobURhdGFDb252ZXJ0ZXItPnRhcmdldFNpemUoc3JjQnVmZmVyLT5zaXplKCkpKSk7CisgICAgfQorICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGRzdEJ1ZmZlciA9ICpkc3Q7CisgICAgc3RhdHVzX3QgZXJyID0gbURhdGFDb252ZXJ0ZXItPmNvbnZlcnQoc3JjQnVmZmVyLCBkc3RCdWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIlslc10gYnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIG1OYW1lLCBlcnIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRzdEJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXRXaXRoQ29udmVydGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBPdXRwdXRCdWZmZXJzOjpjbGVhclN0YXNoKCkgewogICAgIG1QZW5kaW5nLmNsZWFyKCk7CiAgICAgbVJlb3JkZXJTdGFzaC5jbGVhcigpOwpAQCAtMjM2LDcgKzI5OCw3IEBACiAgICAgICAgIGludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0LAogICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0JiBvcmRpbmFsKSB7Ci0gICAgYm9vbCBlb3MgPSBmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICBib29sIGVvcyA9IGZsYWdzICYgQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKICAgICBpZiAoIWJ1ZmZlciAmJiBlb3MpIHsKICAgICAgICAgLy8gVFJJQ0tZOiB3ZSBtYXkgYmUgdmlvbGF0aW5nIG9yZGVyaW5nIG9mIHRoZSBzdGFzaCBoZXJlLiBCZWNhdXNlIHdlCiAgICAgICAgIC8vIGRvbid0IGV4cGVjdCBhbnkgbW9yZSBlbXBsYWNlKCkgY2FsbHMgYWZ0ZXIgdGhpcywgdGhlIG9yZGVyaW5nIHNob3VsZApAQCAtMjQ0LDcgKzMwNiw3IEBACiAgICAgICAgIG1SZW9yZGVyU3Rhc2guZW1wbGFjZV9iYWNrKAogICAgICAgICAgICAgICAgIGJ1ZmZlciwgbm90aWZ5LCB0aW1lc3RhbXAsIGZsYWdzLCBmb3JtYXQsIG9yZGluYWwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZsYWdzID0gZmxhZ3MgJiB+TWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBmbGFncyA9IGZsYWdzICYgfkJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CiAgICAgICAgIGF1dG8gaXQgPSBtUmVvcmRlclN0YXNoLmJlZ2luKCk7CiAgICAgICAgIGZvciAoOyBpdCAhPSBtUmVvcmRlclN0YXNoLmVuZCgpOyArK2l0KSB7CiAgICAgICAgICAgICBpZiAobGVzcyhvcmRpbmFsLCBpdC0+b3JkaW5hbCkpIHsKQEAgLTI1NSw3ICszMTcsNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlciwgbm90aWZ5LCB0aW1lc3RhbXAsIGZsYWdzLCBmb3JtYXQsIG9yZGluYWwpOwogICAgICAgICBpZiAoZW9zKSB7CiAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmJhY2soKS5mbGFncyA9Ci0gICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5iYWNrKCkuZmxhZ3MgfCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5iYWNrKCkuZmxhZ3MgfCBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAgICAgfQogICAgIHdoaWxlICghbVJlb3JkZXJTdGFzaC5lbXB0eSgpICYmIG1SZW9yZGVyU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CkBAIC0yOTIsNyArMzU0LDcgQEAKIAogICAgIC8vIEZsdXNoaW5nIG1SZW9yZGVyU3Rhc2ggYmVjYXVzZSBubyBvdGhlciBidWZmZXJzIHNob3VsZCBjb21lIGFmdGVyIG91dHB1dAogICAgIC8vIEVPUy4KLSAgICBpZiAoZW50cnkuZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICBpZiAoZW50cnkuZmxhZ3MgJiBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgIC8vIEZsdXNoIHJlb3JkZXIgc3Rhc2gKICAgICAgICAgc2V0UmVvcmRlckRlcHRoKDApOwogICAgIH0KQEAgLTg4Nyw2ICs5NDksMTAgQEAKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCisgICAgaW50NjRfdCB1c2FnZVZhbHVlID0gMDsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQ2NCgiYW5kcm9pZC5fQzJNZW1vcnlVc2FnZSIsICZ1c2FnZVZhbHVlKTsKKyAgICB1c2FnZSA9IEMyTWVtb3J5VXNhZ2UodXNhZ2UuZXhwZWN0ZWQgfCB1c2FnZVZhbHVlKTsKKwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKICAgICBpZiAoZXJyICE9IEMyX09LIHx8IGJsb2NrID09IG51bGxwdHIpIHsKQEAgLTEwMzEsNyArMTA5Nyw3IEBACiAgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLCBmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sLCBwaXhlbEZvcm1hdF0oKQogICAgICAgICAgICAgICAgICAgICAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICByZXR1cm4gQWxsb2NhdGVJbnB1dEdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCBmb3JtYXQsIHBpeGVsRm9ybWF0LCB1c2FnZSwgbGJwKTsKICAgICAgICAgICAgIH0pOwogICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOwpAQCAtMTA0MiwxMCArMTEwOCw4IEBACiB9CiAKIHNwPENvZGVjMkJ1ZmZlcj4gR3JhcGhpY0lucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgewotICAgIGludDY0X3QgdXNhZ2VWYWx1ZSA9IDA7Ci0gICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDY0KCJhbmRyb2lkLl9DMk1lbW9yeVVzYWdlIiwgJnVzYWdlVmFsdWUpOwotICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2V7dXNhZ2VWYWx1ZSB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKLSAgICByZXR1cm4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICByZXR1cm4gQWxsb2NhdGVJbnB1dEdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICBtUG9vbCwgbUZvcm1hdCwgZXh0cmFjdFBpeGVsRm9ybWF0KG1Gb3JtYXQpLCB1c2FnZSwgbUxvY2FsQnVmZmVyUG9vbCk7CiB9CiAKQEAgLTEwNzgsNyArMTE0Miw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7Ci0gICAgaWYgKCFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CisgICAgaWYgKCFjb252ZXJ0KGJ1ZmZlciwgJmMyQnVmZmVyKSAmJiAhYzJCdWZmZXItPmNvcHkoYnVmZmVyKSkgewogICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKICAgICB9CkBAIC0xMTk0LDExICsxMjU4LDE0IEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKICAgICAgICAgc2l6ZV90ICppbmRleCwKICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgewotICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOwotICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyOworICAgIGlmICghY29udmVydChidWZmZXIsICZuZXdCdWZmZXIpKSB7CisgICAgICAgIG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG5ld0J1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOwogICAgIH0KLSAgICBuZXdCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CiAgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CiAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCmluZGV4IDk5NWQzYTQuLmM4ZTk5MzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaApAQCAtMTgsOSArMTgsMTEgQEAKIAogI2RlZmluZSBDQ09ERUNfQlVGRkVSU19IXwogCisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxEYXRhQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIApAQCAtMzgyLDYgKzM4NCwxNCBAQAogICAgICAqLwogICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpOwogCisgICAgLyoqCisgICAgICogQXBwbHkgRGF0YUNvbnZlcnRlciBmcm9tIHxzcmN8IHRvIHwqZHN0fCBpZiBuZWVkZWQuIElmIHwqZHN0fCBpcyBudWxscHRyLAorICAgICAqIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgY29udmVyc2lvbiB3YXMgbmVlZGVkIGFuZCBleGVjdXRlZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29udmVydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZzcmMsIHNwPENvZGVjMkJ1ZmZlcj4gKmRzdCk7CisKIHByaXZhdGU6CiAgICAgLy8gU2tpcEN1dEJ1ZmZlcgogICAgIGludDMyX3QgbURlbGF5OwpAQCAtMzkxLDYgKzQwMSwxMiBAQAogCiAgICAgdm9pZCBzZXRTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2tpcCwgaW50MzJfdCBjdXQpOwogCisgICAgLy8gRGF0YUNvbnZlcnRlcgorICAgIHNwPERhdGFDb252ZXJ0ZXI+IG1EYXRhQ29udmVydGVyOworICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0V2l0aENvbnZlcnRlcjsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IG1TcmNFbmNvZGluZzsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IG1Ec3RFbmNvZGluZzsKKwogICAgIC8vIE91dHB1dCBzdGFzaAogCiAgICAgLy8gU3RydWN0IGZvciBhbiBlbnRyeSBpbiB0aGUgb3V0cHV0IHN0YXNoIChtUGVuZGluZyBhbmQgbVJlb3JkZXJTdGFzaCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKaW5kZXggYzI3NTE4Ny4uNTIwOGJlNiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNDb2RlY0NvbmZpZyIKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisKICNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgogI2luY2x1ZGUgPEMyUGFyYW0uaD4KICNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CkBAIC0zMjQsNyArMzI5LDggQEAKICAgICA6IG1JbnB1dEZvcm1hdChuZXcgQU1lc3NhZ2UpLAogICAgICAgbU91dHB1dEZvcm1hdChuZXcgQU1lc3NhZ2UpLAogICAgICAgbVVzaW5nU3VyZmFjZShmYWxzZSksCi0gICAgICBtVHVubmVsZWQoZmFsc2UpIHsgfQorICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKKyAgICAgIG1QdXNoQmxhbmtCdWZmZXJzT25TdG9wKGZhbHNlKSB7IH0KIAogdm9pZCBDQ29kZWNDb25maWc6OmluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpIHsKICAgICB0eXBlZGVmIERvbWFpbiBEOwpAQCAtMzk3LDEwICs0MDMsMTAgQEAKICAgICAvLyBSb3RhdGlvbgogICAgIC8vIE5vdGU6IFNESyByb3RhdGlvbiBpcyBjbG9jay13aXNlLCB3aGlsZSBDMiByb3RhdGlvbiBpcyBjb3VudGVyLWNsb2NrLXdpc2UKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OLCAidmFsdWUiKQotICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkNPREVEKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpDT0RFRCkKICAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1JPVEFUSU9OLCAidmFsdWUiKQotICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlJBVykKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKQogICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKIAogICAgIC8vIGFuZHJvaWQgJ3ZpZGVvLXNjYWxpbmcnCkBAIC01MTAsNiArNTE2LDkgQEAKICAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWZhbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtZmFsbCIpCiAgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOwogCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9IRFJfRk9STUFULCBDMl9QQVJBTUtFWV9IRFJfRk9STUFULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpDT0RFRCAmIEQ6OkNPTkZJRykpOworCiAgICAgYWRkKENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyhLRVlfRkVBVFVSRV8pICsgRkVBVFVSRV9TZWN1cmVQbGF5YmFjaywKICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFLCAidmFsdWUiKSk7CiAKQEAgLTYwOSwxMCArNjE4LDMwIEBACiAgICAgYWRkKENvbmZpZ01hcHBlcigiY3NkLTAiLCAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5JVF9EQVRBLCAgICAgICAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CiAKLSAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfSERSMTBfUExVU19JTkZPLCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UEFSQU0gJiBEOjpJTlBVVCkpOwogCi0gICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSERSMTBfUExVU19JTkZPLCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPLCAidmFsdWUiKQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoQzJfUEFSQU1LRVlfSU5QVVRfSERSX0RZTkFNSUNfSU5GTykgKyAiLnR5cGUiLAorICAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5QVVRfSERSX0RZTkFNSUNfSU5GTywgInR5cGUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlBBUkFNICYgRDo6SU5QVVQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPKSArICIuZGF0YSIsCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPLCAiZGF0YSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UEFSQU0gJiBEOjpJTlBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPKSArICIudHlwZSIsCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfSERSX0RZTkFNSUNfSU5GTywgInR5cGUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPKSArICIuZGF0YSIsCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfSERSX0RZTkFNSUNfSU5GTywgImRhdGEiKQogICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOwogCiAgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICIiKQpAQCAtNjU3LDI0ICs2ODYsMjkgQEAKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURSwgICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKIAotICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BDTV9FTkNPRElORywgIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgICAgICAgInZhbHVlIikKKyAgICBhdXRvIHBjbUVuY29kaW5nTWFwcGVyID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworICAgIGF1dG8gcGNtRW5jb2RpbmdSZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHZhbHVlOworICAgICAgICBpbnQzMl90IHRvOworICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKHZhbHVlKT46OnR5cGU7CisgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QQ01fRU5DT0RJTkcsICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcsICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKQotICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKLSAgICAgICAgICAgIGludDMyX3QgdmFsdWU7Ci0gICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdG87Ci0gICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKLSAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKLSAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB2YWx1ZTsKLSAgICAgICAgICAgIGludDMyX3QgdG87Ci0gICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKHZhbHVlKT46OnR5cGU7Ci0gICAgICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOwotICAgICAgICB9KSk7CisgICAgICAgIC53aXRoTWFwcGVycyhwY21FbmNvZGluZ01hcHBlciwgcGNtRW5jb2RpbmdSZXZlcnNlKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fY29kZWMtcGNtLWVuY29kaW5nIiwgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OlJFQUQpCisgICAgICAgIC53aXRoTWFwcGVycyhwY21FbmNvZGluZ01hcHBlciwgcGNtRW5jb2RpbmdSZXZlcnNlKSk7CiAKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JU19BRFRTLCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKQpAQCAtODk0LDYgKzkyOCwxMiBAQAogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSB8IEQ6OlJFQUQpKSk7CiAKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSB8IEQ6OlJFQUQpKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX01BU0ssIEMyX1BBUkFNS0VZX0NIQU5ORUxfTUFTSywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgRDo6UkVBRCkpOworCiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX1NCUl9NT0RFLCBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREUsICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUiAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSB8IEQ6OlJFQUQpKQogICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgewpAQCAtOTQ4LDkgKzk4OCwzOSBAQAogICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDAgPyBDMl9GQUxTRSA6IEMyX1RSVUU7CiAgICAgICAgIH0pKTsKIAotICAgIC8qIHN0aWxsIHRvIGRvCi0gICAgY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl90dW5uZWwtcGVlay1zZXQtbGVnYWN5IiwgQzJfUEFSQU1LRVlfVFVOTkVMX1BFRUtfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpWSURFTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgICAgICAgKHZvaWQpdi5nZXQoJnZhbHVlKTsKKyAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gMAorICAgICAgICAgICAgICA/IEMyVmFsdWUoQzJQbGF0Zm9ybUNvbmZpZzo6U1BFQ0lGSUVEX1BFRUspCisgICAgICAgICAgICAgIDogQzJWYWx1ZShDMlBsYXRmb3JtQ29uZmlnOjpVTlNQRUNJRklFRF9QRUVLKTsKKyAgICAgICAgfSkpOwogCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVklERU9fUVBfQVZFUkFHRSwgQzJfUEFSQU1LRVlfQVZFUkFHRV9RUCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUElDVFVSRV9UWVBFLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1RZUEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6OlJFQUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgYzI7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNkaykgJiYgQzJNYXBwZXI6Om1hcChzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZShjMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGsgPSBQSUNUVVJFX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgQzJNYXBwZXI6Om1hcChjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgLyogc3RpbGwgdG8gZG8KICAgICAgICBub3QgeWV0IHVzZWQgYnkgTWVkaWFDb2RlYywgYnV0IGRlZmluZWQgYXMgTWVkaWFGb3JtYXQKICAgICBLRVlfQVVESU9fU0VTU0lPTl9JRCAvLyB3ZSB1c2UgImF1ZGlvLWh3LXN5bmMiCiAgICAgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRICkBAIC0xMDU3LDYgKzExMjcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworCisgICAgICAgICAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pIHsKKyAgICAgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMkFuZHJvaWRTdHJlYW1BdmVyYWdlQmxvY2tRdWFudGl6YXRpb25JbmZvOjpvdXRwdXQoMHUsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfQVZFUkFHRV9RUCk7CisgICAgICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm86Om91dHB1dCgwdSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QSUNUVVJFX1RZUEUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDkxLDYgKzExNjgsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHN1YnNjcmliZWQgaW5pdGlhbGx5LCBidXQgY2FuIGJlIHN1YnNjcmliZWQKKyAgICAvLyB1cG9uIGV4cGxpY2l0IHJlcXVlc3QuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4ga09wdGlvbmFsUGFyYW1zID0geworICAgICAgICBDMkFuZHJvaWRTdHJlYW1BdmVyYWdlQmxvY2tRdWFudGl6YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4ICZpbmRleCA6IGtPcHRpb25hbFBhcmFtcykgeworICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuZXJhc2UoaW5kZXgpOworICAgIH0KKyAgICBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb25maWd1cmFibGUsIHt9LCBDMl9NQVlfQkxPQ0spOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMDk4LDE1ICsxMTg2LDIxIEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gJmNvbmZpZ3VyYWJsZSwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAogICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1Byb2R1Y3RGaXJzdEFwaUxldmVsID0KKyAgICAgICAgYmFzZTo6R2V0SW50UHJvcGVydHk8aW50MzJfdD4oInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0JvYXJkQXBpTGV2ZWwgPQorICAgICAgICBiYXNlOjpHZXRJbnRQcm9wZXJ0eTxpbnQzMl90Pigicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZpcnN0QXBpTGV2ZWwgPQorICAgICAgICAoa0JvYXJkQXBpTGV2ZWwgIT0gMCkgPyBrQm9hcmRBcGlMZXZlbCA6IGtQcm9kdWN0Rmlyc3RBcGlMZXZlbDsKICAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7Ci0gICAgLy8gVE9ETzogZW5hYmxlIHRoaXMgd2hlbiBjb21wb25lbnRzIG5vIGxvbmdlciBjcmFzaCBvbiB0aGlzIGNvbmZpZwotICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpICE9IG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgJiYgZmFsc2UpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljZXM7CisgICAgaWYgKG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkgIT0gbVN1YnNjcmliZWRJbmRpY2VzU2l6ZQorICAgICAgICAgICAgJiYga0ZpcnN0QXBpTGV2ZWwgPj0gX19BTkRST0lEX0FQSV9UX18pIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljZXNWZWN0b3I7CiAgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBtU3Vic2NyaWJlZEluZGljZXMpIHsKLSAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgICAgIGluZGljZXNWZWN0b3IucHVzaF9iYWNrKGl4KTsKICAgICAgICAgfQogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBzdWJzY3JpYmVUdW5pbmcgPQotICAgICAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1VuaXF1ZShpbmRpY2VzKTsKKyAgICAgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NVbmlxdWUoaW5kaWNlc1ZlY3Rvcik7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiByZXN1bHRzOwogICAgICAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbmZpZ3VyYWJsZS0+Y29uZmlnKHsgc3Vic2NyaWJlVHVuaW5nLmdldCgpIH0sIGJsb2NraW5nLCAmcmVzdWx0cyk7CiAgICAgICAgIGlmIChjMkVyciAhPSBDMl9PSyAmJiBjMkVyciAhPSBDMl9CQURfSU5ERVgpIHsKQEAgLTExMTYsNiArMTIxMCwyMCBAQAogICAgICAgICBBTE9HVigiU3Vic2NyaWJlZCB0byAlenUgcGFyYW1zIiwgbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSk7CiAgICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgPSBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpOwogICAgIH0KKyNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCisgICAgQUxPR1YoInN1YnNjcmliZWQgdG8gJXp1IHBhcmFtczoiLCBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4ICZpbmRleCA6IG1TdWJzY3JpYmVkSW5kaWNlcykgeworICAgICAgICBzcyA8PCBpbmRleCA8PCAiICI7CisgICAgICAgIGlmIChzcy5zdHIoKS5sZW5ndGgoKSA+IDcwKSB7CisgICAgICAgICAgICBBTE9HVigiJXMiLCBzcy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtKCkuc3dhcChzcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzcy5zdHIoKS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCIlcyIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgIH0KKyNlbmRpZgogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTE0MCw2ICsxMjQ4LDEyIEBACiAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnAgOiBjb25maWdVcGRhdGUpIHsKICAgICAgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgICAgIC8vIEFsbG93IHVuc3Vic2NyaWJlZCB2ZW5kb3IgcGFyYW1ldGVycyB0byBnbyB0aHJvdWdoIC0tLSBpdCBtYXkgYmUKKyAgICAgICAgICAgIC8vIGxhdGVyIGhhbmRsZWQgYnkgdGhlIGZvcm1hdCBzaGFwZXIuCisgICAgICAgICAgICBpZiAoIXAtPmlzVmVuZG9yKCkgJiYgbVN1YnNjcmliZWRJbmRpY2VzLmNvdW50KHAtPmluZGV4KCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidXBkYXRlQ29uZmlndXJhdGlvbjogc2tpcHBlZCB1bnN1YnNjcmliZWQgcGFyYW0gJTA4eCIsIHAtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYXV0byBpbnNlcnRpb24gPSBtQ3VycmVudENvbmZpZy5lbXBsYWNlKHAtPmluZGV4KCksIG51bGxwdHIpOwogICAgICAgICAgICAgaWYgKGluc2VydGlvbi5zZWNvbmQgfHwgKmluc2VydGlvbi5maXJzdC0+c2Vjb25kICE9ICpwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KHAtPmluZGV4KCkpIHx8IG1Mb2NhbFBhcmFtcy5jb3VudChwLT5pbmRleCgpKSkgewpAQCAtMTUxMCw2ICsxNjI0LDIyIEBACiAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtY2xsIikpOwogICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWZhbGwiKSk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBIRFIgZHluYW1pYyBpbmZvCisgICAgICAgIHN0ZDo6c3RyaW5nIGtleVByZWZpeCA9IGlucHV0ID8gQzJfUEFSQU1LRVlfSU5QVVRfSERSX0RZTkFNSUNfSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlS2V5ID0ga2V5UHJlZml4ICsgIi50eXBlIjsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGF0YUtleSA9IGtleVByZWZpeCArICIuZGF0YSI7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gZGF0YTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKHR5cGVLZXkuY19zdHIoKSwgJnR5cGUpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kQnVmZmVyKGRhdGFLZXkuY19zdHIoKSwgJmRhdGEpKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSMTBfUExVU19JTkZPLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUodHlwZUtleS5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKGRhdGFLZXkuY19zdHIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgQUxPR1YoImNvbnZlcnRlZCB0byBTREsgdmFsdWVzIGFzICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwpAQCAtMTU5Myw2ICsxNzIzLDI3IEBACiAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdChDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIGNhcHR1cmVSYXRlIC8gZnJhbWVSYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBIRFIgZm9ybWF0IGZvciB2aWRlbyBlbmNvZGluZworICAgICAgICBpZiAoY29uZmlnRG9tYWluID09IElTX0NPTkZJRykgeworICAgICAgICAgICAgLy8gZG9uJ3QgYXNzdW1lIGhlcmUgdGhhdCB0cmFuc2ZlciBpcyBzZXQgZm9yIEhEUiwgb25seSByZXF1aXJlIGl0IGZvciBITEcKKyAgICAgICAgICAgIGludCB0cmFuc2ZlciA9IDA7CisgICAgICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0cmFuc2Zlcik7CisKKyAgICAgICAgICAgIGludCBwcm9maWxlOworICAgICAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9QUk9GSUxFLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4gbWFwcGVyID0KKyAgICAgICAgICAgICAgICAgICAgQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihtQ29kaW5nTWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90IGMyID0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6VU5LTk9XTjsKKyAgICAgICAgICAgICAgICBpZiAobWFwcGVyICYmIG1hcHBlci0+bWFwSGRyRm9ybWF0KHByb2ZpbGUsICZjMikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMyID09IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhMRyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgIT0gQ09MT1JfVFJBTlNGRVJfSExHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlVOS05PV047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihDMl9QQVJBTUtFWV9IRFJfRk9STUFULCBjMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgeyAgIC8vIHJlZmxlY3QgdGVtcG9yYWwgbGF5ZXJpbmcgaW50byBhIGJpbmFyeSBibG9iCkBAIC0xNjkwLDYgKzE4NDEsMTYgQEAKICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCBtZXRhLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyRHluYW1pY0luZm87CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgJmhkckR5bmFtaWNJbmZvKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4IDogeyBDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfSERSX0RZTkFNSUNfSU5GTyB9KSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigocHJlZml4ICsgIi50eXBlIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF80MCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRCdWZmZXIoKHByZWZpeCArICIuZGF0YSIpLmNfc3RyKCksIGhkckR5bmFtaWNJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2Ugc2V0IHByb3BlciBzaWduZWRuZXNzIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzCkBAIC0xODgyLDcgKzIwNDMsOSBAQAogICAgIG5hbWVzLT5jbGVhcigpOwogICAgIC8vIFRPRE86IGV4cGFuZCB0byBzdGFuZGFyZCBwYXJhbXMKICAgICBmb3IgKGNvbnN0IGF1dG8gJltrZXksIGRlc2NdIDogbVZlbmRvclBhcmFtcykgewotICAgICAgICBuYW1lcy0+cHVzaF9iYWNrKGtleSk7CisgICAgICAgIGlmIChkZXNjLT5pc1Zpc2libGUoKSkgeworICAgICAgICAgICAgbmFtZXMtPnB1c2hfYmFjayhrZXkpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaAppbmRleCA0MTdiNzczLi4yZTdiODY2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCkBAIC0xNDgsNiArMTQ4LDggQEAKICAgICBib29sIG1UdW5uZWxlZDsKICAgICBzcDxOYXRpdmVIYW5kbGU+IG1TaWRlYmFuZEhhbmRsZTsKIAorICAgIGJvb2wgbVB1c2hCbGFua0J1ZmZlcnNPblN0b3A7CisKICAgICBDQ29kZWNDb25maWcoKTsKIAogICAgIC8vLyBpbml0aWFsaXplcyB0aGUgbWVtYmVycyByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGZvcm1hdDogZGVzY3JpcHRvcnMsIHJlZmxlY3RvciwKQEAgLTM2MywxMSArMzY1LDYgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMsCiAgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nID0gQzJfRE9OVF9CTE9DSyk7CiAKLXByaXZhdGU6Ci0KLSAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCi0gICAgdm9pZCBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKLQogICAgIC8vLyBBZGRzIGluZGljZXMgdG8gdGhlIHN1YnNjcmliZWQgaW5kaWNlcywgYW5kIHVwZGF0ZWQgc3Vic2NyaXB0aW9uIHRvIGNvbXBvbmVudAogICAgIC8vLyBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CiAgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCkBAIC0zNzUsNiArMzcyLDExIEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCiAgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nID0gQzJfRE9OVF9CTE9DSyk7CiAKK3ByaXZhdGU6CisKKyAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCisgICAgdm9pZCBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKKwogICAgIC8vLyBHZXRzIFNESyBmb3JtYXQgZnJvbSBjb2RlYyAyLjAgcmVmbGVjdGVkIGNvbmZpZ3VyYXRpb24KICAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzawogICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXRGb3JEb21haW4oCkBAIC0zOTYsNCArMzk4LDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQ19DT0RFQ19IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCmluZGV4IDQwNzA0NzguLmNkZTRjNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCkBAIC0xNiwxMSArMTYsMTggQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXIiCisjZGVmaW5lIEFUUkFDRV9UQUcgIEFUUkFDRV9UQUdfVklERU8KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi9DdGE4NjFfMy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vU21wdGUyMDg2Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vMS4yL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9tYXBwZXIvNC4wL0lNYXBwZXIuaD4KKyNpbmNsdWRlIDxncmFsbG9jdHlwZXMvR3JhbGxvYzQuaD4KICNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KQEAgLTIyNCw2ICsyMzEsNyBAQAogICAgICAgICAgIG1BbGxvY2F0ZWREZXB0aCgwKSwKICAgICAgICAgICBtQmFja0J1ZmZlclNpemUoMCksCiAgICAgICAgICAgbU1lZGlhSW1hZ2UobmV3IEFCdWZmZXIoc2l6ZW9mKE1lZGlhSW1hZ2UyKSkpIHsKKyAgICAgICAgQVRSQUNFX0NBTEwoKTsKICAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmbUNsaWVudENvbG9yRm9ybWF0KSkgewogICAgICAgICAgICAgbUNsaWVudENvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CiAgICAgICAgIH0KQEAgLTI2MCw2ICsyNjgsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGludD4gY2xpZW50Qml0RGVwdGggPSB7fTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1DbGllbnRDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCaXREZXB0aCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDExUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQxMVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0NDRGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJpdERlcHRoID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8tb3A7IHVzZWQgd2l0aCBvcHRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBmYWlscyBpZiBjbGllbnQgYml0LWRlcHRoIGFuZCB0aGUgY29tcG9uZW50IGJpdC1kZXB0aCBkaWZmZXJzCisgICAgICAgICAgICAgICAgaWYgKChjbGllbnRCaXREZXB0aCkgJiYgKGJpdERlcHRoICE9IGNsaWVudEJpdERlcHRoLnZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJCaXQgZGVwdGggb2YgY2xpZW50OiAlZCBhbmQgY29tcG9uZW50OiAlZCBkaWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICpjbGllbnRCaXREZXB0aCwgYml0RGVwdGgpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvIHlQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOwogICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvIHVQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOwogICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvIHZQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOwpAQCAtMzU4LDIxICszOTksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlkZSBpcyBpbiBieXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBzdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBzdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1PZmZzZXQgPSBzdHJpZGUgKiB2U3RyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBzdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBzdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGUgKiAyICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUNvbEluYyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5V3JhcHBpbmcpIHsKQEAgLTUzMyw4ICs1NzUsOCBAQAogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyU2l6ZSArPSBzdHJpZGUgKiB2U3RyaWRlCi0gICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZyAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgLy8gc3RyaWRlIGlzIGluIGJ5dGVzCisgICAgICAgICAgICBidWZmZXJTaXplICs9IHN0cmlkZSAqIHZTdHJpZGUgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nOwogICAgICAgICB9CiAKICAgICAgICAgbUJhY2tCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKQEAgLTU3NSw2ICs2MTcsNyBAQAogICAgICAqIENvcHkgQzJHcmFwaGljVmlldyB0byBNZWRpYUltYWdlMi4KICAgICAgKi8KICAgICBzdGF0dXNfdCBjb3B5VG9NZWRpYUltYWdlKCkgeworICAgICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgICAgIH0KQEAgLTYxMyw3ICs2NTYsOSBAQAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCiAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBBVFJBQ0VfQkVHSU4oIkdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUgYmxvY2stPm1hcCgpIik7CiAgICAgQzJHcmFwaGljVmlldyB2aWV3KGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgQVRSQUNFX0VORCgpOwogICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKICAgICAgICAgQUxPR0QoIkMyR3JhcGhpY0Jsb2NrOjptYXAgZmFpbGVkOiAlZCIsIHZpZXcuZXJyb3IoKSk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtNjU4LDYgKzcwMyw3IEBACiB9CiAKIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY0Jsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgdWludDMyX3Qgd2lkdGggPSBtVmlldy53aWR0aCgpOwogICAgIHVpbnQzMl90IGhlaWdodCA9IG1WaWV3LmhlaWdodCgpOwogICAgIGlmICghbVdyYXBwZWQpIHsKQEAgLTc0Niw4ICs3OTIsMTAgQEAKICAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisgICAgQVRSQUNFX0JFR0lOKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUgYmxvY2stPm1hcCgpIik7CiAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIEFUUkFDRV9FTkQoKTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gaG9sZGVyOwogCiAgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoKnZpZXcsIGZvcm1hdCwgZmFsc2UgLyogY29weSAqLyk7CkBAIC03ODcsOCArODM1LDE0IEBACiAgICAgICAgIEFMT0dEKCJmb3JtYXQgaGFkIG5vIHdpZHRoIC8gaGVpZ2h0Iik7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICAvLyBOT1RFOiB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IFlVVjQyMCBmb3JtYXRzIGZvciBieXRlLWJ1ZmZlciBtb2RlLgotICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIoYWxsb2MoYWxpZ24od2lkdGgsIDE2KSAqIGFsaWduKGhlaWdodCwgMTYpICogMyAvIDIpKTsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgaW50MzJfdCBicHAgPSAxMjsgIC8vIDgoWSkgKyAyKFUpICsgMihWKQorICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmY29sb3JGb3JtYXQpKSB7CisgICAgICAgIGlmIChjb2xvckZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVZQMDEwKSB7CisgICAgICAgICAgICBicHAgPSAyNDsgIC8vIDE2KFkpICsgNChVKSArIDQoVikKKyAgICAgICAgfQorICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyKGFsbG9jKGFsaWduKHdpZHRoLCAxNikgKiBhbGlnbihoZWlnaHQsIDE2KSAqIGJwcCAvIDgpKTsKICAgICByZXR1cm4gbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAogICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgYUJ1ZmZlciwKQEAgLTg0MiwxMSArODk2LDEzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBBVFJBQ0VfQkVHSU4oIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5IGJsb2NrLT5tYXAoKSIpOwogICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAogICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLAogICAgICAgICAgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCiAgICAgICAgICAgICBjb25zdF9jYXN0PENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyICo+KHRoaXMpLT5mb3JtYXQoKSwKICAgICAgICAgICAgIHRydWUgLyogY29weSAqLyk7CisgICAgQVRSQUNFX0VORCgpOwogICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTQxLDQgKzk5NywyNTAgQEAKICAgICByZXR1cm4gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJsb2NrLT5oYW5kbGUoKSk7CiB9CiAKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkN0YTg2MV8zOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6U21wdGUyMDg2OworCit1c2luZyA6OmFuZHJvaWQ6OmdyYWxsb2M0OjpNZXRhZGF0YVR5cGVfQ3RhODYxXzM7Cit1c2luZyA6OmFuZHJvaWQ6OmdyYWxsb2M0OjpNZXRhZGF0YVR5cGVfU21wdGUyMDg2OwordXNpbmcgOjphbmRyb2lkOjpncmFsbG9jNDo6TWV0YWRhdGFUeXBlX1NtcHRlMjA5NF80MDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK3VzaW5nIEVycm9yNCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlY0XzA6OkVycm9yOwordXNpbmcgSU1hcHBlcjQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWNF8wOjpJTWFwcGVyOworCituYW1lc3BhY2UgeworCitzcDxJTWFwcGVyND4gR2V0TWFwcGVyNCgpIHsKKyAgICBzdGF0aWMgc3A8SU1hcHBlcjQ+IHNNYXBwZXIgPSBJTWFwcGVyNDo6Z2V0U2VydmljZSgpOworICAgIHJldHVybiBzTWFwcGVyOworfQorCitjbGFzcyBHcmFsbG9jNEJ1ZmZlciB7CitwdWJsaWM6CisgICAgR3JhbGxvYzRCdWZmZXIoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgOiBtQnVmZmVyKG51bGxwdHIpIHsKKyAgICAgICAgc3A8SU1hcHBlcjQ+IG1hcHBlciA9IEdldE1hcHBlcjQoKTsKKyAgICAgICAgaWYgKCFtYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBVbndyYXAgcmF3IGJ1ZmZlciBoYW5kbGUgZnJvbSB0aGUgQzJIYW5kbGUKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgaWYgKCFuaCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEltcG9ydCB0aGUgcmF3IGhhbmRsZSBzbyBJTWFwcGVyIGNhbiB1c2UgdGhlIGJ1ZmZlci4gVGhlIGltcG9ydGVkCisgICAgICAgIC8vIGhhbmRsZSBtdXN0IGJlIGZyZWVkIHdoZW4gdGhlIGNsaWVudCBpcyBkb25lIHdpdGggdGhlIGJ1ZmZlci4KKyAgICAgICAgbWFwcGVyLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfaGFuZGxlKG5oKSwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgRXJyb3I0ICZlcnJvciwgdm9pZCAqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBUUklDS1k6IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUgY3JlYXRlcyBhIG5ldyBoYW5kbGUgYnV0CisgICAgICAgIC8vICAgICAgICAgZG9lcyBub3QgY2xvbmUgdGhlIGZkcy4gVGh1cyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgaGFuZGxlCisgICAgICAgIC8vICAgICAgICAgd2l0aG91dCBjbG9zaW5nIGl0LgorICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgfQorCisgICAgfkdyYWxsb2M0QnVmZmVyKCkgeworICAgICAgICBzcDxJTWFwcGVyND4gbWFwcGVyID0gR2V0TWFwcGVyNCgpOworICAgICAgICBpZiAobWFwcGVyICYmIG1CdWZmZXIpIHsKKyAgICAgICAgICAgIC8vIEZyZWUgdGhlIGltcG9ydGVkIGJ1ZmZlciBoYW5kbGUuIFRoaXMgZG9lcyBub3QgcmVsZWFzZSB0aGUKKyAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgYnVmZmVyIGl0c2VsZi4KKyAgICAgICAgICAgIG1hcHBlci0+ZnJlZUJ1ZmZlcihtQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG1CdWZmZXIgIT0gbnVsbHB0cik7IH0KK3ByaXZhdGU6CisgICAgdm9pZCAqbUJ1ZmZlcjsKK307CisKK30gIC8vIG5hbXNwYWNlCisKK2MyX3N0YXR1c190IEdldEhkck1ldGFkYXRhRnJvbUdyYWxsb2M0SGFuZGxlKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNNZXRhZGF0YUluZm86OmlucHV0PiAqc3RhdGljSW5mbywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6aW5wdXQ+ICpkeW5hbWljSW5mbykgeworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIHNwPElNYXBwZXI0PiBtYXBwZXIgPSBHZXRNYXBwZXI0KCk7CisgICAgR3JhbGxvYzRCdWZmZXIgYnVmZmVyKGhhbmRsZSk7CisgICAgaWYgKCFtYXBwZXIgfHwgIWJ1ZmZlcikgeworICAgICAgICAvLyBHcmFsbG9jNCBub3Qgc3VwcG9ydGVkOyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIEVycm9yNCBtYXBwZXJFcnIgPSBFcnJvcjQ6Ok5PTkU7CisgICAgaWYgKHN0YXRpY0luZm8pIHsKKyAgICAgICAgQUxPR1YoIkdyYWJiaW5nIHN0YXRpYyBIRFIgaW5mbyBmcm9tIGdyYWxsb2M0IG1ldGFkYXRhIik7CisgICAgICAgIHN0YXRpY0luZm8tPnJlc2V0KG5ldyBDMlN0cmVhbUhkclN0YXRpY01ldGFkYXRhSW5mbzo6aW5wdXQoMHUpKTsKKyAgICAgICAgbWVtc2V0KCYoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcsIDAsIHNpemVvZigoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcpKTsKKyAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWF4Q2xsID0gMDsKKyAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWF4RmFsbCA9IDA7CisgICAgICAgIElNYXBwZXI0OjpnZXRfY2IgY2IgPSBbJm1hcHBlckVyciwgc3RhdGljSW5mb10oRXJyb3I0IGVyciwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgbWFwcGVyRXJyID0gZXJyOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8U21wdGUyMDg2PiBzbXB0ZTIwODY7CisgICAgICAgICAgICBncmFsbG9jNDo6ZGVjb2RlU21wdGUyMDg2KHZlYywgJnNtcHRlMjA4Nik7CisgICAgICAgICAgICBpZiAoc21wdGUyMDg2KSB7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLnJlZC54ICAgID0gc21wdGUyMDg2LT5wcmltYXJ5UmVkLng7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLnJlZC55ICAgID0gc21wdGUyMDg2LT5wcmltYXJ5UmVkLnk7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLmdyZWVuLnggID0gc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcuZ3JlZW4ueSAgPSBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi55OworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1hc3RlcmluZy5ibHVlLnggICA9IHNtcHRlMjA4Ni0+cHJpbWFyeUJsdWUueDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcuYmx1ZS55ICAgPSBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnk7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLndoaXRlLnggID0gc21wdGUyMDg2LT53aGl0ZVBvaW50Lng7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLndoaXRlLnkgID0gc21wdGUyMDg2LT53aGl0ZVBvaW50Lnk7CisKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlID0gc21wdGUyMDg2LT5tYXhMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLm1pbkx1bWluYW5jZSA9IHNtcHRlMjA4Ni0+bWluTHVtaW5hbmNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXBwZXJFcnIgPSBFcnJvcjQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1hcHBlci0+Z2V0KGJ1ZmZlci5nZXQoKSwgTWV0YWRhdGFUeXBlX1NtcHRlMjA4NiwgY2IpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IEMyX1JFRlVTRUQ7CisgICAgICAgIH0gZWxzZSBpZiAobWFwcGVyRXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGNiID0gWyZtYXBwZXJFcnIsIHN0YXRpY0luZm9dKEVycm9yNCBlcnIsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZ2ZWMpIHsKKyAgICAgICAgICAgIG1hcHBlckVyciA9IGVycjsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPEN0YTg2MV8zPiBjdGE4NjFfMzsKKyAgICAgICAgICAgIGdyYWxsb2M0OjpkZWNvZGVDdGE4NjFfMyh2ZWMsICZjdGE4NjFfMyk7CisgICAgICAgICAgICBpZiAoY3RhODYxXzMpIHsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXhDbGwgICA9IGN0YTg2MV8zLT5tYXhDb250ZW50TGlnaHRMZXZlbDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXhGYWxsICA9IGN0YTg2MV8zLT5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXBwZXJFcnIgPSBFcnJvcjQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0ID0gbWFwcGVyLT5nZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfQ3RhODYxXzMsIGNiKTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlcnIgPSBDMl9SRUZVU0VEOworICAgICAgICB9IGVsc2UgaWYgKG1hcHBlckVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZHluYW1pY0luZm8pIHsKKyAgICAgICAgQUxPR1YoIkdyYWJiaW5nIGR5bmFtaWMgSERSIGluZm8gZnJvbSBncmFsbG9jNCBtZXRhZGF0YSIpOworICAgICAgICBkeW5hbWljSW5mby0+cmVzZXQoKTsKKyAgICAgICAgSU1hcHBlcjQ6OmdldF9jYiBjYiA9IFsmbWFwcGVyRXJyLCBkeW5hbWljSW5mb10oRXJyb3I0IGVyciwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgbWFwcGVyRXJyID0gZXJyOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWR5bmFtaWNJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmR5bmFtaWNJbmZvID0gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjppbnB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHZlYy5zaXplKCksIDB1LCBDMkNvbmZpZzo6SERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwKTsKKyAgICAgICAgICAgIG1lbWNweSgoKmR5bmFtaWNJbmZvKS0+bS5kYXRhLCB2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICAgICAgfTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1hcHBlci0+Z2V0KGJ1ZmZlci5nZXQoKSwgTWV0YWRhdGFUeXBlX1NtcHRlMjA5NF80MCwgY2IpOworICAgICAgICBpZiAoIXJldC5pc09rKCkgfHwgbWFwcGVyRXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgZHluYW1pY0luZm8tPnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitjMl9zdGF0dXNfdCBTZXRIZHJNZXRhZGF0YVRvR3JhbGxvYzRIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkclN0YXRpY01ldGFkYXRhSW5mbzo6b3V0cHV0PiAmc3RhdGljSW5mbywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0PiAmZHluYW1pY0luZm8sCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzcDxJTWFwcGVyND4gbWFwcGVyID0gR2V0TWFwcGVyNCgpOworICAgIEdyYWxsb2M0QnVmZmVyIGJ1ZmZlcihoYW5kbGUpOworICAgIGlmICghbWFwcGVyIHx8ICFidWZmZXIpIHsKKyAgICAgICAgLy8gR3JhbGxvYzQgbm90IHN1cHBvcnRlZDsgbm90aGluZyB0byBkbworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoc3RhdGljSW5mbyAmJiAqc3RhdGljSW5mbykgeworICAgICAgICBBTE9HVigiU2V0dGluZyBzdGF0aWMgSERSIGluZm8gYXMgZ3JhbGxvYzQgbWV0YWRhdGEiKTsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxTbXB0ZTIwODY+IHNtcHRlMjA4NiA9IFNtcHRlMjA4NnsKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLngsIHN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueX0sCisgICAgICAgICAgICB7c3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLngsIHN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi55fSwKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcuYmx1ZS54LCBzdGF0aWNJbmZvLT5tYXN0ZXJpbmcuYmx1ZS55fSwKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueCwgc3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLnl9LAorICAgICAgICAgICAgc3RhdGljSW5mby0+bWFzdGVyaW5nLm1heEx1bWluYW5jZSwKKyAgICAgICAgICAgIHN0YXRpY0luZm8tPm1hc3RlcmluZy5taW5MdW1pbmFuY2UsCisgICAgICAgIH07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICAgICAgaWYgKDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlSZWQueCAmJiBzbXB0ZTIwODYtPnByaW1hcnlSZWQueCA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT5wcmltYXJ5UmVkLnkgJiYgc21wdGUyMDg2LT5wcmltYXJ5UmVkLnkgPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+cHJpbWFyeUdyZWVuLnggJiYgc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueCA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueSAmJiBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi55IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnggJiYgc21wdGUyMDg2LT5wcmltYXJ5Qmx1ZS54IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnkgJiYgc21wdGUyMDg2LT5wcmltYXJ5Qmx1ZS55IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPndoaXRlUG9pbnQueCAmJiBzbXB0ZTIwODYtPndoaXRlUG9pbnQueCA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT53aGl0ZVBvaW50LnkgJiYgc21wdGUyMDg2LT53aGl0ZVBvaW50LnkgPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+bWF4THVtaW5hbmNlICYmIDAuMCA8PSBzbXB0ZTIwODYtPm1pbkx1bWluYW5jZQorICAgICAgICAgICAgICAgICYmIGdyYWxsb2M0OjplbmNvZGVTbXB0ZTIwODYoc21wdGUyMDg2LCAmdmVjKSA9PSBPSykgeworICAgICAgICAgICAgUmV0dXJuPEVycm9yND4gcmV0ID0gbWFwcGVyLT5zZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfU21wdGUyMDg2LCB2ZWMpOworICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfUkVGVVNFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6Om9wdGlvbmFsPEN0YTg2MV8zPiBjdGE4NjFfMyA9IEN0YTg2MV8zeworICAgICAgICAgICAgc3RhdGljSW5mby0+bWF4Q2xsLAorICAgICAgICAgICAgc3RhdGljSW5mby0+bWF4RmFsbCwKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKDAuMCA8PSBjdGE4NjFfMy0+bWF4Q29udGVudExpZ2h0TGV2ZWwgJiYgMC4wIDw9IGN0YTg2MV8zLT5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsCisgICAgICAgICAgICAgICAgJiYgZ3JhbGxvYzQ6OmVuY29kZUN0YTg2MV8zKGN0YTg2MV8zLCAmdmVjKSA9PSBPSykgeworICAgICAgICAgICAgUmV0dXJuPEVycm9yND4gcmV0ID0gbWFwcGVyLT5zZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfQ3RhODYxXzMsIHZlYyk7CisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9SRUZVU0VEOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkeW5hbWljSW5mbyAmJiAqZHluYW1pY0luZm8gJiYgZHluYW1pY0luZm8tPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICBBTE9HVigiU2V0dGluZyBkeW5hbWljIEhEUiBpbmZvIGFzIGdyYWxsb2M0IG1ldGFkYXRhIik7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8SU1hcHBlcjQ6Ok1ldGFkYXRhVHlwZT4gbWV0YWRhdGFUeXBlOworICAgICAgICBzd2l0Y2ggKGR5bmFtaWNJbmZvLT5tLnR5cGVfKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF8xMDoKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDA6CisgICAgICAgICAgICBtZXRhZGF0YVR5cGUgPSBNZXRhZGF0YVR5cGVfU21wdGUyMDk0XzQwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YWRhdGFUeXBlKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzbXB0ZTIwOTRfNDA7CisgICAgICAgICAgICBzbXB0ZTIwOTRfNDAucmVzaXplKGR5bmFtaWNJbmZvLT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBtZW1jcHkoc21wdGUyMDk0XzQwLmRhdGEoKSwgZHluYW1pY0luZm8tPm0uZGF0YSwgZHluYW1pY0luZm8tPmZsZXhDb3VudCgpKTsKKworICAgICAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOworICAgICAgICAgICAgaWYgKGdyYWxsb2M0OjplbmNvZGVTbXB0ZTIwOTRfNDAoeyBzbXB0ZTIwOTRfNDAgfSwgJnZlYykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBSZXR1cm48RXJyb3I0PiByZXQgPSBtYXBwZXItPnNldChidWZmZXIuZ2V0KCksICptZXRhZGF0YVR5cGUsIHZlYyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX1JFRlVTRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCmluZGV4IGRjNzg4Y2QuLmIwMmIwNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXwogCiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgpAQCAtMzkxLDYgKzM5MiwzNiBAQAogICAgIGludDMyX3QgbUhlYXBTZXFOdW07CiB9OwogCisvKioKKyAqIEdldCBIRFIgbWV0YWRhdGEgZnJvbSBHcmFsbG9jNCBoYW5kbGUuCisgKgorICogXHBhcmFtW2luXSAgIGhhbmRsZSAgICAgIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGlvbgorICogXHBhcmFtW291dF0gIHN0YXRpY0luZm8gIEhEUiBzdGF0aWMgaW5mbyB0byBiZSBmaWxsZWQuIElnbm9yZWQgaWYgbnVsbDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB8aGFuZGxlfCBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGNvbnRhaW4gdGhlIG1ldGFkYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGFyZWRfcHRyIGlzIHJlc2V0LgorICogXHBhcmFtW291dF0gIGR5bmFtaWNJbmZvIEhEUiBkeW5hbWljIGluZm8gdG8gYmUgZmlsbGVkLiBJZ25vcmVkIGlmIG51bGw7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgfGhhbmRsZXwgaXMgaW52YWxpZCBvciBkb2VzIG5vdCBjb250YWluIHRoZSBtZXRhZGF0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2hhcmVkX3B0ciBpcyByZXNldC4KKyAqIFxyZXR1cm4gQzJfT0sgaWYgc3VjY2Vzc2Z1bAorICovCitjMl9zdGF0dXNfdCBHZXRIZHJNZXRhZGF0YUZyb21HcmFsbG9jNEhhbmRsZSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOjppbnB1dD4gKnN0YXRpY0luZm8sCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86OmlucHV0PiAqZHluYW1pY0luZm8pOworCisvKioKKyAqIFNldCBIRFIgbWV0YWRhdGEgdG8gR3JhbGxvYzQgaGFuZGxlLgorICoKKyAqIFxwYXJhbVtpbl0gICBzdGF0aWNJbmZvICBIRFIgc3RhdGljIGluZm8gdG8gc2V0LiBJZ25vcmVkIGlmIG51bGwgb3IgaW52YWxpZC4KKyAqIFxwYXJhbVtpbl0gICBkeW5hbWljSW5mbyBIRFIgZHluYW1pYyBpbmZvIHRvIHNldC4gSWdub3JlZCBpZiBudWxsIG9yIGludmFsaWQuCisgKiBccGFyYW1bb3V0XSAgaGFuZGxlICAgICAgaGFuZGxlIG9mIHRoZSBhbGxvY2F0aW9uLgorICogXHJldHVybiBDMl9PSyBpZiBzdWNjZXNzZnVsCisgKi8KK2MyX3N0YXR1c190IFNldEhkck1ldGFkYXRhVG9HcmFsbG9jNEhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+ICZzdGF0aWNJbmZvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+ICZkeW5hbWljSW5mbywKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKaW5kZXggN2M0YmZiNi4uMWMzNjJhZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0FzU3RyaW5nLmg+CisjaW5jbHVkZSA8U3VyZmFjZUZsaW5nZXJQcm9wZXJ0aWVzLnN5c3Byb3AuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhPYnNlcnZlci5oPgpAQCAtNTQsNiArNTUsOSBAQAogCiB1c2luZyBUcmFpdHMgPSBDMkNvbXBvbmVudDo6VHJhaXRzOwogCisvLyBIQUwgcGl4ZWwgZm9ybWF0IC0+IGZyYW1ld29yayBjb2xvciBmb3JtYXQKK3R5cGVkZWYgc3RkOjptYXA8dWludDMyX3QsIGludDMyX3Q+IFBpeGVsRm9ybWF0TWFwOworCiBuYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CiAKIGJvb2wgaGFzUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKQEAgLTY3LDYgKzcxLDI2IEBACiAgICAgICAgICAgICBzLmNvbXBhcmUocy5zaXplKCkgLSBzdWZmaXhMZW4sIHN1ZmZpeExlbiwgc3VmZml4KSA9PSAwOwogfQogCitzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IGZpbmRGcmFtZXdvcmtDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCAmZGVzYykgeworICAgIHN3aXRjaCAoZGVzYy5iaXREZXB0aCkgeworICAgICAgICBjYXNlIDh1OgorICAgICAgICAgICAgaWYgKGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlBMQU5BUl9QQUNLRUQKKyAgICAgICAgICAgICAgICAgICAgfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6U0VNSVBMQU5BUl9QQUNLRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMHU6CisgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6U0VNSVBMQU5BUl9QQUNLRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0WVVWUDAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Cit9CisKIC8vIHJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgYWR2ZXJ0aXNlZCBzdXBwb3J0ZWQgcHJvZmlsZSBsZXZlbChzKQogYm9vbCBhZGRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYsCkBAIC05Niw5ICsxMjAsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSOyBpbXBseSAxMC1iaXQgc3VwcG9ydAogICAgIGJvb2wgc3VwcG9ydHNIZHIgPSBmYWxzZTsKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSMTBQbHVzOyBpbXBseSAxMC1iaXQgc3VwcG9ydAogICAgIGJvb2wgc3VwcG9ydHNIZHIxMFBsdXMgPSBmYWxzZTsKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgMTAtYml0IGZvcm1hdAorICAgIGJvb2wgc3VwcG9ydHMxMEJpdCA9IGZhbHNlOwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKICAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOwpAQCAtMTEwLDcgKzEzNyw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuY29yZUluZGV4KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86OkNPUkVfSU5ERVg6CisgICAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkcjEwUGx1c0luZm86OkNPUkVfSU5ERVg6ICAvLyB3aWxsIGJlIGRlcHJlY2F0ZWQKICAgICAgICAgICAgICAgICBzdXBwb3J0c0hkcjEwUGx1cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6Q09SRV9JTkRFWDoKQEAgLTEyMiw5ICsxNTEsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEZvciBWUDkvQVYxLCB0aGUgc3RhdGljIGluZm8gaXMgYWx3YXlzIHByb3BhZ2F0ZWQgYnkgZnJhbWV3b3JrLgorICAgIC8vIFZQOSBkb2VzIG5vdCBzdXBwb3J0IEhEUiBtZXRhZGF0YSBpbiB0aGUgYml0c3RyZWFtIGFuZCBzdGF0aWMgbWV0YWRhdGEKKyAgICAvLyBjYW4gYWx3YXlzIGJlIGNhcnJpZWQgYnkgdGhlIGZyYW1ld29yay4gKFRoZSBmcmFtZXdvcmsgZG9lcyBub3QgcHJvcGFnYXRlCisgICAgLy8gZHluYW1pYyBtZXRhZGF0YSBhcyB0aGF0IG5lZWRzIHRvIGJlIGZyYW1lIGFjY3VyYXRlLikKICAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSk7Ci0gICAgc3VwcG9ydHNIZHIgfD0gKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVjEpOworCisgICAgLy8gSERSIHN1cHBvcnQgaW1wbGllcyAxMC1iaXQgc3VwcG9ydC4KKyAgICAvLyBUT0RPOiBkaXJlY3RseSBjaGVjayB0aGlzIGZyb20gdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICBzdXBwb3J0czEwQml0ID0gKHN1cHBvcnRzSGRyIHx8IHN1cHBvcnRzSGRyMTBQbHVzKTsKKworICAgIC8vIElmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IEhEUiBkaXNwbGF5LCB0aGVuIG5vIGNvZGVjIG9uIHRoZSBkZXZpY2UKKyAgICAvLyBjYW4gYWR2ZXJ0aXNlIHN1cHBvcnQgZm9yIEhEUiBwcm9maWxlcy4KKyAgICAvLyBEZWZhdWx0IHRvIHRydWUgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIGF1dG8gcmV0ID0gc3lzcHJvcDo6U3VyZmFjZUZsaW5nZXJQcm9wZXJ0aWVzOjpoYXNfSERSX2Rpc3BsYXkoKTsKKyAgICBib29sIGhhc0hEUkRpc3BsYXkgPSByZXQuaGFzX3ZhbHVlKCkgPyAqcmV0IDogdHJ1ZTsKIAogICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKIApAQCAtMTUxLDggKzE5MSw4IEBACiAgICAgICAgIGlmIChtYXBwZXIgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKQogICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwTGV2ZWwocGwubGV2ZWwsICZzZGtMZXZlbCkpIHsKICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKLSAgICAgICAgICAgIC8vIGFsc28gbGlzdCBIRFIgcHJvZmlsZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIEhEUgotICAgICAgICAgICAgaWYgKHN1cHBvcnRzSGRyKSB7CisgICAgICAgICAgICAvLyBhbHNvIGxpc3QgSERSIHByb2ZpbGVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBIRFIgYW5kIGRldmljZSBoYXMgSERSIGRpc3BsYXkKKyAgICAgICAgICAgIGlmIChzdXBwb3J0c0hkciAmJiBoYXNIRFJEaXNwbGF5KSB7CiAgICAgICAgICAgICAgICAgYXV0byBoZHJNYXBwZXIgPSBDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CiAgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKQEAgLTE2NSw2ICsyMDUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdXBwb3J0czEwQml0KSB7CisgICAgICAgICAgICAgICAgYXV0byBiaXRuZXNzTWFwcGVyID0gQzJNYXBwZXI6OkdldEJpdERlcHRoUHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSwgMTApOworICAgICAgICAgICAgICAgIGlmIChiaXRuZXNzTWFwcGVyICYmIGJpdG5lc3NNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoIW1hcHBlcikgewogICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBsLnByb2ZpbGUsIHBsLmxldmVsKTsKICAgICAgICAgfQpAQCAtMTk4LDI3ICsyNDQsNzggQEAKIHZvaWQgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYsCiAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIgKmNhcHMsCi0gICAgICAgIGNvbnN0IFRyYWl0cyYgdHJhaXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUpIHsKLSAgICAodm9pZClpbnRmOwotCisgICAgICAgIGNvbnN0IFRyYWl0cyYgdHJhaXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUsCisgICAgICAgIGNvbnN0IFBpeGVsRm9ybWF0TWFwICZwaXhlbEZvcm1hdE1hcCkgewogICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gaW50ZigpIGFzIHdlbGwsIGJ1dCBob3cgZG8gd2UgbWFwIHRoZW0gdG8KICAgICAvLyBNZWRpYUNvZGVjIGNvbG9yIGZvcm1hdHM/CiAgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOwogICAgIGlmIChtZWRpYVR5cGUuZmluZCgidmlkZW8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcwogICAgICAgICAgICAgfHwgbWVkaWFUeXBlLmZpbmQoImltYWdlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5OworICAgICAgICBpZiAoZW5jb2RlcikgeworICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86OmlucHV0IHBpeGVsRm9ybWF0OworICAgICAgICAgICAgcXVlcnkucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZDo6TWFrZShwaXhlbEZvcm1hdCwgcGl4ZWxGb3JtYXQudmFsdWUpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0IHBpeGVsRm9ybWF0OworICAgICAgICAgICAgcXVlcnkucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZDo6TWFrZShwaXhlbEZvcm1hdCwgcGl4ZWxGb3JtYXQudmFsdWUpKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpsaXN0PGludDMyX3Q+IHN1cHBvcnRlZENvbG9yRm9ybWF0czsKKyAgICAgICAgaWYgKGludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKHF1ZXJ5LCBDMl9ET05UX0JMT0NLKSA9PSBDMl9PSykgeworICAgICAgICAgICAgaWYgKHF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzBdLnZhbHVlczsKKyAgICAgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHZhbHVlIDogZnN2LnZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IHBpeGVsRm9ybWF0TWFwLmZpbmQodmFsdWUudTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBwaXhlbEZvcm1hdE1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQyID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRDb2xvckZvcm1hdHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQyID09IHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRDb2xvckZvcm1hdHMucHVzaF9iYWNrKGl0LT5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdXRvIGFkZERlZmF1bHRDb2xvckZvcm1hdCA9IFtjYXBzLCAmc3VwcG9ydGVkQ29sb3JGb3JtYXRzXShpbnQzMl90IGNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRDb2xvckZvcm1hdHMuYmVnaW4oKSwgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmVuZCgpLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGUgY29sb3IgZm9ybWF0IGlzIG9yZGVyZWQgYnkgcHJlZmVyZW5jZS4gVGhlIGludGVudGlvbiBoZXJlIGlzIHRvIGFkdmVydGlzZToKKyAgICAgICAgLy8gICBjMi5hbmRyb2lkLiogY29kZWNzOiBZVVY0MjBzLCBTdXJmYWNlLCA8dGhlIHJlc3Q+CisgICAgICAgIC8vICAgYWxsIG90aGVyIGNvZGVjczogICAgU3VyZmFjZSwgWVVWNDIwcywgPHRoZSByZXN0PgorICAgICAgICAvLyBUT0RPOiBnZXQgdGhpcyBwcmVmZXJlbmNlIHZpYSBDb2RlYzIgQVBJCisKICAgICAgICAgLy8gdmVuZG9yIHZpZGVvIGNvZGVjcyBwcmVmZXIgb3BhcXVlIGZvcm1hdAogICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOwogICAgICAgICB9Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKLSAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLSAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOwotICAgICAgICAvLyBmcmFtZXdvcmsgdmlkZW8gZW5jb2RlcnMgbXVzdCBzdXBwb3J0IHN1cmZhY2UgZm9ybWF0LCB0aG91Z2ggaXQgaXMgdW5jbGVhcgotICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKLSAgICAgICAgaWYgKGVuY29kZXIgJiYgdHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICBhZGREZWZhdWx0Q29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworICAgICAgICBhZGREZWZhdWx0Q29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICBhZGREZWZhdWx0Q29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOworICAgICAgICAvLyBBbmRyb2lkIHZpZGVvIGNvZGVjcyBwcmVmZXIgQ1BVLXJlYWRhYmxlIGZvcm1hdHMKKyAgICAgICAgaWYgKHRyYWl0Lm5hbWUuZmluZCgiYW5kcm9pZCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhZGREZWZhdWx0Q29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtWZW5kb3JTZGtWZXJzaW9uID0gOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAicm8udmVuZG9yLmJ1aWxkLnZlcnNpb24uc2RrIiwgYW5kcm9pZF9nZXRfZGV2aWNlX2FwaV9sZXZlbCgpKTsKKyAgICAgICAgaWYgKGtWZW5kb3JTZGtWZXJzaW9uID49IF9fQU5EUk9JRF9BUElfVF9fKSB7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sb3JGb3JtYXQgOiBzdXBwb3J0ZWRDb2xvckZvcm1hdHMpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChjb2xvckZvcm1hdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC00MTAsNiArNTA3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQaXhlbEZvcm1hdE1hcD4gbmFtZVRvUGl4ZWxGb3JtYXRNYXA7CiAgICAgZm9yIChjb25zdCBUcmFpdHMmIHRyYWl0IDogdHJhaXRzKSB7CiAgICAgICAgIEMyQ29tcG9uZW50OjpyYW5rX3QgcmFuayA9IHRyYWl0LnJhbms7CiAKQEAgLTQyMyw4ICs1MjEsOSBAQAogICAgICAgICBuYW1lQW5kQWxpYXNlcy5pbnNlcnQobmFtZUFuZEFsaWFzZXMuYmVnaW4oKSwgdHJhaXQubmFtZSk7CiAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVPckFsaWFzIDogbmFtZUFuZEFsaWFzZXMpIHsKICAgICAgICAgICAgIGJvb2wgaXNBbGlhcyA9IHRyYWl0Lm5hbWUgIT0gbmFtZU9yQWxpYXM7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQ7CiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYgPQotICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKG5hbWVPckFsaWFzLmNfc3RyKCksICZjbGllbnQpOwogICAgICAgICAgICAgaWYgKCFpbnRmKSB7CiAgICAgICAgICAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIGZvciAlcyclcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGlhcyA/ICJhbGlhcyAiIDogIiIsCkBAIC02MTgsNyArNzE3LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA4UHJvZmlsZU1haW4sIFZQOExldmVsX1ZlcnNpb24wKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbmFtZVRvUGl4ZWxGb3JtYXRNYXAuZmluZChjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChpdCA9PSBuYW1lVG9QaXhlbEZvcm1hdE1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpdCA9IG5hbWVUb1BpeGVsRm9ybWF0TWFwLnRyeV9lbXBsYWNlKGNsaWVudC0+Z2V0U2VydmljZU5hbWUoKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0TWFwICZwaXhlbEZvcm1hdE1hcCA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0TWFwW0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OF0gPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRNYXBbSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwXSAgICA9IENPTE9SX0Zvcm1hdFlVVlAwMTA7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0TWFwW0hBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyXSAgPSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOworICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtIQUxfUElYRUxfRk9STUFUX1JHQkFfRlAxNl0gICAgID0gQ09MT1JfRm9ybWF0NjRiaXRBQkdSRmxvYXQ7CisKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvPiBwaXhlbEZvcm1hdEluZm87CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+cXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm86OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFwUGFyYW1zKSA9PSBDMl9PSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhlYXBQYXJhbXMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8ucmVzZXQoQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm86OkZyb20oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXNbMF0ucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsRm9ybWF0SW5mbyAmJiAqcGl4ZWxGb3JtYXRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBpeGVsRm9ybWF0SW5mby0+ZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgJmRlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8tPm0udmFsdWVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8aW50MzJfdD4gY29sb3JGb3JtYXQgPSBmaW5kRnJhbWV3b3JrQ29sb3JGb3JtYXQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0TWFwW2Rlc2MucGl4ZWxGb3JtYXRdID0gKmNvbG9yRm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRmLCBjYXBzLmdldCgpLCB0cmFpdCwgbWVkaWFUeXBlLCBpdC0+c2Vjb25kKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcAppbmRleCBhZjA1NGM3Li5jYjhiNmFiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vRnJhbWVSZWFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuY3BwCkBAIC04OCw4ICs4OCw3IEBACiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCiAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDB1Ci0gICAgICAgICAgICB8fCAhYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICBpZiAoIWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CiAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDkyZjM3NTQuLjI0NmU1NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICAgICJsaWJjb2RlYzItaW50ZXJuYWwtZGVmYXVsdHMiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX2ludGVybmFsX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtNjAsMTMgKzYwLDEwIEBACiAgICAgICAgICJNZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfaW50ZXJuYWxfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNCdWZmZXJzX3Rlc3QuY3BwCmluZGV4IDQxZTRmZmYuLmE0NzEyOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNCdWZmZXJzX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNCdWZmZXJzX3Rlc3QuY3BwCkBAIC04NjEsNCArODYxLDU3IEBACiAgICAgICAgICAgICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcoc3RkOjpnZXQ8Mz4oaW5mby5wYXJhbSkpOwogICAgICAgICB9KTsKIAorVEVTVChMaW5lYXJPdXRwdXRCdWZmZXJzVGVzdCwgUGNtQ29udmVydEZvcm1hdCkgeworICAgIC8vIFByZXBhcmUgTGluZWFyT3V0cHV0QnVmZmVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaW5lYXJPdXRwdXRCdWZmZXJzPiBidWZmZXJzID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaW5lYXJPdXRwdXRCdWZmZXJzPigidGVzdCIpOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAxKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9TQU1QTEVfUkFURSwgODAwMCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0KTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9jb25maWctcGNtLWVuY29kaW5nIiwga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29kZWMtcGNtLWVuY29kaW5nIiwga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCk7CisgICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisKKyAgICAvLyBQcmVwYXJlIGEgbGluZWFyIEMyQnVmZmVyCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOworICAgIEFTU0VSVF9FUShPSywgR2V0Q29kZWMyQmxvY2tQb29sKEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVIsIG51bGxwdHIsICZwb29sKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQVNTRVJUX0VRKE9LLCBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgMTAyNCwgQzJNZW1vcnlVc2FnZXtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlciA9CisgICAgICAgIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2stPnNoYXJlKDAsIDEwMjQsIEMyRmVuY2UoKSkpOworCisgICAgLy8gVGVzdCByZWd1bGFyIGJ1ZmZlciBjb252ZXJ0CisgICAgc2l6ZV90IGluZGV4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICBBU1NFUlRfRVEoT0ssIGJ1ZmZlcnMtPnJlZ2lzdGVyQnVmZmVyKGMyQnVmZmVyLCAmaW5kZXgsICZjbGllbnRCdWZmZXIpKTsKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nID0gMDsKKyAgICBBU1NFUlRfVFJVRShjbGllbnRCdWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSk7CisgICAgRVhQRUNUX0VRKGtBdWRpb0VuY29kaW5nUGNtMTZiaXQsIHBjbUVuY29kaW5nKTsKKyAgICBBU1NFUlRfVFJVRShidWZmZXJzLT5yZWxlYXNlQnVmZmVyKGNsaWVudEJ1ZmZlciwgJmMyQnVmZmVyKSk7CisKKyAgICAvLyBUZXN0IG51bGwgYnVmZmVyIGNvbnZlcnQKKyAgICBBU1NFUlRfRVEoT0ssIGJ1ZmZlcnMtPnJlZ2lzdGVyQnVmZmVyKG51bGxwdHIsICZpbmRleCwgJmNsaWVudEJ1ZmZlcikpOworICAgIEFTU0VSVF9UUlVFKGNsaWVudEJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpKTsKKyAgICBFWFBFQ1RfRVEoa0F1ZGlvRW5jb2RpbmdQY20xNmJpdCwgcGNtRW5jb2RpbmcpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoY2xpZW50QnVmZmVyLCAmYzJCdWZmZXIpKTsKKworICAgIC8vIERvIHRoZSBzYW1lIHRlc3QgaW4gdGhlIGFycmF5IG1vZGUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8T3V0cHV0QnVmZmVyc0FycmF5PiBhcnJheSA9IGJ1ZmZlcnMtPnRvQXJyYXlNb2RlKDgpOworCisgICAgLy8gVGVzdCByZWd1bGFyIGJ1ZmZlciBjb252ZXJ0CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihjMkJ1ZmZlciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgQVNTRVJUX1RSVUUoY2xpZW50QnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykpOworICAgIEVYUEVDVF9FUShrQXVkaW9FbmNvZGluZ1BjbTE2Yml0LCBwY21FbmNvZGluZyk7CisgICAgQVNTRVJUX1RSVUUoYnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihjbGllbnRCdWZmZXIsICZjMkJ1ZmZlcikpOworCisgICAgLy8gVGVzdCBudWxsIGJ1ZmZlciBjb252ZXJ0CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihudWxscHRyLCAmaW5kZXgsICZjbGllbnRCdWZmZXIpKTsKKyAgICBBU1NFUlRfVFJVRShjbGllbnRCdWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSk7CisgICAgRVhQRUNUX0VRKGtBdWRpb0VuY29kaW5nUGNtMTZiaXQsIHBjbUVuY29kaW5nKTsKKyAgICBBU1NFUlRfVFJVRShidWZmZXJzLT5yZWxlYXNlQnVmZmVyKGNsaWVudEJ1ZmZlciwgJmMyQnVmZmVyKSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwCmluZGV4IDdjNjYwZGMuLjM2MTUyODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcApAQCAtMjI0LDYgKzIyNCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5PEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCwgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCaXRyYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfVU5VU0VELCBMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dFByb2ZpbGVMZXZlbCwgbGV2ZWwpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBTREsgcGFyYW1zCkBAIC0yNDEsNiArMjUyLDggQEAKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ+IG1QaXhlbEFzcGVjdFJhdGlvOwogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtSW5wdXRCaXRyYXRlOwogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbU91dHB1dEJpdHJhdGU7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbUlucHV0UHJvZmlsZUxldmVsOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtT3V0cHV0UHJvZmlsZUxldmVsOwogCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICAgc3RhdGljIEMyUiBTZXR0ZXIoYm9vbCwgQzJQPFQ+ICYpIHsKQEAgLTU3Niw0ICs1ODksNTEgQEAKICAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKIH0KIAordHlwZWRlZiBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBIZHJQcm9maWxlc1BhcmFtczsKKworY2xhc3MgSGRyUHJvZmlsZXNUZXN0CisgICAgOiBwdWJsaWMgQ0NvZGVjQ29uZmlnVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxIZHJQcm9maWxlc1BhcmFtcz4geworfTsKKworVEVTVF9QKEhkclByb2ZpbGVzVGVzdCwgU2V0RnJvbVNkaykgeworICAgIEhkclByb2ZpbGVzUGFyYW1zIHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgc3RkOjpzdHJpbmcgbWVkaWFUeXBlID0gc3RkOjpnZXQ8MD4ocGFyYW1zKTsKKyAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyUHJvZmlsZSA9IHN0ZDo6Z2V0PDE+KHBhcmFtcyk7CisgICAgaW50MzJfdCBzZGtQcm9maWxlID0gc3RkOjpnZXQ8Mj4ocGFyYW1zKTsKKworICAgIGluaXQoQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwgbWVkaWFUeXBlLmNfc3RyKCkpOworCisgICAgQVNTRVJUX0VRKE9LLCBtQ29uZmlnLmluaXRpYWxpemUobVJlZmxlY3RvciwgbUNvbmZpZ3VyYWJsZSkpOworCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdHtuZXcgQU1lc3NhZ2V9OworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX1BST0ZJTEUsIHNka1Byb2ZpbGUpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgQVNTRVJUX0VRKE9LLCBtQ29uZmlnLmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICBtQ29uZmlndXJhYmxlLCBmb3JtYXQsIEQ6OkFMTCwgQzJfTUFZX0JMT0NLLCAmY29uZmlnVXBkYXRlKSk7CisKKyAgICBBU1NFUlRfRVEoMXUsIGNvbmZpZ1VwZGF0ZS5zaXplKCkpOworICAgIEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQgKnBsID0KKyAgICAgICAgRmluZFBhcmFtPHN0ZDo6cmVtb3ZlX3BvaW50ZXI8ZGVjbHR5cGUocGwpPjo6dHlwZT4oY29uZmlnVXBkYXRlKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgcGwpOworICAgIEFTU0VSVF9FUShjMlByb2ZpbGUsIHBsLT5wcm9maWxlKTsKK30KKworSGRyUHJvZmlsZXNQYXJhbXMga0hkclByb2ZpbGVzUGFyYW1zW10gPSB7CisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0hFVkMsIFBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoTUlNRVRZUEVfVklERU9fSEVWQywgUFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoTUlNRVRZUEVfVklERU9fVlA5LCAgUFJPRklMRV9WUDlfMiwgICAgICAgIFZQOVByb2ZpbGUySERSKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoTUlNRVRZUEVfVklERU9fVlA5LCAgUFJPRklMRV9WUDlfMiwgICAgICAgIFZQOVByb2ZpbGUySERSMTBQbHVzKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoTUlNRVRZUEVfVklERU9fVlA5LCAgUFJPRklMRV9WUDlfMywgICAgICAgIFZQOVByb2ZpbGUzSERSKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoTUlNRVRZUEVfVklERU9fVlA5LCAgUFJPRklMRV9WUDlfMywgICAgICAgIFZQOVByb2ZpbGUzSERSMTBQbHVzKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoTUlNRVRZUEVfVklERU9fQVYxLCAgUFJPRklMRV9BVjFfMCwgICAgICAgIEFWMVByb2ZpbGVNYWluMTBIRFIxMCksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0FWMSwgIFBST0ZJTEVfQVYxXzAsICAgICAgICBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzKSwKK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ0NvZGVjQ29uZmlnLAorICAgICAgICBIZHJQcm9maWxlc1Rlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oa0hkclByb2ZpbGVzUGFyYW1zKSk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0ZyYW1lUmVhc3NlbWJsZXJfdGVzdC5jcHAKaW5kZXggNjczOGVlNy4uMGJlOTM0YSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0ZyYW1lUmVhc3NlbWJsZXJfdGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0ZyYW1lUmVhc3NlbWJsZXJfdGVzdC5jcHAKQEAgLTUzLDcgKzUzLDggQEAKICAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZywKICAgICAgICAgICAgIHNpemVfdCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMsCiAgICAgICAgICAgICBzaXplX3QgY291bnQsCi0gICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRPdXRwdXRTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRPdXRwdXRTaXplLAorICAgICAgICAgICAgYm9vbCBzZXBhcmF0ZUVvcykgewogICAgICAgICBGcmFtZVJlYXNzZW1ibGVyIGZyYW1lUmVhc3NlbWJsZXI7CiAgICAgICAgIGZyYW1lUmVhc3NlbWJsZXIuaW5pdCgKICAgICAgICAgICAgICAgICBtUG9vbCwKQEAgLTY3LDcgKzY4LDcgQEAKIAogICAgICAgICBzaXplX3QgaW5wdXRJbmRleCA9IDAsIG91dHB1dEluZGV4ID0gMDsKICAgICAgICAgc2l6ZV90IGV4cGVjdENvdW50ID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQgKyAoc2VwYXJhdGVFb3MgPyAxIDogMCk7ICsraSkgewogICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gbmV3IE1lZGlhQ29kZWNCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZSwgbmV3IEFCdWZmZXIoaW5wdXRGcmFtZVNpemVJbkJ5dGVzKSk7CiAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGlucHV0RnJhbWVTaXplSW5CeXRlcyk7CkBAIC03Nyw4ICs3OCwxMiBAQAogICAgICAgICAgICAgaWYgKGkgPT0gY291bnQgLSAxKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCAxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZVNpemVJbkJ5dGVzOyArK2osICsraW5wdXRJbmRleCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+YmFzZSgpW2pdID0gKGlucHV0SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgIGlmIChpID09IGNvdW50ICYmIHNlcGFyYXRlRW9zKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXM7ICsraiwgKytpbnB1dEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+YmFzZSgpW2pdID0gKGlucHV0SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOwogICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBmcmFtZVJlYXNzZW1ibGVyLnByb2Nlc3MoYnVmZmVyLCAmaXRlbXMpKTsKQEAgLTEwNSw3ICsxMTAsOCBAQAogICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbmNvZGVyRnJhbWVTaXplICogQnl0ZXNQZXJTYW1wbGUoZW5jb2RpbmcpLCB2aWV3LmNhcGFjaXR5KCkpOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdmlldy5jYXBhY2l0eSgpOyArK2osICsrb3V0cHV0SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUob3V0cHV0SW5kZXggPCBpbnB1dEluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlucHV0SW5kZXggPT0gaW5wdXRGcmFtZVNpemVJbkJ5dGVzICogY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnB1dEluZGV4ID09IGlucHV0RnJhbWVTaXplSW5CeXRlcyAqIGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgImlucHV0SW5kZXggPSAiIDw8IGlucHV0SW5kZXggPDwgIiBvdXRwdXRJbmRleCA9ICIgPDwgb3V0cHV0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXhwZWN0ZWQgPSBvdXRwdXRJbmRleCA8IGlucHV0SW5kZXggPyAob3V0cHV0SW5kZXggJiAweEZGKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RDb3VudCA8IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICArK2V4cGVjdENvdW50OwpAQCAtMTM3LDIwNCArMTQzLDIzOSBAQAogLy8gUHVzaCBmcmFtZXMgd2l0aCBleGFjdGx5IHRoZSBzYW1lIHNpemUgYXMgdGhlIGVuY29kZXIgcmVxdWVzdGVkLgogVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoRXhhY3RGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEwMjQgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzL3NhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgNDA5NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyNCBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEwMjQgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggaGFsZiB0aGUgc2l6ZSB0aGF0IHRoZSBlbmNvZGVyIHJlcXVlc3RlZC4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEhhbGZGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDUxMiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDUxMjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICA1MTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgNTEyMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDEwMjQgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBmcmFtZXMgd2l0aCB0d2ljZSB0aGUgc2l6ZSB0aGF0IHRoZSBlbmNvZGVyIHJlcXVlc3RlZC4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaERvdWJsZUZyYW1lU2l6ZSkgewogICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV84LAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDIwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICA0MDk2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAyMDQ4IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDgxOTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgODE5MjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAgICAgNDA5NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgODE5MiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgODE5MjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBmcmFtZXMgd2l0aCBhIGxpdHRsZSBiaXQgbGFyZ2VyICgrNSBzYW1wbGVzKSB0aGFuIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaExpdHRsZUxhcmdlckZyYW1lU2l6ZSkgewogICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV84LAotICAgICAgICAgICAgMTAyOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMTI2NCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDExICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAyMDU4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIyNTI4IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQxMTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgNDUwNTYgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgMTAyOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTEyNjQgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAgICAgMjA1OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMjI1MjggLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgNDExNiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgNDUwNTYgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBmcmFtZXMgd2l0aCBhIGxpdHRsZSBiaXQgc21hbGxlciAoLTUgc2FtcGxlcykgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hMaXR0bGVTbWFsbGVyRnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDE5IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV8xNiwKLSAgICAgICAgICAgIDIwMzggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMTkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgNDA3NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDE5IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAyMDM4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICA0MDc2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiAvLyBQdXNoIHNpbmdsZS1ieXRlIGZyYW1lcwogVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoU2luZ2xlQnl0ZSkgewogICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV84LAotICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMTAwMDAwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV8xNiwKLSAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDQ5ICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICAxIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDI0MDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA5OCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA0OSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDI0MDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBvbmUgYmlnIGNodW5rLgogVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoQmlnQ2h1bmspIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMSAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA0OSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMTAwMDAwIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgICAgIDEgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgICAgIDEgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgICAgIDEgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggMmY0ZDZiMS4uNTRhNmZiMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTcsMTQgKzcsMjggQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlY191dGlsc19oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWyAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLCBdLAorCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAiQ29kZWMyQnVmZmVyVXRpbHMuY3BwIiwKKyAgICAgICAgIkNvZGVjMkNvbW1vblV0aWxzLmNwcCIsCiAgICAgICAgICJDb2RlYzJNYXBwZXIuY3BwIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcAppbmRleCA1Zjg3YzY2Li44MDc4NDFlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTE2LDcgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXJVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyAgQVRSQUNFX1RBR19WSURFTwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlIDxsaWJ5dXYuaD4KIApAQCAtMzYsOCArMzgsOCBAQAogbmFtZXNwYWNlIHsKIAogLyoqCi0gKiBBIGZsaXBwYWJsZSwgb3B0aW1pemFibGUgbWVtY3B5LiBDb25zdHJ1Y3RzIHN1Y2ggYXMgKGZyb20gPyBzcmMgOiBkc3QpIGRvIG5vdCB3b3JrIGFzIHRoZSByZXN1bHRzIGFyZQotICogYWx3YXlzIGNvbnN0LgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KQorICogZG8gbm90IHdvcmsgYXMgdGhlIHJlc3VsdHMgYXJlIGFsd2F5cyBjb25zdC4KICAqLwogdGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgogc3RydWN0IE1lbUNvcGllciB7CkBAIC04OCw3ICs5MCw3IEBACiAgICAgICAgIHVpbnQzMl90IHBsYW5lVyA9IGltZy0+bVdpZHRoIC8gcGxhbmUuY29sU2FtcGxpbmc7CiAgICAgICAgIHVpbnQzMl90IHBsYW5lSCA9IGltZy0+bUhlaWdodCAvIHBsYW5lLnJvd1NhbXBsaW5nOwogCi0gICAgICAgIGJvb2wgY2FuQ29weUJ5Um93ID0gKHBsYW5lLmNvbEluYyA9PSAxKSAmJiAoaW1nLT5tUGxhbmVbaV0ubUNvbEluYyA9PSAxKTsKKyAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IGJwcCkgJiYgKGltZy0+bVBsYW5lW2ldLm1Db2xJbmMgPT0gYnBwKTsKICAgICAgICAgYm9vbCBjYW5Db3B5QnlQbGFuZSA9IGNhbkNvcHlCeVJvdyAmJiAocGxhbmUucm93SW5jID09IGltZy0+bVBsYW5lW2ldLm1Sb3dJbmMpOwogICAgICAgICBpZiAoY2FuQ29weUJ5UGxhbmUpIHsKICAgICAgICAgICAgIE1lbUNvcGllcjxUb01lZGlhSW1hZ2UsIDA+Ojpjb3B5KGltZ1Jvdywgdmlld1JvdywgcGxhbmUucm93SW5jICogcGxhbmVIKTsKQEAgLTExOSw3ICsxMjEsMTAgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgewotICAgIGlmICh2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgaWYgKGltZyA9PSBudWxscHRyCisgICAgICAgIHx8IGltZ0Jhc2UgPT0gbnVsbHB0cgorICAgICAgICB8fCB2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aAorICAgICAgICB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gdmlldy5kYXRhKClbMF07CkBAIC0xMzksMTUgKzE0NCwxOCBAQAogCiAgICAgaWYgKElzTlYxMih2aWV3KSkgewogICAgICAgICBpZiAoSXNOVjEyKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPk5WMTIiKTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9IGVsc2UgaWYgKElzTlYyMShpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5OVjIxIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPkk0MjAiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjEyVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTE1NSwxNSArMTYzLDE4IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgewogICAgICAgICBpZiAoSXNOVjEyKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMTIiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjIxVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY192LCBzcmNfc3RyaWRlX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYyMS0+TlYyMSIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0IC8gMik7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPkk0MjAiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjIxVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY192LCBzcmNfc3RyaWRlX3YsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTE3MSwyNyArMTgyLDM0IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgewogICAgICAgICBpZiAoSXNOVjEyKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IEk0MjAtPk5WMTIiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+TlYyMSIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMjEoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBJNDIwLT5JNDIwIik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQorICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IGdlbmVyaWMiKTsKICAgICByZXR1cm4gX0ltYWdlQ29weTx0cnVlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOwogfQogCiBzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZykgewotICAgIGlmICh2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgaWYgKGltZyA9PSBudWxscHRyCisgICAgICAgIHx8IGltZ0Jhc2UgPT0gbnVsbHB0cgorICAgICAgICB8fCB2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aAorICAgICAgICB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CkBAIC0yMTAsMTUgKzIyOCwxOCBAQAogICAgIGludCBoZWlnaHQgPSB2aWV3LmNyb3AoKS5oZWlnaHQ7CiAgICAgaWYgKElzTlYxMihpbWcpKSB7CiAgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPk5WMTIiKTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYxMi0+TlYyMSIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYxMi0+STQyMCIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMjI2LDE1ICsyNDcsMTggQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKICAgICAgICAgaWYgKElzTlYxMih2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYyMS0+TlYxMiIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYyMS0+TlYyMSIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0IC8gMik7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjIxLT5JNDIwIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfeSwgZHN0X3N0cmlkZV95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0yNDIsMjIgKzI2NiwyNiBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChJc0k0MjAoaW1nKSkgewogICAgICAgICBpZiAoSXNOVjEyKHZpZXcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBJNDIwLT5OVjEyIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKHZpZXcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBJNDIwLT5OVjIxIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYyMShzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBJNDIwLT5JNDIwIik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQorICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IGdlbmVyaWMiKTsKICAgICByZXR1cm4gX0ltYWdlQ29weTxmYWxzZT4odmlldywgaW1nLCBpbWdCYXNlKTsKIH0KIApAQCAtNTEwLDEyICs1MzgsMTQgQEAKIC8vIE1hdHJpeCBjb2VmZmljaWVudCB0byBjb252ZXJ0IFJHQiB0byBQbGFuYXIgWVVWIGRhdGEuCiAvLyBFYWNoIHN1Yi1hcnJheSByZXByZXNlbnRzIHRoZSAzWDMgY29lZmYgdXNlZCB3aXRoIFIsIEcgYW5kIEIKIHN0YXRpYyBjb25zdCBpbnQxNl90IGJ0NjAxTWF0cml4WzJdWzNdWzNdID0gewotICAgIHsgeyA3NiwgMTUwLCAyOSB9LCB7IC00MywgLTg1LCAxMjggfSwgeyAxMjgsIC0xMDcsIC0yMSB9IH0sIC8qIFJBTkdFX0ZVTEwgKi8KKyAgICB7IHsgNzcsIDE1MCwgMjkgfSwgeyAtNDMsIC04NSwgMTI4IH0sIHsgMTI4LCAtMTA3LCAtMjEgfSB9LCAvKiBSQU5HRV9GVUxMICovCiAgICAgeyB7IDY2LCAxMjksIDI1IH0sIHsgLTM4LCAtNzQsIDExMiB9LCB7IDExMiwgLTk0LCAtMTggfSB9LCAgLyogUkFOR0VfTElNSVRFRCAqLwogfTsKIAogc3RhdGljIGNvbnN0IGludDE2X3QgYnQ3MDlNYXRyaXhbMl1bM11bM10gPSB7Ci0gICAgeyB7IDU0LCAxODMsIDE4IH0sIHsgLTI5LCAtOTksIDEyOCB9LCB7IDEyOCwgLTExNiwgLTEyIH0gfSwgLyogUkFOR0VfRlVMTCAqLworICAgIC8vIFRSSUNLWTogMTggaXMgYWRqdXN0ZWQgdG8gMTkgc28gdGhhdCBzdW0gb2Ygcm93IDEgaXMgMjU2CisgICAgeyB7IDU0LCAxODMsIDE5IH0sIHsgLTI5LCAtOTksIDEyOCB9LCB7IDEyOCwgLTExNiwgLTEyIH0gfSwgLyogUkFOR0VfRlVMTCAqLworICAgIC8vIFRSSUNLWTogLTg3IGlzIGFkanVzdGVkIHRvIC04NiBzbyB0aGF0IHN1bSBvZiByb3cgMiBpcyAwCiAgICAgeyB7IDQ3LCAxNTcsIDE2IH0sIHsgLTI2LCAtODYsIDExMiB9LCB7IDExMiwgLTEwMiwgLTEwIH0gfSwgLyogUkFOR0VfTElNSVRFRCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkNvbW1vblV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJDb21tb25VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1ODAwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJDb21tb25VdGlscy5jcHAKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXJVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyAgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgIkNvZGVjMkNvbW1vblV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBpc0F0TGVhc3RUKCkgeworICAgIGNoYXIgZGV2aWNlQ29kZU5hbWVbUFJPUF9WQUxVRV9NQVhdOworICAgIF9fc3lzdGVtX3Byb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZSIsIGRldmljZUNvZGVOYW1lKTsKKyAgICByZXR1cm4gYW5kcm9pZF9nZXRfZGV2aWNlX2FwaV9sZXZlbCgpID49IF9fQU5EUk9JRF9BUElfVF9fIHx8CisgICAgICAgICAgICFzdHJjbXAoZGV2aWNlQ29kZU5hbWUsICJUaXJhbWlzdSIpOworfQorCitib29sIGlzVmVuZG9yQXBpT3JGaXJzdEFwaUF0TGVhc3RUKCkgeworICAgIC8vIFRoZSBmaXJzdCBTREsgdGhlIGRldmljZSBzaGlwcGVkIHdpdGguCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1Byb2R1Y3RGaXJzdEFwaUxldmVsID0KKyAgICAgICAgYmFzZTo6R2V0SW50UHJvcGVydHk8aW50MzJfdD4oInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisKKyAgICAvLyBHUkYgZGV2aWNlcyAoaW50cm9kdWNlZCBpbiBBbmRyb2lkIDExKSBsaXN0IHRoZSBmaXJzdCBhbmQgcG9zc2libHkgdGhlIGN1cnJlbnQgYXBpIGxldmVscworICAgIC8vIHRvIHNpZ25hbCB3aGljaCBWU1IgcmVxdWlyZW1lbnRzIHRoZXkgY29uZm9ybSB0byBldmVuIGlmIHRoZSBmaXJzdCBkZXZpY2UgU0RLIHdhcyBoaWdoZXIuCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0JvYXJkRmlyc3RBcGlMZXZlbCA9CisgICAgICAgIGJhc2U6OkdldEludFByb3BlcnR5PGludDMyX3Q+KCJyby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwiLCAwKTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrQm9hcmRBcGlMZXZlbCA9CisgICAgICAgIGJhc2U6OkdldEludFByb3BlcnR5PGludDMyX3Q+KCJyby5ib2FyZC5hcGlfbGV2ZWwiLCAwKTsKKworICAgIC8vIEZvciBub24tR1JGIGRldmljZXMsIHVzZSB0aGUgZmlyc3QgU0RLIHZlcnNpb24gYnkgdGhlIHByb2R1Y3QuCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZpcnN0QXBpTGV2ZWwgPQorICAgICAgICBrQm9hcmRBcGlMZXZlbCAhPSAwID8ga0JvYXJkQXBpTGV2ZWwgOgorICAgICAgICBrQm9hcmRGaXJzdEFwaUxldmVsICE9IDAgPyBrQm9hcmRGaXJzdEFwaUxldmVsIDoKKyAgICAgICAga1Byb2R1Y3RGaXJzdEFwaUxldmVsOworCisgICAgcmV0dXJuIGtGaXJzdEFwaUxldmVsID49IF9fQU5EUk9JRF9BUElfVF9fOworfQorCitib29sIGlzSGFsUGl4ZWxGb3JtYXRTdXBwb3J0ZWQoQUhhcmR3YXJlQnVmZmVyX0Zvcm1hdCBmb3JtYXQpIHsKKyAgICAvLyBIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTAgcmVxdWlyZW1lbnQgd2FzIGFkZGVkIGluIFQgVlNSLCBhbHRob3VnaCBpdCBjb3VsZCBoYXZlIGJlZW4KKyAgICAvLyBzdXBwb3J0ZWQgcHJpb3IgdG8gdGhpcy4KKyAgICAvLworICAgIC8vIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCBkZXRlY3QgaWYgUDAxMCBpcyBwcm9wZXJseSBzdXBwb3J0ZWQgdXNpbmcgQUhhcmR3YXJlQnVmZmVyCisgICAgLy8gQVBJIGFsb25lLiBGb3Igbm93IGxpbWl0IFAwMTAgdG8gZGV2aWNlcyB0aGF0IGxhdW5jaGVkIHdpdGggQW5kcm9pZCBUIG9yIGtub3duIHRvIGNvbmZvcm0KKyAgICAvLyB0byBBbmRyb2lkIFQgVlNSIChhcyBvcHBvc2VkIHRvIHNpbXBseSBsaW1pdGluZyB0byBhIFQgdmVuZG9yIGltYWdlKS4KKyAgICBpZiAoZm9ybWF0ID09IChBSGFyZHdhcmVCdWZmZXJfRm9ybWF0KUhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCAmJgorICAgICAgICAgICAgIWlzVmVuZG9yQXBpT3JGaXJzdEFwaUF0TGVhc3RUKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSB7CisgICAgICAgICAgICAud2lkdGggPSAzMjAsCisgICAgICAgICAgICAuaGVpZ2h0ID0gMjQwLAorICAgICAgICAgICAgLmZvcm1hdCA9IGZvcm1hdCwKKyAgICAgICAgICAgIC5sYXllcnMgPSAxLAorICAgICAgICAgICAgLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX1JBUkVMWSB8CisgICAgICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX09GVEVOIHwKKyAgICAgICAgICAgICAgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSB8CisgICAgICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ09NUE9TRVJfT1ZFUkxBWSwKKyAgICAgICAgICAgIC5zdHJpZGUgPSAwLAorICAgICAgICAgICAgLnJmdTAgPSAwLAorICAgICAgICAgICAgLnJmdTEgPSAwLAorICAgIH07CisKKyAgICByZXR1cm4gQUhhcmR3YXJlQnVmZmVyX2lzU3VwcG9ydGVkKCZkZXNjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJDb21tb25VdGlscy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkNvbW1vblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkZDY1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJDb21tb25VdGlscy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9DT01NT05fVVRJTFNfSF8KKyNkZWZpbmUgQ09ERUMyX0NPTU1PTl9VVElMU19IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIGlzQXRMZWFzdFQoKTsKKworYm9vbCBpc1ZlbmRvckFwaU9yRmlyc3RBcGlBdExlYXN0VCgpOworCisvKioKKyAqIENoZWNrIGlmIGEgZ2l2ZW4gcGl4ZWwgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAqIGVudW1zIGxpc3RlZCBpbiBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90LCBhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8xX3QKKyAqIGFuZCBzbyBvbiBjYW4gYmUgcGFzc2VkIGFzIHRoZXNlIGVudW1zIGhhdmUgYW4gZXF1aXZhbGVudCBkZWZpbml0aW9uIGluCisgKiBBSGFyZHdhcmVCdWZmZXJfRm9ybWF0IGFzIHdlbGwuCisgKi8KK2Jvb2wgaXNIYWxQaXhlbEZvcm1hdFN1cHBvcnRlZChBSGFyZHdhcmVCdWZmZXJfRm9ybWF0IGZvcm1hdCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfQ09NTU9OX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCmluZGV4IDRkOTM5ZmEuLmM2MDZkNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCkBAIC0xOCw2ICsxOCw5IEBACiAjZGVmaW5lIExPR19UQUcgIkNvZGVjMk1hcHBlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KQEAgLTE2Nyw2ICsxNzAsOSBAQAogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzEyMCwgRG9sYnlWaXNpb25MZXZlbFVoZDEyMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fOEtfMzAsICBEb2xieVZpc2lvbkxldmVsOGszMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fOEtfNjAsICBEb2xieVZpc2lvbkxldmVsOGs2MCB9LAogCiAgICAgLy8gaGlnaCB0aWVycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgb24gYW5kcm9pZCwgZm9yIG5vdyBtYXAgdGhlbSB0byBtYWluIHRpZXIKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0hEXzI0LCAgRG9sYnlWaXNpb25MZXZlbEhkMjQgfSwKQEAgLTE3OCw2ICsxODQsOSBAQAogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzEyMCwgRG9sYnlWaXNpb25MZXZlbFVoZDEyMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfOEtfMzAsICBEb2xieVZpc2lvbkxldmVsOGszMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfOEtfNjAsICBEb2xieVZpc2lvbkxldmVsOGs2MCB9LAogfTsKIAogQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzRG9sYnlWaXNpb25Qcm9maWxlcyA9IHsKQEAgLTI1NSw2ICsyNjQsOCBAQAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMLCBIRVZDUHJvZmlsZU1haW5TdGlsbCB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4gfSwKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAogfTsKIAogQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y0hkclByb2ZpbGVzID0gewpAQCAtMjY1LDYgKzI3NiwxMyBAQAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAogfTsKIAorQUxvb2t1cDxDMkNvbmZpZzo6aGRyX2Zvcm1hdF90LCBpbnQzMl90PiBzSGV2Y0hkckZvcm1hdHMgPSB7CisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpTRFIsIEhFVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SExHLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwX1BMVVMsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCit9OworCiBBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzTXBlZzJMZXZlbHMgPSB7CiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csICAgICAgICAgTVBFRzJMZXZlbExMIH0sCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLCAgICAgICAgTVBFRzJMZXZlbE1MIH0sCkBAIC0zNTQsNiArMzcyLDE3IEBACiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIxMFBsdXMgfSwKIH07CiAKK0FMb29rdXA8QzJDb25maWc6Omhkcl9mb3JtYXRfdCwgaW50MzJfdD4gc1ZwOUhkckZvcm1hdHMgPSB7CisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpTRFIsIFZQOVByb2ZpbGUwIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpTRFIsIFZQOVByb2ZpbGUxIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpITEcsIFZQOVByb2ZpbGUyIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpITEcsIFZQOVByb2ZpbGUzIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMCwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwLCBWUDlQcm9maWxlM0hEUiB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTBfUExVUywgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwX1BMVVMsIFZQOVByb2ZpbGUzSERSMTBQbHVzIH0sCit9OworCiBBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzQXYxTGV2ZWxzID0gewogICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yLCAgICBBVjFMZXZlbDIgIH0sCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSwgIEFWMUxldmVsMjEgfSwKQEAgLTM4MSwxNSArNDEwLDE3IEBACiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMywgIEFWMUxldmVsNzMgfSwKIH07CiAKLQogQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxUHJvZmlsZXMgPSB7Ci0gICAgLy8gVE9ETzogd2lsbCBuZWVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIE1haW44IGFuZCBNYWluMTAKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjggfSwKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjEwIH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwIH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAogfTsKIAorQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxVGVuYml0UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAorfTsKKwogQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxSGRyUHJvZmlsZXMgPSB7CiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwIH0sCiB9OwpAQCAtMzk4LDYgKzQyOSw0NCBAQAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKIH07CiAKK0FMb29rdXA8QzJDb25maWc6Omhkcl9mb3JtYXRfdCwgaW50MzJfdD4gc0F2MUhkckZvcm1hdHMgPSB7CisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpTRFIsIEFWMVByb2ZpbGVNYWluOCB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SExHLCBBVjFQcm9maWxlTWFpbjEwIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMF9QTFVTLCBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCit9OworCisvLyBIQUxfUElYRUxfRk9STUFUXyogLT4gQ09MT1JfRm9ybWF0KgorQUxvb2t1cDx1aW50MzJfdCwgaW50MzJfdD4gc1BpeGVsRm9ybWF0cyA9IHsKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwgQ09MT1JfRm9ybWF0U3VyZmFjZSB9LAorCisgICAgLy8gWUNCQ1JfNDIwXzg4OCBtYXBzIHRvIFlVVjQyMEZsZXhpYmxlIGFuZCB2aWNlIHZlcnNhCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIH0sCisKKyAgICAvLyBGYWxsYmFjayBtYXRjaGVzIGZvciBZQ0JDUl80MjBfODg4CisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LCAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LCAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIH0sCisKKyAgICAvLyBGYWxsYmFjayBtYXRjaGVzIGZvciBZVVY0MjBGbGV4aWJsZQorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ1JDQl80MjBfU1AsICAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCAgICAgICAgICAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSB9LAorCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMl9TUCwgICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIyX0ksICAgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTAsICAgICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVlAwMTAgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyLCAgICAgICAgICAgQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMCB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBX0ZQMTYsICAgICAgICAgICAgICBDT0xPUl9Gb3JtYXQ2NGJpdEFCR1JGbG9hdCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIGludDMyX3Q+IHNQaWN0dXJlVHlwZSA9IHsKKyAgICB7IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdDo6U1lOQ19GUkFNRSwgICAgIFBJQ1RVUkVfVFlQRV9JIH0sCisgICAgeyBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q6OklfRlJBTUUsICAgICAgICBQSUNUVVJFX1RZUEVfSSB9LAorICAgIHsgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90OjpQX0ZSQU1FLCAgICAgICAgUElDVFVSRV9UWVBFX1AgfSwKKyAgICB7IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdDo6Ql9GUkFNRSwgICAgICAgIFBJQ1RVUkVfVFlQRV9CIH0sCit9OworCiAvKioKICAqIEEgaGVscGVyIHRoYXQgcGFzc2VzIHRocm91Z2ggdmVuZG9yIGV4dGVuc2lvbiBwcm9maWxlIGFuZCBsZXZlbCB2YWx1ZXMuCiAgKi8KQEAgLTQ1MCw2ICs1MTksMTAgQEAKICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKICAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOwogICAgIH0KKyAgICAvLyBBQUMgZG9lcyBub3QgaGF2ZSBIRFIgZm9ybWF0CisgICAgdmlydHVhbCBib29sIG1hcEhkckZvcm1hdChpbnQzMl90LCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90Kikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfTsKIAogc3RydWN0IEF2Y1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CkBAIC00ODAsNiArNTUzLDEyIEBACiAgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CiAgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25Qcm9maWxlcy5tYXAoZnJvbSwgdG8pOwogICAgIH0KKyAgICAvLyBEb2xieSBWaXNpb24gaXMgYWx3YXlzIEhEUiBhbmQgdGhlIHByb2ZpbGUgaXMgZnVsbHkgZXhwcmVzc2l2ZSBzbyB1c2UgdW5rbm93bgorICAgIC8vIEhEUiBmb3JtYXQKKyAgICB2aXJ0dWFsIGJvb2wgbWFwSGRyRm9ybWF0KGludDMyX3QsIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgKnRvKSBvdmVycmlkZSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlVOS05PV047CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIH07CiAKIHN0cnVjdCBIMjYzUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKQEAgLTUxOCw2ICs1OTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKICAgICB9CisgICAgdmlydHVhbCBib29sIG1hcEhkckZvcm1hdChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgKnRvKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzSGV2Y0hkckZvcm1hdHMubWFwKGZyb20sIHRvKTsKKyAgICB9CiAKIHByaXZhdGU6CiAgICAgYm9vbCBtSXNIZHI7CkBAIC01OTYsNiArNjc4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOwogICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbWFwSGRyRm9ybWF0KGludDMyX3QgZnJvbSwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCAqdG8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHNWcDlIZHJGb3JtYXRzLm1hcChmcm9tLCB0byk7CisgICAgfQogCiBwcml2YXRlOgogICAgIGJvb2wgbUlzSGRyOwpAQCAtNjAzLDkgKzY4OCw5IEBACiB9OwogCiBzdHJ1Y3QgQXYxUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKLSAgICBBdjFQcm9maWxlTGV2ZWxNYXBwZXIoYm9vbCBpc0hkciA9IGZhbHNlLCBib29sIGlzSGRyMTBQbHVzID0gZmFsc2UpIDoKKyAgICBBdjFQcm9maWxlTGV2ZWxNYXBwZXIoYm9vbCBpc0hkciA9IGZhbHNlLCBib29sIGlzSGRyMTBQbHVzID0gZmFsc2UsIGludDMyX3QgYml0RGVwdGggPSA4KSA6CiAgICAgICAgIFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlcigpLAotICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpIHt9CisgICAgICAgIG1Jc0hkcihpc0hkciksIG1Jc0hkcjEwUGx1cyhpc0hkcjEwUGx1cyksIG1CaXREZXB0aChiaXREZXB0aCkge30KIAogICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKICAgICAgICAgcmV0dXJuIHNBdjFMZXZlbHMubWFwKGZyb20sIHRvKTsKQEAgLTYxNCwyMyArNjk5LDM2IEBACiAgICAgICAgIHJldHVybiBzQXYxTGV2ZWxzLm1hcChmcm9tLCB0byk7CiAgICAgfQogICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgewotICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc0F2MUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgotICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0F2MUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0F2MVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgICAgIHJldHVybiAobUJpdERlcHRoID09IDEwKSA/IHNBdjFUZW5iaXRQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgbUlzSGRyMTBQbHVzID8gc0F2MUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBdjFQcm9maWxlcy5tYXAoZnJvbSwgdG8pOwogICAgIH0KICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKLSAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNBdjFIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKLSAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNBdjFIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBdjFQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgICAgICByZXR1cm4gKG1CaXREZXB0aCA9PSAxMCkgPyBzQXYxVGVuYml0UHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgIG1Jc0hkcjEwUGx1cyA/IHNBdjFIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0F2MUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIG1hcEhkckZvcm1hdChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgKnRvKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzQXYxSGRyRm9ybWF0cy5tYXAoZnJvbSwgdG8pOwogICAgIH0KIAogcHJpdmF0ZToKICAgICBib29sIG1Jc0hkcjsKICAgICBib29sIG1Jc0hkcjEwUGx1czsKKyAgICBpbnQzMl90IG1CaXREZXB0aDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlCiAKKy8vIHRoZSBkZWZhdWx0IG1hcHBlciBpcyB1c2VkIGZvciBtZWRpYSB0eXBlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhEUgorYm9vbCBDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyOjptYXBIZHJGb3JtYXQoaW50MzJfdCwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCAqdG8pIHsKKyAgICAvLyBieSBkZWZhdWx0IG1hcCBhbGwgKGluY2x1ZGluZyB2ZW5kb3IpIHByb2ZpbGVzIHRvIFNEUgorICAgICp0byA9IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlNEUjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogLy8gc3RhdGljCiBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4KIEMyTWFwcGVyOjpHZXRQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlKSB7CkBAIC02NzQsNiArNzcyLDE4IEBACiB9CiAKIC8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0Qml0RGVwdGhQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlLCBpbnQzMl90IGJpdERlcHRoKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0obWVkaWFUeXBlLmJlZ2luKCksIG1lZGlhVHlwZS5lbmQoKSwgbWVkaWFUeXBlLmJlZ2luKCksIDo6dG9sb3dlcik7CisgICAgaWYgKGJpdERlcHRoID09IDgpIHsKKyAgICAgICAgcmV0dXJuIEdldFByb2ZpbGVMZXZlbE1hcHBlcihtZWRpYVR5cGUpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWMSAmJiBiaXREZXB0aCA9PSAxMCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxBdjFQcm9maWxlTGV2ZWxNYXBwZXI+KGZhbHNlLCBmYWxzZSwgYml0RGVwdGgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCiBib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IGZyb20sIGludDMyX3QgKnRvKSB7CiAgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKIH0KQEAgLTk1Niw0MSArMTA2NiwyOSBAQAogLy8gc3RhdGljCiBib29sIEMyTWFwcGVyOjptYXBQaXhlbEZvcm1hdEZyYW1ld29ya1RvQ29kZWMoCiAgICAgICAgIGludDMyX3QgZnJhbWV3b3JrVmFsdWUsIHVpbnQzMl90ICpjMlZhbHVlKSB7Ci0gICAgc3dpdGNoIChmcmFtZXdvcmtWYWx1ZSkgewotICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFN1cmZhY2U6Ci0gICAgICAgICAgICAqYzJWYWx1ZSA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgotICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgotICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKLSAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgotICAgICAgICAgICAgKmMyVmFsdWUgPSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFBhc3N0aHJvdWdoCi0gICAgICAgICAgICAqYzJWYWx1ZSA9IHVpbnQzMl90KGZyYW1ld29ya1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghc1BpeGVsRm9ybWF0cy5tYXAoZnJhbWV3b3JrVmFsdWUsIGMyVmFsdWUpKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIGlmIG5vdCBtYXBwZWQKKyAgICAgICAgKmMyVmFsdWUgPSB1aW50MzJfdChmcmFtZXdvcmtWYWx1ZSk7CiAgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiAvLyBzdGF0aWMKIGJvb2wgQzJNYXBwZXI6Om1hcFBpeGVsRm9ybWF0Q29kZWNUb0ZyYW1ld29yaygKICAgICAgICAgdWludDMyX3QgYzJWYWx1ZSwgaW50MzJfdCAqZnJhbWV3b3JrVmFsdWUpIHsKLSAgICBzd2l0Y2ggKGMyVmFsdWUpIHsKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6Ci0gICAgICAgICAgICAqZnJhbWV3b3JrVmFsdWUgPSBDT0xPUl9Gb3JtYXRTdXJmYWNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjJfU1A6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ1JDQl80MjBfU1A6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjJfSToKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgotICAgICAgICAgICAgKmZyYW1ld29ya1ZhbHVlID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFBhc3N0aHJvdWdoCi0gICAgICAgICAgICAqZnJhbWV3b3JrVmFsdWUgPSBpbnQzMl90KGMyVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFzUGl4ZWxGb3JtYXRzLm1hcChjMlZhbHVlLCBmcmFtZXdvcmtWYWx1ZSkpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggaWYgbm90IG1hcHBlZAorICAgICAgICAqZnJhbWV3b3JrVmFsdWUgPSBpbnQzMl90KGMyVmFsdWUpOwogICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQaWN0dXJlVHlwZS5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCAqdG8pIHsKKyAgICByZXR1cm4gc1BpY3R1cmVUeXBlLm1hcChmcm9tLCB0byk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKaW5kZXggNzk3YzhhOC4uYzhlOWUxMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaApAQCAtMzQsNiArMzQsMTYgQEAKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKGludDMyX3QsIEMyQ29uZmlnOjpwcm9maWxlX3QqKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwTGV2ZWwoQzJDb25maWc6OmxldmVsX3QsIGludDMyX3QqKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwTGV2ZWwoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QqKSA9IDA7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTWFwcGVyIG1ldGhvZCB0aGF0IG1hcHMgYSBNZWRpYUNvZGVjIHByb2ZpbGUgdG8gdGhlIHN1cHBvcnRlZAorICAgICAgICAgICAgICogSERSIGZvcm1hdCBmb3IgdGhhdCBwcm9maWxlLiBTaW5jZSAxMC1iaXQgcHJvZmlsZXMgYXJlIHVzZWQgZm9yCisgICAgICAgICAgICAgKiBITEcsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIEhMRyBmb3IgYWxsIDEwLWJpdCBwcm9maWxlcywgYnV0CisgICAgICAgICAgICAgKiB0aGUgY2FsbGVyIHNob3VsZCBhbHNvIHZlcmlmeSB0aGF0IHRoZSB0cmFuc2ZlciBmdW5jdGlvbiBpcworICAgICAgICAgICAgICogaW5kZWVkIEhMRy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLy8gbm90IGFuIGFic3RyYWN0IG1ldGhvZCBhcyB3ZSBoYXZlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgU0RSCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwSGRyRm9ybWF0KGludDMyX3QsIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgKmhkcik7CiAgICAgICAgICAgICB2aXJ0dWFsIH5Qcm9maWxlTGV2ZWxNYXBwZXIoKSA9IGRlZmF1bHQ7CiAgICAgICAgIH07CiAKQEAgLTQzLDYgKzUzLDkgQEAKICAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CiAgICAgICAgIEdldEhkclByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSk7CiAKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldEJpdERlcHRoUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgaW50MzJfdCBiaXREZXB0aCA9IDgpOworCiAgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBiaXRyYXRlcwogICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90Kik7CiAgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QqKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYjg1OGZhNS4uOWMzYmE0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE1LDEyICsxNSw5IEBACiAgICAgICAgICJDMlBhcmFtX3Rlc3QuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX3ZuZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIC8vIHBhcmFtIHRlc3RzIG11c3Qgbm90IGRlcGVuZCBvbiBhbnkgY29kZWMyIGxpYnJhcmllcyBhcyBhbGwgcGFyYW1zIHNob3VsZCBiZSB0ZW1wbGF0ZWQKQEAgLTQ3LDkgKzQ0LDYgQEAKICAgICAgICAgInZuZGsvQzJCdWZmZXJUZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY29kZWMyIiwKICAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCmluZGV4IGJlODFjODQuLjFkOGFlYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icApAQCAtMTgsNiArMTgsMjUgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKK30KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3ZuZGtfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiB9CiAKIC8vICEhIURPIE5PVCBERVBFTkQgT04gVEhJUyBTSEFSRUQgTElCUkFSWSBESVJFQ1RMWSEhIQpAQCAtMjgsNiArNDcsMTEgQEAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAgICAgLy8gVE9ETzogYi8xNDcxNDc4ODMKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogCiAgICAgc3JjczogWwogICAgICAgICAiQzJBbGxvY2F0b3JCbG9iLmNwcCIsCkBAIC01NCw2ICs3OCw3IEBACiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCiAgICAgXSwKIApAQCAtNzMsMTEgKzk4LDExIEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJpb24iLAogICAgICAgICAibGliZG1hYnVmaGVhcCIsCiAgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliZ3JhbGxvY3R5cGVzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmlvbiIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtOTIsNiArMTE3LDQzIEBACiAgICAgXSwKIH0KIAorLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHN0YXRpY2FsbHkgbGlua2luZyB0byBsaWJjb2RlYzJfdm5kayBmb3IgdW5pdCB0ZXN0cworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItc3RhdGljLWRlZmF1bHRzIiwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliZG1hYnVmaGVhcCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgICAgICAibGliZ3JhbGxvY3R5cGVzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAzLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCisgICAgXSwKK30KKwogLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGNvbXBvbmVudHMKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliY29kZWMyLWltcGwtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKaW5kZXggNmE3ZjE5Yy4uYmM0MDUzZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCkBAIC0yMCw4ICsyMCwxMCBAQAogCiAjaW5jbHVkZSA8bXV0ZXg+CiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvY29tbW9uL1BsYW5lTGF5b3V0Q29tcG9uZW50VHlwZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvY29tbW9uLzEuMi90eXBlcy5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Z3JhbGxvY3R5cGVzL0dyYWxsb2M0Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJBbGxvY2F0b3IuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CkBAIC0yOSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKQEAgLTIzMCw4ICsyMzMsOTAgQEAKICAgICB9CiB9OwogCitzdGF0aWMKK2MyX3N0YXR1c190IEdyYWxsb2M0TWFwcGVyX2xvY2sobmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIHVpbnQ2NF90IHVzYWdlLCBjb25zdCBSZWN0JiBib3VuZHMsCisgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQsIHVpbnQ4X3QgKiphZGRyKSB7CisgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aTo6UGxhbmVMYXlvdXQ+IHBsYW5lczsKKyAgICAvLyB0aGlzIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBHcmFsbG9jIDQgb3IgbGF0ZXIKKyAgICBzdGF0dXNfdCBlcnIgPSBtYXBwZXIuZ2V0UGxhbmVMYXlvdXRzKGhhbmRsZSwgJnBsYW5lcyk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUiB8fCBwbGFuZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gQzJfQ0FOTk9UX0RPOworICAgIH0KKworICAgIHVpbnQ4X3QgKnBvaW50ZXIgPSBudWxscHRyOworICAgIGVyciA9IG1hcHBlci5sb2NrKGhhbmRsZSwgdXNhZ2UsIGJvdW5kcywgKHZvaWQgKiopJnBvaW50ZXIsIG51bGxwdHIsIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IgfHwgcG9pbnRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBsYW5lTGF5b3V0Q29tcG9uZW50VHlwZTsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6UGxhbmVMYXlvdXRDb21wb25lbnQ7CisKKyAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAwOworICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDA7CisKKyAgICBmb3IgKGNvbnN0IHVpOjpQbGFuZUxheW91dCAmcGxhbmUgOiBwbGFuZXMpIHsKKyAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzKys7CisgICAgICAgIHVpbnQzMl90IGxhc3RPZmZzZXRJbkJpdHMgPSAwOworICAgICAgICB1aW50MzJfdCByb290SXggPSBsYXlvdXQtPm51bVBsYW5lczsKKworICAgICAgICBmb3IgKGNvbnN0IFBsYW5lTGF5b3V0Q29tcG9uZW50ICZjb21wb25lbnQgOiBwbGFuZS5jb21wb25lbnRzKSB7CisgICAgICAgICAgICBpZiAoIWdyYWxsb2M0Ojppc1N0YW5kYXJkUGxhbmVMYXlvdXRDb21wb25lbnRUeXBlKGNvbXBvbmVudC50eXBlKSkgeworICAgICAgICAgICAgICAgIG1hcHBlci51bmxvY2soaGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ0FOTk9UX0RPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCByaWdodFNoaWZ0Qml0cyA9IGNvbXBvbmVudC5vZmZzZXRJbkJpdHMgLSBsYXN0T2Zmc2V0SW5CaXRzOworICAgICAgICAgICAgdWludDMyX3QgYWxsb2NhdGVkRGVwdGhJbkJpdHMgPSBjb21wb25lbnQuc2l6ZUluQml0cyArIHJpZ2h0U2hpZnRCaXRzOworICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OnBsYW5lX2luZGV4X3QgcGxhbmVJZDsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpjaGFubmVsX3QgY2hhbm5lbDsKKworICAgICAgICAgICAgc3dpdGNoIChzdGF0aWNfY2FzdDxQbGFuZUxheW91dENvbXBvbmVudFR5cGU+KGNvbXBvbmVudC50eXBlLnZhbHVlKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUGxhbmVMYXlvdXRDb21wb25lbnRUeXBlOjpZOgorICAgICAgICAgICAgICAgICAgICBwbGFuZUlkID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1k7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBsYW5lTGF5b3V0Q29tcG9uZW50VHlwZTo6Q0I6CisgICAgICAgICAgICAgICAgICAgIHBsYW5lSWQgPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBsYW5lTGF5b3V0Q29tcG9uZW50VHlwZTo6Q1I6CisgICAgICAgICAgICAgICAgICAgIHBsYW5lSWQgPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtYXBwZXIudW5sb2NrKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFkZHJbcGxhbmVJZF0gPSBwb2ludGVyICsgcGxhbmUub2Zmc2V0SW5CeXRlcyArIChjb21wb25lbnQub2Zmc2V0SW5CaXRzIC8gOCk7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1twbGFuZUlkXSA9IHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihwbGFuZS5zYW1wbGVJbmNyZW1lbnRJbkJpdHMgLyA4KSwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHBsYW5lLnN0cmlkZUluQnl0ZXMpLCAgICAgICAgICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBsYW5lLmhvcml6b250YWxTdWJzYW1wbGluZyksICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGxhbmUudmVydGljYWxTdWJzYW1wbGluZyksICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIGFsbG9jYXRlZERlcHRoSW5CaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGggKGJpdHMpCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbXBvbmVudC5zaXplSW5CaXRzKSwgICAgICAgICAgICAvLyBiaXREZXB0aCAoYml0cykKKyAgICAgICAgICAgICAgICByaWdodFNoaWZ0Qml0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQgKGJpdHMpCisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgcm9vdEl4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29tcG9uZW50Lm9mZnNldEluQml0cyAvIDgpLCAgICAgIC8vIG9mZnNldCAoYnl0ZXMpCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcysrOworICAgICAgICAgICAgbGFzdE9mZnNldEluQml0cyA9IGNvbXBvbmVudC5vZmZzZXRJbkJpdHMgKyBjb21wb25lbnQuc2l6ZUluQml0czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKIH0gLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAorCiBuYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgewogICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUpOwogfQpAQCAtMzg1LDYgKzQ3MCwxMCBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIsIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgbUdyYWxsb2NVc2FnZSwKICAgICAgICAgICAgICAgICBtU3RyaWRlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOwogICAgIH0KKworICAgIC8vICdOQVRJVkUnIG9uIEFuZHJvaWQgbWVhbnMgTElUVExFX0VORElBTgorICAgIGNvbnN0ZXhwciBDMlBsYW5lSW5mbzo6ZW5kaWFubmVzc190IGtFbmRpYW5uZXNzID0gQzJQbGFuZUluZm86Ok5BVElWRTsKKwogICAgIHN3aXRjaCAobUZvcm1hdCkgewogICAgICAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQzMl90PihQaXhlbEZvcm1hdDQ6OlJHQkFfMTAxMDEwMik6IHsKICAgICAgICAgICAgIC8vIFRSSUNLWTogdGhpcyBpcyB1c2VkIGZvciBtZWRpYSBhcyBZVVY0NDQgaW4gdGhlIGNhc2Ugd2hlbiBpdCBpcyBxdWV1ZWQgZGlyZWN0bHkgdG8gYQpAQCAtNjA5LDE3ICs2OTgsNiBAQAogICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgICAgICAgICAvLyByb290SXgKICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CiAgICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKLSAgICAgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKLSAgICAgICAgICAgIGlmICh1dk9mZnNldCA+IDAgJiYgdXZPZmZzZXQgPCAoaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXApIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOwotICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKLSAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ub2Zmc2V0ID0gdXZPZmZzZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHV2T2Zmc2V0IDwgMCAmJiB1dk9mZnNldCA+IC0oaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXApIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOwotICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKLSAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjQ2LDcgKzcyNCw3IEBACiAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAogICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKICAgICAgICAgICAgICAgICA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKLSAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBrRW5kaWFubmVzcywgICAgICAgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKICAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAogICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CiAgICAgICAgICAgICB9OwpAQCAtNjU5LDcgKzczNyw3IEBACiAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAogICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKICAgICAgICAgICAgICAgICA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKLSAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBrRW5kaWFubmVzcywgICAgICAgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKICAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgIC8vIHJvb3RJeAogICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CiAgICAgICAgICAgICB9OwpAQCAtNjcyLDcgKzc1MCw3IEBACiAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAogICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKICAgICAgICAgICAgICAgICA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKLSAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBrRW5kaWFubmVzcywgICAgICAgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKICAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgIC8vIHJvb3RJeAogICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CiAgICAgICAgICAgICB9OwpAQCAtNjgwLDkgKzc1OCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLCBidXQgbGV0J3MgdHJ5IHRvIGxvY2sgaXQuCisgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoYXQgaXQgaXMsIGxldCdzIHRyeSB0byBsb2NrIGl0IHdpdGggZ3JhbGxvYzQKICAgICAgICAgICAgIGFuZHJvaWRfeWNiY3IgeWNiY3JMYXlvdXQ7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBHcmFsbG9jNE1hcHBlcl9sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsIHJlY3QsIGxheW91dCwgYWRkcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIGxvY2tZQ2JDcgogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9ja1lDYkNyKAogICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsIHJlY3QsICZ5Y2JjckxheW91dCk7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIHljYmNyTGF5b3V0LnkgJiYgeWNiY3JMYXlvdXQuY2IgJiYgeWNiY3JMYXlvdXQuY3IKQEAgLTczNCwxNyArODE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAogICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cwotICAgICAgICAgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKLSAgICAgICAgICAgICAgICBpZiAodXZPZmZzZXQgPiAwICYmIHV2T2Zmc2V0IDwgKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYV9zdGVwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLShpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOwotICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5vZmZzZXQgPSAtdXZPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC03OTAsNiArODYzLDI5IEBACiAgICAgfQogICAgIG1Mb2NrZWQgPSB0cnVlOwogCisgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKKyAgICBpZiAobGF5b3V0LT50eXBlID09IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVViAmJiBsYXlvdXQtPnJvb3RQbGFuZXMgPT0gMykgeworICAgICAgICBpbnRwdHJfdCB1dk9mZnNldCA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdIC0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIGludHB0cl90IHV2Q29sSW5jID0gbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLmNvbEluYzsKKyAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IHV2Q29sSW5jKSB7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICB9IGVsc2UgaWYgKHV2T2Zmc2V0IDwgMCAmJiB1dk9mZnNldCA+IC11dkNvbEluYykgeworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5vZmZzZXQgPSAtdXZPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiQzJBbGxvY2F0aW9uR3JhbGxvYzo6bWFwOiBsYXlvdXQ6IHR5cGU9JWQgbnVtUGxhbmVzPSVkIHJvb3RQbGFuZXM9JWQiLAorICAgICAgICAgIGxheW91dC0+dHlwZSwgbGF5b3V0LT5udW1QbGFuZXMsIGxheW91dC0+cm9vdFBsYW5lcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQtPm51bVBsYW5lczsgKytpKSB7CisgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC0+cGxhbmVzW2ldOworICAgICAgICBBTE9HVigiQzJBbGxvY2F0aW9uR3JhbGxvYzo6bWFwOiBwbGFuZVslZF06IGNvbEluYz0lZCByb3dJbmM9JWQgcm9vdEl4PSV1IG9mZnNldD0ldSIsCisgICAgICAgICAgICAgIGksIHBsYW5lLmNvbEluYywgcGxhbmUucm93SW5jLCBwbGFuZS5yb290SXgsIHBsYW5lLm9mZnNldCk7CisgICAgfQorCiAgICAgcmV0dXJuIEMyX09LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkZlbmNlLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyRmVuY2UuY3BwCmluZGV4IDljNTE4M2UuLjBiNTU2YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyRmVuY2UuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyRmVuY2UuY3BwCkBAIC0xNiwxMyArMTYsMjQgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDMkZlbmNlRmFjdG9yeSIKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CiAKICNpbmNsdWRlIDxDMkZlbmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPEMyU3VyZmFjZVN5bmNPYmouaD4KIAorI2RlZmluZSBNQVhfRkVOQ0VfRkRTIDEKKwogY2xhc3MgQzJGZW5jZTo6SW1wbCB7CiBwdWJsaWM6CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIElOVkFMSURfRkVOQ0UsCisgICAgICAgIE5VTExfRkVOQ0UsCisgICAgICAgIFNVUkZBQ0VfRkVOQ0UsCisgICAgICAgIFNZTkNfRkVOQ0UsCisgICAgfTsKKwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgd2FpdChjMl9uc2Vjc190IHRpbWVvdXROcykgPSAwOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkKCkgY29uc3QgPSAwOwpAQCAtMzMsOSArNDQsMjYgQEAKIAogICAgIHZpcnR1YWwgYm9vbCBpc0hXKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCB0eXBlX3QgdHlwZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBmZW5jZSBzbyBpdCBjYW4gYmUgbWFyc2hhbGxlZC4KKyAgICAgKiBUaGUgbmF0aXZlIGhhbmRsZSBtdXN0IHN0b3JlIGZlbmNlIHR5cGUgaW4gdGhlIGZpcnN0IGludGVnZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdmFsaWQgbmF0aXZlIGhhbmRsZSBpZiB0aGUgZmVuY2UgY2FuIGJlIG1hcnNoYWxsZWQsIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIG5hdGl2ZV9oYW5kbGVfdCAqY3JlYXRlTmF0aXZlSGFuZGxlKCkgY29uc3QgPSAwOworCiAgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKIAogICAgIEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0aWMgdHlwZV90IEdldFR5cGVGcm9tTmF0aXZlSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogbmgpIHsKKyAgICAgICAgaWYgKG5oICYmIG5oLT5udW1GZHMgPj0gMCAmJiBuaC0+bnVtRmRzIDw9IE1BWF9GRU5DRV9GRFMgJiYgbmgtPm51bUludHMgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZV90PihuaC0+ZGF0YVtuaC0+bnVtRmRzXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfRkVOQ0U7CisgICAgfQogfTsKIAogYzJfc3RhdHVzX3QgQzJGZW5jZTo6d2FpdChjMl9uc2Vjc190IHRpbWVvdXROcykgewpAQCAtMTE1LDYgKzE0MywxNSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgdmlydHVhbCB0eXBlX3QgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFNVUkZBQ0VfRkVOQ0U7CisgICAgfQorCisgICAgdmlydHVhbCBuYXRpdmVfaGFuZGxlX3QgKmNyZWF0ZU5hdGl2ZUhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBjcmVhdGUgbmF0aXZlIGhhbmRsZSBmcm9tIHN1cmZhY2UgZmVuY2UiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCiAgICAgdmlydHVhbCB+U3VyZmFjZUZlbmNlSW1wbCgpIHt9OwogCiAgICAgU3VyZmFjZUZlbmNlSW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSwgdWludDMyX3Qgd2FpdElkKSA6CkBAIC0xNDMsMyArMTgwLDEyMCBAQAogICAgIH0KICAgICByZXR1cm4gQzJGZW5jZSgpOwogfQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgX0MyRmVuY2VGYWN0b3J5OjpTeW5jRmVuY2VJbXBsIDogcHVibGljIEMyRmVuY2U6OkltcGwgeworcHVibGljOgorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgd2FpdChjMl9uc2Vjc190IHRpbWVvdXROcykgeworICAgICAgICBjMl9uc2Vjc190IHRpbWVvdXRNcyA9IHRpbWVvdXROcyAvIDEwMDA7CisgICAgICAgIGlmICh0aW1lb3V0TXMgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICB0aW1lb3V0TXMgPSBJTlRfTUFYOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtRmVuY2UtPndhaXQoKGludCl0aW1lb3V0TXMpKSB7CisgICAgICAgICAgICBjYXNlIE5PX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIGNhc2UgLUVUSU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBDMl9USU1FRF9PVVQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmVuY2UtPmdldFN0YXR1cygpICE9IEZlbmNlOjpTdGF0dXM6OkludmFsaWQ7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZlbmNlLT5nZXRTdGF0dXMoKSA9PSBGZW5jZTo6U3RhdHVzOjpTaWduYWxlZDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBmZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GZW5jZS0+ZHVwKCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzSFcoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdHlwZV90IHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTWU5DX0ZFTkNFOworICAgIH0KKworICAgIHZpcnR1YWwgbmF0aXZlX2hhbmRsZV90ICpjcmVhdGVOYXRpdmVIYW5kbGUoKSBjb25zdCB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAxKTsKKyAgICAgICAgaWYgKCFuaCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBuYXRpdmUgaGFuZGxlIGZvciBzeW5jIGZlbmNlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuaC0+ZGF0YVswXSA9IGZkKCk7CisgICAgICAgIG5oLT5kYXRhWzFdID0gdHlwZSgpOworICAgICAgICByZXR1cm4gbmg7CisgICAgfQorCisgICAgdmlydHVhbCB+U3luY0ZlbmNlSW1wbCgpIHt9OworCisgICAgU3luY0ZlbmNlSW1wbChpbnQgZmVuY2VGZCkgOgorICAgICAgICAgICAgbUZlbmNlKHNwPEZlbmNlPjo6bWFrZShmZW5jZUZkKSkge30KKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8U3luY0ZlbmNlSW1wbD4gQ3JlYXRlRnJvbU5hdGl2ZUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QqIG5oKSB7CisgICAgICAgIGlmICghbmggfHwgbmgtPm51bUZkcyAhPSAxIHx8IG5oLT5udW1JbnRzICE9IDEpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGhhbmRsZSBmb3Igc3luYyBmZW5jZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGZkID0gZHVwKG5oLT5kYXRhWzBdKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN5bmNGZW5jZUltcGw+IHAgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN5bmNGZW5jZUltcGw+KGZkKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIHN5bmMgZmVuY2UgaW1wbCIpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBzcDxGZW5jZT4gbUZlbmNlOworfTsKKworQzJGZW5jZSBfQzJGZW5jZUZhY3Rvcnk6OkNyZWF0ZVN5bmNGZW5jZShpbnQgZmVuY2VGZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZlbmNlOjpJbXBsPiBwOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgcCA9IHN0ZDo6bWFrZV9zaGFyZWQ8X0MyRmVuY2VGYWN0b3J5OjpTeW5jRmVuY2VJbXBsPihmZW5jZUZkKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIHN5bmMgZmVuY2UgaW1wbCIpOworICAgICAgICAgICAgY2xvc2UoZmVuY2VGZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwLT52YWxpZCgpKSB7CisgICAgICAgICAgICBwLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIHN5bmMgZmVuY2UgZnJvbSBpbnZhbGlkIGZkIik7CisgICAgfQorICAgIHJldHVybiBDMkZlbmNlKHApOworfQorCituYXRpdmVfaGFuZGxlX3QqIF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlTmF0aXZlSGFuZGxlKGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgcmV0dXJuIGZlbmNlLm1JbXBsPyBmZW5jZS5tSW1wbC0+Y3JlYXRlTmF0aXZlSGFuZGxlKCkgOiBudWxscHRyOworfQorCitDMkZlbmNlIF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlRnJvbU5hdGl2ZUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgeworICAgIGlmICghaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBDMkZlbmNlKCk7CisgICAgfQorICAgIEMyRmVuY2U6OkltcGw6OnR5cGVfdCB0eXBlID0gQzJGZW5jZTo6SW1wbDo6R2V0VHlwZUZyb21OYXRpdmVIYW5kbGUoaGFuZGxlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGZW5jZTo6SW1wbD4gcDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBDMkZlbmNlOjpJbXBsOjpTWU5DX0ZFTkNFOgorICAgICAgICAgICAgcCA9IFN5bmNGZW5jZUltcGw6OkNyZWF0ZUZyb21OYXRpdmVIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIGZlbmNlIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgICAgIC8vIHJldHVybiBhIG51bGwtZmVuY2UgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHAgJiYgIXAtPnZhbGlkKCkpIHsKKyAgICAgICAgcC5yZXNldCgpOworICAgIH0KKyAgICByZXR1cm4gQzJGZW5jZShwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCmluZGV4IGIyNjM2ZTkuLjI5YWFkNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKQEAgLTEwMSw2ICsxMDEsOCBAQAogICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbklkLAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCAqY29uc3VtZXJVc2FnZSk7CisKIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOwogICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CkBAIC0xMjcsOCArMTI5LDkgQEAKICAgICAvLyBDcmVhdGUgYSBsb2NhbCBCbG9ja1Bvb2xEYXRhLgogICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAogICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8aW50PiAmb3duZXIsCiAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4sIGludCBub1VzZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4pOwogCiAgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSBvdmVycmlkZTsKIApAQCAtMTM4LDcgKzE0MSw2IEBACiAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9HZW5lcmF0aW9uLCB1aW50NjRfdCB0b1VzYWdlLCB1aW50NjRfdCB0b0JxSWQsCiAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIsIHVpbnQzMl90IG9sZEdlbmVyYXRpb24sCiAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW0pOwotCiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OwogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRmVuY2VGYWN0b3J5LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRmVuY2VGYWN0b3J5LmgKaW5kZXggZDRiZWQyNi4uNDk0NDExNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkZlbmNlRmFjdG9yeS5oCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJGZW5jZUZhY3RvcnkuaApAQCAtMjgsNiArMjgsNyBAQAogc3RydWN0IF9DMkZlbmNlRmFjdG9yeSB7CiAKICAgICBjbGFzcyBTdXJmYWNlRmVuY2VJbXBsOworICAgIGNsYXNzIFN5bmNGZW5jZUltcGw7CiAKICAgICAvKgogICAgICAqIENyZWF0ZSBDMkZlbmNlIGZvciBCdWZmZXJRdWV1ZUJhc2VkIGJsb2NrcG9vbC4KQEAgLTM4LDYgKzM5LDMwIEBACiAgICAgc3RhdGljIEMyRmVuY2UgQ3JlYXRlU3VyZmFjZUZlbmNlKAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW0sCiAgICAgICAgICAgICB1aW50MzJfdCB3YWl0SWQpOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgQzJGZW5jZSBmcm9tIGEgZmVuY2UgZmlsZSBmZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZW5jZUZkICAgICAgICAgICBGZW5jZSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgb3duZWQgYW5kIGNsb3NlZCBieSB0aGUgcmV0dXJuZWQgZmVuY2Ugb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBDMkZlbmNlIENyZWF0ZVN5bmNGZW5jZShpbnQgZmVuY2VGZCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuYXRpdmUgaGFuZGxlIGZyb20gZmVuY2UgZm9yIG1hcnNoYWxsaW5nCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgbm9uLW51bGwgcG9pbnRlciBpZiB0aGUgZmVuY2UgY2FuIGJlIG1hcnNoYWxsZWQsIG90aGVyd2lzZSByZXR1cm4gbnVsbHB0cgorICAgICAqLworICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIENyZWF0ZU5hdGl2ZUhhbmRsZShjb25zdCBDMkZlbmNlJiBmZW5jZSk7CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBDMkZlbmNlIGZyb20gYSBuYXRpdmUgaGFuZGxlLgorCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgICAgICAgQSBuYXRpdmUgaGFuZGxlIHJlcHJlc2VudGluZyBhIGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZkIGluIHRoZSBuYXRpdmUgaGFuZGxlIHdpbGwgYmUgZHVwbGljYXRlZCwgc28gdGhlIGNhbGxlciB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgb3duIHRoZSBoYW5kbGUgYW5kIGhhdmUgdG8gY2xvc2UgaXQuCisgICAgICovCisgICAgc3RhdGljIEMyRmVuY2UgQ3JlYXRlRnJvbU5hdGl2ZUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKaW5kZXggZGM2MWM0ZS4uZTY3ZTQyZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKQEAgLTU0Miw3ICs1NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlciwgbVN5bmNNZW0sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSWdicFZhbGlkaXR5VG9rZW4sIG1Qcm9kdWNlciwgbVN5bmNNZW0pOwogICAgICAgICAgICAgICAgIG1Qb29sRGF0YXNbc2xvdF0gPSBwb29sRGF0YTsKICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKQEAgLTU3MSwxMSArNTcxLDEyIEBACiBwdWJsaWM6CiAgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCiAgICAgICAgIDogbUluaXQoQzJfT0spLCBtUHJvZHVjZXJJZCgwKSwgbUdlbmVyYXRpb24oMCksCi0gICAgICAgICAgbURxRmFpbHVyZSgwKSwgbUxhc3REcVRzKDApLCBtTGFzdERxTG9nVHMoMCksCi0gICAgICAgICAgbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsKKyAgICAgICAgICBtQ29uc3VtZXJVc2FnZSgwKSwgbURxRmFpbHVyZSgwKSwgbUxhc3REcVRzKDApLAorICAgICAgICAgIG1MYXN0RHFMb2dUcygwKSwgbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtSWdicFZhbGlkaXR5VG9rZW4oc3RkOjptYWtlX3NoYXJlZDxpbnQ+KDApKSB7CiAgICAgfQogCiAgICAgfkltcGwoKSB7CisgICAgICAgIG1JZ2JwVmFsaWRpdHlUb2tlbi5yZXNldCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgewogICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKICAgICAgICAgfQpAQCAtNjE4LDcgKzYxOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBudWxscHRyLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAodWludDY0X3QpMCwgfjAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOwogICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CiAKQEAgLTY5NCw4ICs2OTUsNyBAQAogICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSAwOwogICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBBTE9HVygiaW52YWxpZCBwcm9kdWNlciBwcm9kdWNlciglZCksIGdlbmVyYXRpb24oJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAoYm9vbClwcm9kdWNlciwgYnFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbmZpZ3VyaW5nIG51bGwgcHJvZHVjZXI6IGlnYnBfaW5mb3JtYXRpb24oJWQpIiwgYnFJbmZvcm1hdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvbGRNZW0gPSBtU3luY01lbTsgLy8gcHJldmVuIGRlc3RydWN0aW9uIHdoaWxlIGxvY2tlZC4KICAgICAgICAgICAgIG1TeW5jTWVtID0gYzJTeW5jTWVtOwpAQCAtNzIwLDYgKzcyMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvbGQgYnVmZmVycyBzaG91bGQgbm90IGJlIGNhbmNlbGxlZCBzaW5jZSB0aGUgYXNzb2NpYXRlZCBJR0JQCisgICAgICAgICAgICAgICAgLy8gaXMgbm8gbG9uZ2VyIHZhbGlkLgorICAgICAgICAgICAgICAgIG1JZ2JwVmFsaWRpdHlUb2tlbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0gPSBidWZmZXJzW2ldOwpAQCAtNzMxLDYgKzczNSwxMSBAQAogICAgICAgICAgICAgICAgICAgImJxSWQ6ICVsbHUgbWlncmF0ZWQgYnVmZmVycyAjICVkIiwKICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvZHVjZXJJZCwgbWlncmF0ZWQpOwogICAgICAgICB9CisgICAgICAgIG1Db25zdW1lclVzYWdlID0gdXNhZ2U7CisgICAgfQorCisgICAgdm9pZCBnZXRDb25zdW1lclVzYWdlKHVpbnQ2NF90ICpjb25zdW1lVXNhZ2UpIHsKKyAgICAgICAgKmNvbnN1bWVVc2FnZSA9IG1Db25zdW1lclVzYWdlOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTczOSw2ICs3NDgsNyBAQAogICAgIGMyX3N0YXR1c190IG1Jbml0OwogICAgIHVpbnQ2NF90IG1Qcm9kdWNlcklkOwogICAgIHVpbnQzMl90IG1HZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IG1Db25zdW1lclVzYWdlOwogICAgIE9uUmVuZGVyQ2FsbGJhY2sgbVJlbmRlckNhbGxiYWNrOwogCiAgICAgc2l6ZV90IG1EcUZhaWx1cmU7CkBAIC03NTUsNiArNzY1LDIwIEBACiAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBtU3luY01lbTsKKworICAgIC8vIElHQlAgaW52YWxpZGF0aW9uIG5vdGlmaWNhdGlvbiB0b2tlbi4KKyAgICAvLyBUaGUgYnVmZmVycyhDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSkgaGFzIHRoZSByZWZlcmVuY2UgdG8gdGhlIElHQlAgd2hlcmUKKyAgICAvLyB0aGV5IGJlbG9uZyBpbiBvcmRlciB0byBjYWxsIElHQlA6OmNhbmNlbEJ1ZmZlcigpIHdoZW4gdGhleSBhcmUgb2Ygbm8gdXNlLgorICAgIC8vCisgICAgLy8gSW4gY2VydGFpbiBjYXNlcywgSUdCUCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGlzIGNsYXNzKGFjdHVhbGx5IE1lZGlhQ29kZWMpCisgICAgLy8gYW55IG1vcmUgYW5kIHRoZSBzaXR1YXRpb24gbmVlZHMgdG8gYmUgYWRkcmVzc2VkIHF1aWNrbHkuIEluIG9yZGVyIHRvCisgICAgLy8gYWNoaWV2ZSB0aG9zZSwgc3RkOjpzaGFyZWRfcHRyPD4gaXMgdXNlZCBhcyBhIHRva2VuIGZvciBxdWljayBJR0JQIGludmFsaWRhdGlvbgorICAgIC8vIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBidWZmZXJzLgorICAgIC8vCisgICAgLy8gVGhlIGJ1ZmZlciBzaWRlIHdpbGwgaGF2ZSB0aGUgcmVmZXJlbmNlIG9mIHRoZSB0b2tlbiBhcyBzdGQ6OndlYWtfcHRyPD4uCisgICAgLy8gaWYgdGhlIHRva2VuIGhhcyBiZWVuIGV4cGlyZWQsIHRoZSBidWZmZXJzIHdpbGwgbm90IGNhbGwgSUdCUDo6Y2FuY2VsQnVmZmVyKCkKKyAgICAvLyB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciB1c2VkLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IG1JZ2JwVmFsaWRpdHlUb2tlbjsKIH07CiAKIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKQEAgLTc3MCwxNCArNzk0LDE0IEBACiAKIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSwgaW50IG5vVXNlKSA6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtKSA6CiAgICAgICAgIG1Mb2NhbCh0cnVlKSwgbUhlbGQodHJ1ZSksCiAgICAgICAgIG1HZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBtQnFJZChicUlkKSwgbUJxU2xvdChicVNsb3QpLAogICAgICAgICBtQ3VycmVudEdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIG1DdXJyZW50QnFJZChicUlkKSwKICAgICAgICAgbVRyYW5zZmVyKGZhbHNlKSwgbUF0dGFjaChmYWxzZSksIG1EaXNwbGF5KGZhbHNlKSwKLSAgICAgICAgbUlnYnAocHJvZHVjZXIpLCBtU3luY01lbShzeW5jTWVtKSB7Ci0gICAgICAgICAgICAodm9pZClub1VzZTsKKyAgICAgICAgbU93bmVyKG93bmVyKSwgbUlnYnAocHJvZHVjZXIpLCBtU3luY01lbShzeW5jTWVtKSB7CiB9CiAKIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjp+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSB7CkBAIC03ODYsNyArODEwLDcgQEAKICAgICB9CiAKICAgICBpZiAobUxvY2FsKSB7Ci0gICAgICAgIGlmIChtR2VuZXJhdGlvbiA9PSBtQ3VycmVudEdlbmVyYXRpb24gJiYgbUJxSWQgPT0gbUN1cnJlbnRCcUlkKSB7CisgICAgICAgIGlmIChtR2VuZXJhdGlvbiA9PSBtQ3VycmVudEdlbmVyYXRpb24gJiYgbUJxSWQgPT0gbUN1cnJlbnRCcUlkICYmICFtT3duZXIuZXhwaXJlZCgpKSB7CiAgICAgICAgICAgICBDMlN5bmNWYXJpYWJsZXMgKnN5bmNWYXIgPSBtU3luY01lbSA/IG1TeW5jTWVtLT5tZW0oKSA6IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAoc3luY1ZhcikgewogICAgICAgICAgICAgICAgIHN5bmNWYXItPmxvY2soKTsKQEAgLTEwNzAsMyArMTA5NCwxMCBAQAogICAgICAgICBtSW1wbC0+c2V0UmVuZGVyQ2FsbGJhY2socmVuZGVyQ2FsbGJhY2spOwogICAgIH0KIH0KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpnZXRDb25zdW1lclVzYWdlKHVpbnQ2NF90ICpjb25zdW1lVXNhZ2UpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmdldENvbnN1bWVyVXNhZ2UoY29uc3VtZVVzYWdlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJTdXJmYWNlU3luY09iai5jcHAKaW5kZXggZTU1YmRjMC4uMjExNWNjMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJTdXJmYWNlU3luY09iai5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJTdXJmYWNlU3luY09iai5jcHAKQEAgLTIyOCwxMCArMjI4LDEwIEBACiAgICAgdHYudHZfbnNlYyA9IHRpbWVvdXROcyAlIDEwMDAwMDAwMDA7CiAKICAgICBpbnQgcmV0ID0gIHN5c2NhbGwoX19OUl9mdXRleCwgJm1Db25kLCBGVVRFWF9XQUlULCB3YWl0SWQsICZ0diwgTlVMTCwgMCk7Ci0gICAgaWYgKHJldCA9PSAwIHx8IHJldCA9PSBFQUdBSU4pIHsKKyAgICBpZiAocmV0ID09IDAgfHwgZXJybm8gPT0gRUFHQUlOKSB7CiAgICAgICAgIHJldHVybiBDMl9PSzsKICAgICB9Ci0gICAgaWYgKHJldCA9PSBFSU5UUiB8fCByZXQgPT0gRVRJTUVET1VUKSB7CisgICAgaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVUSU1FRE9VVCkgewogICAgICAgICByZXR1cm4gQzJfVElNRURfT1VUOwogICAgIH0KICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IGJhZTY1ZjMuLjBiYzZlZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTIyLDYgKzIyLDEwIEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZGQuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAppbmRleCAxMDgzYjgyLi43MDc0MWQyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCkBAIC0zNSw2ICszNSwxMCBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYV9yZWZsLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKaW5kZXggOWU5NDdlOS4uM2M2NTY2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icApAQCAtMzQsNiArMzQsMTAgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYW1yZW5jb2RlLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL0FuZHJvaWQuYnAKaW5kZXggMjI4ZWE4MC4uZjE2YjBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icApAQCAtMzUsNiArMzUsMTAgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FnYzJfYW1yX3diLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAKaW5kZXggZDk0NTUzMS4uODc4MDEzNiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvQW5kcm9pZC5icApAQCAtMjEsNiArMjEsMTAgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYXV0b2NvcnIuYyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCmluZGV4IDAwYjJhYjYuLmIyOTUyNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCkBAIC01MDEsMTMgKzUwMSwxNiBAQAogICAgIC8qIGNoZWNrIGZyYW1lIHJhdGUgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCiAgICAgeworICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbaV0gPD0gMC4gfHwgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbaV0gPiAxMjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KICAgICAgICAgZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSA9IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldOwogICAgIH0KIAogICAgIGlmIChlbmNQYXJhbXMtPm5MYXllcnMgPiAxKQogICAgIHsKLSAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdIHx8Ci0gICAgICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMF0gPT0gMC4gfHwgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMV0gPT0gMC4pIC8qIDcvMzEvMDMgKi8KKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdKQogICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKICAgICB9CiAgICAgLyogc2V0IG1heCBmcmFtZSByYXRlICovCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKaW5kZXggOTEyYzgyMS4uNWU2MTNkOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcApAQCAtNTAsNyArNTAsNyBAQAogCiAgcHJpdmF0ZToKICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZSA9IG51bGxwdHI7Ci0gIHVpbnQ4X3QgKm1PdXRwdXRCdWZmZXJba051bU91dHB1dEJ1ZmZlcnNdOworICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXSA9IHt9OwogICBib29sIG1Jbml0aWFsaXplZCA9IGZhbHNlOwogICBib29sIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CiAjaWZkZWYgTVBFRzQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAppbmRleCAxYWIwNTExLi42NjU5ZWE1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCkBAIC00Nyw2ICs0NywxMCBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBob3N0X3N1cHBvcnRlZDp0cnVlLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAppbmRleCA3NTEzY2IxLi5mNjU0ZWNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCkBAIC0yNCwyMSArMjQsMTkgQEAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiZXh0cmFjdG9yLWRlZmF1bHRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAotICAgIC8vIGV4dHJhY3RvcnMgYXJlIHN1cHBvc2VkIHRvIHdvcmsgb24gUSgyOSkKKyAgICAvLyBleHRyYWN0b3JzIGFyZSBleHBlY3RlZCB0byBydW4gb24gUSgyOSkKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCiAKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcgYi9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORwppbmRleCA0OTg0YjhmLi5hN2MyY2ZlIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORwpAQCAtMSw2ICsxLDkgQEAKIHsKICAgInByZXN1Ym1pdCI6IFsKIAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRyYW5zY29kaW5nVGVzdENhc2VzIgorICAgICAgICB9CiAgICAgLy8gVE9ETyhiLzE1MzY2MTU5MSkgZW5hYmxlIHRlc3Qgb25jZSB0aGUgYnVnIGlzIGZpeGVkCiAgICAgLy8gVGhpcyB0ZXN0cyB0aGUgZXh0cmFjdG9yIHBhdGgKICAgICAvLyB7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA3YmYzYTEzLi5hOTI2NDIyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDEwIEBACiAKICAgICBzcmNzOiBbIkFBQ0V4dHJhY3Rvci5jcHAiXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvaW5jbHVkZS9BQUNFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvYWFjL2luY2x1ZGUvQUFDRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IDcxMjM2MGQuLjEyMWI3YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtMjEsNiArMjEsMTAgQEAKIAogICAgIHNyY3M6IFsiQU1SRXh0cmFjdG9yLmNwcCJdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9pbmNsdWRlL0FNUkV4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9hbXIvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA5YTJhNzZiLi44MzRmNGFkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMTksMTIgKzE5LDEyIEBACiAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJmbGFjZXh0cmFjdG9yIiwKLSAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiLCAibGliYmluZGVyX25ka19ob3N0X3VzZXIiXSwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiRkxBQ0V4dHJhY3Rvci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvZmxhYy9pbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icAppbmRleCAwZTU0YjU4Li40OTBlMTk1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtODAsMTEgKzgwLDYgQEAKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCkBAIC0xMjQsMTQgKzExOSw2IEBACiAgICAgICAgICJtcDRfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcDQiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCkBAIC0xNTAsMTAgKzEzNyw2IEBACiAgICAgICAgICJ3YXZfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy93YXYiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLApAQCAtMTczLDEwICsxNTYsNiBAQAogICAgICAgICAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYW1yIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCiAgICAgXSwKQEAgLTE5MywxMCArMTcyLDYgQEAKICAgICAgICAgIm1rdl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21rdiIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJ3ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLApAQCAtMjE3LDkgKzE5Miw2IEBACiAgICAgICAgICJvZ2dfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9vZ2ciLAotICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCkBAIC0yNjUsMTAgKzIzNyw2IEBACiAgICAgICAgICJtcDNfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcDMiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJtcDNleHRyYWN0b3IiLApAQCAtMjg1LDEwICsyNTMsNiBAQAogICAgICAgICAiYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYWFjIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKQEAgLTMwNCwxMCArMjY4LDYgQEAKICAgICAgICAgImZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9mbGFjIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAogICAgICAgICAibGliRkxBQyIsCkBAIC0zMjksMTAgKzI4OSw2IEBACiAgICAgICAgICJtaWRpX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbWlkaSIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICAgICAgImxpYm1lZGlhX21pZGlpb3dyYXBwZXIiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAppbmRleCAwOGE2ZmEwLi5mZWFiZjllIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icApAQCAtMjMsNiArMjMsMTAgQEAKIAogICAgIHNyY3M6IFsiTWlkaUV4dHJhY3Rvci5jcHAiXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9taWRpL2luY2x1ZGUvTWlkaUV4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAppbmRleCA1NGM1YjI3Li45OGNlMzA1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKQEAgLTIxLDEwICsyMSw4IEBACiAKICAgICBzcmNzOiBbIk1hdHJvc2thRXh0cmFjdG9yLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAotICAgICAgICAiZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0iLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvaW5jbHVkZS9NYXRyb3NrYUV4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21rdi9pbmNsdWRlL01hdHJvc2thRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDc1YjliN2IuLjM5NmExM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTYsNiArMTYsMTAgQEAKICAgICAgICAgICAgICJYSU5HU2Vla2VyLmNwcCIsCiAgICAgXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvaW5jbHVkZS9NUDNTZWVrZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzU2Vla2VyLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvTVAzU2Vla2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvVkJSSVNlZWtlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvVkJSSVNlZWtlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL1hJTkdTZWVrZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL1hJTkdTZWVrZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKaW5kZXggN2ZhNmJmZC4uNTQwZDc1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSwxNSBAQAogICAgIF0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYm1wNGV4dHJhY3Rvcl9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtcDRleHRyYWN0b3IiLAogICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLApAQCAtMjcsNiArMzYsMTAgQEAKICAgICAgICAgIlNhbXBsZVRhYmxlLmNwcCIsCiAgICAgXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCA2NWMwMjM4Li43Zjk3ZGRjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xMTMyLDEwICsxMTMyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzaXplID49IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcHJvZmlsZSA9IHB0clsyXSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBibF9jb21wYXRpYmlsaXR5X2lkID0gKHB0cls0XSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmxDb21wYXRpYmlsaXR5SWQgPSAocHRyWzRdKSA+PiA0OwogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjcmVhdGVfdHdvX3RyYWNrcyA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxfY29tcGF0aWJpbGl0eV9pZCAmJiBibF9jb21wYXRpYmlsaXR5X2lkICE9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxDb21wYXRpYmlsaXR5SWQgJiYgYmxDb21wYXRpYmlsaXR5SWQgIT0gMTUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfdHdvX3RyYWNrcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTExNDcsMTMgKzExNDcsMTUgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPnRpbWVzY2FsZSA9IG1MYXN0VHJhY2stPnRpbWVzY2FsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5zYW1wbGVUYWJsZSA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IG1MYXN0VHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+c2tpcFRyYWNrID0gbUxhc3RUcmFjay0+c2tpcFRyYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3RfbmVlZHNfcHJvY2Vzc2luZyA9IG1MYXN0VHJhY2stPmVsc3RfbmVlZHNfcHJvY2Vzc2luZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X21lZGlhX3RpbWUgPSBtTGFzdFRyYWNrLT5lbHN0X21lZGlhX3RpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+ZWxzdF9zZWdtZW50X2R1cmF0aW9uID0gbUxhc3RUcmFjay0+ZWxzdF9zZWdtZW50X2R1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MgPSBtTGFzdFRyYWNrLT5lbHN0X3NoaWZ0X3N0YXJ0X3RpY2tzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3RfaW5pdGlhbF9lbXB0eV9lZGl0X3RpY2tzID0gbUxhc3RUcmFjay0+ZWxzdF9pbml0aWFsX2VtcHR5X2VkaXRfdGlja3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+ZWxzdF9pbml0aWFsX2VtcHR5X2VkaXRfdGlja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5lbHN0X2luaXRpYWxfZW1wdHlfZWRpdF90aWNrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5zdWJzYW1wbGVfZW5jcnlwdGlvbiA9IG1MYXN0VHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+bVR4M2dCdWZmZXIgPSBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlcjsKQEAgLTI1OTEsOSArMjU5MywxMSBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoImR2Y0MiKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoImR2dkMiKTogewogCisgICAgICAgIGNhc2UgRk9VUkNDKCJkdmNDIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkdnZDIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkdndDIik6CisgICAgICAgIHsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gMjQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMjYxMywxMyArMjYxNywxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTik7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKICAgICAgICAgY2FzZSBGT1VSQ0MoImQyNjMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtMzQ4MCw3ICszNDg1LDcgQEAKICAgICAgICAgfQogICAgICAgICB1bnNpZ25lZCBtYXNrID0gYnIuZ2V0Qml0cyg4KTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICAgICAgaWYgKCgoMHgxIDw8IGkpICYmIG1hc2spID09IDApCisgICAgICAgICAgICBpZiAoKCgweDEgPDwgaSkgJiBtYXNrKSA9PSAwKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDgpIHsKQEAgLTQ0NTgsNyArNDQ2Myw2IEBACiAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0KICAgICBzcDxJdGVtVGFibGU+IGl0ZW1UYWJsZTsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewogICAgICAgICB2b2lkICpkYXRhOwpAQCAtNDQ5MSwxNCArNDQ5NSwxNCBAQAogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSkgewogICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgIHx8IHNpemUgIT0gMjQpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotCiAgICAgICAgIC8vIGR2X21ham9yLmR2X21pbm9yIFNob3VsZCBiZSAxLjAgb3IgMi4xCi0gICAgICAgIGlmIChzaXplICE9IDI0IHx8ICgocHRyWzBdICE9IDEgfHwgcHRyWzFdICE9IDApICYmIChwdHJbMF0gIT0gMiB8fCBwdHJbMV0gIT0gMSkpKSB7CisgICAgICAgIGlmICgocHRyWzBdICE9IDEgfHwgcHRyWzFdICE9IDApICYmIChwdHJbMF0gIT0gMiB8fCBwdHJbMV0gIT0gMSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9BQzRQYXJzZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvQUM0UGFyc2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9JdGVtVGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvSXRlbVRhYmxlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCA3ZTYyNDdiLi5hYTU5YTBjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0zOCw2ICszOCwxMCBAQAogICAgICAgICAiTVBFRzJUU0V4dHJhY3Rvci5jcHAiLAogICAgIF0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY2dyb3VwcmMjMjkiLApAQCAtNjEsNiArNjUsNyBAQAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAppbmRleCBkNDMxYjA1Li5hZmQyOGVmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKQEAgLTIwLDkgKzIwLDYgQEAKIAogI2luY2x1ZGUgIk1QRUcyUFNFeHRyYWN0b3IuaCIKIAotI2luY2x1ZGUgPEFub3RoZXJQYWNrZXRTb3VyY2UuaD4KLSNpbmNsdWRlIDxFU1F1ZXVlLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzMsNiArMzAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvRVNRdWV1ZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCAyZTY4ODA5Li45YTNjZDkyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTM1LDEwICszNSw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCi0jaW5jbHVkZSA8QW5vdGhlclBhY2tldFNvdXJjZS5oPgotCiAjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXBlZzIvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggZmQ3N2IwOC4uMGUzZTQ4NCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjMsMTIgKzIzLDExIEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNpbmNsdWRlIDxBVFNQYXJzZXIuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAppbmRleCBkNzU0MGM0Li5kYzNjMjVjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKQEAgLTIyLDggKzIyLDggQEAKIAogICAgIHNyY3M6IFsiT2dnRXh0cmFjdG9yLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC90cmVtb2xvIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvb2dnL2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icAppbmRleCAyM2M3NGY3Li4zYzNiYmRjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCkBAIC03OSwxMSArNzksNiBAQAogICAgICAgICAibGliYmFzZSIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCi0gICAgXSwKLQogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKaW5kZXggODRlYzFmMi4uMmJkOWM2YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKQEAgLTI3LDE4ICsyNywxOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KIAotI2luY2x1ZGUgImFhYy9BQUNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJhbXIvQU1SRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiZmxhYy9GTEFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibWlkaS9NaWRpRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibWt2L01hdHJvc2thRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibXAzL01QM0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1wNC9NUEVHNEV4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1wNC9TYW1wbGVUYWJsZS5oIgotI2luY2x1ZGUgIm1wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJtcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAib2dnL09nZ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIndhdi9XQVZFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxBQUNFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxBTVJFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxGTEFDRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TWlkaUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPE1hdHJvc2thRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TVAzRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TVBFRzRFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxTYW1wbGVUYWJsZS5oPgorI2luY2x1ZGUgPE1QRUcyUFNFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxNUEVHMlRTRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8T2dnRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8V0FWRXh0cmFjdG9yLmg+CiAKICNpbmNsdWRlICJFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IGNjNWUxYzcuLmNkZjU4N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtMTgsMTIgKzE4LDEyIEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlid2F2ZXh0cmFjdG9yIiwKIAotICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyIsICJsaWJiaW5kZXJfbmRrX2hvc3RfdXNlciJdLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJXQVZFeHRyYWN0b3IuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL3dhdi9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMgYi9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMKaW5kZXggZTIwMTM5OS4uZDRlZTUxYiAxMDA2NDQKLS0tIGEvbWVkaWEvamFuaXRvcnMvY29kZWNfT1dORVJTCisrKyBiL21lZGlhL2phbml0b3JzL2NvZGVjX09XTkVSUwpAQCAtMiw0ICsyLDQgQEAKICMgZGlmZmVyZW50aWF0ZWQgZnJvbSBwbHVnaW5zIGNvbm5lY3RpbmcgdGhvc2UgY29kZWNzIHRvIGVpdGhlciBvbXggb3IgY29kZWMyIGluZnJhc3RydWN0dXJlCiBlc3NpY2tAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvamFuaXRvcnMvbWVkaWFfbGVhZHNfT1dORVJTIGIvbWVkaWEvamFuaXRvcnMvbWVkaWFfbGVhZHNfT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGJkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYW5pdG9ycy9tZWRpYV9sZWFkc19PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIGdlcnJpdCBvd25lci9hcHByb3ZlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgVExzIHdpdGhpbiB0aGUgbWVkaWEgdGVhbQorIyBsb29zZWx5IChhcyBvZiAyMDIyLzMpIGZnb2xkZmFpbkAgYW5kIGRpcmVjdCByZXBvcnRzCithcmlmZGlraWNpQGdvb2dsZS5jb20KK2VsYXVyZW50QGdvb2dsZS5jb20KK2Znb2xkZmFpbkBnb29nbGUuY29tICAgICN7TEFTVF9SRVNPUlRfU1VHR0VTVElPTn0KK2xham9zQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQorb2xseUBnb29nbGUuY29tCityb2JlcnRzaGloQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUyBiL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUwppbmRleCBlNGM0ZmMyLi5jY2VkMTljIDEwMDY0NAotLS0gYS9tZWRpYS9qYW5pdG9ycy9yZWxpYWJpbGl0eV9tYWlubGluZV9PV05FUlMKKysrIGIvbWVkaWEvamFuaXRvcnMvcmVsaWFiaWxpdHlfbWFpbmxpbmVfT1dORVJTCkBAIC0xLDUgKzEsNSBAQAogIyBCdWcgY29tcG9uZW50OiAxMDUxMzA5Ci0jIGdvL2FuZHJvaWQtbWVkaWEtcmVsYWliaWxpdHkKKyMgZ28vYW5kcm9pZC1tZWRpYS1yZWxpYWJpbGl0eQogCiBlc3NpY2tAZ29vZ2xlLmNvbQogbmNoYWxrb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGliYWF1ZGlvL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU1YTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAppbmRleCA3ZGFhYzIwLi45NTZiM2NkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCkBAIC00MCw2ICs0MCwzMSBAQAogICAgIGludDY0X3QgbmFub3NlY29uZHM7CiB9IFRpbWVzdGFtcDsKIAorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90ICAga1dvcmtsb2FkU2NhbGVyID0gNTAwOworCisvLyBMaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorc3RhdGljIHVpbnQzMl90IHNfcmFuZG9tMTYoKSB7CisgICAgc3RhdGljIHVpbnQzMl90IHNlZWQgPSAxMjM0OworICAgIHNlZWQgPSAoKHNlZWQgKiAzMTQyMSkgKyA2OTI3KSAmIDB4MEZGRkY7CisgICAgcmV0dXJuIHNlZWQ7Cit9CisKKy8qKgorICogVGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIGdvb2QgZm9yIGJ1cm5pbmcgQ1BVIGJlY2F1c2UgdGhlIGNvbXBpbGVyIGNhbm5vdAorICogZWFzaWx5IG9wdGltaXplIGF3YXkgdGhlIGNvbXB1dGF0aW9uLgorICogQHBhcmFtIHdvcmtsb2FkIG51bWJlciBvZiB0aW1lcyB0byBleGVjdXRlIHRoZSBsb29wCisgKiBAcmV0dXJuIGEgd2hpdGUgbm9pc2UgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCArMS4wCisgKi8KK3N0YXRpYyBmbG9hdCBzX2J1cm5DUFUoaW50MzJfdCB3b3JrbG9hZCkgeworICAgIHVpbnQzMl90IHJhbmRvbSA9IDA7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgd29ya2xvYWQ7IGkrKykgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCAxMDsgaisrKSB7CisgICAgICAgICAgICByYW5kb20gPSByYW5kb20gXiBzX3JhbmRvbTE2KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChyYW5kb20gLSAzMjc2OCkgKiAoMS4wIC8gMzI3NjgpOworfQorCiAvKioKICAqIFNpbXBsZSB3cmFwcGVyIGZvciBBQXVkaW8gdGhhdCBvcGVucyBhbiBvdXRwdXQgc3RyZWFtIGVpdGhlciBpbiBjYWxsYmFjayBvciBibG9ja2luZyB3cml0ZSBtb2RlLgogICovCkBAIC0yNjgsMTEgKzI5MywxMyBAQAogICAgIGludDMyX3QgICAgICAgICAgICB0aW1lc3RhbXBDb3VudCA9IDA7IC8vIGluIHRpbWVzdGFtcHMKICAgICBpbnQzMl90ICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDQ4MDAwOwogICAgIGludDMyX3QgICAgICAgICAgICBwcmVmaXhUb25lRnJhbWVzID0gMDsKKyAgICBkb3VibGUgICAgICAgICAgICAgd29ya2xvYWQgPSAwLjA7CiAgICAgYm9vbCAgICAgICAgICAgICAgIHN3ZWVwU2V0dXAgPSBmYWxzZTsKIAogICAgIGludCAgICAgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOwogICAgIGJvb2wgICAgICAgICAgICAgICBzY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgIGNwdUFmZmluaXR5ID0gLTE7CiAKICAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgc2ltcGxlUGxheWVyOwogICAgIGludDMyX3QgICAgICAgICAgICBjYWxsYmFja0NvdW50ID0gMDsKQEAgLTMwNCw2ICszMzEsMTQgQEAKIAogfSBTaW5lVGhyZWFkZWREYXRhX3Q7CiAKK2ludCBzZXRDcHVBZmZpbml0eShpbnQgY3B1SW5kZXgpIHsKK2NwdV9zZXRfdCBjcHVfc2V0OworICAgIENQVV9aRVJPKCZjcHVfc2V0KTsKKyAgICBDUFVfU0VUKGNwdUluZGV4LCAmY3B1X3NldCk7CisgICAgaW50IGVyciA9IHNjaGVkX3NldGFmZmluaXR5KChwaWRfdCkgMCwgc2l6ZW9mKGNwdV9zZXRfdCksICZjcHVfc2V0KTsKKyAgICByZXR1cm4gZXJyID09IDAgPyAwIDogLWVycm5vOworfQorCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYygKICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCkBAIC0zMTksNiArMzU0LDEwIEBACiAgICAgfQogICAgIFNpbmVUaHJlYWRlZERhdGFfdCAqc2luZURhdGEgPSAoU2luZVRocmVhZGVkRGF0YV90ICopIHVzZXJEYXRhOwogCisgICAgaWYgKHNpbmVEYXRhLT5jcHVBZmZpbml0eSA+PSAwKSB7CisgICAgICAgIHNldENwdUFmZmluaXR5KHNpbmVEYXRhLT5jcHVBZmZpbml0eSk7CisgICAgICAgIHNpbmVEYXRhLT5jcHVBZmZpbml0eSA9IC0xOworICAgIH0KICAgICAvLyBQbGF5IGFuIGluaXRpYWwgaGlnaCB0b25lIHNvIHdlIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIGJlZ2lubmluZyB3YXMgdHJ1bmNhdGVkLgogICAgIGlmICghc2luZURhdGEtPnN3ZWVwU2V0dXAgJiYgc2luZURhdGEtPmZyYW1lc1RvdGFsID49IHNpbmVEYXRhLT5wcmVmaXhUb25lRnJhbWVzKSB7CiAgICAgICAgIHNpbmVEYXRhLT5zZXR1cFNpbmVTd2VlcHMoKTsKQEAgLTM5OCw2ICs0MzcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKICAgICB9CiAKKyAgICBzX2J1cm5DUFUoKGludDMyX3QpKHNpbmVEYXRhLT53b3JrbG9hZCAqIGtXb3JrbG9hZFNjYWxlciAqIG51bUZyYW1lcykpOworCiAgICAgc2luZURhdGEtPmNhbGxiYWNrQ291bnQrKzsKICAgICBzaW5lRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOwogICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IGNkYzk4N2IuLjQwMGZjN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTMxLDEwICszMSwxMCBAQAogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAotI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS44IgorI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMi4xIgogCi1jb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEhhbmdUaW1lTVNlYyA9IDEwOwotCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRIYW5nVGltZU1TZWMgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrV29ya1BlcmlvZFNlY29uZHMgPSA2OwogLyoqCiAgKiBPcGVuIHN0cmVhbSwgcGxheSBzb21lIHNpbmUgd2F2ZXMsIHRoZW4gY2xvc2UgdGhlIHN0cmVhbS4KICAqCkBAIC00NCw3ICs0NCwxMSBAQAogc3RhdGljIGFhdWRpb19yZXN1bHRfdCB0ZXN0T3BlblBsYXlDbG9zZShBQXVkaW9BcmdzUGFyc2VyICZhcmdQYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZpeFRvbmVNc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhhbmdUaW1lTVNlYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYW5nVGltZU1TZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgY3B1QWZmaW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgbG93V29ya0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgaGlnaFdvcmtMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdvcmtQZXJpb2RTZWNvbmRzKQogewogICAgIFNpbmVUaHJlYWRlZERhdGFfdCBteURhdGE7CiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyICZwbGF5ZXIgPSBteURhdGEuc2ltcGxlUGxheWVyOwpAQCAtNTcsNiArNjEsNyBAQAogICAgIG15RGF0YS5zY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CiAgICAgbXlEYXRhLmNhbGxiYWNrQ291bnQgPSAwOwogICAgIG15RGF0YS5oYW5nVGltZU1TZWMgPSBoYW5nVGltZU1TZWM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCisgICAgbXlEYXRhLmNwdUFmZmluaXR5ID0gY3B1QWZmaW5pdHk7CiAKICAgICByZXN1bHQgPSBwbGF5ZXIub3BlbihhcmdQYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywKQEAgLTExMSw4ICsxMTYsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gUGxheSBhIHNpbmUgd2F2ZSBpbiB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgcHJpbnRmKCJTbGVlcCBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyBwbGF5cyBpbiBhIGNhbGxiYWNrIHRocmVhZC4gJWQgb2YgJWRcbiIsCi0gICAgICAgICAgICAgICBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCksIChsb29wSW5kZXggKyAxKSwgbG9vcENvdW50KTsKKyAgICAgICAgcHJpbnRmKCJNb25pdG9yIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHBsYXlzIGluIGEgY2FsbGJhY2sgdGhyZWFkLiAlZCBvZiAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCksIChsb29wSW5kZXggKyAxKSwgbG9vcENvdW50LCB3b3JrUGVyaW9kU2Vjb25kcyk7CiAgICAgICAgIHN0YXJ0ZWRBdE5hbm9zID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKICAgICAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgZHVyYXRpb25TZWNvbmRzOyBzZWNvbmQrKykgewogICAgICAgICAgICAgLy8gU2xlZXAgYSB3aGlsZS4gV2FrZSB1cCBlYXJseSBpZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgYSBESVNDT05ORUNULgpAQCAtMTIzLDEzICsxMjgsMTcgQEAKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNSZWFkID0gKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHBsYXllci5nZXRTdHJlYW0oKSk7CiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhydW5zID0gQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgbXlEYXRhLndvcmtsb2FkID0gKChzZWNvbmQgJSAoMiAqIHdvcmtQZXJpb2RTZWNvbmRzKSkgPCB3b3JrUGVyaW9kU2Vjb25kcykKKyAgICAgICAgICAgICAgICAgICAgPyBsb3dXb3JrTG9hZCA6IGhpZ2hXb3JrTG9hZDsKICAgICAgICAgICAgIHByaW50ZigiIHdha2VyIHJlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXMgd3JpdHRlbiAlOGQgLSByZWFkICU4ZCA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXMgd3JpdHRlbiAlOGQgLSByZWFkICU4ZCA9ICU4ZCIKKyAgICAgICAgICAgICAgICAgICAiLCB3b3JrID0gJTUuMWYsIHVuZGVycnVucyA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgKGludCkgbWlsbGlzLAogICAgICAgICAgICAgICAgICAgIHNlY29uZCwKICAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQsCiAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgbXlEYXRhLndvcmtsb2FkLAogICAgICAgICAgICAgICAgICAgIHhydW5zKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKQEAgLTIyMCw2ICsyMjksMTEgQEAKICAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOwogICAgIHByaW50ZigiICAgICAgLWx7Y291bnR9IGxvb3BDb3VudCBzdGFydC9zdG9wLCBldmVyeSBvdGhlciBvbmUgaXMgc2lsZW50XG4iKTsKICAgICBwcmludGYoIiAgICAgIC10e21zZWN9ICBwbGF5IGEgaGlnaCBwaXRjaGVkIHRvbmUgYXQgdGhlIGJlZ2lubmluZ1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtd3t3b3JrbG9hZH0gIHNldCBiYXNlIHdvcmtsb2FkLCBkZWZhdWx0IDAuMFxuIik7CisgICAgcHJpbnRmKCIgICAgICAtV3t3b3JrbG9hZH0gIGFsdGVybmF0ZSBiZXR3ZWVuIHRoaXMgaGlnaGVyIHdvcmtsb2FkIGFuZCBiYXNlIHdvcmtsb2FkXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1ae2R1cmF0aW9ufSAgbnVtYmVyIG9mIHNlY29uZHMgdG8gc3BlbmQgYXQgZWFjaCB3b3JrbG9hZCwgZGVmYXVsdCA9ICVkXG4iLAorICAgICAgICAgICBrV29ya1BlcmlvZFNlY29uZHMpOworICAgIHByaW50ZigiICAgICAgLWF7Y3B1fSAgIHNldCBDUFUgYWZmaW5pdHksIGRlZmF1bHQgbm9uZVxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtaHttc2VjfSAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IGhhbmdpbmcgaW4gY2FsbGJhY2tcbiIpOwogICAgIHByaW50ZigiICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHNwZWNpZmllZCB0aGVuICVkIHVzZWQuXG4iLAogICAgICAgICAgICAga0RlZmF1bHRIYW5nVGltZU1TZWMpOwpAQCAtMjMyLDYgKzI0NiwxMCBAQAogICAgIGludDMyX3QgICAgICAgICAgICBsb29wQ291bnQgPSAxOwogICAgIGludDMyX3QgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgIGNwdUFmZmluaXR5ID0gLTE7CisgICAgZG91YmxlICAgICAgICAgICAgIGxvd1dvcmtMb2FkID0gMC4wOworICAgIGRvdWJsZSAgICAgICAgICAgICBoaWdoV29ya0xvYWQgPSAtMS4wOworICAgIGludDMyX3QgICAgICAgICAgICB3b3JrUGVyaW9kU2Vjb25kcyA9IGtXb3JrUGVyaW9kU2Vjb25kczsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgpAQCAtMjQ3LDYgKzI2NSw5IEBACiAgICAgICAgICAgICBpZiAoYXJnWzBdID09ICctJykgewogICAgICAgICAgICAgICAgIGNoYXIgb3B0aW9uID0gYXJnWzFdOwogICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgICAgICAgICAgICAgY3B1QWZmaW5pdHkgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgogICAgICAgICAgICAgICAgICAgICAgICAgbG9vcENvdW50ID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU4LDYgKzI3OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0b2koJmFyZ1syXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrRGVmYXVsdEhhbmdUaW1lTVNlYzsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvd1dvcmtMb2FkID0gYXRvZigmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdXJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hXb3JrTG9hZCA9IGF0b2YoJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGVyaW9kU2Vjb25kcyA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CkBAIC0yNzEsOSArMzAxLDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoaGlnaFdvcmtMb2FkID4gMCkgeworICAgICAgICBpZiAoaGlnaFdvcmtMb2FkIDwgbG93V29ya0xvYWQpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSAtVyVmIHdvcmtsb2FkIGxvd2VyIHRoYW4gLXclZiB3b3JrbG9hZCIsIGhpZ2hXb3JrTG9hZCwgbG93V29ya0xvYWQpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGhpZ2hXb3JrTG9hZCA9IGxvd1dvcmtMb2FkOyAvLyBoaWdoIG5vdCBzcGVjaWZpZWQgc28gdXNlIGxvdworICAgIH0KKwogICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBjYW4gY29tcGxldGUgdGhlIHRlc3Qgd2l0aG91dCBkaXNjb25uZWN0aW5nLgogICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIsIGxvb3BDb3VudCwKLSAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjLCBoYW5nVGltZU1TZWMpKQorICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMsIGhhbmdUaW1lTVNlYywKKyAgICAgICAgICAgIGNwdUFmZmluaXR5LAorICAgICAgICAgICAgbG93V29ya0xvYWQsIGhpZ2hXb3JrTG9hZCwKKyAgICAgICAgICAgIHdvcmtQZXJpb2RTZWNvbmRzKSkKICAgICAgICAgICAgID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogCiAgICAgcmV0dXJuIChyZXN1bHQpID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMTIxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGliYWF1ZGlvX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibGliYWF1ZGlvX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpb19oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYXVkaW9tYW5hZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5IiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgICAgICAibGliYmFzZV9uZGsiLAorICAgICAgICAibGliY2dyb3VwcmMiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJhYXVkaW8tYWlkbC1jcHAiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibGliYWF1ZGlvX2ludGVybmFsIiwKKyAgICAgICAgImxpYmNncm91cHJjX2Zvcm1hdCIsCisgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9saWJhYXVkaW8vZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmExNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw3NyBAQAorIyBGdXp6ZXIgZm9yIGxpYmFhdWRpbworCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgYGxpYmFhdWRpb2AgYXJlIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorc291cmNlIGNvZGUgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworRnV6emVycyBhc3NpZ25zIHZhbHVlcyB0byB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgdG8gcGFzcyBvbiB0byBsaWJhYXVkaW86CisxLiBEZXZpY2UgSWQgKHBhcmFtZXRlciBuYW1lOiBgZGV2aWNlSWRgKQorMi4gU2FtcGxpbmcgUmF0ZSAocGFyYW1ldGVyIG5hbWU6IGBzYW1wbGVSYXRlYCkKKzMuIE51bWJlciBvZiBjaGFubmVscyAocGFyYW1ldGVyIG5hbWU6IGBjaGFubmVsQ291bnRgKQorNC4gQXVkaW8gVHJhdmVsIERpcmVjdGlvbiAocGFyYW1ldGVyIG5hbWU6IGBkaXJlY3Rpb25gKQorNS4gQXVkaW8gRm9ybWF0IChwYXJhbWV0ZXIgbmFtZTogYGZvcm1hdGApCis2LiBBdWRpbyBTaGFyaW5nIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgc2hhcmluZ01vZGVgKQorNy4gQXVkaW8gVXNhZ2UgKHBhcmFtZXRlciBuYW1lOiBgdXNhZ2VgKQorOC4gQXVkaW8gQ29udGVudCB0eXBlIChwYXJhbWV0ZXIgbmFtZTogYGNvbnRlbnRUeXBlYCkKKzkuIEF1ZGlvIElucHV0IFByZXNldCAocGFyYW1ldGVyIG5hbWU6IGBpbnB1dFByZXNldGApCisxMC4gQXVkaW8gUHJpdmFjeSBTZW5zaXRpdml0eSAocGFyYW1ldGVyIG5hbWU6IGBwcml2YWN5U2Vuc2l0aXZlYCkKKzExLiBCdWZmZXIgQ2FwYWNpdHkgSW4gRnJhbWVzIChwYXJhbWV0ZXIgbmFtZTogYGZyYW1lc2ApCisxMi4gUGVyZm9ybWFuY2UgTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBtb2RlYCkKKzEzLiBBbGxvd2VkIENhcHR1cmUgUG9saWN5IChwYXJhbWV0ZXIgbmFtZTogYGFsbG93ZWRDYXB0dXJlUG9saWN5YCkKKzE0LiBTZXNzaW9uIElkIChwYXJhbWV0ZXIgbmFtZTogYHNlc3Npb25JZGApCisxNS4gRnJhbWVzIHBlciBEYXRhIENhbGxiYWNrIChwYXJhbWV0ZXIgbmFtZTogYGZyYW1lc1BlckRhdGFDYWxsYmFja2ApCisxNi4gTU1hcCBQb2xpY3kgKHBhcmFtZXRlciBuYW1lOiBgcG9saWN5YCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBkZXZpY2VJZGAgfCBBbnkgdmFsdWUgb2YgdHlwZSBgaW50MzJfdGAgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc2FtcGxlUmF0ZWAgfCBBbnkgdmFsdWUgb2YgdHlwZSBgaW50MzJfdGAgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgY2hhbm5lbENvdW50YCB8ICBBbnkgdmFsdWUgb2YgdHlwZSBgaW50MzJfdGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBkaXJlY3Rpb25gIHwgMC4gYEFBVURJT19ESVJFQ1RJT05fT1VUUFVUYCAxLiBgQUFVRElPX0RJUkVDVElPTl9JTlBVVGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBmb3JtYXRgIHwgMC4gYEFBVURJT19GT1JNQVRfSU5WQUxJRGAgMS4gYEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRURgIDIuIGBBQVVESU9fRk9STUFUX1BDTV9JMTZgIDMuIGBBQVVESU9fRk9STUFUX1BDTV9GTE9BVGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzaGFyaW5nTW9kZWAgfCAwLiBgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkVgIDEuIGBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGB1c2FnZWAgfCAwLiBgQUFVRElPX1VTQUdFX01FRElBYCAxLiBgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05gIDIuIGBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HYCAzLiBgQUFVRElPX1VTQUdFX0FMQVJNYCA0LiBgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTmAgNS4gYEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fUklOR1RPTkVgIDYuIGBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UYCA3LiBgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWWAgOC4gYEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0VgIDkuIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT05gIDEwLiBgQUFVRElPX1VTQUdFX0dBTUVgIDExLiBgQUFVRElPX1VTQUdFX0FTU0lTVEFOVGAgMTIuIGBBQVVESU9fU1lTVEVNX1VTQUdFX0VNRVJHRU5DWWAgMTMuIGBBQVVESU9fU1lTVEVNX1VTQUdFX1NBRkVUWWAgMTQuIGBBQVVESU9fU1lTVEVNX1VTQUdFX1ZFSElDTEVfU1RBVFVTYCAxNS4gYEFBVURJT19TWVNURU1fVVNBR0VfQU5OT1VOQ0VNRU5UYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGNvbnRlbnRUeXBlYCB8IDAuIGBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSGAgMS4gYEFBVURJT19DT05URU5UX1RZUEVfTVVTSUNgIDIuIGBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFYCAzLiBgQUFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT05gIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgaW5wdXRQcmVzZXRgIHwgMC4gYEFBVURJT19JTlBVVF9QUkVTRVRfR0VORVJJQ2AgMS4gYEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSYCAyLiBgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTmAgMy4gYEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTmAgNC4gYEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRURgIDUuIGBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHByaXZhY3lTZW5zaXRpdmVgIHwgMC4gYHRydWVgIDEuIGBmYWxzZWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBmcmFtZXNgIHwgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgICB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYG1vZGVgIHwgMC4gYEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkVgIDEuIGBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkdgIDIuIGBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBhbGxvd2VkQ2FwdHVyZVBvbGljeWAgfCAwLiBgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMYCAxLiBgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNYCAyLiBgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzZXNzaW9uSWRgIHwgMC4gYEFBVURJT19TRVNTSU9OX0lEX05PTkVgIDEuIGBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBmcmFtZXNQZXJEYXRhQ2FsbGJhY2tgIHwgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgcG9saWN5YCB8IDAuIGBBQVVESU9fUE9MSUNZX05FVkVSYCAxLiBgQUFVRElPX1BPTElDWV9BVVRPYCAyLiBgQUFVRElPX1BPTElDWV9BTFdBWVNgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgbW9kdWxlLgorVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbnMgdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc24ndCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGxpYmFhdWRpb19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGxpYmFhdWRpb19mdXp6ZXIKK2BgYAorIyMjIFN0ZXBzIHRvIHJ1bgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbGliYWF1ZGlvX2Z1enplci9saWJhYXVkaW9fZnV6emVyCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZnV6emVyL2xpYmFhdWRpb19mdXp6ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9saWJhYXVkaW9fZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjMzZWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9saWJhYXVkaW9fZnV6emVyLmNwcApAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvLmgiCisjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TdHJpbmdMZW5ndGggPSAyNTY7CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1Blck1pbGxpc2Vjb25kID0gMTAwMCAqIDEwMDA7CisKK2NvbnN0ZXhwciBhYXVkaW9fZGlyZWN0aW9uX3Qga0RpcmVjdGlvbnNbXSA9IHsKKyAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCwgQUFVRElPX0RJUkVDVElPTl9JTlBVVCwgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY29uc3RleHByIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Qga1BlcmZvcm1hbmNlTW9kZXNbXSA9IHsKKyAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcsCisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fZm9ybWF0X3Qga0Zvcm1hdHNbXSA9IHsKKyAgICBBQVVESU9fRk9STUFUX0lOVkFMSUQsICAgICAgICBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVELAorICAgIEFBVURJT19GT1JNQVRfUENNX0kxNiwgICAgICAgIEFBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgIEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQsIEFBVURJT19GT1JNQVRfUENNX0kzMn07CisKK2NvbnN0ZXhwciBhYXVkaW9fc2hhcmluZ19tb2RlX3Qga1NoYXJpbmdNb2Rlc1tdID0geworICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRH07CisKK2NvbnN0ZXhwciBpbnQzMl90IGtTYW1wbGVSYXRlc1tdID0ge0FBVURJT19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwfTsKKworY29uc3RleHByIGFhdWRpb191c2FnZV90IGtVc2FnZXNbXSA9IHsKKyAgICBBQVVESU9fVVNBR0VfTUVESUEsCisgICAgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICBBQVVESU9fVVNBR0VfQUxBUk0sCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfR0FNRSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5ULAorICAgIEFBVURJT19TWVNURU1fVVNBR0VfRU1FUkdFTkNZLAorICAgIEFBVURJT19TWVNURU1fVVNBR0VfU0FGRVRZLAorICAgIEFBVURJT19TWVNURU1fVVNBR0VfVkVISUNMRV9TVEFUVVMsCisgICAgQUFVRElPX1NZU1RFTV9VU0FHRV9BTk5PVU5DRU1FTlQsCisgICAgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY29uc3RleHByIGFhdWRpb19jb250ZW50X3R5cGVfdCBrQ29udGVudFR5cGVzW10gPSB7CisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRSwgQUFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04sCisgICAgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY29uc3RleHByIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBrSW5wdXRQcmVzZXRzW10gPSB7CisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9HRU5FUklDLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04sCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSwKKyAgICBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBrQWxsb3dlZENhcHR1cmVQb2xpY2llc1tdID0geworICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTCwgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNLAorICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkUsIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fc2Vzc2lvbl9pZF90IGtTZXNzaW9uSWRzW10gPSB7CisgICAgQUFVRElPX1NFU1NJT05fSURfTk9ORSwgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUsIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fcG9saWN5X3Qga1BvbGljaWVzW10gPSB7CisgICAgQUFVRElPX1BPTElDWV9ORVZFUiwgQUFVRElPX1BPTElDWV9BVVRPLCBBQVVESU9fUE9MSUNZX0FMV0FZUywKKyAgICBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjbGFzcyBMaWJBYXVkaW9GdXp6ZXIgeworcHVibGljOgorICB+TGliQWF1ZGlvRnV6emVyKCkgeyBkZUluaXQoKTsgfQorICBib29sIGluaXQoKTsKKyAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgdm9pZCBkZUluaXQoKTsKKworcHJpdmF0ZToKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqbUFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICBBQXVkaW9TdHJlYW0gKm1BYXVkaW9TdHJlYW0gPSBudWxscHRyOworfTsKKworYm9vbCBMaWJBYXVkaW9GdXp6ZXI6OmluaXQoKSB7CisgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmbUFhdWRpb0J1aWxkZXIpOworICBpZiAoKHJlc3VsdCAhPSBBQVVESU9fT0spIHx8ICghbUFhdWRpb0J1aWxkZXIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIExpYkFhdWRpb0Z1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwKGRhdGEsIHNpemUpOworICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUgPQorICAgICAgZmRwLlBpY2tWYWx1ZUluQXJyYXkoe2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtQZXJmb3JtYW5jZU1vZGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUobUFhdWRpb0J1aWxkZXIsIG1vZGUpOworCisgIGludDMyX3QgZGV2aWNlSWQgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtBQVVESU9fVU5TUEVDSUZJRUQsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkKG1BYXVkaW9CdWlsZGVyLCBkZXZpY2VJZCk7CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZU5hbWUgPSBmZHAuUGlja1ZhbHVlSW5BcnJheTxzdGQ6OnN0cmluZz4oCisgICAgICB7ImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvIiwgImFuZHJvaWQuYXBwLmFwcG9wcy5jdHMiLAorICAgICAgIGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtSYW5kb21TdHJpbmdMZW5ndGgpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGFja2FnZU5hbWUobUFhdWRpb0J1aWxkZXIsIHBhY2thZ2VOYW1lLmNfc3RyKCkpOworCisgIHN0ZDo6c3RyaW5nIGF0dHJpYnV0aW9uVGFnID0KKyAgICAgIGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtSYW5kb21TdHJpbmdMZW5ndGgpOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEF0dHJpYnV0aW9uVGFnKG1BYXVkaW9CdWlsZGVyLCBhdHRyaWJ1dGlvblRhZy5jX3N0cigpKTsKKworICBpbnQzMl90IHNhbXBsZVJhdGUgPSBmZHAuUGlja1ZhbHVlSW5BcnJheShrU2FtcGxlUmF0ZXMpOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZVJhdGUobUFhdWRpb0J1aWxkZXIsIHNhbXBsZVJhdGUpOworCisgIGludDMyX3QgY2hhbm5lbENvdW50ID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7QUFVRElPX1VOU1BFQ0lGSUVELCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQobUFhdWRpb0J1aWxkZXIsIGNoYW5uZWxDb3VudCk7CisKKyAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtEaXJlY3Rpb25zKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKG1BYXVkaW9CdWlsZGVyLCBkaXJlY3Rpb24pOworCisgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrRm9ybWF0cyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChtQWF1ZGlvQnVpbGRlciwgZm9ybWF0KTsKKworICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrU2hhcmluZ01vZGVzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUobUFhdWRpb0J1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKworICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtVc2FnZXMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRVc2FnZShtQWF1ZGlvQnVpbGRlciwgdXNhZ2UpOworCisgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtDb250ZW50VHlwZXMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZShtQWF1ZGlvQnVpbGRlciwgY29udGVudFR5cGUpOworCisgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtJbnB1dFByZXNldHMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChtQWF1ZGlvQnVpbGRlciwgaW5wdXRQcmVzZXQpOworCisgIGJvb2wgcHJpdmFjeVNlbnNpdGl2ZSA9IGZkcC5Db25zdW1lQm9vbCgpOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFByaXZhY3lTZW5zaXRpdmUobUFhdWRpb0J1aWxkZXIsIHByaXZhY3lTZW5zaXRpdmUpOworCisgIGludDMyX3QgZnJhbWVzID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7QUFVRElPX1VOU1BFQ0lGSUVELCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKG1BYXVkaW9CdWlsZGVyLCBmcmFtZXMpOworCisgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgYWxsb3dlZENhcHR1cmVQb2xpY3kgPQorICAgICAgZmRwLlBpY2tWYWx1ZUluQXJyYXkoe2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtBbGxvd2VkQ2FwdHVyZVBvbGljaWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShtQWF1ZGlvQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ2FwdHVyZVBvbGljeSk7CisKKyAgYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrU2Vzc2lvbklkcyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChtQWF1ZGlvQnVpbGRlciwgc2Vzc2lvbklkKTsKKworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhtQWF1ZGlvQnVpbGRlciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhtQWF1ZGlvQnVpbGRlciwgbnVsbHB0ciwgbnVsbHB0cik7CisKKyAgaW50MzJfdCBmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtBQVVESU9fVU5TUEVDSUZJRUQsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjayhtQWF1ZGlvQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKKworICBhYXVkaW9fcG9saWN5X3QgcG9saWN5ID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1BvbGljaWVzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb19zZXRNTWFwUG9saWN5KHBvbGljeSk7CisgICh2b2lkKUFBdWRpb19nZXRNTWFwUG9saWN5KCk7CisKKyAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9CisgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0obUFhdWRpb0J1aWxkZXIsICZtQWF1ZGlvU3RyZWFtKTsKKyAgaWYgKChyZXN1bHQgIT0gQUFVRElPX09LKSB8fCAoIW1BYXVkaW9TdHJlYW0pKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChtQWF1ZGlvU3RyZWFtKTsKKyAgdWludDhfdCBudW1iZXJPZkJ1cnN0cyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKKyAgaW50MzJfdCBtYXhGcmFtZXMgPSBudW1iZXJPZkJ1cnN0cyAqIGZyYW1lc1BlckJ1cnN0OworICBpbnQzMl90IHJlcXVlc3RlZEJ1ZmZlclNpemUgPQorICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSAqIGZyYW1lc1BlckJ1cnN0OworICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG1BYXVkaW9TdHJlYW0sIHJlcXVlc3RlZEJ1ZmZlclNpemUpOworCisgIGludDY0X3QgcG9zaXRpb24gPSAwLCBuYW5vc2Vjb25kcyA9IDA7CisgIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAobUFhdWRpb1N0cmVhbSwgQ0xPQ0tfTU9OT1RPTklDLCAmcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbm9zZWNvbmRzKTsKKworICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG1BYXVkaW9TdHJlYW0pOworCisgIGFhdWRpb19mb3JtYXRfdCBhY3R1YWxGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KG1BYXVkaW9TdHJlYW0pOworICBpbnQzMl90IGFjdHVhbENoYW5uZWxDb3VudCA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobUFhdWRpb1N0cmVhbSk7CisKKyAgaW50MzJfdCBjb3VudCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgZGlyZWN0aW9uID0gQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihtQWF1ZGlvU3RyZWFtKTsKKworICBpZiAoYWN0dWFsRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gaW5wdXRTaG9ydERhdGEobWF4RnJhbWVzICogYWN0dWFsQ2hhbm5lbENvdW50LCAweDApOworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgICAgQUF1ZGlvU3RyZWFtX3JlYWQobUFhdWRpb1N0cmVhbSwgaW5wdXRTaG9ydERhdGEuZGF0YSgpLCBtYXhGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKiBrTmFub3NQZXJNaWxsaXNlY29uZCk7CisgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtX3dyaXRlKG1BYXVkaW9TdHJlYW0sIGlucHV0U2hvcnREYXRhLmRhdGEoKSwgbWF4RnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKiBrTmFub3NQZXJNaWxsaXNlY29uZCk7CisgICAgfQorICB9IGVsc2UgaWYgKGFjdHVhbEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0RmxvYXREYXRhKG1heEZyYW1lcyAqIGFjdHVhbENoYW5uZWxDb3VudCwgMHgwKTsKKyAgICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICAgIEFBdWRpb1N0cmVhbV9yZWFkKG1BYXVkaW9TdHJlYW0sIGlucHV0RmxvYXREYXRhLmRhdGEoKSwgbWF4RnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICoga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbV93cml0ZShtQWF1ZGlvU3RyZWFtLCBpbnB1dEZsb2F0RGF0YS5kYXRhKCksIG1heEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICoga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICAgIH0KKyAgfQorCisgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTjsKKyAgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShtQWF1ZGlvU3RyZWFtLCBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLCBjb3VudCAqIGtOYW5vc1Blck1pbGxpc2Vjb25kKTsKKyAgKHZvaWQpQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSk7CisKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFVzYWdlKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFN0YXRlKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldChtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2lzUHJpdmFjeVNlbnNpdGl2ZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5KG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRTaGFyaW5nTW9kZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQobUFhdWRpb1N0cmVhbSk7CisKKyAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShtQWF1ZGlvU3RyZWFtKTsKKyAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChtQWF1ZGlvU3RyZWFtKTsKKyAgQUF1ZGlvU3RyZWFtX3JlbGVhc2UobUFhdWRpb1N0cmVhbSk7CisgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChtQWF1ZGlvU3RyZWFtKTsKK30KKwordm9pZCBMaWJBYXVkaW9GdXp6ZXI6OmRlSW5pdCgpIHsKKyAgaWYgKG1BYXVkaW9CdWlsZGVyKSB7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUobUFhdWRpb0J1aWxkZXIpOworICB9CisgIGlmIChtQWF1ZGlvU3RyZWFtKSB7CisgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKG1BYXVkaW9TdHJlYW0pOworICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgTGliQWF1ZGlvRnV6emVyIGxpYkFhdWRpb0Z1enplcjsKKyAgaWYgKGxpYkFhdWRpb0Z1enplci5pbml0KCkpIHsKKyAgICBsaWJBYXVkaW9GdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCA0YjA4Mjk1Li4yZmY5ZjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KIAogLyoqCi0gKiBAZmlsZSBBQXVkaW8uaAorICogQGZpbGUgYWF1ZGlvL0FBdWRpby5oCiAgKi8KIAogLyoqCkBAIC00NDQsNiArNDQ0LDIyIEBACiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19jb250ZW50X3R5cGVfdDsKIAorZW51bSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoZSBhdWRpbyBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBhdHRyaWJ1dGVzIHdpbGwgZm9sbG93IHRoZQorICAgICAqIGRlZmF1bHQgcGxhdGZvcm0gYmVoYXZpb3Igd2l0aCByZWdhcmRzIHRvIHdoaWNoIGNvbnRlbnQgd2lsbCBiZSBzcGF0aWFsaXplZCBvciBub3QuCisgICAgICovCisgICAgQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX0FVVE8gPSAxLAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGUgYXVkaW8gY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlc2UgYXR0cmlidXRlcyBzaG91bGQgbmV2ZXIKKyAgICAgKiBiZSBzcGF0aWFsaXplZC4KKyAgICAgKi8KKyAgICBBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfTkVWRVIgPSAyLAorfTsKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdDsKKwogLyoqCiAgKiBEZWZpbmVzIHRoZSBhdWRpbyBzb3VyY2UuCiAgKiBBbiBhdWRpbyBzb3VyY2UgZGVmaW5lcyBib3RoIGEgZGVmYXVsdCBwaHlzaWNhbCBzb3VyY2Ugb2YgYXVkaW8gc2lnbmFsLCBhbmQgYSByZWNvcmRpbmcKQEAgLTU2NSw2ICs1ODEsMTQ1IEBACiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19zZXNzaW9uX2lkX3Q7CiAKKy8qKgorICogRGVmaW5lcyB0aGUgYXVkaW8gY2hhbm5lbCBtYXNrLgorICogQ2hhbm5lbCBtYXNrcyBhcmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2FtcGxlcyBhbmQgdGhlaXIKKyAqIGFycmFuZ2VtZW50IGluIHRoZSBhdWRpbyBmcmFtZS4gVGhleSBhcmUgYWxzbyB1c2VkIGluIHRoZSBlbmRwb2ludAorICogKGUuZy4gYSBVU0IgYXVkaW8gaW50ZXJmYWNlLCBhIERBQyBjb25uZWN0ZWQgdG8gaGVhZHBob25lcykgdG8KKyAqIHNwZWNpZnkgYWxsb3dhYmxlIGNvbmZpZ3VyYXRpb25zIG9mIGEgcGFydGljdWxhciBkZXZpY2UuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDMyLgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIGNoYW5uZWwgbWFzaworICAgICAqLworICAgIEFBVURJT19DSEFOTkVMX0lOVkFMSUQgPSAtMSwKKworICAgIC8qKgorICAgICAqIE91dHB1dCBhdWRpbyBjaGFubmVsIG1hc2sKKyAgICAgKi8KKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUID0gMSA8PCAwLAorICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUID0gMSA8PCAxLAorICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0NFTlRFUiA9IDEgPDwgMiwKKyAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZID0gMSA8PCAzLAorICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfTEVGVCA9IDEgPDwgNCwKKyAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX1JJR0hUID0gMSA8PCA1LAorICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0xFRlRfT0ZfQ0VOVEVSID0gMSA8PCA2LAorICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDEgPDwgNywKKyAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0NFTlRFUiA9IDEgPDwgOCwKKyAgICBBQVVESU9fQ0hBTk5FTF9TSURFX0xFRlQgPSAxIDw8IDksCisgICAgQUFVRElPX0NIQU5ORUxfU0lERV9SSUdIVCA9IDEgPDwgMTAsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX0NFTlRFUiA9IDEgPDwgMTEsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX0ZST05UX0xFRlQgPSAxIDw8IDEyLAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9GUk9OVF9DRU5URVIgPSAxIDw8IDEzLAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9GUk9OVF9SSUdIVCA9IDEgPDwgMTQsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX0JBQ0tfTEVGVCA9IDEgPDwgMTUsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX0JBQ0tfQ0VOVEVSID0gMSA8PCAxNiwKKyAgICBBQVVESU9fQ0hBTk5FTF9UT1BfQkFDS19SSUdIVCA9IDEgPDwgMTcsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfTEVGVCA9IDEgPDwgMTgsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfUklHSFQgPSAxIDw8IDE5LAorICAgIEFBVURJT19DSEFOTkVMX0JPVFRPTV9GUk9OVF9MRUZUID0gMSA8PCAyMCwKKyAgICBBQVVESU9fQ0hBTk5FTF9CT1RUT01fRlJPTlRfQ0VOVEVSID0gMSA8PCAyMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9CT1RUT01fRlJPTlRfUklHSFQgPSAxIDw8IDIyLAorICAgIEFBVURJT19DSEFOTkVMX0xPV19GUkVRVUVOQ1lfMiA9IDEgPDwgMjMsCisgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfV0lERV9MRUZUID0gMSA8PCAyNCwKKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9XSURFX1JJR0hUID0gMSA8PCAyNSwKKworICAgIEFBVURJT19DSEFOTkVMX01PTk8gPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZULAorICAgIEFBVURJT19DSEFOTkVMX1NURVJFTyA9IEFBVURJT19DSEFOTkVMX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDEgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZLAorICAgIEFBVURJT19DSEFOTkVMX1RSSSA9IEFBVURJT19DSEFOTkVMX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIsCisgICAgQUFVRElPX0NIQU5ORUxfVFJJX0JBQ0sgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfQ0VOVEVSLAorICAgIEFBVURJT19DSEFOTkVMXzNQT0lOVDEgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZLAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDIgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfU0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMiA9IEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZLAorICAgIEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDIgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfU0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMiA9IEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZLAorICAgIEFBVURJT19DSEFOTkVMX1FVQUQgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMX1FVQURfU0lERSA9IEFBVURJT19DSEFOTkVMX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9TSURFX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1NJREVfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfU1VSUk9VTkQgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0NFTlRFUiwKKyAgICBBQVVESU9fQ0hBTk5FTF9QRU5UQSA9IEFBVURJT19DSEFOTkVMX1FVQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQ0VOVEVSLAorICAgIC8vIGFrYSA1UE9JTlQxX0JBQ0sKKyAgICBBQVVESU9fQ0hBTk5FTF81UE9JTlQxID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMV9TSURFID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfU0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9TSURFX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzZQT0lOVDEgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfQkFDS19MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfQkFDS19SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfQ0VOVEVSLAorICAgIEFBVURJT19DSEFOTkVMXzdQT0lOVDEgPSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfU0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfU0lERV9SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQyID0gQUFVRElPX0NIQU5ORUxfNVBPSU5UMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfU0lERV9SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQ0ID0gQUFVRElPX0NIQU5ORUxfNVBPSU5UMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX0JBQ0tfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9CQUNLX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDIgPSBBQVVESU9fQ0hBTk5FTF83UE9JTlQxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDQgPSBBQVVESU9fQ0hBTk5FTF83UE9JTlQxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfQkFDS19MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX0JBQ0tfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNCA9IEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9XSURFX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9XSURFX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDYgPSBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX1JJR0hULAorCisgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQkFDSyA9IEFBVURJT19DSEFOTkVMX0ZST05UX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfQ0VOVEVSLAorfTsKK3R5cGVkZWYgdWludDMyX3QgYWF1ZGlvX2NoYW5uZWxfbWFza190OworCiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TdHJlYW1TdHJ1Y3QgICAgICAgICBBQXVkaW9TdHJlYW07CiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TdHJlYW1CdWlsZGVyU3RydWN0ICBBQXVkaW9TdHJlYW1CdWlsZGVyOwogCkBAIC02MjMsOCArNzc4LDE2IEBACiAgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgotICogUmVxdWVzdCBhbiBhdWRpbyBkZXZpY2UgaWRlbnRpZmllZCBkZXZpY2UgdXNpbmcgYW4gSUQuCi0gKiBPbiBBbmRyb2lkLCBmb3IgZXhhbXBsZSwgdGhlIElEIGNvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIEphdmEgQXVkaW9NYW5hZ2VyLgorICogUmVxdWVzdCBhbiBhdWRpbyBkZXZpY2UgaWRlbnRpZmllZCBieSBhbiBJRC4KKyAqCisgKiBUaGUgSUQgY291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgSmF2YSBBdWRpb01hbmFnZXIuCisgKiBBdWRpb01hbmFnZXIuZ2V0RGV2aWNlcygpIHJldHVybnMgYW4gYXJyYXkgb2Yge0BsaW5rIEF1ZGlvRGV2aWNlSW5mb30sCisgKiB3aGljaCBjb250YWlucyBhIGdldElkKCkgbWV0aG9kLiBUaGF0IElEIGNhbiBiZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHlvdSBtYXkgbm90IGdldCB0aGUgZGV2aWNlIHRoYXQgeW91IHJlcXVlc3RlZC4KKyAqIFNvIGlmIGl0IGlzIGltcG9ydGFudCB0byB5b3UsIHlvdSBzaG91bGQgY2FsbAorICogQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKCkgYWZ0ZXIgdGhlIHN0cmVhbSBpcyBvcGVuZWQgdG8KKyAqIHZlcmlmeSB0aGUgYWN0dWFsIElELgogICoKICAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LAogICogaW4gd2hpY2ggY2FzZSB0aGUgcHJpbWFyeSBkZXZpY2Ugd2lsbCBiZSB1c2VkLgpAQCAtNjQzLDggKzgwNiwxMSBAQAogICogVGhpcyBpcyB1c3VhbGx5IHtAY29kZSBDb250ZXh0I2dldFBhY2thZ2VOYW1lKCl9LgogICoKICAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgYSByYW5kb20gcGFja2FnZSBpbiB0aGUgY2FsbGluZyB1aWQuCi0gKiBUaGUgdmFzdCBtYWpvcml0eSBvZiBhcHBzIGhhdmUgb25seSBvbmUgcGFja2FnZSBwZXIgY2FsbGluZyBVSUQuIElmIHRoZSBwYWNrYWdlCi0gKiBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxsaW5nIFVJRCwgdGhlbiByZXF1ZXN0cyB3aWxsIGJlIHJlamVjdGVkLgorICogVGhlIHZhc3QgbWFqb3JpdHkgb2YgYXBwcyBoYXZlIG9ubHkgb25lIHBhY2thZ2UgcGVyIGNhbGxpbmcgVUlELgorICogSWYgYW4gaW52YWxpZCBwYWNrYWdlIG5hbWUgaXMgc2V0LCBpbnB1dCBzdHJlYW1zIG1heSBub3QgYmUgZ2l2ZW4gcGVybWlzc2lvbiB0bworICogcmVjb3JkIHdoZW4gc3RhcnRlZC4KKyAqCisgKiBUaGUgcGFja2FnZSBuYW1lIGlzIHVzdWFsbHkgdGhlIGFwcGxpY2F0aW9uSWQgaW4geW91ciBhcHAncyBidWlsZC5ncmFkbGUgZmlsZS4KICAqCiAgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgogICoKQEAgLTY5OSw2ICs4NjUsMTEgQEAKICAqIElmIGFuIGV4YWN0IHZhbHVlIGlzIHNwZWNpZmllZCB0aGVuIGFuIG9wZW5lZCBzdHJlYW0gd2lsbCB1c2UgdGhhdCB2YWx1ZS4KICAqIElmIGEgc3RyZWFtIGNhbm5vdCBiZSBvcGVuZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRoZW4gdGhlIG9wZW4gd2lsbCBmYWlsLgogICoKKyAqIEFzIHRoZSBjaGFubmVsIGNvdW50IHByb3ZpZGVkIGhlcmUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgY291bnQKKyAqIG9mIGNoYW5uZWwgbWFzayB1c2VkIGluIHtAbGluayBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxNYXNrfSwgdGhlIGxhc3QgY2FsbGVkIGZ1bmN0aW9uCisgKiB3aWxsIGJlIHJlc3BlY3RlZCBpZiBib3RoIHRoaXMgZnVuY3Rpb24gYW5kIHtAbGluayBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxNYXNrfSBhcmUKKyAqIGNhbGxlZC4KKyAqCiAgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCkBAIC03MTQsNiArODg1LDggQEAKICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQogICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBhIGZyYW1lLgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnR9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtODM2LDYgKzEwMDksMzcgQEAKICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKKyAqIFNldHMgdGhlIGJlaGF2aW9yIGFmZmVjdGluZyB3aGV0aGVyIHNwYXRpYWxpemF0aW9uIHdpbGwgYmUgdXNlZC4KKyAqCisgKiBUaGUgQUF1ZGlvIHN5c3RlbSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIHNlbGVjdCB3aGV0aGVyIHRoZSBzdHJlYW0gd2lsbCBnbworICogdGhyb3VnaCBhIHNwYXRpYWxpemVyIGVmZmVjdCBvciBub3Qgd2hlbiB0aGUgZWZmZWN0IGlzIHN1cHBvcnRlZCBhbmQgZW5hYmxlZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMyLgorICoKKyAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCisgKiBAcGFyYW0gc3BhdGlhbGl6YXRpb25CZWhhdmlvciB0aGUgZGVzaXJlZCBiZWhhdmlvciB3aXRoIHJlZ2FyZHMgdG8gc3BhdGlhbGl6YXRpb24sIGVnLgorICogICAgIHtAbGluayAjQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX0FVVE99CisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3Qgc3BhdGlhbGl6YXRpb25CZWhhdmlvcikgX19JTlRST0RVQ0VEX0lOKDMyKTsKKworLyoqCisgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgYXVkaW8gZGF0YSBvZiB0aGlzIG91dHB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgZm9yCisgKiBzcGF0aWFsaXphdGlvbi4KKyAqCisgKiBJZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHByb2Nlc3NlZCBmb3Igc3BhdGlhbGl6YXRpb24sIHNldHRpbmcgdGhpcyB0byB0cnVlIHdpbGwgcHJldmVudAorICogaXNzdWVzIHN1Y2ggYXMgZG91YmxlLXByb2Nlc3Npbmcgb24gcGxhdGZvcm1zIHRoYXQgd2lsbCBzcGF0aWFsaXplIGF1ZGlvIGRhdGEuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIGlzU3BhdGlhbGl6ZWQgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBhbHJlYWR5IHByb2Nlc3NlZCBmb3IgYmluYXVyYWwgb3IgdHJhbnNhdXJhbCBzcGF0aWFsCisgKiAgICAgcmVuZGVyaW5nLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElzQ29udGVudFNwYXRpYWxpemVkKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZCkgX19JTlRST0RVQ0VEX0lOKDMyKTsKKworLyoqCiAgKiBTZXQgdGhlIGlucHV0IChjYXB0dXJlKSBwcmVzZXQgZm9yIHRoZSBzdHJlYW0uCiAgKgogICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKQEAgLTExMzYsNiArMTM0MCwzMiBAQAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIpCiAgICAgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAorLyoqCisgKiBTZXQgYXVkaW8gY2hhbm5lbCBtYXNrIGZvciB0aGUgc3RyZWFtLgorICoKKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgorICogSWYgYm90aCBjaGFubmVsIG1hc2sgYW5kIGNvdW50IGFyZSBub3Qgc2V0LCB0aGVuIHN0ZXJlbyB3aWxsIHRoZW4gYmUgY2hvc2VuIHdoZW4gdGhlCisgKiBzdHJlYW0gaXMgb3BlbmVkLgorICogQWZ0ZXIgb3BlbmluZyBhIHN0cmVhbSB3aXRoIGFuIHVuc3BlY2lmaWVkIHZhbHVlLCB0aGUgYXBwbGljYXRpb24gbXVzdCBxdWVyeSBmb3IgdGhlCisgKiBhY3R1YWwgdmFsdWUsIHdoaWNoIG1heSB2YXJ5IGJ5IGRldmljZS4KKyAqCisgKiBJZiBhbiBleGFjdCB2YWx1ZSBpcyBzcGVjaWZpZWQgdGhlbiBhbiBvcGVuZWQgc3RyZWFtIHdpbGwgdXNlIHRoYXQgdmFsdWUuCisgKiBJZiBhIHN0cmVhbSBjYW5ub3QgYmUgb3BlbmVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSB0aGVuIHRoZSBvcGVuIHdpbGwgZmFpbC4KKyAqCisgKiBBcyB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIGNvdW50IG9mIHByb3ZpZGVkIGNoYW5uZWwgbWFzayBoZXJlIG1heSBiZSBkaWZmZXJlbnQKKyAqIGZyb20gdGhlIGNoYW5uZWwgY291bnQgdXNlZCBpbiB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnR9IG9yCisgKiB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWV9LCB0aGUgbGFzdCBjYWxsZWQgZnVuY3Rpb24gd2lsbCBiZQorICogcmVzcGVjdGVkIGlmIHRoaXMgZnVuY3Rpb24gYW5kIHtAbGluayBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudH0gb3IKKyAqIHtAbGluayBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZX0gYXJlIGNhbGxlZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMyLgorICoKKyAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCisgKiBAcGFyYW0gY2hhbm5lbE1hc2sgQXVkaW8gY2hhbm5lbCBtYXNrIGRlc2lyZWQuCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxNYXNrKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgX19JTlRST0RVQ0VEX0lOKDMyKTsKKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBTdHJlYW0gQ29udHJvbAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xNjE2LDYgKzE4NDYsMzEgQEAKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCisgKiBSZXR1cm4gdGhlIHNwYXRpYWxpemF0aW9uIGJlaGF2aW9yIGZvciB0aGUgc3RyZWFtLgorICoKKyAqIElmIG5vbmUgd2FzIGV4cGxpY2l0bHkgc2V0LCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdAorICoge0BsaW5rICNBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfQVVUT30gYmVoYXZpb3IuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqCisgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQorICogQHJldHVybiBzcGF0aWFsaXphdGlvbiBiZWhhdmlvciwgZm9yIGV4YW1wbGUge0BsaW5rICNBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfQVVUT30KKyAqLworQUFVRElPX0FQSSBhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdCBBQXVkaW9TdHJlYW1fZ2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcigKKyAgICAgICAgQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigzMik7CisKKy8qKgorICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmVhbSBpcyBzcGF0aWFsaXplZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMyLgorICoKKyAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnQgaXMgc3BhdGlhbGl6ZWQKKyAqLworQUFVRElPX0FQSSBib29sIEFBdWRpb1N0cmVhbV9pc0NvbnRlbnRTcGF0aWFsaXplZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDMyKTsKKworCisvKioKICAqIFJldHVybiB0aGUgaW5wdXQgcHJlc2V0IGZvciB0aGUgc3RyZWFtLgogICoKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCkBAIC0xNjUyLDYgKzE5MDcsMTggQEAKIEFBVURJT19BUEkgYm9vbCBBQXVkaW9TdHJlYW1faXNQcml2YWN5U2Vuc2l0aXZlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogICAgICAgICBfX0lOVFJPRFVDRURfSU4oMzApOwogCisvKioKKyAqIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrIGZvciB0aGUgc3RyZWFtLiBUaGlzIHdpbGwgYmUgdGhlIG1hc2sgc2V0IHVzaW5nCisgKiB7QGxpbmsgI0FBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbE1hc2t9LCBvciB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0gb3RoZXJ3aXNlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzIuCisgKgorICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKKyAqIEByZXR1cm4gYWN0dWFsIGNoYW5uZWwgbWFzaworICovCitBQVVESU9fQVBJIGFhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbE1hc2soQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigzMik7CisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvVGVzdGluZy5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaAppbmRleCAwMmVjNDExLi4wZjJkN2EyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvVGVzdGluZy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW9UZXN0aW5nLmgKQEAgLTQ5LDYgKzQ5LDEyIEBACiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19wb2xpY3lfdDsKIAorLy8gSW50ZXJuYWwgZXJyb3IgY29kZXMuIE9ubHkgdXNlZCBieSB0aGUgZnJhbWV3b3JrLgorZW51bSB7CisgICAgQUFVRElPX0lOVEVSTkFMX0VSUk9SX0JBU0UgPSAtMTAwMCwKKyAgICBBQVVESU9fRVJST1JfU1RBTkRCWSwKK307CisKIC8qKgogICogQ29udHJvbCB3aGV0aGVyIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIHdpbGwgdXNlIHRoZSBuZXcgTU1BUCBkYXRhIHBhdGgKICAqIG9yIHRoZSBvbGRlciAiTGVnYWN5IiBkYXRhIHBhdGguCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9tZWFzdXJlX2RldmljZV9wb3dlci5weSBiL21lZGlhL2xpYmFhdWRpby9zY3JpcHRzL21lYXN1cmVfZGV2aWNlX3Bvd2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmOTA5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9tZWFzdXJlX2RldmljZV9wb3dlci5weQpAQCAtMCwwICsxLDI4OCBAQAorIyEvdXNyL2Jpbi9weXRob24zCisiIiIKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiCisKKycnJworTWVhc3VyZSBDUFUgcmVsYXRlZCBwb3dlciBvbiBQaXhlbCA2IG9yIGxhdGVyIGRldmljZXMgdXNpbmcgT0RQTSwKK3RoZSBPbiBEZXZpY2UgUG93ZXIgTWVhc3VyZW1lbnQgdG9vbC4KK0dlbmVyYXRlIGEgQ1NWIHJlcG9ydCBmb3IgcHV0dGluZyBpbiBhIHNwcmVhZHNoZWV0CisnJycKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKKyMgZGVmYXVsdHMKK1BSRV9ERUxBWV9TRUNPTkRTID0gMC41ICMgdGltZSB0byBzbGVlcCBiZWZvcmUgY29tbWFuZCB0byBhdm9pZCBhZGIgdW5yb290IGVycm9yCitERUZBVUxUX05VTV9JVEVSQVRJT05TID0gNQorREVGQVVMVF9GSUxFX05BTUUgPSAnZW5lcmd5X2NvbW1hbmRzLnR4dCcKKworJycnCitEZWZhdWx0IHJhaWwgYXNzaWdubWVudHMKK3BoaWxidXJrLW1hY2Jvb2twcm8zOmV4cHQgcGhpbGJ1cmskIGFkYiBzaGVsbCBjYXQgL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuZXJneV92YWx1ZQordD0zNDk4OTQKK0NIMChUPTM0OTg5NClbUzEwTV9WRERfVFBVXSwgNTU3ODc1NgorQ0gxKFQ9MzQ5ODk0KVtWU1lTX1BXUl9NT0RFTV0sIDI5MTEwOTQwCitDSDIoVD0zNDk4OTQpW1ZTWVNfUFdSX1JGRkVdLCAzMTY2MDQ2CitDSDMoVD0zNDk4OTQpW1MyTV9WRERfQ1BVQ0wyXSwgMzAyMDM1MDIKK0NINChUPTM0OTg5NClbUzNNX1ZERF9DUFVDTDFdLCAyMzM3NzUzMworQ0g1KFQ9MzQ5ODk0KVtTNE1fVkREX0NQVUNMMF0sIDQ2MzU2OTQyCitDSDYoVD0zNDk4OTQpW1M1TV9WRERfSU5UXSwgMTA3NzE4NzYKK0NINyhUPTM0OTg5NClbUzFNX1ZERF9NSUZdLCAyMTA5MTM2MworcGhpbGJ1cmstbWFjYm9va3BybzM6ZXhwdCBwaGlsYnVyayQgYWRiIHNoZWxsIGNhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTEvZW5lcmd5X3ZhbHVlCit0PTM1OTQ1OAorQ0gwKFQ9MzU5NDU4KVtWU1lTX1BXUl9XTEFOX0JUXSwgNDU5OTMyMDkKK0NIMShUPTM1OTQ1OClbTDJTX1ZERF9BT0NfUkVUXSwgMjgyMjkyOAorQ0gyKFQ9MzU5NDU4KVtTOVNfVkREX0FPQ10sIDY5MjM3MDYKK0NIMyhUPTM1OTQ1OClbUzVTX1ZERFFfTUVNXSwgNDY1ODIwMgorQ0g0KFQ9MzU5NDU4KVtTMTBTX1ZERDJMXSwgNTUwNjI3MworQ0g1KFQ9MzU5NDU4KVtTNFNfVkREMkhfTUVNXSwgMTQyNTQ1NzQKK0NINihUPTM1OTQ1OClbUzJTX1ZERF9HM0RdLCA1MzE1NDIwCitDSDcoVD0zNTk0NTgpW1ZTWVNfUFdSX0RJU1BMQVldLCA4MTIyMTY2NQorJycnCisKKycnJworTERPMk0oTDJNX0FMSVZFKTpERFIgIC0+IERSQU0gQXJyYXkgQ29yZSBQb3dlcgorQlVDSzRTKFM0U19WREQySF9NRU0pOkREUiAtPiBOb3JtYWwgb3BlcmF0aW9uIGRhdGEgYW5kIGNvbnRyb2wgcGF0aCBsb2dpYyBjaXJjdWl0cworQlVDSzVTKFM1U19WRERRX01FTSk6RERSIC0+IExQRERSIEkvTyBpbnRlcmZhY2UKK0JVQ0sxMFMoUzEwU19WREQyTCk6RERSICAtPiBEVkZTQyAoMTYwME1icHMgb3IgbG93ZXIpIG9wZXJhdGlvbiBkYXRhIGFuZCBjb250cm9sIHBhdGggbG9naWMgY2lyY3VpdHMKK0JVQ0sxTSAoUzFNX1ZERF9NSUYpOiAgU29DIHNpZGUgTWVtb3J5IEludGVyRmFjZSBhbmQgQ29udHJvbGxlcgorJycnCisKKyMgTWFwIGJldHdlZW4gcmFpbCBuYW1lIGFuZCBodW1hbiByZWFkYWJsZSBuYW1lLgorRU5FUkdZX0RJQ1RJT05BUlkgPSB7IFwKKyAgICAgICAgJ1M0TV9WRERfQ1BVQ0wwJzogJ0NQVTAnLCBcCisgICAgICAgICdTM01fVkREX0NQVUNMMSc6ICdDUFUxJywgXAorICAgICAgICAnUzJNX1ZERF9DUFVDTDInOiAnQ1BVMicsIFwKKyAgICAgICAgJ1MxTV9WRERfTUlGJzogJ01JRicsIFwKKyAgICAgICAgJ0wyTV9BTElWRSc6ICdERFJBQycsIFwKKyAgICAgICAgJ1M0U19WREQySF9NRU0nOiAnRERSTk8nLCBcCisgICAgICAgICdTMTBTX1ZERDJMJzogJ0REUjE2JywgXAorICAgICAgICAnUzVTX1ZERFFfTUVNJzogJ0REUklPJywgXAorICAgICAgICAnVlNZU19QV1JfRElTUExBWSc6ICdTQ1JFRU4nfQorCitTT1JURURfRU5FUkdZX0xJU1QgPSBzb3J0ZWQoRU5FUkdZX0RJQ1RJT05BUlksIGtleT1FTkVSR1lfRElDVElPTkFSWS5nZXQpCisKKyMgU29tZXRpbWVzIGFkYiByZXR1cm5zIDEgZm9yIG5vIGFwcGFyZW50IHJlYXNvbi4KKyMgU28gdHJ5IHNldmVyYWwgdGltZXMuCisjIEByZXR1cm4gMCBvbiBzdWNjZXNzCitkZWYgYWRiVHJ5TXVsdGlwbGUoY29tbWFuZCk6CisgICAgcmV0dXJuQ29kZSA9IDEKKyAgICBjb3VudCA9IDAKKyAgICBsaW1pdCA9IDUKKyAgICB3aGlsZSBjb3VudCA8IGxpbWl0IGFuZCByZXR1cm5Db2RlICE9IDA6CisgICAgICAgIHByaW50KCgnVHJ5IHRvIGFkYiB7fSB7fSBvZiB7fScuZm9ybWF0KGNvbW1hbmQsIGNvdW50LCBsaW1pdCkpKQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoWyJhZGIiLCAid2FpdC1mb3ItZGV2aWNlIl0pCisgICAgICAgIHRpbWUuc2xlZXAoUFJFX0RFTEFZX1NFQ09ORFMpCisgICAgICAgIHJldHVybkNvZGUgPSBzdWJwcm9jZXNzLmNhbGwoWyJhZGIiLCBjb21tYW5kXSkKKyAgICAgICAgcHJpbnQoKCdyZXR1cm5Db2RlID0ge30nLmZvcm1hdChyZXR1cm5Db2RlKSkpCisgICAgICAgIGNvdW50ICs9IDEKKyAgICByZXR1cm4gcmV0dXJuQ29kZQorCisjIFNvbWV0aW1lcyAiYWRiIHJvb3QiIHJldHVybnMgMSEKKyMgU28gdHJ5IHNldmVyYWwgdGltZXMuCisjIEByZXR1cm4gMCBvbiBzdWNjZXNzCitkZWYgYWRiUm9vdCgpOgorICAgIHJldHVybiBhZGJUcnlNdWx0aXBsZSgicm9vdCIpOworCisjIFNvbWV0aW1lcyAiYWRiIHVucm9vdCIgcmV0dXJucyAxIQorIyBTbyB0cnkgc2V2ZXJhbCB0aW1lcy4KKyMgQHJldHVybiAwIG9uIHN1Y2Nlc3MKK2RlZiBhZGJVbnJvb3QoKToKKyAgICByZXR1cm4gYWRiVHJ5TXVsdGlwbGUoInVucm9vdCIpOworCisjIEBwYXJhbSBjb21tYW5kU3RyaW5nIFN0cmluZyBjb250YWluaW5nIHNoZWxsIGNvbW1hbmQKKyMgQHJldHVybiBCb3RoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBvZiB0aGUgY29tbWFuZHMgcnVuCitkZWYgcnVuQ29tbWFuZChjb21tYW5kU3RyaW5nKToKKyAgICBwcmludChjb21tYW5kU3RyaW5nKQorICAgIGlmIGNvbW1hbmRTdHJpbmcgPT0gImFkYiB1bnJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJVbnJvb3QoKQorICAgIGVsaWYgY29tbWFuZFN0cmluZyA9PSAiYWRiIHJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJSb290KCkKKyAgICBlbHNlOgorICAgICAgICBjb21tYW5kQXJyYXkgPSBjb21tYW5kU3RyaW5nLnNwbGl0KCcgJykKKyAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oY29tbWFuZEFycmF5LCBjaGVjaz1UcnVlLCBjYXB0dXJlX291dHB1dD1UcnVlKS5zdGRvdXQKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgQHBhcmFtIGNvbW1hbmRTdHJpbmcgU3RyaW5nIGNvbnRhaW5pbmcgQURCIGNvbW1hbmQKKyMgQHJldHVybiBCb3RoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBvZiB0aGUgY29tbWFuZHMgcnVuCitkZWYgYWRiQ29tbWFuZChjb21tYW5kU3RyaW5nKToKKyAgICBpZiBjb21tYW5kU3RyaW5nID09ICJ1bnJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJVbnJvb3QoKQorICAgIGVsaWYgY29tbWFuZFN0cmluZyA9PSAicm9vdCI6CisgICAgICAgIHJlc3VsdCA9IGFkYlJvb3QoKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCgiYWRiICIgKyBjb21tYW5kU3RyaW5nKSkKKyAgICAgICAgY29tbWFuZEFycmF5ID0gWyJhZGIiXSArIGNvbW1hbmRTdHJpbmcuc3BsaXQoJyAnKQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoWyJhZGIiLCAid2FpdC1mb3ItZGV2aWNlIl0pCisgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGNvbW1hbmRBcnJheSwgY2hlY2s9VHJ1ZSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSkuc3Rkb3V0CisgICAgcmV0dXJuIHJlc3VsdAorCisjIFBhcnNlIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgIkNIMyhUPTEwNjk3NjM1KVtTMk1fVkREX0NQVUNMMl0sIDExNjY1NTMzNSIKKyMgVXNlIFMyTV9WRERfQ1BVQ0wyIGFzIHRoZSB0YWcgYW5kIHNldCB2YWx1ZSB0byB0aGUgbnVtYmVyCisjIGluIHRoZSByZXBvcnQgZGljdGlvbmFyeS4KK2RlZiBwYXJzZUVuZXJneVZhbHVlKHN0cmluZyk6CisgICAgcmV0dXJuIHR1cGxlKHJlLnNwbGl0KCdcW3xcXSwgKycsIHN0cmluZylbMTpdKQorCisjIFJlYWQgYWNjdW11bGF0ZWQgZW5lcmd5IGludG8gYSBkaWN0aW9uYXJ5LgorZGVmIG1lYXN1cmVFbmVyZ3lGb3JEZXZpY2UoZGV2aWNlSW5kZXgsIHJlcG9ydCk6CisgICAgIyBwcmludCgibWVhc3VyZUVuZXJneUZvckRldmljZSAiICsgc3RyKGRldmljZUluZGV4KSkKKyAgICB0YWJsZUJ5dGVzID0gYWRiQ29tbWFuZCggXAorICAgICAgICAgICAgJ3NoZWxsIGNhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZXt9L2VuZXJneV92YWx1ZSdcCisgICAgICAgICAgICAuZm9ybWF0KGRldmljZUluZGV4KSkKKyAgICB0YWJsZSA9IHRhYmxlQnl0ZXMuZGVjb2RlKCJ1dGYtOCIpCisgICAgIyBwcmludCh0YWJsZSkKKyAgICBmb3IgY291bnQsIGxpbmUgaW4gZW51bWVyYXRlKHRhYmxlLnNwbGl0bGluZXMoKSk6CisgICAgICAgIGlmIGNvdW50ID4gMDoKKyAgICAgICAgICAgIHRhZ0VuZXJneSA9IHBhcnNlRW5lcmd5VmFsdWUobGluZSkKKyAgICAgICAgICAgIHJlcG9ydFt0YWdFbmVyZ3lbMF1dID0gaW50KHRhZ0VuZXJneVsxXS5zdHJpcCgpKQorICAgICMgcHJpbnQocmVwb3J0KQorCitkZWYgbWVhc3VyZUVuZXJneU9uY2UoKToKKyAgICBhZGJDb21tYW5kKCJyb290IikKKyAgICByZXBvcnQgPSB7fQorICAgIGQwID0gbWVhc3VyZUVuZXJneUZvckRldmljZSgwLCByZXBvcnQpCisgICAgZDEgPSBtZWFzdXJlRW5lcmd5Rm9yRGV2aWNlKDEsIHJlcG9ydCkKKyAgICBhZGJVbnJvb3QoKQorICAgIHJldHVybiByZXBvcnQKKworIyBTdWJ0cmFjdCBudW1lcmljIHZhbHVlcyBmb3IgbWF0Y2hpbmcga2V5cy4KK2RlZiBzdWJ0cmFjdFJlcG9ydHMoQSwgQik6CisgICAgcmV0dXJuIHt4OiBBW3hdIC0gQlt4XSBmb3IgeCBpbiBBIGlmIHggaW4gQn0KKworIyBBZGQgbnVtZXJpYyB2YWx1ZXMgZm9yIG1hdGNoaW5nIGtleXMuCitkZWYgYWRkUmVwb3J0cyhBLCBCKToKKyAgICByZXR1cm4ge3g6IEFbeF0gKyBCW3hdIGZvciB4IGluIEEgaWYgeCBpbiBCfQorCisjIERpdmlkZSBudW1lcmljIHZhbHVlcyBieSBkaXZpc29yLgorIyBAcmV0dXJuIE1vZGlmaWVkIGNvcHkgb2YgcmVwb3J0LgorZGVmIGRpdmlkZVJlcG9ydChyZXBvcnQsIGRpdmlzb3IpOgorICAgIHJldHVybiB7a2V5OiB2YWwgLyBkaXZpc29yIGZvciBrZXksIHZhbCBpbiBsaXN0KHJlcG9ydC5pdGVtcygpKX0KKworIyBHZW5lcmF0ZSBhIGRpY3Rpb25hcnkgdGhhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBtZWFzdXJlbWVudHMgb3ZlciB0aW1lLgorZGVmIG1lYXN1cmVFbmVyZ3lPdmVyVGltZShkdXJhdGlvbik6CisgICAgcmVwb3J0MSA9IG1lYXN1cmVFbmVyZ3lPbmNlKCkKKyAgICBwcmludCgoIk1lYXN1cmUgZW5lcmd5IGZvciAiICsgc3RyKGR1cmF0aW9uKSArICIgc2Vjb25kcy4iKSkKKyAgICB0aW1lLnNsZWVwKGR1cmF0aW9uKQorICAgIHJlcG9ydDIgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgcmV0dXJuIHN1YnRyYWN0UmVwb3J0cyhyZXBvcnQyLCByZXBvcnQxKQorCisjIEdlbmVyYXRlIGEgQ1NWIHN0cmluZyBjb250YWluaW5nIHRoZSBodW1hbiByZWFkYWJsZSBoZWFkZXJzLgorZGVmIGZvcm1hdEVuZXJneUhlYWRlcigpOgorICAgIGhlYWRlciA9ICIiCisgICAgZm9yIHRhZyBpbiBTT1JURURfRU5FUkdZX0xJU1Q6CisgICAgICAgIGhlYWRlciArPSBFTkVSR1lfRElDVElPTkFSWVt0YWddICsgIiwgIgorICAgIHJldHVybiBoZWFkZXIKKworIyBHZW5lcmF0ZSBhIENTViBzdHJpbmcgY29udGFpbmluZyB0aGUgbnVtZXJpYyB2YWx1ZXMuCitkZWYgZm9ybWF0RW5lcmd5RGF0YShyZXBvcnQpOgorICAgIGRhdGEgPSAiIgorICAgIGZvciB0YWcgaW4gU09SVEVEX0VORVJHWV9MSVNUOgorICAgICAgICBpZiB0YWcgaW4gbGlzdChyZXBvcnQua2V5cygpKToKKyAgICAgICAgICAgIGRhdGEgKz0gc3RyKHJlcG9ydFt0YWddKSArICIsICIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgKz0gIi0xLCIKKyAgICByZXR1cm4gZGF0YQorCitkZWYgcHJpbnRFbmVyZ3lSZXBvcnQocmVwb3J0KToKKyAgICBzID0gIlxuIgorICAgIHMgKz0gIlZhbHVlcyBhcmUgaW4gbWljcm9XYXR0U2Vjb25kc1xuIgorICAgIHMgKz0gIlJlcG9ydCBiZWxvdyBpcyBDU1YgZm9ybWF0IGZvciBwYXN0aW5nIGludG8gYSBzcHJlYWRzaGVldDpcbiIKKyAgICBzICs9IGZvcm1hdEVuZXJneUhlYWRlcigpICsgIlxuIgorICAgIHMgKz0gZm9ybWF0RW5lcmd5RGF0YShyZXBvcnQpICsgIlxuIgorICAgIHByaW50KHMpCisKKyMgR2VuZXJhdGUgYSBkaWN0aW9uYXJ5IHRoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbWVhc3VyZW1lbnRzCisjIGJlZm9yZSBhbmQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBjb21tYW5kLgorZGVmIG1lYXN1cmVFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQpOgorICAgIHJlcG9ydDEgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgcHJpbnQoKCJNZWFzdXJlIGVuZXJneSBmb3I6ICAiICsgY29tbWFuZCkpCisgICAgcmVzdWx0ID0gcnVuQ29tbWFuZChjb21tYW5kKQorICAgIHJlcG9ydDIgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgIyBwcmludChyZXN1bHQpCisgICAgcmV0dXJuIHN1YnRyYWN0UmVwb3J0cyhyZXBvcnQyLCByZXBvcnQxKQorCisjIEF2ZXJhZ2UgdGhlIHJlc3VsdHMgb2Ygc2V2ZXJhbCBtZWFzdXJlbWVudHMgZm9yIG9uZSBjb21tYW5kLgorZGVmIGF2ZXJhZ2VFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQsIGNvdW50KToKKyAgICBwcmludCgiPT09PT09PT09PT09PT09PT09PSAjMFxuIikKKyAgICBzdW1SZXBvcnQgPSBtZWFzdXJlRW5lcmd5Rm9yQ29tbWFuZChjb21tYW5kKQorICAgIGZvciBpIGluIHJhbmdlKDEsIGNvdW50KToKKyAgICAgICAgcHJpbnQoKCI9PT09PT09PT09PT09PT09PT09ICMiICsgc3RyKGkpICsgIlxuIikpCisgICAgICAgIHJlcG9ydCA9IG1lYXN1cmVFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQpCisgICAgICAgIHN1bVJlcG9ydCA9IGFkZFJlcG9ydHMoc3VtUmVwb3J0LCByZXBvcnQpCisgICAgcHJpbnQoc3VtUmVwb3J0KQorICAgIHJldHVybiBkaXZpZGVSZXBvcnQoc3VtUmVwb3J0LCBjb3VudCkKKworIyBQYXJzZSBhIGxpc3Qgb2YgY29tbWFuZHMgaW4gYSBmaWxlLgorIyBMaW5lcyBlbmRpbmcgaW4gIlwiIGFyZSBjb250aW51YXRpb24gbGluZXMuCisjIExpbmVzIGJlZ2lubmluZyB3aXRoICIjIiBhcmUgY29tbWVudHMuCitkZWYgbWVhc3VyZUVuZXJneUZvckNvbW1hbmRzKGZpbGVOYW1lKToKKyAgICBmaW5hbFJlcG9ydCA9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICBmaW5hbFJlcG9ydCArPSAiY29tbWVudCwgY29tbWFuZCwgIiArIGZvcm1hdEVuZXJneUhlYWRlcigpICsgIlxuIgorICAgIGNvbW1lbnQgPSAiIgorICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKGZpbGVOYW1lKQorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICB3aGlsZSBsaW5lOgorICAgICAgICAgICAgY29tbWFuZCA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgaWYgY29tbWFuZC5zdGFydHN3aXRoKCIjIik6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudAorICAgICAgICAgICAgICAgIHByaW50KChjb21tYW5kICsgIlxuIikpCisgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1hbmRbMTpdLnN0cmlwKCkgIyByZW1vdmUgbGVhZGluZyAnIycKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZC5lbmRzd2l0aCgnXFwnKToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZFs6LTFdLnN0cmlwKCkgIyByZW1vdmUgdHJhaWxpbmcgJ1wnCisgICAgICAgICAgICAgICAgcnVuQ29tbWFuZChjb21tYW5kKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kOgorICAgICAgICAgICAgICAgIHJlcG9ydCA9IGF2ZXJhZ2VFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQsIERFRkFVTFRfTlVNX0lURVJBVElPTlMpCisgICAgICAgICAgICAgICAgZmluYWxSZXBvcnQgKz0gY29tbWVudCArICIsICIgKyBjb21tYW5kICsgIiwgIiArIGZvcm1hdEVuZXJneURhdGEocmVwb3J0KSArICJcbiIKKyAgICAgICAgICAgICAgICBwcmludChmaW5hbFJlcG9ydCkKKyAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgZmluYWxseToKKyAgICAgICAgZnAuY2xvc2UoKQorICAgIHJldHVybiBmaW5hbFJlcG9ydAorCitkZWYgbWFpbigpOgorICAgICMgcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3MKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zZWNvbmRzJywKKyAgICAgICAgICAgIGhlbHA9Ik1lYXN1cmUgcG93ZXIgZm9yIE4gc2Vjb25kcy4gSWdub3JlIHNjcmlwdEZpbGUuIiwKKyAgICAgICAgICAgIHR5cGU9ZmxvYXQpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiZmlsZU5hbWUiLAorICAgICAgICAgICAgbmFyZ3MgPSAnPycsCisgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIGZpbGUgY29udGFpbmluZyBjb21tYW5kcyB0byBiZSBtZWFzdXJlZC4iCisgICAgICAgICAgICAgICAgICAgICsgIiBEZWZhdWx0IHBhdGggPSAiICsgREVGQVVMVF9GSUxFX05BTUUgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIExpbmVzIGVuZGluZyBpbiAnXCcgYXJlIGNvbnRpbnVhdGlvbiBsaW5lcy4iCisgICAgICAgICAgICAgICAgICAgICsgIiBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLiIsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9REVGQVVMVF9GSUxFX05BTUUpCisgICAgYXJncz1wYXJzZXIucGFyc2VfYXJncygpOworCisgICAgcHJpbnQoKCJzZWNvbmRzICA9ICIgKyBzdHIoYXJncy5zZWNvbmRzKSkpCisgICAgcHJpbnQoKCJmaWxlTmFtZSA9ICIgKyBzdHIoYXJncy5maWxlTmFtZSkpKQorICAgICMgUHJvY2VzcyBjb21tYW5kIGxpbmUKKyAgICBpZiBhcmdzLnNlY29uZHM6CisgICAgICAgIHJlcG9ydCA9IG1lYXN1cmVFbmVyZ3lPdmVyVGltZShhcmdzLnNlY29uZHMpCisgICAgICAgIHByaW50RW5lcmd5UmVwb3J0KHJlcG9ydCkKKyAgICBlbHNlOgorICAgICAgICByZXBvcnQgPSBtZWFzdXJlRW5lcmd5Rm9yQ29tbWFuZHMoYXJncy5maWxlTmFtZSkKKyAgICAgICAgcHJpbnQocmVwb3J0KQorICAgIHByaW50KCJGaW5pc2hlZC5cbiIpCisgICAgcmV0dXJuIDAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zZXR1cF9vZHBtX2NwdV9yYWlscy5zaCBiL21lZGlhL2xpYmFhdWRpby9zY3JpcHRzL3NldHVwX29kcG1fY3B1X3JhaWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5MjQxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zZXR1cF9vZHBtX2NwdV9yYWlscy5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCisjIENvbmZpZ3VyZSBPRFBNIHJhaWxzIHRvIG1lYXN1cmUgQ1BVIHNwZWNpZmljIHBvd2VyLgorIyBTZWUgZ28vb2RwbS1wMjEtdXNlcmd1aWRlCisKK2FkYiByb290CisKKyMgTERPMk0oTDJNX0FMSVZFKSAtIERSQU0gQXJyYXkgQ29yZSBQb3dlcgorYWRiIHNoZWxsICdlY2hvICJDSDA9TERPMk0iID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuYWJsZWRfcmFpbHMnCisKKyMgVGhlc2UgYXJlIHRoZSBkZWZhdWx0cy4KKyMgQlVDSzJNKFMyTV9WRERfQ1BVQ0wyKTpDUFUoQklHKQorIyBhZGIgc2hlbGwgJ2VjaG8gIkNIMz1CVUNLMk0iID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0szTShTM01fVkREX0NQVUNMMSk6Q1BVKE1JRCkKKyMgYWRiIHNoZWxsICdlY2hvICJDSDQ9QlVDSzNNIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmFibGVkX3JhaWxzJworIyBCVUNLNE0oUzRNX1ZERF9DUFVDTDApOkNQVShMSVRUTEUpCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g1PUJVQ0s0TSIgPiAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTAvZW5hYmxlZF9yYWlscycKKyMgQlVDSzFNKFMxTV9WRERfTUlGKTpNSUYKKyMgYWRiIHNoZWxsICdlY2hvICJDSDc9QlVDSzFNIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmFibGVkX3JhaWxzJworCisjIFRoZXNlIGFyZSBkZWZhdWx0IG9uIGRldmljZTEuCisjIEJVQ0s1UyhTNVNfVkREUV9NRU0pOkREUgorIyBhZGIgc2hlbGwgJ2VjaG8gIkNIMz1CVUNLNVMiID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UxL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0sxMFMoUzEwU19WREQyTCk6RERSCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g0PUJVQ0sxMFMiID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UxL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0s0UyhTNFNfVkREMkhfTUVNKTpERFIKKyMgYWRiIHNoZWxsICdlY2hvICJDSDU9QlVDSzRTIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMS9lbmFibGVkX3JhaWxzJworCithZGIgc2hlbGwgJ2NhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTAvZW5hYmxlZF9yYWlscycKK2FkYiBzaGVsbCAnY2F0IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMS9lbmFibGVkX3JhaWxzJworCithZGIgdW5yb290CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zY3JpcHRzL3N5bnRobWFya190ZXN0cy50eHQgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zeW50aG1hcmtfdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmQ0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zeW50aG1hcmtfdGVzdHMudHh0CkBAIC0wLDAgKzEsNTAgQEAKKyMgTWVhc3VyZSBlbmVyZ3kgY29uc3VtcHRpb24gd2l0aCBzeW50aG1hcmsuCisKKyMgTm9uZQorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MAorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MAorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejAKKworIyBBRFBGIFBJRAorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MQorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MQorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejEKKworIyBBRFBGIDw0MDAgUlIKKyMgYWRiIHJvb3QgXAorIyBhZGIgc2hlbGwgc2V0cHJvcCB2ZW5kb3IucG93ZXJoYWwuYWRwZi51Y2xhbXBfbWluLmhpZ2hfbGltaXQgNDAwIFwKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXoxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjEwMCAtQjIgLXoxCisKKyMgQURQRiA8NTAwIFJSCisjIGFkYiByb290IFwKKyMgYWRiIHNoZWxsIHNldHByb3AgdmVuZG9yLnBvd2VyaGFsLmFkcGYudWNsYW1wX21pbi5oaWdoX2xpbWl0IDUwMCBcCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjUwIC1CMiAtejEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU4xMDAgLUIyIC16MQorCisjIEFEUEYgPDYwMCBSUgorIyBhZGIgcm9vdCBcCisjIGFkYiBzaGVsbCBzZXRwcm9wIHZlbmRvci5wb3dlcmhhbC5hZHBmLnVjbGFtcF9taW4uaGlnaF9saW1pdCA2MDAgXAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU41MCAtQjIgLXoxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjc1IC1CMiAtejEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejEKKworIyB1Y2xhbXAKKyMgYWRiIHJvb3QgXAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUxCisKKyMgc3RlYWR5CisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uNzUgLUIyIC11MAorCisjIENQVSBhZmZpbml0eQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUwIC1jMQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUwIC1jNAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUwIC1jNgorCisjIHN0ZWFkeSArIGFmZmluaXR5CisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uNzUgLUIyIC11MCAtYzEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW43NSAtQjIgLXUwIC1jNAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjc1IC1CMiAtdTAgLWM2CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAppbmRleCAzM2E1YzdmLi4zNjNkMjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC03LDYgKzcsNjUgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK3RpZHlfZXJyb3JzID0gWworICAgIC8vIGh0dHBzOi8vY2xhbmcubGx2bS5vcmcvZXh0cmEvY2xhbmctdGlkeS9jaGVja3MvbGlzdC5odG1sCisgICAgLy8gRm9yIG1hbnkgY2F0ZWdvcmllcywgdGhlIGNoZWNrcyBhcmUgdG9vIG1hbnkgdG8gc3BlY2lmeSBpbmRpdmlkdWFsbHkuCisgICAgLy8gRmVlbCBmcmVlIHRvIGRpc2FibGUgYXMgbmVlZGVkIC0gYXMgd2FybmluZ3MgYXJlIGdlbmVyYWxseSBpZ25vcmVkLAorICAgIC8vIHdlIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycy4KKyAgICAiYW5kcm9pZC0qIiwKKyAgICAiYnVncHJvbmUtKiIsCisgICAgImNlcnQtKiIsCisgICAgImNsYW5nLWFuYWx5emVyLXNlY3VyaXR5KiIsCisgICAgImdvb2dsZS0qIiwKKyAgICAibWlzYy0qIiwKKyAgICAvLyJtb2Rlcm5pemUtKiIsICAvLyBleHBsaWNpdGx5IGxpc3QgdGhlIG1vZGVybml6ZSBhcyB0aGV5IGNhbiBiZSBzdWJqZWN0aXZlLgorICAgICJtb2Rlcm5pemUtYXZvaWQtYmluZCIsCisgICAgLy8ibW9kZXJuaXplLWF2b2lkLWMtYXJyYXlzIiwgLy8gc3RkOjphcnJheTw+IGNhbiBiZSB2ZXJib3NlCisgICAgIm1vZGVybml6ZS1jb25jYXQtbmVzdGVkLW5hbWVzcGFjZXMiLAorICAgIC8vIm1vZGVybml6ZS1kZXByZWNhdGVkLWhlYWRlcnMiLCAvLyBDIGhlYWRlcnMgc3RpbGwgb2sgZXZlbiBpZiB0aGVyZSBpcyBDKysgZXF1aXZhbGVudC4KKyAgICAibW9kZXJuaXplLWRlcHJlY2F0ZWQtaW9zLWJhc2UtYWxpYXNlcyIsCisgICAgIm1vZGVybml6ZS1sb29wLWNvbnZlcnQiLAorICAgICJtb2Rlcm5pemUtbWFrZS1zaGFyZWQiLAorICAgICJtb2Rlcm5pemUtbWFrZS11bmlxdWUiLAorICAgICJtb2Rlcm5pemUtcGFzcy1ieS12YWx1ZSIsCisgICAgIm1vZGVybml6ZS1yYXctc3RyaW5nLWxpdGVyYWwiLAorICAgICJtb2Rlcm5pemUtcmVkdW5kYW50LXZvaWQtYXJnIiwKKyAgICAibW9kZXJuaXplLXJlcGxhY2UtYXV0by1wdHIiLAorICAgICJtb2Rlcm5pemUtcmVwbGFjZS1yYW5kb20tc2h1ZmZsZSIsCisgICAgIm1vZGVybml6ZS1yZXR1cm4tYnJhY2VkLWluaXQtbGlzdCIsCisgICAgIm1vZGVybml6ZS1zaHJpbmstdG8tZml0IiwKKyAgICAibW9kZXJuaXplLXVuYXJ5LXN0YXRpYy1hc3NlcnQiLAorICAgIC8vICJtb2Rlcm5pemUtdXNlLWF1dG8iLCAvLyBmb3VuZCBpbiBBQXVkaW9BdWRpby5jcHAKKyAgICAibW9kZXJuaXplLXVzZS1ib29sLWxpdGVyYWxzIiwKKyAgICAibW9kZXJuaXplLXVzZS1kZWZhdWx0LW1lbWJlci1pbml0IiwKKyAgICAibW9kZXJuaXplLXVzZS1lbXBsYWNlIiwKKyAgICAibW9kZXJuaXplLXVzZS1lcXVhbHMtZGVmYXVsdCIsCisgICAgIm1vZGVybml6ZS11c2UtZXF1YWxzLWRlbGV0ZSIsCisgICAgLy8gIm1vZGVybml6ZS11c2Utbm9kaXNjYXJkIiwgLy8gZm91bmQgaW4gYWlkbCBnZW5lcmF0ZWQgZmlsZXMKKyAgICAibW9kZXJuaXplLXVzZS1ub2V4Y2VwdCIsCisgICAgIm1vZGVybml6ZS11c2UtbnVsbHB0ciIsCisgICAgLy8gIm1vZGVybml6ZS11c2Utb3ZlcnJpZGUiLCAvLyBmb3VuZCBpbiBhaWRsIGdlbmVyYXRlZCBmaWxlcworICAgIC8vICJtb2Rlcm5pemUtdXNlLXRyYWlsaW5nLXJldHVybi10eXBlIiwgLy8gbm90IG5lY2Vzc2FyaWx5IG1vcmUgcmVhZGFibGUKKyAgICAibW9kZXJuaXplLXVzZS10cmFuc3BhcmVudC1mdW5jdG9ycyIsCisgICAgIm1vZGVybml6ZS11c2UtdW5jYXVnaHQtZXhjZXB0aW9ucyIsCisgICAgLy8gIm1vZGVybml6ZS11c2UtdXNpbmciLCAvLyBmb3VuZCB0eXBlZGVmIGluIHNldmVyYWwgZmlsZXMKKyAgICAicGVyZm9ybWFuY2UtKiIsCisKKyAgICAvLyBSZW1vdmUgc29tZSBwZWRhbnRpYyBzdHlsaXN0aWMgcmVxdWlyZW1lbnRzLgorICAgICItYW5kcm9pZC1jbG9leGVjLWR1cCIsIC8vIGZvdW5kIGluIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCisgICAgIi1idWdwcm9uZS1tYWNyby1wYXJlbnRoZXNlcyIsIC8vIGZvdW5kIGluIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorICAgICItYnVncHJvbmUtbmFycm93aW5nLWNvbnZlcnNpb25zIiwgLy8gZm91bmQgaW4gc2V2ZXJhbCBpbnRlcmZhY2UgZnJvbSBzaXplX3QgdG8gaW50MzJfdAorCisgICAgIi1nb29nbGUtcmVhZGFiaWxpdHktY2FzdGluZyIsIC8vIEMrKyBjYXN0cyBub3QgYWx3YXlzIG5lY2Vzc2FyeSBhbmQgbWF5IGJlIHZlcmJvc2UKKyAgICAiLWdvb2dsZS1yZWFkYWJpbGl0eS10b2RvIiwgLy8gZG8gbm90IHJlcXVpcmUgVE9ETyhpbmZvKQorICAgICItZ29vZ2xlLWJ1aWxkLXVzaW5nLW5hbWVzcGFjZSIsIC8vIFJlZW5hYmxlIGFuZCBmaXggbGF0ZXIuCisgICAgIi1nb29nbGUtZ2xvYmFsLW5hbWVzLWluLWhlYWRlcnMiLCAvLyBmb3VuZCBpbiBzZXZlcmFsIGZpbGVzCisKKyAgICAiLW1pc2Mtbm9uLXByaXZhdGUtbWVtYmVyLXZhcmlhYmxlcy1pbi1jbGFzc2VzIiwgLy8gZm91bmQgaW4gYWlkbCBnZW5lcmF0ZWQgZmlsZXMKKworICAgICItcGVyZm9ybWFuY2Utbm8taW50LXRvLXB0ciIsIC8vIGZvdW5kIGluIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorXQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWF1ZGlvIiwKIApAQCAtMzQsNyArOTMsNiBAQAogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAotCiAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFsbCBzeW1ib2xzIGFyZSBoaWRkZW4uCiAgICAgICAgIC8vICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgLy8gQUFVRElPX0FQSSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IGEgZnVuY3Rpb24gb3IgYSB2YXJpYWJsZSBhcyBhIHZpc2libGUgc3ltYm9sLgpAQCAtNTIsNyArMTEwLDcgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlicGVybWlzc2lvbiIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC02NCw2ICsxMjIsMTMgQEAKICAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCiAgICAgICAgIHZlcnNpb25zOiBbIjI4Il0sCiAgICAgfSwKKworICAgIHRpZHk6IHRydWUsCisgICAgdGlkeV9jaGVja3M6IHRpZHlfZXJyb3JzLAorICAgIHRpZHlfY2hlY2tzX2FzX2Vycm9yczogdGlkeV9lcnJvcnMsCisgICAgdGlkeV9mbGFnczogWworICAgICAgICAiLWZvcm1hdC1zdHlsZT1maWxlIiwKKyAgICBdCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMTAyLDYgKzE2Nyw4IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAogICAgIF0sCiAKQEAgLTEzOSwxMCArMjA2LDE2IEBACiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAotICAgICAgICAiZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0NoYW5uZWxDb3VudENvbnZlcnRlci5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTW9ub0JsZW5kLmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9NdWx0aVRvTW9ub0NvbnZlcnRlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NhbXBsZVJhdGVDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9TaW5rRmxvYXQuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9TaW5rSTE2LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU2lua0kyNC5jcHAiLApAQCAtMTUxLDExICsyMjQsMjYgQEAKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMzIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvSW50ZWdlclJhdGlvLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL0xpbmVhclJlc2FtcGxlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL3Jlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAiLAogICAgIF0sCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCiAgICAgfSwKKworICAgIHRpZHk6IHRydWUsCisgICAgdGlkeV9jaGVja3M6IHRpZHlfZXJyb3JzLAorICAgIHRpZHlfY2hlY2tzX2FzX2Vycm9yczogdGlkeV9lcnJvcnMsCisgICAgdGlkeV9mbGFnczogWworICAgICAgICAiLWZvcm1hdC1zdHlsZT1maWxlIiwKKyAgICBdCiB9CiAKIGFpZGxfaW50ZXJmYWNlIHsKQEAgLTE3MiwxOSArMjYwLDE1IEBACiAgICAgICAgICJiaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCiAgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbCIsCi0gICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIgorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbCIsCiAgICAgXSwKICAgICBiYWNrZW5kOgogICAgIHsKLSAgICAgICAgY3BwOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgICAgICB9LAogICAgICAgICBqYXZhOiB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGhhdmUgYXVkaW9fY29tbW9uLWFpZGwgYXZhaWxhYmxlIGluIEphdmEgdG8gZW5hYmxlCi0gICAgICAgICAgICAvLyAgICAgICB0aGlzLgotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgICAgICBzZGtfdmVyc2lvbjogIm1vZHVsZV9jdXJyZW50IiwKICAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwCmluZGV4IDZlM2ExYzguLjQyZDgxY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5jcHAKQEAgLTEyNCw0ICsxMjQsMTYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6ZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmZW5kcG9pbnRPdXQpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIEVuZHBvaW50IGVuZHBvaW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPmV4aXRTdGFuZGJ5KHN0cmVhbUhhbmRsZSwgJmVuZHBvaW50LCAmcmVzdWx0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoc3RhdHVzKSk7CisgICAgfQorICAgIGVuZHBvaW50T3V0ID0gc3RkOjptb3ZlKGVuZHBvaW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYWF1ZGlvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaAppbmRleCA1ZTlhYjU3Li5kMTcwNzgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmgKQEAgLTU3LDYgKzU3LDkgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOworCiBwcml2YXRlOgogICAgIElBQXVkaW9TZXJ2aWNlKiBjb25zdCBtRGVsZWdhdGU7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAppbmRleCBmYTVhMmRhLi44ZTVmYWNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcApAQCAtMzYsMTMgKzM2LDEwIEBACiB1c2luZyBhbmRyb2lkOjpJU2VydmljZU1hbmFnZXI7CiB1c2luZyBhbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXI7CiB1c2luZyBhbmRyb2lkOjppbnRlcmZhY2VfY2FzdDsKLXVzaW5nIGFuZHJvaWQ6OklJbnRlcmZhY2U7CiB1c2luZyBhbmRyb2lkOjpNdXRleDsKIHVzaW5nIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTsKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjp3cDsKLXVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCkBAIC05Myw3ICs5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gbGlua1RvRGVhdGgoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUFBdWRpb1NlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgICAgICAgICAgbUFkYXB0ZXIucmVzZXQobmV3IEFkYXB0ZXIoYWF1ZGlvU2VydmljZSwgbUFBdWRpb0NsaWVudCkpOworICAgICAgICAgICAgICAgIG1BZGFwdGVyID0gc3RkOjptYWtlX3NoYXJlZDxBZGFwdGVyPihhYXVkaW9TZXJ2aWNlLCBtQUF1ZGlvQ2xpZW50KTsKICAgICAgICAgICAgICAgICBuZWVkVG9SZWdpc3RlciA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGNhbGxiYWNrcyBjYW4gYmUgcmVjZWl2ZWQgYnkgbUFBdWRpb0NsaWVudAogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKQEAgLTIwNCwzICsyMDEsMTEgQEAKIAogICAgIHJldHVybiBzZXJ2aWNlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCk7CiB9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmV4aXRTdGFuZGJ5KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmZW5kcG9pbnRPdXQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisKKyAgICByZXR1cm4gc2VydmljZS0+ZXhpdFN0YW5kYnkoc3RyZWFtSGFuZGxlLCBlbmRwb2ludE91dCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKaW5kZXggNmE3YjYzOS4uMDk2OGY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaApAQCAtMTA4LDcgKzEwOCwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAotICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50T3V0KSBvdmVycmlkZTsKKworICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IC8qaGFuZGxlKi8sIGludDMyX3QgLypvcGNvZGUqLywgaW50MzJfdCAvKnZhbHVlKi8pIHsKICAgICAgICAgLy8gVE9ETyBUaGlzIGlzIGp1c3QgYSBzdHViIHNvIHdlIGNhbiBoYXZlIGEgY2xpZW50IEJpbmRlciB0byBwYXNzIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICAvLyBUT0RPIEltcGxlbWVudGVkIGluIGEgbGF0ZXIgQ0wuCiAgICAgICAgIEFMT0dXKCJvblN0cmVhbUNoYW5nZSBjYWxsZWQhIik7CkBAIC0xMTYsNyArMTE5LDcgQEAKIAogICAgIGNsYXNzIEFBdWRpb0NsaWVudCA6IHB1YmxpYyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQUF1ZGlvQ2xpZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEFBdWRpb0NsaWVudChhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+IGFhdWRpb0JpbmRlckNsaWVudCkKKyAgICAgICAgZXhwbGljaXQgQUF1ZGlvQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OndwPEFBdWRpb0JpbmRlckNsaWVudD4mIGFhdWRpb0JpbmRlckNsaWVudCkKICAgICAgICAgICAgICAgICA6IG1CaW5kZXJDbGllbnQoYWF1ZGlvQmluZGVyQ2xpZW50KSB7CiAgICAgICAgIH0KIApAQCAtMTUwLDEwICsxNTMsMTAgQEAKICAgICBjbGFzcyBBZGFwdGVyIDogcHVibGljIEFBdWRpb0JpbmRlckFkYXB0ZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgQWRhcHRlcihjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvU2VydmljZT4mIGRlbGVnYXRlLAotICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4mIGFhdWRpb0NsaWVudCkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxBQXVkaW9DbGllbnQ+IGFhdWRpb0NsaWVudCkKICAgICAgICAgICAgICAgICA6IEFBdWRpb0JpbmRlckFkYXB0ZXIoZGVsZWdhdGUuZ2V0KCkpLAogICAgICAgICAgICAgICAgICAgbURlbGVnYXRlKGRlbGVnYXRlKSwKLSAgICAgICAgICAgICAgICAgIG1BQXVkaW9DbGllbnQoYWF1ZGlvQ2xpZW50KSB7fQorICAgICAgICAgICAgICAgICAgbUFBdWRpb0NsaWVudChzdGQ6Om1vdmUoYWF1ZGlvQ2xpZW50KSkge30KIAogICAgICAgICB2aXJ0dWFsIH5BZGFwdGVyKCkgewogICAgICAgICAgICAgaWYgKG1EZWxlZ2F0ZSAhPSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaAppbmRleCA1ZDExNTEyLi5lOTAxNzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgKQEAgLTM3LDcgKzM3LDcgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgewogcHVibGljOgogCi0gICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSgpIHt9OworICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUludGVyZmFjZSgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KSA9IDA7CkBAIC05NSw2ICs5NSwxNiBAQAogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpID0gMDsKKworICAgIC8qKgorICAgICAqIEV4aXQgdGhlIHN0YW5kYnkgbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUgdGhlIHN0cmVhbSBoYW5kbGUKKyAgICAgKiBAcGFyYW0gcGFyY2VsYWJsZSBjb250YWlucyBuZXcgZGF0YSBxdWV1ZSBpbmZvcm1hdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uCisgICAgICovCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgPSAwOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggMmQ1MDFlZi4uYjYwYmFjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtMjMsMjYgKzIzLDM2IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgorCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKLXVzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwogCiBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uKGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpIHsKLSAgICBzZXRTYW1wbGVzUGVyRnJhbWUocGFyY2VsYWJsZS5zYW1wbGVzUGVyRnJhbWUpOworICAgIHNldENoYW5uZWxNYXNrKHBhcmNlbGFibGUuY2hhbm5lbE1hc2spOwogICAgIHNldFNhbXBsZVJhdGUocGFyY2VsYWJsZS5zYW1wbGVSYXRlKTsKICAgICBzZXREZXZpY2VJZChwYXJjZWxhYmxlLmRldmljZUlkKTsKICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9fc2hhcmluZ19tb2RlX3QpID09IHNpemVvZihwYXJjZWxhYmxlLnNoYXJpbmdNb2RlKSk7CiAgICAgc2V0U2hhcmluZ01vZGUocGFyY2VsYWJsZS5zaGFyaW5nTW9kZSk7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fZm9ybWF0X3QpID09IHNpemVvZihwYXJjZWxhYmxlLmF1ZGlvRm9ybWF0KSk7Ci0gICAgc2V0Rm9ybWF0KHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihwYXJjZWxhYmxlLmF1ZGlvRm9ybWF0KSk7CisgICAgYXV0byBjb252Rm9ybWF0ID0gYW5kcm9pZDo6YWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCgKKyAgICAgICAgICAgIHBhcmNlbGFibGUuYXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChjb252Rm9ybWF0Lm9rKCkgPyBjb252Rm9ybWF0LnZhbHVlKCkgOiBBVURJT19GT1JNQVRfSU5WQUxJRCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2RpcmVjdGlvbl90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5kaXJlY3Rpb24pKTsKICAgICBzZXREaXJlY3Rpb24ocGFyY2VsYWJsZS5kaXJlY3Rpb24pOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGF1ZGlvX3VzYWdlX3QpID09IHNpemVvZihwYXJjZWxhYmxlLnVzYWdlKSk7CiAgICAgc2V0VXNhZ2UocGFyY2VsYWJsZS51c2FnZSk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2NvbnRlbnRfdHlwZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5jb250ZW50VHlwZSkpOwogICAgIHNldENvbnRlbnRUeXBlKHBhcmNlbGFibGUuY29udGVudFR5cGUpOworCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3QpID09CisgICAgICAgICAgICBzaXplb2YocGFyY2VsYWJsZS5zcGF0aWFsaXphdGlvbkJlaGF2aW9yKSk7CisgICAgc2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcihwYXJjZWxhYmxlLnNwYXRpYWxpemF0aW9uQmVoYXZpb3IpOworICAgIHNldElzQ29udGVudFNwYXRpYWxpemVkKHBhcmNlbGFibGUuaXNDb250ZW50U3BhdGlhbGl6ZWQpOworCisKICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9faW5wdXRfcHJlc2V0X3QpID09IHNpemVvZihwYXJjZWxhYmxlLmlucHV0UHJlc2V0KSk7CiAgICAgc2V0SW5wdXRQcmVzZXQocGFyY2VsYWJsZS5pbnB1dFByZXNldCk7CiAgICAgc2V0QnVmZmVyQ2FwYWNpdHkocGFyY2VsYWJsZS5idWZmZXJDYXBhY2l0eSk7CkBAIC02MywxMyArNzMsMTkgQEAKIAogU3RyZWFtUGFyYW1ldGVycyBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjpwYXJjZWxhYmxlKCkgY29uc3QgewogICAgIFN0cmVhbVBhcmFtZXRlcnMgcmVzdWx0OwotICAgIHJlc3VsdC5zYW1wbGVzUGVyRnJhbWUgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXN1bHQuY2hhbm5lbE1hc2sgPSBnZXRDaGFubmVsTWFzaygpOwogICAgIHJlc3VsdC5zYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOwogICAgIHJlc3VsdC5kZXZpY2VJZCA9IGdldERldmljZUlkKCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSA9PSBzaXplb2YocmVzdWx0LnNoYXJpbmdNb2RlKSk7CiAgICAgcmVzdWx0LnNoYXJpbmdNb2RlID0gZ2V0U2hhcmluZ01vZGUoKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhdWRpb19mb3JtYXRfdCkgPT0gc2l6ZW9mKHJlc3VsdC5hdWRpb0Zvcm1hdCkpOwotICAgIHJlc3VsdC5hdWRpb0Zvcm1hdCA9IHN0YXRpY19jYXN0PEF1ZGlvRm9ybWF0PihnZXRGb3JtYXQoKSk7CisgICAgYXV0byBjb252QXVkaW9Gb3JtYXQgPSBhbmRyb2lkOjpsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGdldEZvcm1hdCgpKTsKKyAgICBpZiAoY29udkF1ZGlvRm9ybWF0Lm9rKCkpIHsKKyAgICAgICAgcmVzdWx0LmF1ZGlvRm9ybWF0ID0gY29udkF1ZGlvRm9ybWF0LnZhbHVlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmF1ZGlvRm9ybWF0ID0gQXVkaW9Gb3JtYXREZXNjcmlwdGlvbnt9OworICAgICAgICByZXN1bHQuYXVkaW9Gb3JtYXQudHlwZSA9CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0VHlwZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQ7CisgICAgfQogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHJlc3VsdC5kaXJlY3Rpb24pKTsKICAgICByZXN1bHQuZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fdXNhZ2VfdCkgPT0gc2l6ZW9mKHJlc3VsdC51c2FnZSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCmluZGV4IDhkOTAwMzQuLmE0Y2MyYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKIEFBdWRpb1N0cmVhbVJlcXVlc3Q6OkFBdWRpb1N0cmVhbVJlcXVlc3QoY29uc3QgU3RyZWFtUmVxdWVzdCYgcGFyY2VsYWJsZSkgOgotICAgICAgICBtQ29uZmlndXJhdGlvbihzdGQ6Om1vdmUocGFyY2VsYWJsZS5wYXJhbXMpKSwKKyAgICAgICAgbUNvbmZpZ3VyYXRpb24ocGFyY2VsYWJsZS5wYXJhbXMpLAogICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UocGFyY2VsYWJsZS5hdHRyaWJ1dGlvblNvdXJjZSksCiAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQocGFyY2VsYWJsZS5zaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpLAogICAgICAgICBtSW5TZXJ2aWNlKHBhcmNlbGFibGUuaW5TZXJ2aWNlKSB7CkBAIC0zOCw3ICszOCw3IEBACiAKIFN0cmVhbVJlcXVlc3QgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6cGFyY2VsYWJsZSgpIGNvbnN0IHsKICAgICBTdHJlYW1SZXF1ZXN0IHJlc3VsdDsKLSAgICByZXN1bHQucGFyYW1zID0gc3RkOjptb3ZlKG1Db25maWd1cmF0aW9uKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LnBhcmFtcyA9IG1Db25maWd1cmF0aW9uLnBhcmNlbGFibGUoKTsKICAgICByZXN1bHQuYXR0cmlidXRpb25Tb3VyY2UgPSBtQXR0cmlidXRpb25Tb3VyY2U7CiAgICAgcmVzdWx0LnNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQ7CiAgICAgcmVzdWx0LmluU2VydmljZSA9IG1JblNlcnZpY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcAppbmRleCBhYTRhYzI3Li5iMTI2MmRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKQEAgLTI5LDE3ICsyOSwxNSBAQAogI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgYW5kcm9pZDo6bWVkaWE6OlNoYXJlZEZpbGVSZWdpb247Ci11c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKQotICAgICAgICA6IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUudXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS51cERhdGFRdWV1ZVBhcmNlbGFibGUpKSwKLSAgICAgICAgICBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUuZG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpKSwKKyAgICAgICAgOiBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKHBhcmNlbGFibGUudXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKSwKKyAgICAgICAgICBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUocGFyY2VsYWJsZS5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSksCisgICAgICAgICAgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZShwYXJjZWxhYmxlLnVwRGF0YVF1ZXVlUGFyY2VsYWJsZSksCisgICAgICAgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlKHBhcmNlbGFibGUuZG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpLAogICAgICAgICAgIG1OdW1TaGFyZWRNZW1vcmllcyhwYXJjZWxhYmxlLnNoYXJlZE1lbW9yaWVzLnNpemUoKSkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyY2VsYWJsZS5zaGFyZWRNZW1vcmllcy5zaXplKCkgJiYgaSA8IE1BWF9TSEFSRURfTUVNT1JJRVM7ICsraSkgewogICAgICAgICAvLyBSZS1jb25zdHJ1Y3QuCkBAIC01NiwxMCArNTQsMTAgQEAKIAogRW5kcG9pbnQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSYmIHsKICAgICBFbmRwb2ludCByZXN1bHQ7Ci0gICAgcmVzdWx0LnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7Ci0gICAgcmVzdWx0LmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC51cERhdGFRdWV1ZVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC5kb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQudXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQudXBEYXRhUXVldWVQYXJjZWxhYmxlID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRvd25EYXRhUXVldWVQYXJjZWxhYmxlID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnBhcmNlbGFibGUoKTsKICAgICByZXN1bHQuc2hhcmVkTWVtb3JpZXMucmVzZXJ2ZShzdGQ6Om1pbihtTnVtU2hhcmVkTWVtb3JpZXMsIE1BWF9TSEFSRURfTUVNT1JJRVMpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllcyAmJiBpIDwgTUFYX1NIQVJFRF9NRU1PUklFUzsgKytpKSB7CiAgICAgICAgIHJlc3VsdC5zaGFyZWRNZW1vcmllcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG1TaGFyZWRNZW1vcmllc1tpXSkucGFyY2VsYWJsZSgpKTsKQEAgLTgxLDYgKzc5LDIyIEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCit2b2lkIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpjbG9zZURhdGFGaWxlRGVzY3JpcHRvcigpIHsKKyAgICBjb25zdCBpbnQzMl90IGN1ckRhdGFNZW1vcnlJbmRleCA9IG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5nZXRTaGFyZWRNZW1vcnlJbmRleCgpOworICAgIG1TaGFyZWRNZW1vcmllc1tjdXJEYXRhTWVtb3J5SW5kZXhdLmNsb3NlQW5kUmVsZWFzZUZkKCk7Cit9CisKK3ZvaWQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnVwZGF0ZURhdGFGaWxlRGVzY3JpcHRvcigKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIGVuZHBvaW50UGFyY2VsYWJsZSkgeworICAgIGNvbnN0IGludDMyX3QgY3VyRGF0YU1lbW9yeUluZGV4ID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLmdldFNoYXJlZE1lbW9yeUluZGV4KCk7CisgICAgY29uc3QgaW50MzJfdCBuZXdEYXRhTWVtb3J5SW5kZXggPQorICAgICAgICAgICAgZW5kcG9pbnRQYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuZ2V0U2hhcmVkTWVtb3J5SW5kZXgoKTsKKyAgICBtU2hhcmVkTWVtb3JpZXNbY3VyRGF0YU1lbW9yeUluZGV4XS5jbG9zZSgpOworICAgIG1TaGFyZWRNZW1vcmllc1tjdXJEYXRhTWVtb3J5SW5kZXhdLnNldHVwKAorICAgICAgICAgICAgZW5kcG9pbnRQYXJjZWxhYmxlLT5tU2hhcmVkTWVtb3JpZXNbbmV3RGF0YU1lbW9yeUluZGV4XSk7CisgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnVwZGF0ZU1lbW9yeShlbmRwb2ludFBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSk7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6cmVzb2x2ZShFbmRwb2ludERlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZXNvbHZlKG1TaGFyZWRNZW1vcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcik7CkBAIC05NCw2ICsxMDgsMTAgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnJlc29sdmVEYXRhUXVldWUoUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnJlc29sdmUobVNoYXJlZE1lbW9yaWVzLCBkZXNjcmlwdG9yKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpjbG9zZSgpIHsKICAgICBpbnQgZXJyID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllczsgaSsrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCmluZGV4IDUyMzdhMWEuLjVkMmMzOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgLy8gQ3Rvci9hc3NpZ25tZW50IGZyb20gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgogICAgIC8vIFNpbmNlIHRoZSBwYXJjZWxhYmxlIG9iamVjdCBvd25zIHVuaXF1ZSBGRHMgKGZvciBzaGFyZWQgbWVtb3J5IGJsb2NrcyksIG1vdmUgc2VtYW50aWNzIGFyZQogICAgIC8vIHByb3ZpZGVkIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGR1cGUuCi0gICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKKyAgICBleHBsaWNpdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZShFbmRwb2ludCYmIHBhcmNlbGFibGUpOwogICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlJiBvcGVyYXRvcj0oRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKIAogICAgIC8qKgpAQCAtNTIsNyArNTIsMjAgQEAKICAgICAgKi8KICAgICBpbnQzMl90IGFkZEZpbGVEZXNjcmlwdG9yKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCisgICAgLyoqCisgICAgICogQ2xvc2UgY3VycmVudCBkYXRhIGZpbGUgZGVzY3JpcHRvci4gVGhlIGR1cGxpY2F0ZWQgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbG9zZURhdGFGaWxlRGVzY3JpcHRvcigpOworCisgICAgLyoqCisgICAgICogVXBkYXRlIGN1cnJlbnQgZGF0YSBmaWxlIGRlc2NyaXB0b3Igd2l0aCBnaXZlbiBlbmRwb2ludCBwYXJjZWxhYmxlLgorICAgICAqIEBwYXJhbSBlbmRwb2ludFBhcmNlbGFibGUgYW4gZW5kcG9pbnQgcGFyY2VsYWJsZSB0aGF0IGNvbnRhaW5zIG5ldyBkYXRhIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZURhdGFGaWxlRGVzY3JpcHRvcihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogZW5kcG9pbnRQYXJjZWxhYmxlKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKEVuZHBvaW50RGVzY3JpcHRvciAqZGVzY3JpcHRvcik7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmVEYXRhUXVldWUoUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCmluZGV4IGE0YjNjZWMuLjNiYzUxZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcApAQCAtMzAsOSArMzAsMTAgQEAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpSaW5nQnVmZmVyUGFyY2VsYWJsZShjb25zdCBSaW5nQnVmZmVyJiBwYXJjZWxhYmxlKQotICAgICAgICA6IG1SZWFkQ291bnRlclBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUucmVhZENvdW50ZXJQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbVdyaXRlQ291bnRlclBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUud3JpdGVDb3VudGVyUGFyY2VsYWJsZSkpLAotICAgICAgICAgIG1EYXRhUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS5kYXRhUGFyY2VsYWJsZSkpLAorICAgICAgICA6IG1SZWFkQ291bnRlclBhcmNlbGFibGUocGFyY2VsYWJsZS5yZWFkQ291bnRlclBhcmNlbGFibGUpLAorICAgICAgICAgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKHBhcmNlbGFibGUud3JpdGVDb3VudGVyUGFyY2VsYWJsZSksCisgICAgICAgICAgbURhdGFQYXJjZWxhYmxlKHBhcmNlbGFibGUuZGF0YVBhcmNlbGFibGUpLAorICAgICAgICAgIG1TaGFyZWRNZW1vcnlJbmRleChwYXJjZWxhYmxlLnNoYXJlZE1lbW9yeUluZGV4KSwKICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZShwYXJjZWxhYmxlLmJ5dGVzUGVyRnJhbWUpLAogICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdChwYXJjZWxhYmxlLmZyYW1lc1BlckJ1cnN0KSwKICAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyhwYXJjZWxhYmxlLmNhcGFjaXR5SW5GcmFtZXMpLApAQCAtNDIsOSArNDMsMTAgQEAKIAogUmluZ0J1ZmZlciBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6cGFyY2VsYWJsZSgpIGNvbnN0IHsKICAgICBSaW5nQnVmZmVyIHJlc3VsdDsKLSAgICByZXN1bHQucmVhZENvdW50ZXJQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1SZWFkQ291bnRlclBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKLSAgICByZXN1bHQud3JpdGVDb3VudGVyUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtV3JpdGVDb3VudGVyUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC5kYXRhUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRGF0YVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQucmVhZENvdW50ZXJQYXJjZWxhYmxlID0gbVJlYWRDb3VudGVyUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LndyaXRlQ291bnRlclBhcmNlbGFibGUgPSBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRhdGFQYXJjZWxhYmxlID0gbURhdGFQYXJjZWxhYmxlLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQuc2hhcmVkTWVtb3J5SW5kZXggPSBtU2hhcmVkTWVtb3J5SW5kZXg7CiAgICAgcmVzdWx0LmJ5dGVzUGVyRnJhbWUgPSBtQnl0ZXNQZXJGcmFtZTsKICAgICByZXN1bHQuZnJhbWVzUGVyQnVyc3QgPSBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgcmVzdWx0LmNhcGFjaXR5SW5GcmFtZXMgPSBtQ2FwYWNpdHlJbkZyYW1lczsKQEAgLTYwLDYgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFkQ291bnRlck9mZnNldCwKICAgICAgICAgICAgICAgICAgaW50MzJfdCB3cml0ZUNvdW50ZXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnRlclNpemVCeXRlcykgeworICAgIG1TaGFyZWRNZW1vcnlJbmRleCA9IHNoYXJlZE1lbW9yeUluZGV4OwogICAgIG1SZWFkQ291bnRlclBhcmNlbGFibGUuc2V0dXAoc2hhcmVkTWVtb3J5SW5kZXgsIHJlYWRDb3VudGVyT2Zmc2V0LCBjb3VudGVyU2l6ZUJ5dGVzKTsKICAgICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5zZXR1cChzaGFyZWRNZW1vcnlJbmRleCwgd3JpdGVDb3VudGVyT2Zmc2V0LCBjb3VudGVyU2l6ZUJ5dGVzKTsKICAgICBtRGF0YVBhcmNlbGFibGUuc2V0dXAoc2hhcmVkTWVtb3J5SW5kZXgsIGRhdGFNZW1vcnlPZmZzZXQsIGRhdGFTaXplSW5CeXRlcyk7CkBAIC02OCwxMiArNzEsMTMgQEAKIHZvaWQgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnNldHVwTWVtb3J5KGludDMyX3Qgc2hhcmVkTWVtb3J5SW5kZXgsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YU1lbW9yeU9mZnNldCwKICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhU2l6ZUluQnl0ZXMpIHsKKyAgICBtU2hhcmVkTWVtb3J5SW5kZXggPSBzaGFyZWRNZW1vcnlJbmRleDsKICAgICBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLnNldHVwKHNoYXJlZE1lbW9yeUluZGV4LCAwLCAwKTsKICAgICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5zZXR1cChzaGFyZWRNZW1vcnlJbmRleCwgMCwgMCk7CiAgICAgbURhdGFQYXJjZWxhYmxlLnNldHVwKHNoYXJlZE1lbW9yeUluZGV4LCBkYXRhTWVtb3J5T2Zmc2V0LCBkYXRhU2l6ZUluQnl0ZXMpOwogfQogCi1pbnQzMl90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpnZXRCeXRlc1BlckZyYW1lKCkgeworaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0Qnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbUJ5dGVzUGVyRnJhbWU7CiB9CiAKQEAgLTgxLDcgKzg1LDcgQEAKICAgICBtQnl0ZXNQZXJGcmFtZSA9IGJ5dGVzUGVyRnJhbWU7CiB9CiAKLWludDMyX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OmdldEZyYW1lc1BlckJ1cnN0KCkgeworaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsKIH0KIApAQCAtODksNyArOTMsNyBAQAogICAgIG1GcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckJ1cnN0OwogfQogCi1pbnQzMl90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpnZXRDYXBhY2l0eUluRnJhbWVzKCkgeworaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0Q2FwYWNpdHlJbkZyYW1lcygpIGNvbnN0IHsKICAgICByZXR1cm4gbUNhcGFjaXR5SW5GcmFtZXM7CiB9CiAKQEAgLTEyNCw2ICsxMjgsMTQgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCit2b2lkIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjp1cGRhdGVNZW1vcnkoY29uc3QgUmluZ0J1ZmZlclBhcmNlbGFibGUmIHBhcmNlbGFibGUpIHsKKyAgICBzZXR1cE1lbW9yeShtU2hhcmVkTWVtb3J5SW5kZXgsIDAsCisgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5nZXRDYXBhY2l0eUluRnJhbWVzKCkgKiBwYXJjZWxhYmxlLmdldEJ5dGVzUGVyRnJhbWUoKSk7CisgICAgc2V0Qnl0ZXNQZXJGcmFtZShwYXJjZWxhYmxlLmdldEJ5dGVzUGVyRnJhbWUoKSk7CisgICAgc2V0RnJhbWVzUGVyQnVyc3QocGFyY2VsYWJsZS5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICBzZXRDYXBhY2l0eUluRnJhbWVzKHBhcmNlbGFibGUuZ2V0Q2FwYWNpdHlJbkZyYW1lcygpKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobUNhcGFjaXR5SW5GcmFtZXMgPCAwIHx8IG1DYXBhY2l0eUluRnJhbWVzID49IDMyICogMTAyNCkgewogICAgICAgICBBTE9HRSgiaW52YWxpZCBtQ2FwYWNpdHlJbkZyYW1lcyA9ICVkIiwgbUNhcGFjaXR5SW5GcmFtZXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaAppbmRleCAyNTA4Y2VhLi4yOWQwZDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaApAQCAtNDYsMTUgKzQ2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFTaXplSW5CeXRlcyk7CiAKLSAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKTsKKyAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0Qnl0ZXNQZXJGcmFtZShpbnQzMl90IGJ5dGVzUGVyRnJhbWUpOwogCi0gICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0RnJhbWVzUGVyQnVyc3QoaW50MzJfdCBmcmFtZXNQZXJCdXJzdCk7CiAKLSAgICBpbnQzMl90IGdldENhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICBpbnQzMl90IGdldENhcGFjaXR5SW5GcmFtZXMoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0Q2FwYWNpdHlJbkZyYW1lcyhpbnQzMl90IGNhcGFjaXR5SW5GcmFtZXMpOwogCkBAIC02Miw2ICs2MiwxMiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOwogCisgICAgdm9pZCB1cGRhdGVNZW1vcnkoY29uc3QgUmluZ0J1ZmZlclBhcmNlbGFibGUmIHBhcmNlbGFibGUpOworCisgICAgaW50MzJfdCBnZXRTaGFyZWRNZW1vcnlJbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaGFyZWRNZW1vcnlJbmRleDsKKyAgICB9CisKICAgICB2b2lkIGR1bXAoKTsKIAogICAgIC8vIEV4dHJhY3QgYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgpAQCAtNzEsNiArNzcsNyBAQAogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1SZWFkQ291bnRlclBhcmNlbGFibGU7CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbVdyaXRlQ291bnRlclBhcmNlbGFibGU7CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbURhdGFQYXJjZWxhYmxlOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TaGFyZWRNZW1vcnlJbmRleCA9IC0xOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1CeXRlc1BlckZyYW1lID0gMDsgICAgIC8vIGluZGV4IGlzIGluIGZyYW1lcwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IDA7ICAgIC8vIGZvciBJU09DSFJPTk9VUyBxdWV1ZXMKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IDA7ICAvLyB6ZXJvIGlmIHVudXNlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IGVlZjIzOGYuLjc0MWFlZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKIHVzaW5nIGFuZHJvaWQ6Om1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uOwogCkBAIC02NSw2ICs2NCwxMCBAQAogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCit2b2lkIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnNldHVwKGNvbnN0IFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgJnNoYXJlZE1lbW9yeVBhcmNlbGFibGUpIHsKKyAgICBzZXR1cChzaGFyZWRNZW1vcnlQYXJjZWxhYmxlLm1GZCwgc2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5tU2l6ZUluQnl0ZXMpOworfQorCiBhYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6Y2xvc2UoKSB7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgIT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKICAgICAgICAgaW50IGVyciA9IG11bm1hcChtUmVzb2x2ZWRBZGRyZXNzLCBtU2l6ZUluQnl0ZXMpOwpAQCAtNzcsOCArODAsMTYgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCithYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6Y2xvc2VBbmRSZWxlYXNlRmQoKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGNsb3NlKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgbUZkLnJlc2V0KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpyZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IHVuaXF1ZV9mZCYgZmQpIHsKLSAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAobnVsbHB0ciwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyA9PSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewogICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgbkJ5dGVzID0gJSIgUFJJZDY0ICIsIGVycm5vID0gJXMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggMWYyYzMzNS4uNzc2MmZlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC01MiwxMiArNTIsMTYgQEAKICAgICAgKi8KICAgICB2b2lkIHNldHVwKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCisgICAgdm9pZCBzZXR1cChjb25zdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlJiBzaGFyZWRNZW1vcnlQYXJjZWxhYmxlKTsKKwogICAgIC8vIG1tYXAoKSBzaGFyZWQgbWVtb3J5CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoaW50MzJfdCBvZmZzZXRJbkJ5dGVzLCBpbnQzMl90IHNpemVJbkJ5dGVzLCB2b2lkICoqcmVnaW9uQWRkcmVzc1B0cik7CiAKICAgICAvLyBtdW5tYXAoKSBhbnkgbWFwcGVkIG1lbW9yeQogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlQW5kUmVsZWFzZUZkKCk7CisKICAgICBpbnQzMl90IGdldFNpemVJbkJ5dGVzKCk7CiAKICAgICB2b2lkIGR1bXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcAppbmRleCA1NmI5OWMwLi42ZmExMDliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCkBAIC0yOSwxMCArMjksNyBAQAogI2luY2x1ZGUgImJpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oIgogCi11c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbAppbmRleCA0NGQyMjExLi40ODVjMmUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbApAQCAtNzgsNCArNzgsNiBAQAogCiAgICAgaW50IHVucmVnaXN0ZXJBdWRpb1RocmVhZChpbnQgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFRocmVhZElkKTsKKworICAgIGludCBleGl0U3RhbmRieShpbnQgc3RyZWFtSGFuZGxlLCBvdXQgRW5kcG9pbnQgZW5kcG9pbnQpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9SaW5nQnVmZmVyLmFpZGwKaW5kZXggYTU4YjMzYS4uZGQ2NDQ5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vUmluZ0J1ZmZlci5haWRsCkBAIC0yNiw0ICsyNiw1IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdDsgICAgLy8gZm9yIElTT0NIUk9OT1VTIHF1ZXVlcwogICAgIGludCAgICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lczsgIC8vIHplcm8gaWYgdW51c2VkCiAgICAgaW50IC8qIFJpbmdidWZmZXJGbGFncyAqLyBmbGFnczsgIC8vID0gUmluZ2J1ZmZlckZsYWdzOjpOT05FOworICAgIGludCAgICAgICAgICAgICAgICAgc2hhcmVkTWVtb3J5SW5kZXg7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmFpZGwKaW5kZXggYjdjNGY3MC4uOTgzZTE5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUGFyYW1ldGVycy5haWRsCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogcGFja2FnZSBhYXVkaW87CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwogCiBwYXJjZWxhYmxlIFN0cmVhbVBhcmFtZXRlcnMgewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZTsgIC8vICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2s7ICAvLyAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgLy8gICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkOyAgLy8gICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50IC8qIGFhdWRpb19zaGFyaW5nX21vZGVfdCAqLyAgICAgICAgICAgc2hhcmluZ01vZGU7ICAvLyAgICAgICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIEF1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0OyAgLy8gICAgICAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdDsgIC8vICAgICAgICAgID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgaW50IC8qIGFhdWRpb19kaXJlY3Rpb25fdCAqLyAgICAgICAgICAgICAgZGlyZWN0aW9uOyAgLy8gICAgICAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwogICAgIGludCAvKiBhYXVkaW9fdXNhZ2VfdCAqLyAgICAgICAgICAgICAgICAgIHVzYWdlOyAgLy8gICAgICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50IC8qIGFhdWRpb19jb250ZW50X3R5cGVfdCAqLyAgICAgICAgICAgY29udGVudFR5cGU7ICAvLyAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQgLyogYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3QgKi9zcGF0aWFsaXphdGlvbkJlaGF2aW9yOyAvLz0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29udGVudFNwYXRpYWxpemVkOyAgLy8gPSBmYWxzZTsKICAgICBpbnQgLyogYWF1ZGlvX2lucHV0X3ByZXNldF90ICovICAgICAgICAgICBpbnB1dFByZXNldDsgIC8vICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNhcGFjaXR5OyAgLy8gICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50IC8qIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgKi8gYWxsb3dlZENhcHR1cmVQb2xpY3k7ICAvLyA9IEFBVURJT19VTlNQRUNJRklFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCmluZGV4IDYxYjUwZjMuLjJlZDNlM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApAQCAtMjEsNyArMjEsMTAgQEAKICNpbmNsdWRlICJBQXVkaW9GbG93R3JhcGguaCIKIAogI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vQmxlbmQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTXVsdGlUb01hbnlDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rRmxvYXQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kxNi5oPgpAQCAtMzIsMTcgKzM1LDIyIEBACiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkyNC5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMzIuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9GbG93R3JhcGg6OmNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VNb25vQmxlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF1ZGlvQmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4Y2x1c2l2ZSkgeworICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CiAKICAgICAvLyBUT0RPIGNoYW5nZSBiYWNrIHRvIEFMT0dECi0gICAgQUxPR0koIiVzKCkgc291cmNlIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCwgc2luayBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQiLAotICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIHNvdXJjZUNoYW5uZWxDb3VudCwgc2lua0Zvcm1hdCwgc2lua0NoYW5uZWxDb3VudCk7CisgICAgQUxPR0koIiVzKCkgc291cmNlIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCwgc2luayBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsICIKKyAgICAgICAgICAidXNlTW9ub0JsZW5kID0gJWQsIGF1ZGlvQmFsYW5jZSA9ICVmLCBpc0V4Y2x1c2l2ZSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgc291cmNlQ2hhbm5lbENvdW50LCBzaW5rRm9ybWF0LCBzaW5rQ2hhbm5lbENvdW50LAorICAgICAgICAgIHVzZU1vbm9CbGVuZCwgYXVkaW9CYWxhbmNlLCBpc0V4Y2x1c2l2ZSk7CiAKICAgICBzd2l0Y2ggKHNvdXJjZUZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CkBAIC02MywxMCArNzEsMTEgQEAKICAgICB9CiAgICAgbGFzdE91dHB1dCA9ICZtU291cmNlLT5vdXRwdXQ7CiAKLSAgICAvLyBBcHBseSB2b2x1bWUgYXMgYSByYW1wIHRvIGF2b2lkIHBvcHMuCi0gICAgbVZvbHVtZVJhbXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KHNvdXJjZUNoYW5uZWxDb3VudCk7Ci0gICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVZvbHVtZVJhbXAtPmlucHV0KTsKLSAgICBsYXN0T3V0cHV0ID0gJm1Wb2x1bWVSYW1wLT5vdXRwdXQ7CisgICAgaWYgKHVzZU1vbm9CbGVuZCkgeworICAgICAgICBtTW9ub0JsZW5kID0gc3RkOjptYWtlX3VuaXF1ZTxNb25vQmxlbmQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1Nb25vQmxlbmQtPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtTW9ub0JsZW5kLT5vdXRwdXQ7CisgICAgfQogCiAgICAgLy8gRm9yIGEgcHVyZSBmbG9hdCBncmFwaCwgdGhlcmUgaXMgY2hhbmNlIHRoYXQgdGhlIGRhdGEgcmFuZ2UgbWF5IGJlIHZlcnkgbGFyZ2UuCiAgICAgLy8gU28gd2Ugc2hvdWxkIGNsaXAgdG8gYSByZWFzb25hYmxlIHZhbHVlIHRoYXQgYWxsb3dzIGEgbGl0dGxlIGhlYWRyb29tLgpAQCAtODYsNiArOTUsMjYgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAorICAgIC8vIEFwcGx5IHZvbHVtZSByYW1wcyBmb3Igb25seSBleGNsdXNpdmUgc3RyZWFtcy4KKyAgICBpZiAoaXNFeGNsdXNpdmUpIHsKKyAgICAgICAgLy8gQXBwbHkgdm9sdW1lIHJhbXBzIHRvIHNldCB0aGUgbGVmdC9yaWdodCBhdWRpbyBiYWxhbmNlIGFuZCB0YXJnZXQgdm9sdW1lcy4KKyAgICAgICAgLy8gVGhlIHNpZ25hbHMgd2lsbCBiZSBkZWNvdXBsZWQsIHZvbHVtZSByYW1wcyB3aWxsIGJlIGFwcGxpZWQsIGJlZm9yZSB0aGUgc2lnbmFscyBhcmUKKyAgICAgICAgLy8gY29tYmluZWQgYWdhaW4uCisgICAgICAgIG1NdWx0aVRvTWFueUNvbnZlcnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TXVsdGlUb01hbnlDb252ZXJ0ZXI+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICBtTWFueVRvTXVsdGlDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1hbnlUb011bHRpQ29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbU11bHRpVG9NYW55Q29udmVydGVyLT5pbnB1dCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lua0NoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtVm9sdW1lUmFtcHMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8UmFtcExpbmVhcj4oMSkpOworICAgICAgICAgICAgbVBhbm5pbmdWb2x1bWVzLmVtcGxhY2VfYmFjaygxLjBmKTsKKyAgICAgICAgICAgIGxhc3RPdXRwdXQgPSBtTXVsdGlUb01hbnlDb252ZXJ0ZXItPm91dHB1dHNbaV0uZ2V0KCk7CisgICAgICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCYobVZvbHVtZVJhbXBzW2ldLmdldCgpLT5pbnB1dCkpOworICAgICAgICAgICAgbGFzdE91dHB1dCA9ICYobVZvbHVtZVJhbXBzW2ldLmdldCgpLT5vdXRwdXQpOworICAgICAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdChtTWFueVRvTXVsdGlDb252ZXJ0ZXItPmlucHV0c1tpXS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbGFzdE91dHB1dCA9ICZtTWFueVRvTXVsdGlDb252ZXJ0ZXItPm91dHB1dDsKKyAgICAgICAgc2V0QXVkaW9CYWxhbmNlKGF1ZGlvQmFsYW5jZSk7CisgICAgfQorCiAgICAgc3dpdGNoIChzaW5rRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rRmxvYXQ+KHNpbmtDaGFubmVsQ291bnQpOwpAQCAtMTE3LDkgKzE0NiwzMiBAQAogICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCiAgKi8KIHZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgbVZvbHVtZVJhbXAtPnNldFRhcmdldCh2b2x1bWUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZVJhbXBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Wb2x1bWVSYW1wc1tpXS0+c2V0VGFyZ2V0KHZvbHVtZSAqIG1QYW5uaW5nVm9sdW1lc1tpXSk7CisgICAgfQorICAgIG1UYXJnZXRWb2x1bWUgPSB2b2x1bWU7CiB9CiAKKy8qKgorICogQHBhcmFtIGF1ZGlvQmFsYW5jZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMAorICovCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0QXVkaW9CYWxhbmNlKGZsb2F0IGF1ZGlvQmFsYW5jZSkgeworICAgIGlmIChtUGFubmluZ1ZvbHVtZXMuc2l6ZSgpID49IDIpIHsKKyAgICAgICAgZmxvYXQgbGVmdE11bHRpcGxpZXIgPSAwOworICAgICAgICBmbG9hdCByaWdodE11bHRpcGxpZXIgPSAwOworICAgICAgICBtQmFsYW5jZS5jb21wdXRlU3RlcmVvQmFsYW5jZShhdWRpb0JhbGFuY2UsICZsZWZ0TXVsdGlwbGllciwgJnJpZ2h0TXVsdGlwbGllcik7CisgICAgICAgIG1QYW5uaW5nVm9sdW1lc1swXSA9IGxlZnRNdWx0aXBsaWVyOworICAgICAgICBtUGFubmluZ1ZvbHVtZXNbMV0gPSByaWdodE11bHRpcGxpZXI7CisgICAgICAgIG1Wb2x1bWVSYW1wc1swXS0+c2V0VGFyZ2V0KG1UYXJnZXRWb2x1bWUgKiBsZWZ0TXVsdGlwbGllcik7CisgICAgICAgIG1Wb2x1bWVSYW1wc1sxXS0+c2V0VGFyZ2V0KG1UYXJnZXRWb2x1bWUgKiByaWdodE11bHRpcGxpZXIpOworICAgIH0KK30KKworLyoqCisgKiBAcGFyYW0gbnVtRnJhbWVzIHRvIHNsb3dseSBhZGp1c3QgZm9yIHZvbHVtZSBjaGFuZ2VzCisgKi8KIHZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICBtVm9sdW1lUmFtcC0+c2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKKyAgICBmb3IgKGF1dG8mIHJhbXAgOiBtVm9sdW1lUmFtcHMpIHsKKyAgICAgICAgcmFtcC0+c2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCmluZGV4IGE0OWY2NGUuLjYwMmMxN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCkBAIC0yMyw4ICsyMywxMiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JhbGFuY2UuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub0JsZW5kLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KIAogY2xhc3MgQUF1ZGlvRmxvd0dyYXBoIHsKQEAgLTM2LDEyICs0MCwxOSBAQAogICAgICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsQ291bnQKICAgICAgKiBAcGFyYW0gc2lua0Zvcm1hdAogICAgICAqIEBwYXJhbSBzaW5rQ2hhbm5lbENvdW50CisgICAgICogQHBhcmFtIHVzZU1vbm9CbGVuZAorICAgICAqIEBwYXJhbSBhdWRpb0JhbGFuY2UKKyAgICAgKiBAcGFyYW0gY2hhbm5lbE1hc2sKKyAgICAgKiBAcGFyYW0gaXNFeGNsdXNpdmUKICAgICAgKiBAcmV0dXJuCiAgICAgICovCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VNb25vQmxlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdWRpb0JhbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhjbHVzaXZlKTsKIAogICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CiAKQEAgLTUwLDE0ICs2MSwzMCBAQAogICAgICAqLwogICAgIHZvaWQgc2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXVkaW9CYWxhbmNlIGJldHdlZW4gLTEuMCBhbmQgMS4wCisgICAgICovCisgICAgdm9pZCBzZXRBdWRpb0JhbGFuY2UoZmxvYXQgYXVkaW9CYWxhbmNlKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMgdG8gc2xvd2x5IGFkanVzdCBmb3Igdm9sdW1lIGNoYW5nZXMKKyAgICAgKi8KICAgICB2b2lkIHNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcyk7CiAKIHByaXZhdGU6Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9Tb3VyY2U+ICAgICAgICAgIG1Tb3VyY2U7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6UmFtcExpbmVhcj4gICAgICAgICAgIG1Wb2x1bWVSYW1wOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkNsaXBUb1JhbmdlPiAgICAgICAgICBtQ2xpcHBlcjsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpNb25vVG9NdWx0aUNvbnZlcnRlcj4gbUNoYW5uZWxDb252ZXJ0ZXI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9TaW5rPiAgICAgICAgICAgIG1TaW5rOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6OkZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkPiBtU291cmNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6Ok1vbm9CbGVuZD4gbU1vbm9CbGVuZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gbUNsaXBwZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6Ok1hbnlUb011bHRpQ29udmVydGVyPgorICAgICAgICAgICAgbU1hbnlUb011bHRpQ29udmVydGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6Ok11bHRpVG9NYW55Q29udmVydGVyPgorICAgICAgICAgICAgbU11bHRpVG9NYW55Q29udmVydGVyOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6OlJhbXBMaW5lYXI+PiBtVm9sdW1lUmFtcHM7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1QYW5uaW5nVm9sdW1lczsKKyAgICBmbG9hdCBtVGFyZ2V0Vm9sdW1lID0gMS4wZjsKKyAgICBhbmRyb2lkOjphdWRpb191dGlsczo6QmFsYW5jZSBtQmFsYW5jZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpGbG93R3JhcGhTaW5rPiBtU2luazsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAppbmRleCBlYmM5ZjJiLi5lNzgwZjRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcApAQCAtMzEsMTMgKzMxLDYgQEAKICNkZWZpbmUgUklESUNVTE9VU0xZX0xBUkdFX0JVRkZFUl9DQVBBQ0lUWSAgICgyNTYgKiAxMDI0KQogI2RlZmluZSBSSURJQ1VMT1VTTFlfTEFSR0VfRlJBTUVfU0laRSAgICAgICAgNDA5NgogCi1BdWRpb0VuZHBvaW50OjpBdWRpb0VuZHBvaW50KCkKLSAgICA6IG1GcmVlUnVubmluZyhmYWxzZSkKLSAgICAsIG1EYXRhUmVhZENvdW50ZXIoMCkKLSAgICAsIG1EYXRhV3JpdGVDb3VudGVyKDApCi17Ci19Ci0KIC8vIFRPRE8gQ29uc2lkZXIgbW92aW5nIHRvIGEgbWV0aG9kIGluIFJpbmdCdWZmZXJEZXNjcmlwdG9yCiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IoY29uc3QgY2hhciAqdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKQEAgLTE0NiwzOCArMTM5LDQ5IEBACiAgICAgKTsKIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gZGF0YSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIGRlc2NyaXB0b3IgPSAmcEVuZHBvaW50RGVzY3JpcHRvci0+ZGF0YVF1ZXVlRGVzY3JpcHRvcjsKLSAgICBBTE9HVigiY29uZmlndXJlKCkgZGF0YSBmcmFtZXNQZXJCdXJzdCA9ICVkIiwgZGVzY3JpcHRvci0+ZnJhbWVzUGVyQnVyc3QpOworICAgIHJlc3VsdCA9IGNvbmZpZ3VyZURhdGFRdWV1ZShwRW5kcG9pbnREZXNjcmlwdG9yLT5kYXRhUXVldWVEZXNjcmlwdG9yLCBkaXJlY3Rpb24pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnQ6OmNvbmZpZ3VyZURhdGFRdWV1ZShjb25zdCBSaW5nQnVmZmVyRGVzY3JpcHRvciYgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBdWRpb0VuZHBvaW50X3ZhbGlkYXRlUXVldWVEZXNjcmlwdG9yKCJkYXRhIiwgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQUxPR1YoImNvbmZpZ3VyZSgpIGRhdGEgZnJhbWVzUGVyQnVyc3QgPSAlZCIsIGRlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3QpOwogICAgIEFMT0dWKCJjb25maWd1cmUoKSBkYXRhIHJlYWRDb3VudGVyQWRkcmVzcyA9ICVwIiwKLSAgICAgICAgICBkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MpOworICAgICAgICAgIGRlc2NyaXB0b3IucmVhZENvdW50ZXJBZGRyZXNzKTsKIAogICAgIC8vIEFuIGV4YW1wbGUgb2YgZnJlZSBydW5uaW5nIGlzIHdoZW4gdGhlIG90aGVyIHNpZGUgaXMgcmVhZCBvciB3cml0dGVuIGJ5IGhhcmR3YXJlIERNQQogICAgIC8vIG9yIGEgRFNQLiBJdCBkb2VzIG5vdCB1cGRhdGUgaXRzIGNvdW50ZXIgc28gd2UgaGF2ZSB0byB1cGRhdGUgaXQuCiAgICAgaW50NjRfdCAqcmVtb3RlQ291bnRlciA9IChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzIC8vIHJlYWQgYnkgb3RoZXIgc2lkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3M7IC8vIHdyaXR0ZW4gYnkgb3RoZXIgc2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc2NyaXB0b3IucmVhZENvdW50ZXJBZGRyZXNzIC8vIHJlYWQgYnkgb3RoZXIgc2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3Iud3JpdGVDb3VudGVyQWRkcmVzczsgLy8gd3JpdHRlbiBieSBvdGhlciBzaWRlCiAgICAgbUZyZWVSdW5uaW5nID0gKHJlbW90ZUNvdW50ZXIgPT0gbnVsbHB0cik7CiAgICAgQUxPR1YoImNvbmZpZ3VyZSgpIG1GcmVlUnVubmluZyA9ICVkIiwgbUZyZWVSdW5uaW5nID8gMSA6IDApOwogCi0gICAgaW50NjRfdCAqcmVhZENvdW50ZXJBZGRyZXNzID0gKGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKQorICAgIGludDY0X3QgKnJlYWRDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJm1EYXRhUmVhZENvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzczsKLSAgICBpbnQ2NF90ICp3cml0ZUNvdW50ZXJBZGRyZXNzID0gKGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3IucmVhZENvdW50ZXJBZGRyZXNzOworICAgIGludDY0X3QgKndyaXRlQ291bnRlckFkZHJlc3MgPSAoZGVzY3JpcHRvci53cml0ZUNvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmbURhdGFXcml0ZUNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLndyaXRlQ291bnRlckFkZHJlc3M7CiAKICAgICAvLyBDbGVhciBidWZmZXIgdG8gYXZvaWQgYW4gaW5pdGlhbCBnbGl0Y2ggb24gc29tZSBkZXZpY2VzLgotICAgIHNpemVfdCBidWZmZXJTaXplQnl0ZXMgPSBkZXNjcmlwdG9yLT5jYXBhY2l0eUluRnJhbWVzICogZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZTsKLSAgICBtZW1zZXQoZGVzY3JpcHRvci0+ZGF0YUFkZHJlc3MsIDAsIGJ1ZmZlclNpemVCeXRlcyk7CisgICAgc2l6ZV90IGJ1ZmZlclNpemVCeXRlcyA9IGRlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lcyAqIGRlc2NyaXB0b3IuYnl0ZXNQZXJGcmFtZTsKKyAgICBtZW1zZXQoZGVzY3JpcHRvci5kYXRhQWRkcmVzcywgMCwgYnVmZmVyU2l6ZUJ5dGVzKTsKIAogICAgIG1EYXRhUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9CdWZmZXJJbmRpcmVjdD4oCi0gICAgICAgICAgICBkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lLAotICAgICAgICAgICAgZGVzY3JpcHRvci0+Y2FwYWNpdHlJbkZyYW1lcywKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuYnl0ZXNQZXJGcmFtZSwKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgIHJlYWRDb3VudGVyQWRkcmVzcywKICAgICAgICAgICAgIHdyaXRlQ291bnRlckFkZHJlc3MsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLT5kYXRhQWRkcmVzcworICAgICAgICAgICAgZGVzY3JpcHRvci5kYXRhQWRkcmVzcwogICAgICk7Ci0gICAgdWludDMyX3QgdGhyZXNob2xkID0gZGVzY3JpcHRvci0+Y2FwYWNpdHlJbkZyYW1lcyAvIDI7CisgICAgdWludDMyX3QgdGhyZXNob2xkID0gZGVzY3JpcHRvci5jYXBhY2l0eUluRnJhbWVzIC8gMjsKICAgICBtRGF0YVF1ZXVlLT5zZXRUaHJlc2hvbGQodGhyZXNob2xkKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTg4LDQ3ICsxOTIsNjYgQEAKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RW1wdHlSb29tQXZhaWxhYmxlKHdyYXBwaW5nQnVmZmVyKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldEVtcHR5Um9vbUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZ1bGxEYXRhQXZhaWxhYmxlKHdyYXBwaW5nQnVmZmVyKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldEZ1bGxEYXRhQXZhaWxhYmxlKHdyYXBwaW5nQnVmZmVyKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7Cit9CisKK2FuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgQXVkaW9FbmRwb2ludDo6cmVhZCh2b2lkICpidWZmZXIsIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5yZWFkKGJ1ZmZlciwgbnVtRnJhbWVzKTsKK30KKworYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBBdWRpb0VuZHBvaW50Ojp3cml0ZSh2b2lkICpidWZmZXIsIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT53cml0ZShidWZmZXIsIG51bUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVdyaXRlSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBpZiAobURhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1EYXRhUXVldWUtPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVJlYWRJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVJlYWRDb3VudGVyKGZpZm9fY291bnRlcl90IGZyYW1lc1JlYWQpIHsKLSAgICBtRGF0YVF1ZXVlLT5zZXRSZWFkQ291bnRlcihmcmFtZXNSZWFkKTsKKyAgICBpZiAobURhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1EYXRhUXVldWUtPnNldFJlYWRDb3VudGVyKGZyYW1lc1JlYWQpOworICAgIH0KIH0KIAogZmlmb19jb3VudGVyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RGF0YVJlYWRDb3VudGVyKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRSZWFkQ291bnRlcigpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+Z2V0UmVhZENvdW50ZXIoKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpzZXREYXRhV3JpdGVDb3VudGVyKGZpZm9fY291bnRlcl90IGZyYW1lc1JlYWQpIHsKLSAgICBtRGF0YVF1ZXVlLT5zZXRXcml0ZUNvdW50ZXIoZnJhbWVzUmVhZCk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5zZXRXcml0ZUNvdW50ZXIoZnJhbWVzUmVhZCk7CisgICAgfQogfQogCiBmaWZvX2NvdW50ZXJfdCBBdWRpb0VuZHBvaW50OjpnZXREYXRhV3JpdGVDb3VudGVyKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldFdyaXRlQ291bnRlcigpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OnNldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnQzMl90IHJlcXVlc3RlZEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqYWN0dWFsRnJhbWVzKSB7CisgICAgaWYgKG1EYXRhUXVldWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQogICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPCBFTkRQT0lOVF9EQVRBX1FVRVVFX1NJWkVfTUlOKSB7CiAgICAgICAgIHJlcXVlc3RlZEZyYW1lcyA9IEVORFBPSU5UX0RBVEFfUVVFVUVfU0laRV9NSU47CiAgICAgfQpAQCAtMjM4LDExICsyNjEsMTEgQEAKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRCdWZmZXJTaXplSW5GcmFtZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldFRocmVzaG9sZCgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+Z2V0VGhyZXNob2xkKCk7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpIGNvbnN0IHsKLSAgICByZXR1cm4gKGludDMyX3QpbURhdGFRdWV1ZS0+Z2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogKGludDMyX3QpbURhdGFRdWV1ZS0+Z2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmR1bXAoKSBjb25zdCB7CkBAIC0yNTEsNSArMjc0LDcgQEAKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjplcmFzZURhdGFNZW1vcnkoKSB7Ci0gICAgbURhdGFRdWV1ZS0+ZXJhc2VNZW1vcnkoKTsKKyAgICBpZiAobURhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1EYXRhUXVldWUtPmVyYXNlTWVtb3J5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCmluZGV4IDRjOGQ2MGYuLjAxZGQwNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BQVVESU9fQVVESU9fRU5EUE9JTlRfSAogI2RlZmluZSBBTkRST0lEX0FBVURJT19BVURJT19FTkRQT0lOVF9ICiAKKyNpbmNsdWRlIDxtdXRleD4KKwogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKQEAgLTM0LDcgKzM2LDcgQEAKIGNsYXNzIEF1ZGlvRW5kcG9pbnQgewogCiBwdWJsaWM6Ci0gICAgQXVkaW9FbmRwb2ludCgpOworICAgIEF1ZGlvRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CiAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgYmFzZWQgb24gdGhlIEVuZFBvaW50RGVzY3JpcHRvcl90LgpAQCAtNDIsNiArNDQsOSBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoY29uc3QgRW5kcG9pbnREZXNjcmlwdG9yICpwRW5kcG9pbnREZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlRGF0YVF1ZXVlKGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICZkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworCiAgICAgLyoqCiAgICAgICogUmVhZCBmcm9tIGEgY29tbWFuZCBwYXNzZWQgdXAgZnJvbSB0aGUgU2VydmVyLgogICAgICAqIEByZXR1cm4gMSBpZiBjb21tYW5kIHJlY2VpdmVkLCAwIGZvciBubyBjb21tYW5kLCBvciBuZWdhdGl2ZSBlcnJvci4KQEAgLTU2LDYgKzYxLDEwIEBACiAKICAgICBpbnQzMl90IGdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKIAorICAgIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgcmVhZCh2b2lkKiBidWZmZXIsIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKTsKKworICAgIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3Qgd3JpdGUodm9pZCogYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7CisKICAgICB2b2lkIGFkdmFuY2VSZWFkSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcyk7CiAKICAgICB2b2lkIGFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpOwpAQCAtODUsMTkgKzk0LDMxIEBACiAKICAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKSBjb25zdDsKIAorICAgIHZvaWQgc2V0VGhyZXNob2xkKGludDMyX3QgZnJhbWVzKSB7CisgICAgICAgIG1EYXRhUXVldWUtPnNldFRocmVzaG9sZChmcmFtZXMpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0VGhyZXNob2xkKCkgeworICAgICAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0VGhyZXNob2xkKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogV3JpdGUgemVyb3MgdG8gdGhlIGRhdGEgcXVldWUgbWVtb3J5LgogICAgICAqLwogICAgIHZvaWQgZXJhc2VEYXRhTWVtb3J5KCk7CiAKKyAgICB2b2lkIGZyZWVEYXRhUXVldWUoKTsKKwogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpGaWZvQnVmZmVySW5kaXJlY3Q+IG1VcENvbW1hbmRRdWV1ZTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlckluZGlyZWN0PiBtRGF0YVF1ZXVlOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1GcmVlUnVubmluZzsKLSAgICBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCBtRGF0YVJlYWRDb3VudGVyOyAvLyBvbmx5IHVzZWQgaWYgZnJlZS1ydW5uaW5nCi0gICAgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3QgbURhdGFXcml0ZUNvdW50ZXI7IC8vIG9ubHkgdXNlZCBpZiBmcmVlLXJ1bm5pbmcKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtRnJlZVJ1bm5pbmd7ZmFsc2V9OworICAgIGFuZHJvaWQ6OmZpZm9fY291bnRlcl90IG1EYXRhUmVhZENvdW50ZXJ7MH07IC8vIG9ubHkgdXNlZCBpZiBmcmVlLXJ1bm5pbmcKKyAgICBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCBtRGF0YVdyaXRlQ291bnRlcnswfTsgLy8gb25seSB1c2VkIGlmIGZyZWUtcnVubmluZworCisgICAgc3RkOjptdXRleCBtRGF0YVF1ZXVlTG9jazsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFhdWRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA2ZDJkNDY0Li45ZjA1NjRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC00OSw4ICs1MSw2IEBACiAvLyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIHNlbnNlIG9mIHRoZSBsb2dzIG1vcmUgZWFzaWx5LgogI2RlZmluZSBMT0dfVEFHIChtSW5TZXJ2aWNlID8gIkF1ZGlvU3RyZWFtSW50ZXJuYWxfU2VydmljZSIgOiAiQXVkaW9TdHJlYW1JbnRlcm5hbF9DbGllbnQiKQogCi11c2luZyBhbmRyb2lkOjpNdXRleDsKLXVzaW5nIGFuZHJvaWQ6OldyYXBwaW5nQnVmZmVyOwogdXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKQEAgLTgxLDggKzgxLDYgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0OwotICAgIGludDMyX3QgZnJhbWVzUGVySGFyZHdhcmVCdXJzdDsKICAgICBBQXVkaW9TdHJlYW1SZXF1ZXN0IHJlcXVlc3Q7CiAgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uT3V0cHV0OwogCkBAIC05Nyw5ICs5NSw2IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgY29uc3QgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKLSAgICBpbnQzMl90IGJ1cnN0TWljcm9zID0gMDsKLQogICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEZvcm1hdCA9IGdldEZvcm1hdCgpOwogICAgIC8vIFdlIGhhdmUgdG8gZG8gdm9sdW1lIHNjYWxpbmcuIFNvIHdlIHByZWZlciBGTE9BVCBmb3JtYXQuCiAgICAgaWYgKHJlcXVlc3RlZEZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewpAQCAtMTIzLDEyICsxMTgsMTQgQEAKIAogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERldmljZUlkKGdldERldmljZUlkKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVzUGVyRnJhbWUoZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERpcmVjdGlvbihnZXREaXJlY3Rpb24oKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Q2hhbm5lbE1hc2soZ2V0Q2hhbm5lbE1hc2soKSk7CiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRVc2FnZShnZXRVc2FnZSgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRDb250ZW50VHlwZShnZXRDb250ZW50VHlwZSgpKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKGdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKSk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0SXNDb250ZW50U3BhdGlhbGl6ZWQoaXNDb250ZW50U3BhdGlhbGl6ZWQoKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0SW5wdXRQcmVzZXQoZ2V0SW5wdXRQcmVzZXQoKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0UHJpdmFjeVNlbnNpdGl2ZShpc1ByaXZhY3lTZW5zaXRpdmUoKSk7CiAKQEAgLTEzOCw3ICsxMzUsOCBAQAogCiAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA8IDAKLSAgICAgICAgICAgICYmIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNhbXBsZXNQZXJGcmFtZSgpID09IDEgLy8gbW9ubz8KKyAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgIHx8IHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldENoYW5uZWxNYXNrKCkgPT0gQUFVRElPX0NIQU5ORUxfTU9OTykKICAgICAgICAgICAgICYmIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUCiAgICAgICAgICAgICAmJiAhaXNJblNlcnZpY2UoKSkgewogICAgICAgICAvLyBpZiB0aGF0IGZhaWxlZCB0aGVuIHRyeSBzd2l0Y2hpbmcgZnJvbSBtb25vIHRvIHN0ZXJlbyBpZiBPVVRQVVQuCkBAIC0xNDYsNyArMTQ0LDcgQEAKICAgICAgICAgLy8gdGhhdCB3cml0ZXMgdG8gYSBzdGVyZW8gTU1BUCBzdHJlYW0uCiAgICAgICAgIEFMT0dEKCIlcygpIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVzUGVyRnJhbWUoMik7IC8vIHN0ZXJlbworICAgICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRDaGFubmVsTWFzayhBQVVESU9fQ0hBTk5FTF9TVEVSRU8pOwogICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSA9IG1TZXJ2aWNlSW50ZXJmYWNlLm9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CiAgICAgfQogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA8IDApIHsKQEAgLTE3NCw5ICsxNzIsMTAgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgLy8gU2F2ZSByZXN1bHRzIG9mIHRoZSBvcGVuLgotICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIGlmIChnZXRDaGFubmVsTWFzaygpID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBzZXRDaGFubmVsTWFzayhjb25maWd1cmF0aW9uT3V0cHV0LmdldENoYW5uZWxNYXNrKCkpOwogICAgIH0KKwogICAgIG1EZXZpY2VDaGFubmVsQ291bnQgPSBjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZVJhdGUoKSk7CkBAIC0xODYsNiArMTg1LDggQEAKIAogICAgIHNldFVzYWdlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0VXNhZ2UoKSk7CiAgICAgc2V0Q29udGVudFR5cGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRDb250ZW50VHlwZSgpKTsKKyAgICBzZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcigpKTsKKyAgICBzZXRJc0NvbnRlbnRTcGF0aWFsaXplZChjb25maWd1cmF0aW9uT3V0cHV0LmlzQ29udGVudFNwYXRpYWxpemVkKCkpOwogICAgIHNldElucHV0UHJlc2V0KGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0SW5wdXRQcmVzZXQoKSk7CiAKICAgICAvLyBTYXZlIGRldmljZSBmb3JtYXQgc28gd2UgY2FuIGRvIGZvcm1hdCBjb252ZXJzaW9uIGFuZCB2b2x1bWUgc2NhbGluZyB0b2dldGhlci4KQEAgLTIwOSwxMiArMjEwLDI4IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgZnJhbWVzUGVySGFyZHdhcmVCdXJzdCA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKKyAgICBpZiAoKHJlc3VsdCA9IGNvbmZpZ3VyZURhdGFJbmZvcm1hdGlvbihidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpKSkgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Y29uZmlndXJlRGF0YUluZm9ybWF0aW9uKGludDMyX3QgY2FsbGJhY2tGcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1BlckhhcmR3YXJlQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CiAKICAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgogICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKICAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KLSAgICBmcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CisgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CisgICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7CisgICAgY29uc3QgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOwogICAgIGRvIHsKICAgICAgICAgaWYgKGJ1cnN0TWljcm9zID4gMCkgeyAgLy8gc2tpcCBmaXJzdCBsb29wCiAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdCAqPSAyOwpAQCAtMjI3LDggKzI0NCw3IEBACiAgICAgLy8gVmFsaWRhdGUgZmluYWwgYnVyc3Qgc2l6ZS4KICAgICBpZiAoZnJhbWVzUGVyQnVyc3QgPCBNSU5fRlJBTUVTX1BFUl9CVVJTVCB8fCBmcmFtZXNQZXJCdXJzdCA+IE1BWF9GUkFNRVNfUEVSX0JVUlNUKSB7CiAgICAgICAgIEFMT0dFKCIlcyAtIGZyYW1lc1BlckJ1cnN0IG91dCBvZiByYW5nZSA9ICVkIiwgX19mdW5jX18sIGZyYW1lc1BlckJ1cnN0KTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIHNldEZyYW1lc1BlckJ1cnN0KGZyYW1lc1BlckJ1cnN0KTsgLy8gb25seSBzYXZlIGdvb2QgdmFsdWUKIApAQCAtMjM2LDI2ICsyNTIsMjEgQEAKICAgICBpZiAobUJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMgPCBnZXRGcmFtZXNQZXJCdXJzdCgpCiAgICAgICAgICAgICB8fCBtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyA+IE1BWF9CVUZGRVJfQ0FQQUNJVFlfSU5fRlJBTUVTKSB7CiAgICAgICAgIEFMT0dFKCIlcyAtIGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgX19mdW5jX18sIG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzKTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCiAgICAgbUNsb2NrTW9kZWwuc2V0U2FtcGxlUmF0ZShnZXRTYW1wbGVSYXRlKCkpOwogICAgIG1DbG9ja01vZGVsLnNldEZyYW1lc1BlckJ1cnN0KGZyYW1lc1BlckhhcmR3YXJlQnVyc3QpOwogCiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrU2V0KCkpIHsKLSAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKKyAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gY2FsbGJhY2tGcmFtZXM7CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewogICAgICAgICAgICAgQUxPR1coIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgdG9vIGJpZyA9ICVkLCBjYXBhY2l0eSA9ICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2FsbGJhY2tGcmFtZXMsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9IGVsc2UgaWYgKG1DYWxsYmFja0ZyYW1lcyA8IDApIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBnZXRGcmFtZXNQZXJCdXJzdCgpOwpAQCAtMjY1LDYgKzI3NiwxOCBAQAogICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oY2FsbGJhY2tCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICAvLyBFeGNsdXNpdmUgb3V0cHV0IHN0cmVhbXMgc2hvdWxkIGNvbWJpbmUgY2hhbm5lbHMgd2hlbiBtb25vIGF1ZGlvIGFkanVzdG1lbnQKKyAgICAvLyBpcyBlbmFibGVkLiBUaGV5IHNob3VsZCBhbHNvIGFkanVzdCBmb3IgYXVkaW8gYmFsYW5jZS4KKyAgICBpZiAoKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSAmJgorICAgICAgICAoZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkpIHsKKyAgICAgICAgYm9vbCBpc01hc3Rlck1vbm8gPSBmYWxzZTsKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OmdldE1hc3Rlck1vbm8oJmlzTWFzdGVyTW9ubyk7CisgICAgICAgIHNldFJlcXVpcmVNb25vQmxlbmQoaXNNYXN0ZXJNb25vKTsKKyAgICAgICAgZmxvYXQgYXVkaW9CYWxhbmNlID0gMDsKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OmdldE1hc3RlckJhbGFuY2UoJmF1ZGlvQmFsYW5jZSk7CisgICAgICAgIHNldEF1ZGlvQmFsYW5jZShhdWRpb0JhbGFuY2UpOworICAgIH0KKwogICAgIC8vIEZvciBkZWJ1Z2dpbmcgYW5kIGFuYWx5emluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIE1NQVAgdGltZXN0YW1wcy4KICAgICAvLyBGb3IgT1VUUFVULCB1c2UgYSBORUdBVElWRSBvZmZzZXQgdG8gbW92ZSB0aGUgQ1BVIHdyaXRlcyBmdXJ0aGVyIEJFRk9SRSB0aGUgSFcgcmVhZHMuCiAgICAgLy8gRm9yIElOUFVULCB1c2UgYSBQT1NJVElWRSBvZmZzZXQgdG8gbW92ZSB0aGUgQ1BVIHJlYWRzIGZ1cnRoZXIgQUZURVIgdGhlIEhXIHdyaXRlcy4KQEAgLTI4NCwxNCArMzA3LDcgQEAKICAgICB9CiAKICAgICBzZXRCdWZmZXJTaXplKG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzIC8gMik7IC8vIERlZmF1bHQgYnVmZmVyIHNpemUgdG8gbWF0Y2ggUQotCi0gICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLWVycm9yOgotICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCkBAIC0zMzIsMTMgKzM0OCw2NyBAQAogewogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKnN0cmVhbSA9IChBdWRpb1N0cmVhbUludGVybmFsICopY29udGV4dDsKICAgICAvL0xPR0QoIm9ib2VfY2FsbGJhY2tfdGhyZWFkLCBzdHJlYW0gPSAlcCIsIHN0cmVhbSk7Ci0gICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBzdHJlYW0tPmNhbGxiYWNrTG9vcCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpleGl0U3RhbmRieV9sKCkgeworICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGVuZHBvaW50UGFyY2VsYWJsZTsKKyAgICAvLyBUaGUgc3RyZWFtIGlzIGluIHN0YW5kYnkgbW9kZSwgY29weSBhbGwgYXZhaWxhYmxlIGRhdGEgYW5kIHRoZW4gY2xvc2UgdGhlIGR1cGxpY2F0ZWQKKyAgICAvLyBzaGFyZWQgZmlsZSBkZXNjcmlwdG9yIHNvIHRoYXQgaXQgd29uJ3QgY2F1c2UgaXNzdWUgd2hlbiB0aGUgSEFMIHRyeSB0byByZWFsbG9jYXRlIG5ldworICAgIC8vIHNoYXJlZCBmaWxlIGRlc2NyaXB0b3Igd2hlbiBleGl0aW5nIGZyb20gc3RhbmRieS4KKyAgICAvLyBDYWNoZSBjdXJyZW50IHJlYWQgY291bnRlciwgd2hpY2ggd2lsbCBiZSByZXNldCB0byBuZXcgcmVhZCBhbmQgd3JpdGUgY291bnRlcgorICAgIC8vIHdoZW4gdGhlIG5ldyBkYXRhIHF1ZXVlIGFuZCBlbmRwb2ludCBhcmUgcmVjb25maWd1cmVkLgorICAgIGNvbnN0IGFuZHJvaWQ6OmZpZm9fY291bnRlcl90IHJlYWRDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpOworICAgIC8vIENhY2hlIHRoZSBidWZmZXIgc2l6ZSB3aGljaCBtYXkgYmUgZnJvbSBjbGllbnQuCisgICAgY29uc3QgaW50MzJfdCBwcmV2aW91c0J1ZmZlclNpemUgPSBtQnVmZmVyU2l6ZUluRnJhbWVzOworICAgIC8vIENvcHkgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gY3VycmVudCBkYXRhIHF1ZXVlLgorICAgIHVpbnQ4X3QgYnVmZmVyW2dldEJ1ZmZlckNhcGFjaXR5KCkgKiBnZXRCeXRlc1BlckZyYW1lKCldOworICAgIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgZnVsbEZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICBtQXVkaW9FbmRwb2ludC0+cmVhZChidWZmZXIsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIG1FbmRQb2ludFBhcmNlbGFibGUuY2xvc2VEYXRhRmlsZURlc2NyaXB0b3IoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2UuZXhpdFN0YW5kYnkoCisgICAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSwgZW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGV4aXQgc3RhbmRieSwgZXJyb3I9JWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIC8vIFJlY29uc3RydWN0IGRhdGEgcXVldWUgZGVzY3JpcHRvciB1c2luZyBuZXcgc2hhcmVkIGZpbGUgZGVzY3JpcHRvci4KKyAgICBtRW5kUG9pbnRQYXJjZWxhYmxlLnVwZGF0ZURhdGFGaWxlRGVzY3JpcHRvcigmZW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICByZXN1bHQgPSBtRW5kUG9pbnRQYXJjZWxhYmxlLnJlc29sdmVEYXRhUXVldWUoJm1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXNvbHZlIGRhdGEgcXVldWUgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LCBlcnJvcj0lZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgLy8gUmVjb25maWd1cmUgYXVkaW8gZW5kcG9pbnQgd2l0aCBuZXcgZGF0YSBxdWV1ZSBkZXNjcmlwdG9yLgorICAgIG1BdWRpb0VuZHBvaW50LT5jb25maWd1cmVEYXRhUXVldWUoCisgICAgICAgICAgICBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IsIGdldERpcmVjdGlvbigpKTsKKyAgICAvLyBTZXQgcmVhZCBhbmQgd3JpdGUgY291bnRlcnMgd2l0aCBwcmV2aW91cyByZWFkIGNvdW50ZXIsIHRoZSBsYXRlciB3cml0ZSBhY3Rpb24KKyAgICAvLyB3aWxsIG1ha2UgdGhlIGNvdW50ZXIgYXQgdGhlIGNvcnJlY3QgcGxhY2UuCisgICAgbUF1ZGlvRW5kcG9pbnQtPnNldERhdGFSZWFkQ291bnRlcihyZWFkQ291bnRlcik7CisgICAgbUF1ZGlvRW5kcG9pbnQtPnNldERhdGFXcml0ZUNvdW50ZXIocmVhZENvdW50ZXIpOworICAgIHJlc3VsdCA9IGNvbmZpZ3VyZURhdGFJbmZvcm1hdGlvbihtQ2FsbGJhY2tGcmFtZXMpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIGRhdGEgaW5mb3JtYXRpb24gYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LCBlcnJvcj0lZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgLy8gV3JpdGUgZGF0YSBmcm9tIHByZXZpb3VzIGRhdGEgYnVmZmVyIHRvIG5ldyBlbmRwb2ludC4KKyAgICBpZiAoYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBmcmFtZXNXcml0dGVuID0KKyAgICAgICAgICAgICAgICBtQXVkaW9FbmRwb2ludC0+d3JpdGUoYnVmZmVyLCBmdWxsRnJhbWVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gIT0gZnVsbEZyYW1lc0F2YWlsYWJsZSkgeworICAgICAgICBBTE9HVygiU29tZSBkYXRhIGxvc3QgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LCBmcmFtZXMgd3JpdHRlbjogJWQsICIKKyAgICAgICAgICAgICAgImZyYW1lcyB0byB3cml0ZTogJWQiLCBmcmFtZXNXcml0dGVuLCBmdWxsRnJhbWVzQXZhaWxhYmxlKTsKKyAgICB9CisgICAgLy8gUmVzZXQgcHJldmlvdXMgYnVmZmVyIHNpemUgYXMgaXQgbWF5IGJlIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LgorICAgIHNldEJ1ZmZlclNpemUocHJldmlvdXNCdWZmZXJTaXplKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogSXQgbm9ybWFsbHkgdGFrZXMgYWJvdXQgMjAtMzAgbXNlYyB0byBzdGFydCBhIHN0cmVhbSBvbiB0aGUgc2VydmVyLgogICogQnV0IHRoZSBmaXJzdCB0aW1lIGNhbiB0YWtlIGFzIG11Y2ggYXMgMjAwLTMwMCBtc2VjLiBUaGUgSFcKQEAgLTM3NSw4ICs0NDUsMTUgQEAKICAgICBwcmVwYXJlQnVmZmVyc0ZvclN0YXJ0KCk7IC8vIHRlbGwgc3ViY2xhc3NlcyB0byBnZXQgcmVhZHkKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5zdGFydFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgSU5WQUxJRF9IQU5ETEUsIHN0cmVhbSB3YXMgcHJvYmFibHkgc3RvbGVuIiwgX19mdW5jX18pOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX1NUQU5EQlkpIHsKKyAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBhdCBzdGFuZGJ5IG1vZGUuIE5lZWQgdG8gZXhpdCBzdGFuZGJ5IGJlZm9yZSBzdGFydGluZyB0aGUgc3RyZWFtLgorICAgICAgICByZXN1bHQgPSBleGl0U3RhbmRieV9sKCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5zdGFydFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgZXJyb3IgPSAlZCwgc3RyZWFtIHdhcyBwcm9iYWJseSBzdG9sZW4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKICAgICAgICAgLy8gU3RlYWxpbmcgd2FzIGFkZGVkIGluIFIuIENvZXJjZSByZXN1bHQgdG8gaW1wcm92ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CkBAIC0zOTYsNiArNDczLDcgQEAKICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVGhyZWFkX2wocGVyaW9kTmFub3MsIGFhdWRpb19jYWxsYmFja190aHJlYWRfcHJvYywgdGhpcyk7CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFRPRE8oYi8yMTQ2MDc2MzgpOiBEbyB3ZSB3YW50IHRvIHJvbGwgYmFjayB0byBvcmlnaW5hbCBzdGF0ZSBvciBrZWVwIGFzIGRpc2Nvbm5lY3RlZD8KICAgICAgICAgc2V0U3RhdGUob3JpZ2luYWxTdGF0ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CkBAIC00MjQsNyArNTAyLDcgQEAKICAgICBpZiAoaXNEYXRhQ2FsbGJhY2tTZXQoKQogICAgICAgICAgICAgJiYgKGlzQWN0aXZlKCkgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBqb2luVGhyZWFkX2woTlVMTCk7IC8vIG1heSB0ZW1wb3JhcmlseSB1bmxvY2sgbVN0cmVhbUxvY2sKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGpvaW5UaHJlYWRfbChudWxscHRyKTsgLy8gbWF5IHRlbXBvcmFyaWx5IHVubG9jayBtU3RyZWFtTG9jawogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSkgewogICAgICAgICAgICAgQUxPR0QoIiVzKCkgSU5WQUxJRF9IQU5ETEUsIHN0cmVhbSB3YXMgcHJvYmFibHkgc3RvbGVuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOwpAQCAtNTExLDcgKzU4OSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpnZXRUaW1lc3RhbXAoY2xvY2tpZF90IC8qY2xvY2tJZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggZmJlNGMxMy4uMjM2NzU3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMTE2LDcgKzExNiw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbihpbnQzMl90IHNlcnZlck1hcmdpbiA9IDApID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbihpbnQzMl90IHNlcnZlck1hcmdpbikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkge30KIApAQCAtMTg0LDkgKzE4NCwxNCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCB3cml0ZU5vd1dpdGhDb252ZXJzaW9uKGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcyk7CiAKKyAgICAvLyBFeGl0IHRoZSBzdHJlYW0gZnJvbSBzdGFuZGJ5LCB3aWxsIHJlY29uc3RydWN0IGRhdGEgcGF0aC4KKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnlfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKTsKKwogICAgIC8vIEFkanVzdCB0aW1pbmcgbW9kZWwgYmFzZWQgb24gdGltZXN0YW1wIGZyb20gc2VydmljZS4KICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAodWludDY0X3QgcG9zaXRpb24sIGludDY0X3QgdGltZSk7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlRGF0YUluZm9ybWF0aW9uKGludDMyX3QgY2FsbGJhY2tGcmFtZXMpOworCiAgICAgLy8gVGhyZWFkIG9uIG90aGVyIHNpZGUgb2YgRklGTyB3aWxsIGhhdmUgd2FrZXVwIGppdHRlci4KICAgICAvLyBCeSBkZWxheWluZyBzbGlnaHRseSB3ZSBjYW4gYXZvaWQgd2FraW5nIHVwIGJlZm9yZSBvdGhlciBzaWRlIGlzIHJlYWR5LgogICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgICBtV2FrZXVwRGVsYXlOYW5vczsgLy8gZGVsYXkgcGFzdCB0eXBpY2FsIHdha2V1cCBqaXR0ZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAyZGE1NDA2Li4xZWZjY2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC00Niw4ICs0Niw2IEBACiAKIH0KIAotQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6On5BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpIHt9Ci0KIHZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4pIHsKICAgICBpbnQ2NF90IHJlYWRDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpOwogICAgIGludDY0X3Qgd3JpdGVDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFXcml0ZUNvdW50ZXIoKSArIHNlcnZlck1hcmdpbjsKQEAgLTEwOSw3ICsxMDcsNyBAQAogICAgIGlmIChtTmVlZENhdGNoVXAuaXNSZXF1ZXN0ZWQoKSkgewogICAgICAgICAvLyBDYXRjaCBhbiBNTUFQIHBvaW50ZXIgdGhhdCBpcyBhbHJlYWR5IGFkdmFuY2luZy4KICAgICAgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGluaXRpYWwgdW5kZXJydW5zIGNhdXNlZCBieSBhIHNsb3cgY29sZCBzdGFydC4KLSAgICAgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKDAgLypzZXJ2ZXJNYXJnaW4qLyk7CiAgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOwogICAgIH0KIApAQCAtMjI4LDcgKzIyNiw3IEBACiB2b2lkICpBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Y2FsbGJhY2tMb29wKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwotICAgIGlmICghaXNEYXRhQ2FsbGJhY2tTZXQoKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gbnVsbHB0cjsKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CiAgICAgd2hpbGUgKG1DYWxsYmFja0VuYWJsZWQubG9hZCgpICYmIGlzQWN0aXZlKCkgJiYgKHJlc3VsdCA+PSAwKSkgewpAQCAtMjYwLDUgKzI1OCw1IEBACiAKICAgICBBTE9HRCgiY2FsbGJhY2tMb29wKCkgZXhpdGluZywgcmVzdWx0ID0gJWQsIGlzQWN0aXZlKCkgPSAlZCIsCiAgICAgICAgICAgcmVzdWx0LCAoaW50KSBpc0FjdGl2ZSgpKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCmluZGV4IDI1MWE3ZjIuLjg3MDE3ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaApAQCAtMjgsOCArMjgsOSBAQAogCiBjbGFzcyBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSA6IHB1YmxpYyBBdWRpb1N0cmVhbUludGVybmFsIHsKIHB1YmxpYzoKLSAgICBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwgYm9vbCBpblNlcnZpY2UgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCB+QXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKTsKKyAgICBleHBsaWNpdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluU2VydmljZSA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpID0gZGVmYXVsdDsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZWFkKHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKQEAgLTQ1LDcgKzQ2LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJPZmZzZXQgPSAwKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJPZmZzZXQpIG92ZXJyaWRlOwogCiAvKioKICAqIExvdyBsZXZlbCBkYXRhIHByb2Nlc3NpbmcgdGhhdCB3aWxsIG5vdCBibG9jay4gSXQgd2lsbCBqdXN0IHJlYWQgb3Igd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKaW5kZXggNzFiZGU5MC4uN2M3YTk2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcApAQCAtNDQsOCArNDQsNiBAQAogCiB9CiAKLUF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojp+QXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoKSB7fQotCiBjb25zdGV4cHIgaW50IGtSYW1wTVNlYyA9IDEwOyAvLyB0aW1lIHRvIGFwcGx5IGEgY2hhbmdlIGluIHZvbHVtZQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CkBAIC01NCw3ICs1MiwxMCBAQAogICAgICAgICByZXN1bHQgPSBtRmxvd0dyYXBoLmNvbmZpZ3VyZShnZXRGb3JtYXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1aXJlTW9ub0JsZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEF1ZGlvQmFsYW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkpOwogCiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CkBAIC0xMTUsNyArMTE2LDcgQEAKIH0KIAogdm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b25GbHVzaEZyb21TZXJ2ZXIoKSB7Ci0gICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oMCAvKnNlcnZlck1hcmdpbiovKTsKIH0KIAogLy8gV3JpdGUgdGhlIGRhdGEsIGJsb2NrIGlmIG5lZWRlZCBhbmQgdGltZW91dE1pbGxpcyA+IDAKQEAgLTIwMSwxMCArMjAyLDE4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBTbGVlcCB1bnRpbCB0aGUgcmVhZENvdW50ZXIgY2F0Y2hlcyB1cCBhbmQgd2Ugb25seSBoYXZlCi0gICAgICAgICAgICAgICAgLy8gdGhlIGdldEJ1ZmZlclNpemUoKSBmcmFtZXMgb2YgZGF0YSBzaXR0aW5nIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICAgICAgaW50NjRfdCBuZXh0UmVhZFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFXcml0ZUNvdW50ZXIoKSAtIGdldEJ1ZmZlclNpemUoKTsKLSAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShuZXh0UmVhZFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgd2hlbiB0aGVyZSB3aWxsIGJlIHJvb20gYXZhaWxhYmxlIHRvIHdyaXRlIHRvIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFwcEJ1ZmZlclNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBlbmRwb2ludEJ1ZmZlclNpemUgdGhlbgorICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaGF2ZSByb29tIHRvIHdyaXRlIGRhdGEgYmV5b25kIHRoZSBhcHBCdWZmZXJTaXplLgorICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgYSB0ZWNobmlxdWUgdXNlZCB0byByZWR1Y2UgZ2xpdGNoZXMgd2l0aG91dCBhZGRpbmcgbGF0ZW5jeS4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFwcEJ1ZmZlclNpemUgPSBnZXRCdWZmZXJTaXplKCk7CisgICAgICAgICAgICAgICAgLy8gVGhlIGVuZHBvaW50IGJ1ZmZlciBzaXplIGlzIHNldCB0byB0aGUgbWF4aW11bSB0aGF0IGNhbiBiZSB3cml0dGVuLgorICAgICAgICAgICAgICAgIC8vIElmIHdlIHVzZSBpdCB0aGVuIHdlIG11c3QgY2FydmUgb3V0IHNvbWUgcm9vbSB0byB3cml0ZSBkYXRhIHdoZW4gd2Ugd2FrZSB1cC4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVuZEJ1ZmZlclNpemUgPSBtQXVkaW9FbmRwb2ludC0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJlc3RCdWZmZXJTaXplID0gc3RkOjptaW4oYXBwQnVmZmVyU2l6ZSwgZW5kQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXRSZWFkUG9zaXRpb24gPSBtQXVkaW9FbmRwb2ludC0+Z2V0RGF0YVdyaXRlQ291bnRlcigpIC0gYmVzdEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgd2FrZVRpbWUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUodGFyZ2V0UmVhZFBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0yODEsNyArMjkwLDcgQEAKICAgICBBTE9HRCgiJXMoKSBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+Pj4iLCBfX2Z1bmNfXyk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Ci0gICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWlzRGF0YUNhbGxiYWNrU2V0KCkpIHJldHVybiBudWxscHRyOwogICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQobUNhbGxiYWNrRnJhbWVzKTsKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CkBAIC0zMDksNyArMzE4LDcgQEAKIAogICAgIEFMT0dEKCIlcygpIGV4aXRpbmcsIHJlc3VsdCA9ICVkLCBpc0FjdGl2ZSgpID0gJWQgPDw8PDw8PDw8PDw8PDwiLAogICAgICAgICAgIF9fZnVuY19fLCByZXN1bHQsIChpbnQpIGlzQWN0aXZlKCkpOwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKaW5kZXggMDNjOTU3ZC4uZTc2MTgwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCkBAIC0zMCw4ICszMCw5IEBACiAKIGNsYXNzIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5IDogcHVibGljIEF1ZGlvU3RyZWFtSW50ZXJuYWwgewogcHVibGljOgotICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLCBib29sIGluU2VydmljZSA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUludGVybmFsUGxheSgpOworICAgIGV4cGxpY2l0IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5TZXJ2aWNlID0gZmFsc2UpOworICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCkgPSBkZWZhdWx0OwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSBvdmVycmlkZTsKIApAQCAtNjYsNyArNjcsNyBAQAogCiAgICAgdm9pZCBwcmVwYXJlQnVmZmVyc0ZvclN0YXJ0KCkgb3ZlcnJpZGU7CiAKLSAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4gPSAwKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4pIG92ZXJyaWRlOwogCiAgICAgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAppbmRleCBmMGRjZDQ0Li42OTIxMjcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKQEAgLTQzLDE0ICs0Myw3IEBACiAvLyBhbmQgZHVtcGVkIHRvIHRoZSBsb2cgd2hlbiB0aGUgc3RyZWFtIGlzIHN0b3BwZWQuCiAKIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6SXNvY2hyb25vdXNDbG9ja01vZGVsKCkKLSAgICAgICAgOiBtTWFya2VyRnJhbWVQb3NpdGlvbigwKQotICAgICAgICAsIG1NYXJrZXJOYW5vVGltZSgwKQotICAgICAgICAsIG1TYW1wbGVSYXRlKDQ4MDAwKQotICAgICAgICAsIG1GcmFtZXNQZXJCdXJzdCg0OCkKLSAgICAgICAgLCBtQnVyc3RQZXJpb2ROYW5vcygwKSAvLyB0aGlzIHdpbGwgYmUgdXBkYXRlZCBiZWZvcmUgdXNlCi0gICAgICAgICwgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vcygwKQotICAgICAgICAsIG1MYXRlbmVzc0ZvckRyaWZ0TmFub3Moa0luaXRpYWxMYXRlbmVzc0ZvckRyaWZ0TmFub3MpCi0gICAgICAgICwgbVN0YXRlKFNUQVRFX1NUT1BQRUQpCisgICAgICAgIDogbUxhdGVuZXNzRm9yRHJpZnROYW5vcyhrSW5pdGlhbExhdGVuZXNzRm9yRHJpZnROYW5vcykKIHsKICAgICBpZiAoKEFBdWRpb1Byb3BlcnR5X2dldExvZ01hc2soKSAmIEFBVURJT19MT0dfQ0xPQ0tfTU9ERUxfSElTVE9HUkFNKSAhPSAwKSB7CiAgICAgICAgIG1IaXN0b2dyYW1NaWNyb3MgPSBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbT4oa0hpc3RvZ3JhbUJpbkNvdW50LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA2MjgwMDEzLi4zMDA3MjM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMTQ5LDE2ICsxNDksMTYgQEAKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrSGlzdG9ncmFtQmluV2lkdGhNaWNyb3MgPSA1MDsKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrSGlzdG9ncmFtQmluQ291bnQgPSAxMjg7CiAKLSAgICBpbnQ2NF90ICAgICAgICAgICAgIG1NYXJrZXJGcmFtZVBvc2l0aW9uOyAvLyBFc3RpbWF0ZWQgSFcgcG9zaXRpb24uCi0gICAgaW50NjRfdCAgICAgICAgICAgICBtTWFya2VyTmFub1RpbWU7ICAgICAgLy8gRXN0aW1hdGVkIEhXIHRpbWUuCi0gICAgaW50MzJfdCAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90ICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdDsgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRyYW5zZmVycmVkIGF0IG9uZSB0aW1lLgotICAgIGludDMyX3QgICAgICAgICAgICAgbUJ1cnN0UGVyaW9kTmFub3M7ICAgIC8vIFRpbWUgYmV0d2VlbiBIVyBidXJzdHMuCisgICAgaW50NjRfdCAgICAgICAgICAgICBtTWFya2VyRnJhbWVQb3NpdGlvbnswfTsgLy8gRXN0aW1hdGVkIEhXIHBvc2l0aW9uLgorICAgIGludDY0X3QgICAgICAgICAgICAgbU1hcmtlck5hbm9UaW1lezB9OyAgICAgIC8vIEVzdGltYXRlZCBIVyB0aW1lLgorICAgIGludDMyX3QgICAgICAgICAgICAgbVNhbXBsZVJhdGV7NDgwMDB9OworICAgIGludDMyX3QgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ezQ4fTsgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgdHJhbnNmZXJyZWQgYXQgb25lIHRpbWUuCisgICAgaW50MzJfdCAgICAgICAgICAgICBtQnVyc3RQZXJpb2ROYW5vc3swfTsgICAgLy8gVGltZSBiZXR3ZWVuIEhXIGJ1cnN0cy4KICAgICAvLyBJbmNsdWRlcyBtQnVyc3RQZXJpb2ROYW5vcyBiZWNhdXNlIHdlIHNhbXBsZSByYW5kb21seSBvdmVyIHRpbWUuCi0gICAgaW50MzJfdCAgICAgICAgICAgICBtTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zOworICAgIGludDMyX3QgICAgICAgICAgICAgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vc3swfTsKICAgICAvLyBUaHJlc2hvbGQgZm9yIGxhdGVuZXNzIHRoYXQgdHJpZ2dlcnMgYSBkcmlmdCBsYXRlciBpbiB0aW1lLgogICAgIGludDMyX3QgICAgICAgICAgICAgbUxhdGVuZXNzRm9yRHJpZnROYW5vczsKLSAgICBjbG9ja19tb2RlbF9zdGF0ZV90IG1TdGF0ZTsgICAgICAgICAgICAgICAvLyBTdGF0ZSBtYWNoaW5lIGhhbmRsZXMgc3RhcnR1cCBzZXF1ZW5jZS4KKyAgICBjbG9ja19tb2RlbF9zdGF0ZV90IG1TdGF0ZXtTVEFURV9TVE9QUEVEfTsgICAvLyBTdGF0ZSBtYWNoaW5lIGhhbmRsZXMgc3RhcnR1cCBzZXF1ZW5jZS4KIAogICAgIGludDMyX3QgICAgICAgICAgICAgbVRpbWVzdGFtcENvdW50ID0gMDsgIC8vIEZvciBsb2dnaW5nLgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCBkMTAzYWNhLi45MGZmNGE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTEyOCw3ICsxMjgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOworICAgIGNvbnN0IGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFBdWRpb0NvbnZlcnRfY2hhbm5lbENvdW50VG9NYXNrKHNhbXBsZXNQZXJGcmFtZSk7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2spOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTE2Niw2ICsxNjcsMTggQEAKICAgICBzdHJlYW1CdWlsZGVyLT5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CiB9CiAKK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3Qgc3BhdGlhbGl6YXRpb25CZWhhdmlvcikgeworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldFNwYXRpYWxpemF0aW9uQmVoYXZpb3Ioc3BhdGlhbGl6YXRpb25CZWhhdmlvcik7Cit9CisKK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElzQ29udGVudFNwYXRpYWxpemVkKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpIHsKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRJc0NvbnRlbnRTcGF0aWFsaXplZChpc1NwYXRpYWxpemVkKTsKK30KKwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwpAQCAtMjIzLDYgKzIzNiwxMyBAQAogICAgIHN0cmVhbUJ1aWxkZXItPnNldEZyYW1lc1BlckRhdGFDYWxsYmFjayhmcmFtZXMpOwogfQogCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsTWFzayhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKQoreworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKTsKK30KKwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW0qKiBzdHJlYW1QdHIpCiB7CkBAIC0zMzIsNyArMzUyLDggQEAKIHsKIAogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT53YWl0Rm9yU3RhdGVDaGFuZ2UoaW5wdXRTdGF0ZSwgbmV4dFN0YXRlLCB0aW1lb3V0TmFub3NlY29uZHMpOworICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiBzcEF1ZGlvU3RyZWFtKGF1ZGlvU3RyZWFtKTsKKyAgICByZXR1cm4gc3BBdWRpb1N0cmVhbS0+d2FpdEZvclN0YXRlQ2hhbmdlKGlucHV0U3RhdGUsIG5leHRTdGF0ZSwgdGltZW91dE5hbm9zZWNvbmRzKTsKIH0KIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00OTUsNiArNTE2LDE5IEBACiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRDb250ZW50VHlwZSgpOwogfQogCitBQVVESU9fQVBJIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IEFBdWRpb1N0cmVhbV9nZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKAorICAgICAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcigpOworfQorCitBQVVESU9fQVBJIGJvb2wgQUF1ZGlvU3RyZWFtX2lzQ29udGVudFNwYXRpYWxpemVkKEFBdWRpb1N0cmVhbSogc3RyZWFtKQoreworICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5pc0NvbnRlbnRTcGF0aWFsaXplZCgpOworfQorCiBBQVVESU9fQVBJIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKQEAgLTU2MiwzICs1OTYsMTEgQEAKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+aXNQcml2YWN5U2Vuc2l0aXZlKCk7CiB9CisKK0FBVURJT19BUEkgYWF1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsTWFzayhBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIGNvbnN0IGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpOworICAgIC8vIERvIG5vdCByZXR1cm4gY2hhbm5lbCBpbmRleCBtYXNrcyBhcyB0aGV5IGFyZSBub3QgcHVibGljLgorICAgIHJldHVybiBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGNoYW5uZWxNYXNrKSA/IEFBVURJT19VTlNQRUNJRklFRCA6IGNoYW5uZWxNYXNrOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCmluZGV4IGFjZmFjMjQuLjhiN2I3NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKQEAgLTMwLDkgKzMwLDYgQEAKIC8vIEhETUkgc3VwcG9ydHMgdXAgdG8gMzIgY2hhbm5lbHMgYXQgMTUzNjAwMCBIei4KICNkZWZpbmUgU0FNUExFX1JBVEVfSFpfTUFYICAgICAgICAgICAxNjAwMDAwCiAKLUFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQotQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6fkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQotCiB2b2lkIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OmNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKSB7CiAgICAgbVNhbXBsZXNQZXJGcmFtZSAgICAgID0gb3RoZXIubVNhbXBsZXNQZXJGcmFtZTsKICAgICBtU2FtcGxlUmF0ZSAgICAgICAgICAgPSBvdGhlci5tU2FtcGxlUmF0ZTsKQEAgLTQ0LDExICs0MSwxNCBAQAogICAgIG1CdWZmZXJDYXBhY2l0eSAgICAgICA9IG90aGVyLm1CdWZmZXJDYXBhY2l0eTsKICAgICBtVXNhZ2UgICAgICAgICAgICAgICAgPSBvdGhlci5tVXNhZ2U7CiAgICAgbUNvbnRlbnRUeXBlICAgICAgICAgID0gb3RoZXIubUNvbnRlbnRUeXBlOworICAgIG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yID0gb3RoZXIubVNwYXRpYWxpemF0aW9uQmVoYXZpb3I7CisgICAgbUlzQ29udGVudFNwYXRpYWxpemVkID0gb3RoZXIubUlzQ29udGVudFNwYXRpYWxpemVkOwogICAgIG1JbnB1dFByZXNldCAgICAgICAgICA9IG90aGVyLm1JbnB1dFByZXNldDsKICAgICBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBvdGhlci5tQWxsb3dlZENhcHR1cmVQb2xpY3k7CiAgICAgbUlzUHJpdmFjeVNlbnNpdGl2ZSAgID0gb3RoZXIubUlzUHJpdmFjeVNlbnNpdGl2ZTsKICAgICBtT3BQYWNrYWdlTmFtZSAgICAgICAgPSBvdGhlci5tT3BQYWNrYWdlTmFtZTsKICAgICBtQXR0cmlidXRpb25UYWcgICAgICAgPSBvdGhlci5tQXR0cmlidXRpb25UYWc7CisgICAgbUNoYW5uZWxNYXNrICAgICAgICAgID0gb3RoZXIubUNoYW5uZWxNYXNrOwogfQogCiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IGlzRm9ybWF0VmFsaWQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CkBAIC0xNjAsNiArMTYwLDE5IEBACiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CiAKKyAgICBzd2l0Y2ggKG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIEFBVURJT19TUEFUSUFMSVpBVElPTl9CRUhBVklPUl9BVVRPOgorICAgICAgICBjYXNlIEFBVURJT19TUEFUSUFMSVpBVElPTl9CRUhBVklPUl9ORVZFUjoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoInNwYXRpYWxpemF0aW9uIGJlaGF2aW9yIG5vdCB2YWxpZCA9ICVkIiwgbVNwYXRpYWxpemF0aW9uQmVoYXZpb3IpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgfQorCisgICAgLy8gbm8gdmFsaWRhdGlvbiByZXF1aXJlZCBmb3IgbUlzQ29udGVudFNwYXRpYWxpemVkCisKICAgICBzd2l0Y2ggKG1JbnB1dFByZXNldCkgewogICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUM6CkBAIC0xODcsNyArMjAwLDk0IEBACiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gQUFVRElPX09LOworICAgIHJldHVybiB2YWxpZGF0ZUNoYW5uZWxNYXNrKCk7Cit9CisKK2Jvb2wgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6dmFsaWRhdGVDaGFubmVsTWFzaygpIGNvbnN0IHsKKyAgICBpZiAobUNoYW5uZWxNYXNrID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0KKworICAgIGlmIChtQ2hhbm5lbE1hc2sgJiBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVgpIHsKKyAgICAgICAgc3dpdGNoIChtQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180OgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzU6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183OgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzg6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xODoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiSW52YWxpZCBjaGFubmVsIGluZGV4IG1hc2sgJSN4IiwgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBzd2l0Y2ggKG1DaGFubmVsTWFzaykgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9NT05POgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9TVEVSRU86CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0ZST05UX0JBQ0s6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzJQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCwgSU4iLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobUNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX01PTk86CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1NURVJFTzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfVFJJOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9UUklfQkFDSzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMFBPSU5UMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMFBPSU5UMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfUVVBRDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfUVVBRF9TSURFOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9TVVJST1VORDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfUEVOVEE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDFfU0lERToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UNDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNlBPSU5UMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfN1BPSU5UMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfN1BPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfN1BPSU5UMVBPSU5UNDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4LiBPVVQiLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjpkdW1wKCkgY29uc3QgewpAQCAtMTk1LDEyICsyOTUsMTUgQEAKICAgICBBTE9HRCgibVNlc3Npb25JZCAgICAgICAgICAgID0gJTZkIiwgbVNlc3Npb25JZCk7CiAgICAgQUxPR0QoIm1TYW1wbGVSYXRlICAgICAgICAgICA9ICU2ZCIsIG1TYW1wbGVSYXRlKTsKICAgICBBTE9HRCgibVNhbXBsZXNQZXJGcmFtZSAgICAgID0gJTZkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CisgICAgQUxPR0QoIm1DaGFubmVsTWFzayAgICAgICAgICA9ICUjeCIsIG1DaGFubmVsTWFzayk7CiAgICAgQUxPR0QoIm1TaGFyaW5nTW9kZSAgICAgICAgICA9ICU2ZCIsIChpbnQpbVNoYXJpbmdNb2RlKTsKICAgICBBTE9HRCgibUF1ZGlvRm9ybWF0ICAgICAgICAgID0gJTZkIiwgKGludCltQXVkaW9Gb3JtYXQpOwogICAgIEFMT0dEKCJtRGlyZWN0aW9uICAgICAgICAgICAgPSAlNmQiLCBtRGlyZWN0aW9uKTsKICAgICBBTE9HRCgibUJ1ZmZlckNhcGFjaXR5ICAgICAgID0gJTZkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICBBTE9HRCgibVVzYWdlICAgICAgICAgICAgICAgID0gJTZkIiwgbVVzYWdlKTsKICAgICBBTE9HRCgibUNvbnRlbnRUeXBlICAgICAgICAgID0gJTZkIiwgbUNvbnRlbnRUeXBlKTsKKyAgICBBTE9HRCgibVNwYXRpYWxpemF0aW9uQmVoYXZpb3IgPSAlNmQiLCBtU3BhdGlhbGl6YXRpb25CZWhhdmlvcik7CisgICAgQUxPR0QoIm1Jc0NvbnRlbnRTcGF0aWFsaXplZCA9ICVzIiwgbUlzQ29udGVudFNwYXRpYWxpemVkID8gInRydWUiIDogImZhbHNlIik7CiAgICAgQUxPR0QoIm1JbnB1dFByZXNldCAgICAgICAgICA9ICU2ZCIsIG1JbnB1dFByZXNldCk7CiAgICAgQUxPR0QoIm1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9ICU2ZCIsIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSk7CiAgICAgQUxPR0QoIm1Jc1ByaXZhY3lTZW5zaXRpdmUgICA9ICVzIiwgbUlzUHJpdmFjeVNlbnNpdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggNTczNzA1Mi4uY2I5OThiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC0yNiw4ICsyNiw4IEBACiAKIGNsYXNzIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgotICAgIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCk7CisgICAgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycygpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCkgPSBkZWZhdWx0OwogCiAgICAgaW50MzJfdCBnZXREZXZpY2VJZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EZXZpY2VJZDsKQEAgLTQ5LDEzICs0OSw2IEBACiAgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYWxzbyBrbm93biBhcyBjaGFubmVsQ291bnQuCi0gICAgICovCi0gICAgdm9pZCBzZXRTYW1wbGVzUGVyRnJhbWUoaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpIHsKLSAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKLSAgICB9Ci0KICAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQXVkaW9Gb3JtYXQ7CiAgICAgfQpAQCAtMTA0LDYgKzk3LDIyIEBACiAgICAgICAgIG1Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwogICAgIH0KIAorICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IGdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3BhdGlhbGl6YXRpb25CZWhhdmlvcjsKKyAgICB9CisKKyAgICB2b2lkIHNldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3Qgc3BhdGlhbGl6YXRpb25CZWhhdmlvcikgeworICAgICAgICBtU3BhdGlhbGl6YXRpb25CZWhhdmlvciA9IHNwYXRpYWxpemF0aW9uQmVoYXZpb3I7CisgICAgfQorCisgICAgYm9vbCBpc0NvbnRlbnRTcGF0aWFsaXplZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc0NvbnRlbnRTcGF0aWFsaXplZDsKKyAgICB9CisKKyAgICB2b2lkIHNldElzQ29udGVudFNwYXRpYWxpemVkKGJvb2wgaXNTcGF0aWFsaXplZCkgeworICAgICAgICBtSXNDb250ZW50U3BhdGlhbGl6ZWQgPSBpc1NwYXRpYWxpemVkOworICAgIH0KKwogICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBnZXRJbnB1dFByZXNldCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1JbnB1dFByZXNldDsKICAgICB9CkBAIC0xNDEsNyArMTUwLDcgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiByZWV4YW1pbmUgaWYgSWRlbnRpdHkgY2FuIGJlIHVzZWQKLSAgICB2b2lkIHNldE9wUGFja2FnZU5hbWUoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gb3BQYWNrYWdlTmFtZSkgeworICAgIHZvaWQgc2V0T3BQYWNrYWdlTmFtZShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgb3BQYWNrYWdlTmFtZSkgewogICAgICAgICBtT3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CiAgICAgfQogCkBAIC0xNDksMTAgKzE1OCwxOSBAQAogICAgICAgICByZXR1cm4gbUF0dHJpYnV0aW9uVGFnOwogICAgIH0KIAotICAgIHZvaWQgc2V0QXR0cmlidXRpb25UYWcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gYXR0cmlidXRpb25UYWcpIHsKKyAgICB2b2lkIHNldEF0dHJpYnV0aW9uVGFnKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBhdHRyaWJ1dGlvblRhZykgewogICAgICAgICBtQXR0cmlidXRpb25UYWcgPSBhdHRyaWJ1dGlvblRhZzsKICAgICB9CiAKKyAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0Q2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbE1hc2s7CisgICAgfQorCisgICAgdm9pZCBzZXRDaGFubmVsTWFzayhhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9Db252ZXJ0X2NoYW5uZWxNYXNrVG9Db3VudChjaGFubmVsTWFzayk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBieXRlcyBwZXIgZnJhbWUgb2YgZ2V0Rm9ybWF0KCkKICAgICAgKi8KQEAgLTE3MSw2ICsxODksOCBAQAogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiBwcml2YXRlOgorICAgIGJvb2wgdmFsaWRhdGVDaGFubmVsTWFzaygpIGNvbnN0OworCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CkBAIC0xNzksNiArMTk5LDkgQEAKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICAgICAgbUNvbnRlbnRUeXBlICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNDb250ZW50U3BhdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICAgICAgIG1JbnB1dFByZXNldCAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IEFBVURJT19VTlNQRUNJRklFRDsKQEAgLTE4Niw2ICsyMDksNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzUHJpdmFjeVNlbnNpdGl2ZSAgID0gZmFsc2U7CiAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gICAgICBtT3BQYWNrYWdlTmFtZSAgICAgICAgPSB7fTsKICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiAgICAgIG1BdHRyaWJ1dGlvblRhZyAgICAgICA9IHt9OworICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCAgICAgICAgICAgbUNoYW5uZWxNYXNrICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5oCmluZGV4IDFlODhkMTUuLjZjMjI3NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5oCkBAIC0zMSw3ICszMSw4IEBACiBjb25zdCBjaGFyKiBBdWRpb0dsb2JhbF9jb252ZXJ0UmVzdWx0VG9UZXh0KGFhdWRpb19yZXN1bHRfdCByZXR1cm5Db2RlKTsKIGNvbnN0IGNoYXIqIEF1ZGlvR2xvYmFsX2NvbnZlcnRTaGFyaW5nTW9kZVRvVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSk7CiBjb25zdCBjaGFyKiBBdWRpb0dsb2JhbF9jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKTsKLX0KKworfSAvLyBuYW1lc3BhY2UgYWF1ZGlvCiAKICNlbmRpZiAgLy8gQUFVRElPX0FVRElPR0xPQkFMX0gKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggMDlkOTUzNS4uMDZmMDViMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC03Niw2ICs3Niw3IEBACiAgICAgLy8gQ29weSBwYXJhbWV0ZXJzIGZyb20gdGhlIEJ1aWxkZXIgYmVjYXVzZSB0aGUgQnVpbGRlciBtYXkgYmUgZGVsZXRlZCBhZnRlciB0aGlzIGNhbGwuCiAgICAgLy8gVE9ETyBBdWRpb1N0cmVhbSBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZiBBdWRpb1N0cmVhbVBhcmFtZXRlcnMKICAgICBtU2FtcGxlc1BlckZyYW1lID0gYnVpbGRlci5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBidWlsZGVyLmdldENoYW5uZWxNYXNrKCk7CiAgICAgbVNhbXBsZVJhdGUgPSBidWlsZGVyLmdldFNhbXBsZVJhdGUoKTsKICAgICBtRGV2aWNlSWQgPSBidWlsZGVyLmdldERldmljZUlkKCk7CiAgICAgbUZvcm1hdCA9IGJ1aWxkZXIuZ2V0Rm9ybWF0KCk7CkBAIC05MSw2ICs5MiwxMiBAQAogICAgIGlmIChtQ29udGVudFR5cGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIG1Db250ZW50VHlwZSA9IEFBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CiAgICAgfQorICAgIG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yID0gYnVpbGRlci5nZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKCk7CisgICAgLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgcHJvcGVydGllcywgbm90ZSBVTlNQRUNJRklFRCBpcyB0aGUgc2FtZSBhcyBBVVRPCisgICAgaWYgKG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBtU3BhdGlhbGl6YXRpb25CZWhhdmlvciA9IEFBVURJT19TUEFUSUFMSVpBVElPTl9CRUhBVklPUl9BVVRPOworICAgIH0KKyAgICBtSXNDb250ZW50U3BhdGlhbGl6ZWQgPSBidWlsZGVyLmlzQ29udGVudFNwYXRpYWxpemVkKCk7CiAgICAgbUlucHV0UHJlc2V0ID0gYnVpbGRlci5nZXRJbnB1dFByZXNldCgpOwogICAgIGlmIChtSW5wdXRQcmVzZXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIG1JbnB1dFByZXNldCA9IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT047CkBAIC01OTUsNiArNjAyLDcgQEAKIAogdm9pZCBBdWRpb1N0cmVhbTo6c2V0RHVja0FuZE11dGVWb2x1bWUoZmxvYXQgZHVja0FuZE11dGVWb2x1bWUpIHsKICAgICBBTE9HRCgiJXMoKSB0byAlZiIsIF9fZnVuY19fLCBkdWNrQW5kTXV0ZVZvbHVtZSk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIG1EdWNrQW5kTXV0ZVZvbHVtZSA9IGR1Y2tBbmRNdXRlVm9sdW1lOwogICAgIGRvU2V0Vm9sdW1lKCk7IC8vIGFwcGx5IHRoaXMgY2hhbmdlCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDk4MzVjOGMuLjVmYjQ1MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC0yNTMsNiArMjUzLDE0IEBACiAgICAgICAgIHJldHVybiBtQ29udGVudFR5cGU7CiAgICAgfQogCisgICAgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3QgZ2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yOworICAgIH0KKworICAgIGJvb2wgaXNDb250ZW50U3BhdGlhbGl6ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNDb250ZW50U3BhdGlhbGl6ZWQ7CisgICAgfQorCiAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGdldElucHV0UHJlc2V0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUlucHV0UHJlc2V0OwogICAgIH0KQEAgLTI2OSw4ICsyNzcsMTcgQEAKICAgICAgICAgcmV0dXJuIG1Jc1ByaXZhY3lTZW5zaXRpdmU7CiAgICAgfQogCisgICAgYm9vbCBnZXRSZXF1aXJlTW9ub0JsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlcXVpcmVNb25vQmxlbmQ7CisgICAgfQorCisgICAgZmxvYXQgZ2V0QXVkaW9CYWxhbmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUF1ZGlvQmFsYW5jZTsKKyAgICB9CisKICAgICAvKioKLSAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldEZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCisgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldENoYW5uZWxNYXNrKCkgYW5kIHNldEZvcm1hdCgpCisgICAgICogaGF2ZSBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lICogZ2V0Qnl0ZXNQZXJTYW1wbGUoKTsKQEAgLTI4NCw3ICszMDEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRTYW1wbGVzUGVyRnJhbWUoKSBhbmQgc2V0RGV2aWNlRm9ybWF0KCkgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0Q2hhbm5lbE1hc2soKSBhbmQgc2V0RGV2aWNlRm9ybWF0KCkgaGF2ZSBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0RGV2aWNlRm9ybWF0KCkpOwpAQCAtMzE4LDYgKzMzNSwxNSBAQAogICAgICAgICByZXR1cm4gbUZyYW1lc1BlckRhdGFDYWxsYmFjazsKICAgICB9CiAKKyAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0Q2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbE1hc2s7CisgICAgfQorCisgICAgdm9pZCBzZXRDaGFubmVsTWFzayhhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9Db252ZXJ0X2NoYW5uZWxNYXNrVG9Db3VudChjaGFubmVsTWFzayk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIGlmIGRhdGEgY2FsbGJhY2sgaGFzIGJlZW4gc3BlY2lmaWVkCiAgICAgICovCkBAIC00MjksNyArNDU1LDcgQEAKICAgICAvLyBQbGF5ZXJCYXNlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnRyb2wgdGhlIHN0cmVhbSB2b2x1bWUuCiAgICAgY2xhc3MgTXlQbGF5ZXJCYXNlIDogcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgTXlQbGF5ZXJCYXNlKCkge307CisgICAgICAgIE15UGxheWVyQmFzZSgpID0gZGVmYXVsdDsKIAogICAgICAgICB2aXJ0dWFsIH5NeVBsYXllckJhc2UoKSA9IGRlZmF1bHQ7CiAKQEAgLTQ5NSwxMSArNTIxLDYgQEAKICAgICB9CiAKICAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KLSAgICB2b2lkIHNldFNhbXBsZXNQZXJGcmFtZShpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkgewotICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gc2FtcGxlc1BlckZyYW1lOwotICAgIH0KLQotICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgIHZvaWQgc2V0RnJhbWVzUGVyQnVyc3QoaW50MzJfdCBmcmFtZXNQZXJCdXJzdCkgewogICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJCdXJzdDsKICAgICB9CkBAIC01NjMsNyArNTg0LDcgQEAKICAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCiAgICAgICogQHJldHVybiBvcmlnaW5hbCBwb2ludGVyIG9yIHRoZSBjb252ZXJzaW9uIGJ1ZmZlcgogICAgICAqLwotICAgIHZpcnR1YWwgY29uc3Qgdm9pZCAqIG1heWJlQ29udmVydERldmljZURhdGEoY29uc3Qgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHZpcnR1YWwgY29uc3Qgdm9pZCAqIG1heWJlQ29udmVydERldmljZURhdGEoY29uc3Qgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IC8qbnVtRnJhbWVzKi8pIHsKICAgICAgICAgcmV0dXJuIGF1ZGlvRGF0YTsKICAgICB9CiAKQEAgLTU4OSw2ICs2MTAsMTQgQEAKICAgICAgICAgbUNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CiAgICAgfQogCisgICAgdm9pZCBzZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpIHsKKyAgICAgICAgbVNwYXRpYWxpemF0aW9uQmVoYXZpb3IgPSBzcGF0aWFsaXphdGlvbkJlaGF2aW9yOworICAgIH0KKworICAgIHZvaWQgc2V0SXNDb250ZW50U3BhdGlhbGl6ZWQoYm9vbCBpc0NvbnRlbnRTcGF0aWFsaXplZCkgeworICAgICAgICBtSXNDb250ZW50U3BhdGlhbGl6ZWQgPSBpc0NvbnRlbnRTcGF0aWFsaXplZDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KQEAgLTYxMCw2ICs2MzksMjAgQEAKICAgICAgICAgbUlzUHJpdmFjeVNlbnNpdGl2ZSA9IHByaXZhY3lTZW5zaXRpdmU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1aXJlTW9ub0JsZW5kKGJvb2wgcmVxdWlyZU1vbm9CbGVuZCkgeworICAgICAgICBtUmVxdWlyZU1vbm9CbGVuZCA9IHJlcXVpcmVNb25vQmxlbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgICovCisgICAgdm9pZCBzZXRBdWRpb0JhbGFuY2UoZmxvYXQgYXVkaW9CYWxhbmNlKSB7CisgICAgICAgIG1BdWRpb0JhbGFuY2UgPSBhdWRpb0JhbGFuY2U7CisgICAgfQorCiAgICAgc3RkOjpzdHJpbmcgbU1ldHJpY3NJZDsgLy8gc2V0IG9uY2UgZHVyaW5nIG9wZW4oKQogCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgbVN0cmVhbUxvY2s7CkBAIC02MzMsNiArNjc2LDcgQEAKIAogICAgIC8vIFRoZXNlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgb3BlbigpLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCAgICAgICBtQ2hhbm5lbE1hc2sgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgIG1TaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwpAQCAtNjQ1LDkgKzY4OSwxMyBAQAogCiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3QgbVNwYXRpYWxpemF0aW9uQmVoYXZpb3IgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0NvbnRlbnRTcGF0aWFsaXplZCA9IGZhbHNlOwogICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNQcml2YWN5U2Vuc2l0aXZlID0gZmFsc2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1SZXF1aXJlTW9ub0JsZW5kID0gZmFsc2U7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0JhbGFuY2UgPSAwOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKaW5kZXggZTAxNTU5Mi4uYTEwMGFhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKQEAgLTIwLDkgKzIwLDE0IEBACiAKICNpbmNsdWRlIDxuZXc+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW9UZXN0aW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeVR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKQEAgLTM1LDYgKzQwLDEwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3k7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbzsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlOworCiAjZGVmaW5lIEFBVURJT19NTUFQX1BPTElDWV9ERUZBVUxUICAgICAgICAgICAgIEFBVURJT19QT0xJQ1lfTkVWRVIKICNkZWZpbmUgQUFVRElPX01NQVBfRVhDTFVTSVZFX1BPTElDWV9ERUZBVUxUICAgQUFVRElPX1BPTElDWV9ORVZFUgogCkBAIC01MywxNiArNjIsMTAgQEAKIC8qCiAgKiBBdWRpb1N0cmVhbUJ1aWxkZXIKICAqLwotQXVkaW9TdHJlYW1CdWlsZGVyOjpBdWRpb1N0cmVhbUJ1aWxkZXIoKSB7Ci19Ci0KLUF1ZGlvU3RyZWFtQnVpbGRlcjo6fkF1ZGlvU3RyZWFtQnVpbGRlcigpIHsKLX0KLQogc3RhdGljIGFhdWRpb19yZXN1bHRfdCBidWlsZGVyX2NyZWF0ZVN0cmVhbShhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJ5TU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+ICZzdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IC8qc2hhcmluZ01vZGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0cnlNTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gJnN0cmVhbSkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewpAQCAtOTIsNiArOTUsMzcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCituYW1lc3BhY2UgeworCithYXVkaW9fcG9saWN5X3QgYWlkbDJsZWdhY3lfYWF1ZGlvX3BvbGljeShBdWRpb01NYXBQb2xpY3kgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeTo6TkVWRVI6CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1BPTElDWV9ORVZFUjsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3k6OkFVVE86CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1BPTElDWV9BVVRPOworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeTo6QUxXQVlTOgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19QT0xJQ1lfQUxXQVlTOworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeTo6VU5TUEVDSUZJRUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIH0KK30KKworLy8gVGhlIGFhdWRpbyBwb2xpY3kgd2lsbCBiZSBBTFdBWVMsIE5FVkVSLCBVTlNQRUNJRklFRCBvbmx5IHdoZW4gYWxsIHBvbGljeSBpbmZvIGFyZQorLy8gQUxXQVlTLCBORVZFUiBvciBVTlNQRUNJRklFRC4gT3RoZXJ3aXNlLCB0aGUgYWF1ZGlvIHBvbGljeSB3aWxsIGJlIEFVVE8uCithYXVkaW9fcG9saWN5X3QgZ2V0QUF1ZGlvUG9saWN5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiYgcG9saWN5SW5mb3MpIHsKKyAgICBpZiAocG9saWN5SW5mb3MuZW1wdHkoKSkgcmV0dXJuIEFBVURJT19QT0xJQ1lfQVVUTzsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHBvbGljeUluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChwb2xpY3lJbmZvcy5hdChpKS5tbWFwUG9saWN5ICE9IHBvbGljeUluZm9zLmF0KDApLm1tYXBQb2xpY3kpIHsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fUE9MSUNZX0FVVE87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFpZGwybGVnYWN5X2FhdWRpb19wb2xpY3kocG9saWN5SW5mb3MuYXQoMCkubW1hcFBvbGljeSk7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKIC8vIFRyeSB0byBvcGVuIHVzaW5nIE1NQVAgcGF0aCBpZiB0aGF0IGlzIGFsbG93ZWQuCiAvLyBGYWxsIGJhY2sgdG8gTGVnYWN5IHBhdGggaWYgTU1BUCBub3QgYXZhaWxhYmxlLgogLy8gRXhhY3QgYmVoYXZpb3IgaXMgY29udHJvbGxlZCBieSBNTWFwUG9saWN5LgpAQCAtMTEwLDI1ICsxNDQsMzIgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiBwb2xpY3lJbmZvczsKICAgICAvLyBUaGUgQVBJIHNldHRpbmcgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCiAgICAgYWF1ZGlvX3BvbGljeV90IG1tYXBQb2xpY3kgPSBBdWRpb0dsb2JhbF9nZXRNTWFwUG9saWN5KCk7CiAgICAgLy8gSWYgbm90IHNwZWNpZmllZCB0aGVuIGdldCBmcm9tIGEgc3lzdGVtIHByb3BlcnR5LgotICAgIGlmIChtbWFwUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtbWFwUG9saWN5ID0gQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFBvbGljeSgpOworICAgIGlmIChtbWFwUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCAmJiBhbmRyb2lkOjpBdWRpb1N5c3RlbTo6Z2V0TW1hcFBvbGljeUluZm8oCisgICAgICAgICAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZTo6REVGQVVMVCwgJnBvbGljeUluZm9zKSA9PSBOT19FUlJPUikgeworICAgICAgICBtbWFwUG9saWN5ID0gZ2V0QUF1ZGlvUG9saWN5KHBvbGljeUluZm9zKTsKICAgICB9CiAgICAgLy8gSWYgc3RpbGwgbm90IHNwZWNpZmllZCB0aGVuIHVzZSB0aGUgZGVmYXVsdC4KICAgICBpZiAobW1hcFBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgbW1hcFBvbGljeSA9IEFBVURJT19NTUFQX1BPTElDWV9ERUZBVUxUOwogICAgIH0KIAotICAgIGludDMyX3QgbWFwRXhjbHVzaXZlUG9saWN5ID0gQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcEV4Y2x1c2l2ZVBvbGljeSgpOwotICAgIGlmIChtYXBFeGNsdXNpdmVQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1hcEV4Y2x1c2l2ZVBvbGljeSA9IEFBVURJT19NTUFQX0VYQ0xVU0lWRV9QT0xJQ1lfREVGQVVMVDsKKyAgICBwb2xpY3lJbmZvcy5jbGVhcigpOworICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwRXhjbHVzaXZlUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGlmIChhbmRyb2lkOjpBdWRpb1N5c3RlbTo6Z2V0TW1hcFBvbGljeUluZm8oCisgICAgICAgICAgICBBdWRpb01NYXBQb2xpY3lUeXBlOjpFWENMVVNJVkUsICZwb2xpY3lJbmZvcykgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbW1hcEV4Y2x1c2l2ZVBvbGljeSA9IGdldEFBdWRpb1BvbGljeShwb2xpY3lJbmZvcyk7CisgICAgfQorICAgIGlmIChtbWFwRXhjbHVzaXZlUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBtbWFwRXhjbHVzaXZlUG9saWN5ID0gQUFVRElPX01NQVBfRVhDTFVTSVZFX1BPTElDWV9ERUZBVUxUOwogICAgIH0KIAogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IGdldFNoYXJpbmdNb2RlKCk7CiAgICAgaWYgKChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkKLSAgICAgICAgJiYgKG1hcEV4Y2x1c2l2ZVBvbGljeSA9PSBBQVVESU9fUE9MSUNZX05FVkVSKSkgeworICAgICAgICAmJiAobW1hcEV4Y2x1c2l2ZVBvbGljeSA9PSBBQVVESU9fUE9MSUNZX05FVkVSKSkgewogICAgICAgICBBTE9HRCgiJXMoKSBFWENMVVNJVkUgc2hhcmluZyBtb2RlIG5vdCBzdXBwb3J0ZWQuIFVzZSBTSEFSRUQuIiwgX19mdW5jX18pOwogICAgICAgICBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgICAgICBzZXRTaGFyaW5nTW9kZShzaGFyaW5nTW9kZSk7CkBAIC0yNjgsOCArMzA5LDggQEAKIAogdm9pZCBBdWRpb1N0cmVhbUJ1aWxkZXI6OmxvZ1BhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgLy8gVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBpbiB0aGUgZnV0dXJlLiBQbGVhc2UgbGVhdmUgaXQgaW4uCi0gICAgQUxPR0koInJhdGUgICA9ICU2ZCwgY2hhbm5lbHMgID0gJWQsIGZvcm1hdCAgID0gJWQsIHNoYXJpbmcgPSAlcywgZGlyID0gJXMiLAotICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGdldEZvcm1hdCgpLAorICAgIEFMT0dJKCJyYXRlICAgPSAlNmQsIGNoYW5uZWxzICA9ICVkLCBjaGFubmVsTWFzayA9ICUjeCwgZm9ybWF0ICAgPSAlZCwgc2hhcmluZyA9ICVzLCBkaXIgPSAlcyIsCisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZ2V0Q2hhbm5lbE1hc2soKSwgZ2V0Rm9ybWF0KCksCiAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGdldFNoYXJpbmdNb2RlKCkpLAogICAgICAgICAgIEFBdWRpb19jb252ZXJ0RGlyZWN0aW9uVG9UZXh0KGdldERpcmVjdGlvbigpKSk7CiAgICAgQUxPR0koImRldmljZSA9ICU2ZCwgc2Vzc2lvbklkID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxiYWNrOiAlcyB3aXRoIGZyYW1lcyA9ICVkIiwKQEAgLTI4MCw5ICszMjEsOCBAQAogICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwogICAgIEFMT0dJKCJ1c2FnZSAgPSAlNmQsIGNvbnRlbnRUeXBlID0gJWQsIGlucHV0UHJlc2V0ID0gJWQsIGFsbG93ZWRDYXB0dXJlUG9saWN5ID0gJWQiLAogICAgICAgICAgIGdldFVzYWdlKCksIGdldENvbnRlbnRUeXBlKCksIGdldElucHV0UHJlc2V0KCksIGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOwotICAgIEFMT0dJKCJwcml2YWN5IHNlbnNpdGl2ZSA9ICVzIiwgaXNQcml2YWN5U2Vuc2l0aXZlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBBTE9HSSgib3BQYWNrYWdlTmFtZSA9ICVzIiwgIWdldE9wUGFja2FnZU5hbWUoKS5oYXNfdmFsdWUoKSA/Ci0gICAgICAgICIobnVsbCkiIDogZ2V0T3BQYWNrYWdlTmFtZSgpLnZhbHVlKCkuY19zdHIoKSk7Ci0gICAgQUxPR0koImF0dHJpYnV0aW9uVGFnID0gJXMiLCAhZ2V0QXR0cmlidXRpb25UYWcoKS5oYXNfdmFsdWUoKSA/Ci0gICAgICAgICIobnVsbCkiIDogZ2V0QXR0cmlidXRpb25UYWcoKS52YWx1ZSgpLmNfc3RyKCkpOworICAgIEFMT0dJKCJwcml2YWN5IHNlbnNpdGl2ZSA9ICVzLCBvcFBhY2thZ2VOYW1lID0gJXMsIGF0dHJpYnV0aW9uVGFnID0gJXMiLAorICAgICAgICAgIGlzUHJpdmFjeVNlbnNpdGl2ZSgpID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAhZ2V0T3BQYWNrYWdlTmFtZSgpLmhhc192YWx1ZSgpID8gIihudWxsKSIgOiBnZXRPcFBhY2thZ2VOYW1lKCkudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICFnZXRBdHRyaWJ1dGlvblRhZygpLmhhc192YWx1ZSgpID8gIihudWxsKSIgOiBnZXRBdHRyaWJ1dGlvblRhZygpLnZhbHVlKCkuY19zdHIoKSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKaW5kZXggOWY5MzM0MS4uZjkxYzI1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaApAQCAtMzEsOSArMzEsOSBAQAogICovCiBjbGFzcyBBdWRpb1N0cmVhbUJ1aWxkZXIgOiBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6Ci0gICAgQXVkaW9TdHJlYW1CdWlsZGVyKCk7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyKCkgPSBkZWZhdWx0OwogCi0gICAgfkF1ZGlvU3RyZWFtQnVpbGRlcigpOworICAgIH5BdWRpb1N0cmVhbUJ1aWxkZXIoKSA9IGRlZmF1bHQ7CiAKICAgICBib29sIGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCmluZGV4IDM3NTQ4ZjAuLjdiMGFjYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaApAQCAtMzgsNyArMzgsNyBAQAogCiBjbGFzcyBGaWZvQnVmZmVyIHsKIHB1YmxpYzoKLSAgICBGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSk7CisgICAgZXhwbGljaXQgRmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUpOwogCiAgICAgdmlydHVhbCB+Rmlmb0J1ZmZlcigpID0gZGVmYXVsdDsKIApAQCAtMTYyLDYgKzE2Miw2IEBACiAgICAgdWludDhfdCAqbUV4dGVybmFsU3RvcmFnZSA9IG51bGxwdHI7CiB9OwogCi19ICAvLyBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy9GSUZPX0ZJRk9fQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKaW5kZXggMDU3YTk0ZS4uZTE1ZDQ0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAsIG1Xcml0ZUNvdW50ZXIoMCkKICAgICB7fQogCi0gICAgdmlydHVhbCB+Rmlmb0NvbnRyb2xsZXIoKSB7fQorICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyKCkgPSBkZWZhdWx0OwogCiAgICAgLy8gVE9ETyByZXZpZXcgdXNlIG9mIG1lbW9yeSBiYXJyaWVycywgcHJvYmFibHkgaW5jb3JyZWN0CiAgICAgdmlydHVhbCBmaWZvX2NvdW50ZXJfdCBnZXRSZWFkQ291bnRlcigpIG92ZXJyaWRlIHsKQEAgLTU3LDYgKzU3LDYgQEAKICAgICBzdGQ6OmF0b21pYzxmaWZvX2NvdW50ZXJfdD4gbVdyaXRlQ291bnRlcjsKIH07CiAKLX0gIC8vIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvL0ZJRk9fRklGT19DT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKaW5kZXggMWRlY2UwZS4uYWQ2ZDA0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKQEAgLTI5LDkgKzI5LDYgQEAKIHsKIH0KIAotRmlmb0NvbnRyb2xsZXJCYXNlOjp+Rmlmb0NvbnRyb2xsZXJCYXNlKCkgewotfQotCiBmaWZvX2ZyYW1lc190IEZpZm9Db250cm9sbGVyQmFzZTo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKICAgICBmaWZvX2ZyYW1lc190IHRlbXAgPSAwOwogICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coZ2V0V3JpdGVDb3VudGVyKCksIGdldFJlYWRDb3VudGVyKCksICZ0ZW1wKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAppbmRleCAxZWRiOGEzLi4yYTYxNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICovCiAgICAgRmlmb0NvbnRyb2xsZXJCYXNlKGZpZm9fZnJhbWVzX3QgY2FwYWNpdHksIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKTsKIAotICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyQmFzZSgpOworICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyQmFzZSgpID0gZGVmYXVsdDsKIAogICAgIC8vIEFic3RyYWN0IG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlcy4KICAgICAvKioKQEAgLTEyMyw2ICsxMjMsNiBAQAogICAgIGZpZm9fZnJhbWVzX3QgbVRocmVzaG9sZDsKIH07CiAKLX0gIC8vIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBGSUZPX0ZJRk9fQ09OVFJPTExFUl9CQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oCmluZGV4IGVjNDhlNTcuLmE1OTIyNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVySW5kaXJlY3QuaApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBzZXRSZWFkQ291bnRlcigwKTsKICAgICAgICAgc2V0V3JpdGVDb3VudGVyKDApOwogICAgIH0KLSAgICB2aXJ0dWFsIH5GaWZvQ29udHJvbGxlckluZGlyZWN0KCkge307CisgICAgdmlydHVhbCB+Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdCgpID0gZGVmYXVsdDsKIAogICAgIC8vIFRPRE8gcmV2aWV3IHVzZSBvZiBtZW1vcnkgYmFycmllcnMsIHByb2JhYmx5IGluY29ycmVjdAogICAgIHZpcnR1YWwgZmlmb19jb3VudGVyX3QgZ2V0UmVhZENvdW50ZXIoKSBvdmVycmlkZSB7CkBAIC02OCw2ICs2OCw2IEBACiAgICAgc3RkOjphdG9taWM8Zmlmb19jb3VudGVyX3Q+ICogbVdyaXRlQ291bnRlckFkZHJlc3M7CiB9OwogCi19ICAvLyBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy9GSUZPX0ZJRk9fQ09OVFJPTExFUl9JTkRJUkVDVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2N2ZkYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9Qcm9jZXNzb3JCYXNlOjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaWYgKGZyYW1lUG9zaXRpb24gPiBtTGFzdEZyYW1lUG9zaXRpb24pIHsKLSAgICAgICAgbUxhc3RGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKLSAgICAgICAgbUZyYW1lc1ZhbGlkID0gb25Qcm9jZXNzKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci0gICAgfQotICAgIHJldHVybiBtRnJhbWVzVmFsaWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BdWRpb0Zsb2F0QmxvY2tQb3J0OjpBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2spCi0gICAgICAgIDogQXVkaW9Qb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAsIG1GcmFtZXNQZXJCbG9jayhmcmFtZXNQZXJCbG9jaykKLSAgICAgICAgLCBtU2FtcGxlQmxvY2soTlVMTCkgewotICAgIGludDMyX3QgbnVtRmxvYXRzID0gZnJhbWVzUGVyQmxvY2sgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICBtU2FtcGxlQmxvY2sgPSBuZXcgZmxvYXRbbnVtRmxvYXRzXXswLjBmfTsKLX0KLQotQXVkaW9GbG9hdEJsb2NrUG9ydDo6fkF1ZGlvRmxvYXRCbG9ja1BvcnQoKSB7Ci0gICAgZGVsZXRlW10gbVNhbXBsZUJsb2NrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50MzJfdCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcyk7Ci0gICAgcmV0dXJuIG1QYXJlbnQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLX0KLQotLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgotdm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6Y29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7Ci0gICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKLX0KLQotdm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6ZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7Ci0gICAgcG9ydC0+ZGlzY29ubmVjdCh0aGlzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9GbG9hdElucHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIHJldHVybiAobUNvbm5lY3RlZCA9PSBOVUxMKQotICAgICAgICAgICAgPyBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpCi0gICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci19Ci0KLWZsb2F0ICpBdWRpb0Zsb2F0SW5wdXRQb3J0OjpnZXRCbG9jaygpIHsKLSAgICBpZiAobUNvbm5lY3RlZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jaygpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCbG9jaygpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9TaW5rOjpwdWxsKGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaW50MzJfdCBhY3R1YWxGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtRnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLSAgICBtRnJhbWVQb3NpdGlvbiArPSBhY3R1YWxGcmFtZXM7Ci0gICAgcmV0dXJuIGFjdHVhbEZyYW1lczsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI5MzJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBBdWRpb1Byb2Nlc3NvckJhc2UuaAotICoKLSAqIEF1ZGlvIHByb2Nlc3Npbmcgbm9kZSBhbmQgcG9ydHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbXBsZSBkYXRhIGZsb3cgZ3JhcGguCi0gKi8KLQotI2lmbmRlZiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAotI2RlZmluZSBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8vIFRPRE8gY29uc2lkZXIgcHVibGlzaGluZyBhbGwgaGVhZGVyIGZpbGVzIHVuZGVyICJpbmNsdWRlL2xpYmFhdWRpby9GbG93R3JhcGguaCIKLQotbmFtZXNwYWNlIGZsb3dncmFwaCB7Ci0KLS8vIERlZmF1bHQgYmxvY2sgc2l6ZSB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIEF1ZGlvRmxvYXRCbG9ja1BvcnQgaXMgY3JlYXRlZC4KLS8vIElmIGl0IGlzIHRvbyBzbWFsbCB0aGVuIHdlIHdpbGwgaGF2ZSB0b28gbXVjaCBvdmVyaGVhZCBmcm9tIHN3aXRjaGluZyBiZXR3ZWVuIG5vZGVzLgotLy8gSWYgaXQgaXMgdG9vIGhpZ2ggdGhlbiB3ZSB3aWxsIHRocmFzaCB0aGUgY2FjaGVzLgotY29uc3RleHByIGludCBrRGVmYXVsdEJsb2NrU2l6ZSA9IDg7IC8vIGFyYml0cmFyeQotCi1jbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Byb2Nlc3NvckJhc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGN1c3RvbSBmdW5jdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBudW1GcmFtZXMgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCBmb3IgcHJvY2Vzc2luZwotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBmcmFtZVBvc2l0aW9uIGlzIGF0IG9yIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHBvc2l0aW9uIHRoZW4gY2FsbCBvblByb2Nlc3MoKS4KLSAgICAgKiBUaGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyBncmFwaHMuCi0gICAgICogSXQgYWxzbyBwcmV2ZW50cyBub2RlcyB1cHN0cmVhbSBmcm9tIGEgYnJhbmNoIGZyb20gYmVpbmcgZXhlY3V0ZWQgdHdpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbgotICAgICAqIEBwYXJhbSBudW1GcmFtZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKLQotcHJvdGVjdGVkOgotICAgIGludDY0X3QgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IC0xOyAvLyBTdGFydCBhdCAtMSBzbyB0aGF0IHRoZSBmaXJzdCBwdWxsIHdvcmtzLgotCi1wcml2YXRlOgotICAgIGludDMyX3QgIG1GcmFtZXNWYWxpZCA9IDA7IC8vIG51bSB2YWxpZCBmcmFtZXMgaW4gdGhlIGJsb2NrCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gICogVGhpcyBpcyBhIGNvbm5lY3RvciB0aGF0IGFsbG93cyBkYXRhIHRvIGZsb3cgYmV0d2VlbiBtb2R1bGVzLgotICAqLwotY2xhc3MgQXVkaW9Qb3J0IHsKLXB1YmxpYzoKLSAgICBBdWRpb1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCkKLSAgICAgICAgICAgICwgbVNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpIHsKLSAgICB9Ci0KLSAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgotICAgIEF1ZGlvUG9ydChjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKLSAgICBBdWRpb1BvcnQmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKLQotICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQ7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCAgICBtU2FtcGxlc1BlckZyYW1lID0gMTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIFRoaXMgcG9ydCBjb250YWlucyBhIGZsb2F0IHR5cGUgYnVmZmVyLgotICogVGhlIHNpemUgaXMgZnJhbWVzUGVyQmxvY2sgKiBzYW1wbGVzUGVyRnJhbWUpLgotICovCi1jbGFzcyBBdWRpb0Zsb2F0QmxvY2tQb3J0ICA6IHB1YmxpYyBBdWRpb1BvcnQgewotcHVibGljOgotICAgIEF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50LAotICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2sgPSBrRGVmYXVsdEJsb2NrU2l6ZQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0QmxvY2tQb3J0KCk7Ci0KLSAgICBpbnQzMl90IGdldEZyYW1lc1BlckJsb2NrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJsb2NrOwotICAgIH0KLQotcHJvdGVjdGVkOgotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0Ci0gICAgICovCi0gICAgdmlydHVhbCBmbG9hdCAqZ2V0QmxvY2soKSB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlQmxvY2s7Ci0gICAgfQotCi0KLXByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQmxvY2sgPSAxOwotICAgIGZsb2F0ICAgICAgICAgICAqbVNhbXBsZUJsb2NrID0gbnVsbHB0cjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gICogVGhlIHJlc3VsdHMgb2YgYSBtb2R1bGUgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyIG9mIHRoZSBvdXRwdXQgcG9ydHMuCi0gICovCi1jbGFzcyBBdWRpb0Zsb2F0T3V0cHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKLXB1YmxpYzoKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCi0gICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0T3V0cHV0UG9ydCgpID0gZGVmYXVsdDsKLQotICAgIHVzaW5nIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrOwotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGUgcGFyZW50IG1vZHVsZSdzIG9uUHJvY2VzcygpIG1ldGhvZC4KLSAgICAgKiBUaGF0IG1heSBwdWxsIGRhdGEgZnJvbSBpdHMgaW5wdXRzIGFuZCByZWN1cnNpdmVseQotICAgICAqIHByb2Nlc3MgdGhlIGVudGlyZSBncmFwaC4KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHVsbGVkCi0gICAgICovCi0gICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKLQotICAgIC8qKgotICAgICAqIENvbm5lY3QgdG8gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgotICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KLSAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KLSAgICAgKiBJZiB5b3UgY29ubmVjdCBhIHNlY29uZCBvdXRwdXQgcG9ydCB0byBhbiBpbnB1dCBwb3J0Ci0gICAgICogdGhlbiBpdCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uLgotICAgICAqCi0gICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuIERvIG5vdCBtb2RpZnkgdGhlIGdyYXBoIHRvcG9sb2d5IGZvcm0gYW5vdGhlciB0aHJlYWQgd2hpbGUgcnVubmluZy4KLSAgICAgKi8KLSAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgotICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgotICAgICAqLwotICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgewotcHVibGljOgotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+QXVkaW9GbG9hdElucHV0UG9ydCgpID0gZGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KLSAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgotICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCi0gICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgotICAgICAqLwotICAgIGZsb2F0ICpnZXRCbG9jaygpIG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogUHVsbCBkYXRhIGZyb20gYW55IG91dHB1dCBwb3J0IHRoYXQgaXMgY29ubmVjdGVkLgotICAgICAqLwotICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBldmVyeSB2YWx1ZSBvZiB0aGUgZmxvYXQgYnVmZmVyLgotICAgICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkIGlmIGFuIG91dHB1dCBwb3J0IGlzIGNvbm5lY3RlZAotICAgICAqIHRvIHRoaXMgcG9ydC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIGludCBudW1GbG9hdHMgPSBrRGVmYXVsdEJsb2NrU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QmxvY2soKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GbG9hdHM7IGkrKykgewotICAgICAgICAgICAgKmJ1ZmZlcisrID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25uZWN0IHRvIHRoZSBvdXRwdXQgb2YgYW5vdGhlciBtb2R1bGUuCi0gICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgotICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgotICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgotICAgICAqLwotICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgewotICAgICAgICBhc3NlcnQoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gcG9ydC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICBtQ29ubmVjdGVkID0gcG9ydDsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKLSAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7Ci0gICAgICAgICh2b2lkKSBwb3J0OwotICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbUNvbm5lY3RlZCA9IG51bGxwdHI7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBBdWRpb1NvdXJjZShpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpID0gZGVmYXVsdDsKLQotICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKLQotICAgIHZvaWQgc2V0RGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgICAgICBtRGF0YSA9IGRhdGE7Ci0gICAgICAgIG1TaXplSW5GcmFtZXMgPSBudW1GcmFtZXM7Ci0gICAgICAgIG1GcmFtZUluZGV4ID0gMDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBjb25zdCB2b2lkICptRGF0YSA9IG51bGxwdHI7Ci0gICAgaW50MzJfdCAgICAgbVNpemVJbkZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiBmcmFtZXMgaW4gbURhdGEKLSAgICBpbnQzMl90ICAgICBtRnJhbWVJbmRleCA9IDA7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQXVkaW9TaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+QXVkaW9TaW5rKCkgPSBkZWZhdWx0OwotCi0gICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKLQotICAgIC8qKgotICAgICAqIERvIG5vdGhpbmcuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAotICAgICAqLwotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKLSAgICAgICAgKHZvaWQpIGZyYW1lUG9zaXRpb247Ci0gICAgICAgICh2b2lkKSBudW1GcmFtZXM7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50MzJfdCBwdWxsKGludDMyX3QgbnVtRnJhbWVzKTsKLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1GcmFtZVBvc2l0aW9uID0gMDsKLX07Ci0KLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLwotCi0jZW5kaWYgLyogRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NoYW5uZWxDb3VudENvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODA0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiQ2hhbm5lbENvdW50Q29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKK0NoYW5uZWxDb3VudENvbnZlcnRlcjo6Q2hhbm5lbENvdW50Q29udmVydGVyKAorICAgICAgICBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LAorICAgICAgICBpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgaW5wdXRDaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBvdXRwdXRDaGFubmVsQ291bnQpIHsKK30KKworQ2hhbm5lbENvdW50Q29udmVydGVyOjp+Q2hhbm5lbENvdW50Q29udmVydGVyKCkgPSBkZWZhdWx0OworCitpbnQzMl90IENoYW5uZWxDb3VudENvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKKyAgICBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgaW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICBpbnQgaW5wdXRDaGFubmVsID0gMDsKKyAgICAgICAgZm9yIChpbnQgb3V0cHV0Q2hhbm5lbCA9IDA7IG91dHB1dENoYW5uZWwgPCBvdXRwdXRDaGFubmVsQ291bnQ7IG91dHB1dENoYW5uZWwrKykgeworICAgICAgICAgICAgLy8gQ29weSBpbnB1dCBjaGFubmVscyB0byBvdXRwdXQgY2hhbm5lbHMuCisgICAgICAgICAgICAvLyBXcmFwIGlmIHdlIHJ1biBvdXQgb2YgaW5wdXRzLgorICAgICAgICAgICAgLy8gRGlzY2FyZCBpZiB3ZSBydW4gb3V0IG9mIG91dHB1dHMuCisgICAgICAgICAgICBvdXRwdXRCdWZmZXJbb3V0cHV0Q2hhbm5lbF0gPSBpbnB1dEJ1ZmZlcltpbnB1dENoYW5uZWxdOworICAgICAgICAgICAgaW5wdXRDaGFubmVsID0gKGlucHV0Q2hhbm5lbCA9PSBpbnB1dENoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgPyAwIDogaW5wdXRDaGFubmVsICsgMTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dEJ1ZmZlciArPSBpbnB1dENoYW5uZWxDb3VudDsKKyAgICAgICAgb3V0cHV0QnVmZmVyICs9IG91dHB1dENoYW5uZWxDb3VudDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThmNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQ0hBTk5FTF9DT1VOVF9DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfQ0hBTk5FTF9DT1VOVF9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCisvKioKKyAqIENoYW5nZSB0aGUgbnVtYmVyIG9mIG51bWJlciBvZiBjaGFubmVscyB3aXRob3V0IG1peGluZy4KKyAqIFdoZW4gaW5jcmVhc2luZyB0aGUgY2hhbm5lbCBjb3VudCwgZHVwbGljYXRlIGlucHV0IGNoYW5uZWxzLgorICogV2hlbiBkZWNyZWFzaW5nIHRoZSBjaGFubmVsIGNvdW50LCBkcm9wIGlucHV0IGNoYW5uZWxzLgorICovCisgICAgY2xhc3MgQ2hhbm5lbENvdW50Q29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2hhbm5lbENvdW50Q29udmVydGVyKAorICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQpOworCisgICAgICAgIHZpcnR1YWwgfkNoYW5uZWxDb3VudENvbnZlcnRlcigpOworCisgICAgICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgICAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuICJDaGFubmVsQ291bnRDb252ZXJ0ZXIiOworICAgICAgICB9CisKKyAgICAgICAgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgaW5wdXQ7CisgICAgICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CisgICAgfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9DSEFOTkVMX0NPVU5UX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKaW5kZXggYmQ5YzIyYS4uYzZhZDBiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApAQCAtMTYsMjUgKzE2LDIzIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogI2luY2x1ZGUgIkNsaXBUb1JhbmdlLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBDbGlwVG9SYW5nZTo6Q2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKLSAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgICAgICA6IEZsb3dHcmFwaEZpbHRlcihjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBDbGlwVG9SYW5nZTo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci0gICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKLSAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CitpbnQzMl90IENsaXBUb1JhbmdlOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOwogCi0gICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc3RkOjptaW4obU1heGltdW0sIHN0ZDo6bWF4KG1NaW5pbXVtLCAqaW5wdXRCdWZmZXIrKykpOwogICAgIH0KIAotICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIG51bUZyYW1lczsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCmluZGV4IDllZWYyNTQuLjJmZGRlZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApAQCAtMjEsMjIgKzIxLDIyIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKIC8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCiAvLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heEhlYWRyb29tID0gMS40MTI1Mzc1NGY7CiBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNaW5IZWFkcm9vbSA9IC1rRGVmYXVsdE1heEhlYWRyb29tOwogCi1jbGFzcyBDbGlwVG9SYW5nZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworY2xhc3MgQ2xpcFRvUmFuZ2UgOiBwdWJsaWMgRmxvd0dyYXBoRmlsdGVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5DbGlwVG9SYW5nZSgpID0gZGVmYXVsdDsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAogICAgIHZvaWQgc2V0TWluaW11bShmbG9hdCBtaW4pIHsKICAgICAgICAgbU1pbmltdW0gPSBtaW47CkBAIC01NCwxNCArNTQsMTUgQEAKICAgICAgICAgcmV0dXJuIG1NYXhpbXVtOwogICAgIH0KIAotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiQ2xpcFRvUmFuZ2UiOworICAgIH0KIAogcHJpdmF0ZToKICAgICBmbG9hdCBtTWluaW11bSA9IGtEZWZhdWx0TWluSGVhZHJvb207CiAgICAgZmxvYXQgbU1heGltdW0gPSBrRGVmYXVsdE1heEhlYWRyb29tOwogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93R3JhcGhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTJhYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEZsb3dHcmFwaE5vZGU6OnB1bGxEYXRhKGludDMyX3QgbnVtRnJhbWVzLCBpbnQ2NF90IGNhbGxDb3VudCkgeworICAgIGludDMyX3QgZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAvLyBQcmV2ZW50IHJlY3Vyc2lvbiBhbmQgbXVsdGlwbGUgZXhlY3V0aW9uIG9mIG5vZGVzLgorICAgIGlmIChjYWxsQ291bnQgPiBtTGFzdENhbGxDb3VudCkgeworICAgICAgICBtTGFzdENhbGxDb3VudCA9IGNhbGxDb3VudDsKKyAgICAgICAgaWYgKG1EYXRhUHVsbGVkQXV0b21hdGljYWxseSkgeworICAgICAgICAgICAgLy8gUHVsbCBmcm9tIGFsbCB0aGUgdXBzdHJlYW0gbm9kZXMuCisgICAgICAgICAgICBmb3IgKGF1dG8gJnBvcnQgOiBtSW5wdXRQb3J0cykgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gZml4IGJ1ZyBvZiBsZWF2aW5nIHVudXNlZCBkYXRhIGluIHNvbWUgcG9ydHMgaWYgdXNpbmcgbXVsdGlwbGUgQXVkaW9Tb3VyY2UKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gcG9ydC5nZXQoKS5wdWxsRGF0YShjYWxsQ291bnQsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG9uUHJvY2VzcyhmcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lQ291bnQgPSBtTGFzdEZyYW1lQ291bnQ7CisgICAgfQorICAgIHJldHVybiBmcmFtZUNvdW50OworfQorCit2b2lkIEZsb3dHcmFwaE5vZGU6OnB1bGxSZXNldCgpIHsKKyAgICBpZiAoIW1CbG9ja1JlY3Vyc2lvbikgeworICAgICAgICBtQmxvY2tSZWN1cnNpb24gPSB0cnVlOyAvLyBmb3IgY3ljbGljIGdyYXBocworICAgICAgICAvLyBQdWxsIHJlc2V0IGZyb20gYWxsIHRoZSB1cHN0cmVhbSBub2Rlcy4KKyAgICAgICAgZm9yIChhdXRvICZwb3J0IDogbUlucHV0UG9ydHMpIHsKKyAgICAgICAgICAgIHBvcnQuZ2V0KCkucHVsbFJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJsb2NrUmVjdXJzaW9uID0gZmFsc2U7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIEZsb3dHcmFwaE5vZGU6OnJlc2V0KCkgeworICAgIG1MYXN0RnJhbWVDb3VudCA9IDA7CisgICAgbUxhc3RDYWxsQ291bnQgPSBrSW5pdGlhbENhbGxDb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Zsb3dHcmFwaFBvcnRGbG9hdDo6Rmxvd0dyYXBoUG9ydEZsb2F0KEZsb3dHcmFwaE5vZGUgJnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1ZmZlcikKKyAgICAgICAgOiBGbG93R3JhcGhQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAsIG1GcmFtZXNQZXJCdWZmZXIoZnJhbWVzUGVyQnVmZmVyKQorICAgICAgICAsIG1CdWZmZXIobnVsbHB0cikgeworICAgIHNpemVfdCBudW1GbG9hdHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGZyYW1lc1BlckJ1ZmZlcikgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtQnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPihudW1GbG9hdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ6OnB1bGxEYXRhKGludDY0X3QgY2FsbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJ1ZmZlcigpLCBudW1GcmFtZXMpOworICAgIHJldHVybiBtQ29udGFpbmluZ05vZGUucHVsbERhdGEobnVtRnJhbWVzLCBjYWxsQ291bnQpOworfQorCit2b2lkIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dDo6cHVsbFJlc2V0KCkgeworICAgIG1Db250YWluaW5nTm9kZS5wdWxsUmVzZXQoKTsKK30KKworLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgordm9pZCBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ6OmNvbm5lY3QoRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgKnBvcnQpIHsKKyAgICBwb3J0LT5jb25uZWN0KHRoaXMpOworfQorCit2b2lkIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dDo6ZGlzY29ubmVjdChGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCAqcG9ydCkgeworICAgIHBvcnQtPmRpc2Nvbm5lY3QodGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEZsb3dHcmFwaFBvcnRGbG9hdElucHV0OjpwdWxsRGF0YShpbnQ2NF90IGNhbGxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gKG1Db25uZWN0ZWQgPT0gbnVsbHB0cikKKyAgICAgICAgICAgID8gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQnVmZmVyKCksIG51bUZyYW1lcykKKyAgICAgICAgICAgIDogbUNvbm5lY3RlZC0+cHVsbERhdGEoY2FsbENvdW50LCBudW1GcmFtZXMpOworfQordm9pZCBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dDo6cHVsbFJlc2V0KCkgeworICAgIGlmIChtQ29ubmVjdGVkICE9IG51bGxwdHIpIG1Db25uZWN0ZWQtPnB1bGxSZXNldCgpOworfQorCitmbG9hdCAqRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQ6OmdldEJ1ZmZlcigpIHsKKyAgICBpZiAobUNvbm5lY3RlZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBGbG93R3JhcGhQb3J0RmxvYXQ6OmdldEJ1ZmZlcigpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCdWZmZXIoKTsKKyAgICB9Cit9CisKK2ludDMyX3QgRmxvd0dyYXBoU2luazo6cHVsbERhdGEoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gRmxvd0dyYXBoTm9kZTo6cHVsbERhdGEobnVtRnJhbWVzLCBnZXRMYXN0Q2FsbENvdW50KCkgKyAxKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg0YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5oCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogRmxvd0dyYXBoLmgKKyAqCisgKiBQcm9jZXNzaW5nIG5vZGUgYW5kIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW1wbGUgZGF0YSBmbG93IGdyYXBoLgorICogVGhpcyB3YXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGF1ZGlvIGJ1dCBjb3VsZCBiZSB1c2VkIGZvciBvdGhlcgorICogdHlwZXMgb2YgZGF0YS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9GTE9XX0dSQVBIX05PREVfSAorI2RlZmluZSBGTE9XR1JBUEhfRkxPV19HUkFQSF9OT0RFX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE8gTW92ZSB0aGVzZSBjbGFzc2VzIGludG8gc2VwYXJhdGUgZmlsZXMuCisvLyBUT0RPIFJldmlldyB1c2Ugb2YgcmF3IHBvaW50ZXJzIGZvciBjb25uZWN0KCkuIE1heWJlIHVzZSBzbWFydCBwb2ludGVycyBidXQgbmVlZCB0byBhdm9pZAorLy8gICAgICBydW4tdGltZSBkZWFsbG9jYXRpb24gaW4gYXVkaW8gdGhyZWFkLgorCisvLyBTZXQgZmxhZ3MgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwgYW5kIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0UgYmFzZWQgb24gd2hldGhlciBjb21waWxlcgorLy8gZmxhZyBfX0FORFJPSURfTkRLX18gaXMgZGVmaW5lZC4gX19BTkRST0lEX05ES19fIHNob3VsZCBiZSBkZWZpbmVkIGluIG9ib2UgYW5kIG5vdCBhYXVkaW8uCisKKyNpZm5kZWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKKyNpZmRlZiBfX0FORFJPSURfTkRLX18KKyNkZWZpbmUgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwgMAorI2Vsc2UKKyNkZWZpbmUgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwgMQorI2VuZGlmIC8vIF9fQU5EUk9JRF9OREtfXworI2VuZGlmIC8vIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCisKKyNpZm5kZWYgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRQorI2lmZGVmIF9fQU5EUk9JRF9OREtfXworI2RlZmluZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFIG9ib2UKKyNlbHNlCisjZGVmaW5lIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0UgYWF1ZGlvCisjZW5kaWYgLy8gX19BTkRST0lEX05ES19fCisjZW5kaWYgLy8gRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRQorCituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiB0aGUgRmxvd0dyYXBoUG9ydEZsb2F0IGlzIGNyZWF0ZWQuCisvLyBJZiBpdCBpcyB0b28gc21hbGwgdGhlbiB3ZSB3aWxsIGhhdmUgdG9vIG11Y2ggb3ZlcmhlYWQgZnJvbSBzd2l0Y2hpbmcgYmV0d2VlbiBub2Rlcy4KKy8vIElmIGl0IGlzIHRvbyBoaWdoIHRoZW4gd2Ugd2lsbCB0aHJhc2ggdGhlIGNhY2hlcy4KK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRCdWZmZXJTaXplID0gODsgLy8gYXJiaXRyYXJ5CisKK2NsYXNzIEZsb3dHcmFwaFBvcnQ7CitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIG5vZGVzIGluIHRoZSBmbG93Z3JhcGguCisgKi8KK2NsYXNzIEZsb3dHcmFwaE5vZGUgeworcHVibGljOgorICAgIEZsb3dHcmFwaE5vZGUoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+Rmxvd0dyYXBoTm9kZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFJlYWQgZnJvbSB0aGUgaW5wdXQgcG9ydHMsCisgICAgICogZ2VuZXJhdGUgbXVsdGlwbGUgZnJhbWVzIG9mIGRhdGEgdGhlbiB3cml0ZSB0aGUgcmVzdWx0cyB0byB0aGUgb3V0cHV0IHBvcnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG51bUZyYW1lcyBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcmVxdWVzdGVkIGZvciBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIHZpcnR1YWwgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHRoZSBjYWxsQ291bnQgaXMgYXQgb3IgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhbGxDb3VudCB0aGVuIGNhbGwKKyAgICAgKiBwdWxsRGF0YSBvbiBhbGwgb2YgdGhlIHVwc3RyZWFtTm9kZXMuCisgICAgICogVGhlbiBjYWxsIG9uUHJvY2VzcygpLgorICAgICAqIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgY3ljbGljIGdyYXBocy4KKyAgICAgKiBJdCBhbHNvIHByZXZlbnRzIG5vZGVzIHVwc3RyZWFtIGZyb20gYSBicmFuY2ggZnJvbSBiZWluZyBleGVjdXRlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsQ291bnQKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIHZhbGlkCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQzMl90IG51bUZyYW1lcywgaW50NjRfdCBjYWxsQ291bnQpOworCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlbHkgcmVzZXQgYWxsIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGgsIHN0YXJ0aW5nIGZyb20gYSBTaW5rLgorICAgICAqCisgICAgICogVGhpcyBtdXN0IG5vdCBiZSBjYWxsZWQgYXQgdGhlIHNhbWUgdGltZSBhcyBwdWxsRGF0YSEKKyAgICAgKi8KKyAgICB2b2lkIHB1bGxSZXNldCgpOworCisgICAgLyoqCisgICAgICogUmVzZXQgZnJhbWVQb3NpdGlvbiBjb3VudGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZvaWQgYWRkSW5wdXRQb3J0KEZsb3dHcmFwaFBvcnQgJnBvcnQpIHsKKyAgICAgICAgbUlucHV0UG9ydHMuZW1wbGFjZV9iYWNrKHBvcnQpOworICAgIH0KKworICAgIGJvb2wgaXNEYXRhUHVsbGVkQXV0b21hdGljYWxseSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhUHVsbGVkQXV0b21hdGljYWxseTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgZGF0YSBwdWxsZWQgdGhyb3VnaCB0aGUgZ3JhcGggYXV0b21hdGljYWxseS4KKyAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICAgICAqCisgICAgICogU2V0IGZhbHNlIGlmIHlvdSB3YW50IHRvIHB1bGwgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgcG9ydHMgaW4gdGhlIG9uUHJvY2VzcygpIG1ldGhvZC4KKyAgICAgKiBZb3UgbWlnaHQgZG8gdGhpcywgZm9yIGV4YW1wbGUsIGluIGEgc2FtcGxlIHJhdGUgY29udmVydGluZyBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGF1dG9tYXRpYworICAgICAqLworICAgIHZvaWQgc2V0RGF0YVB1bGxlZEF1dG9tYXRpY2FsbHkoYm9vbCBhdXRvbWF0aWMpIHsKKyAgICAgICAgbURhdGFQdWxsZWRBdXRvbWF0aWNhbGx5ID0gYXV0b21hdGljOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJGbG93R3JhcGgiOworICAgIH0KKworICAgIGludDY0X3QgZ2V0TGFzdENhbGxDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1MYXN0Q2FsbENvdW50OworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90ICBrSW5pdGlhbENhbGxDb3VudCA9IC0xOworICAgIGludDY0X3QgIG1MYXN0Q2FsbENvdW50ID0ga0luaXRpYWxDYWxsQ291bnQ7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEZsb3dHcmFwaFBvcnQ+PiBtSW5wdXRQb3J0czsKKworcHJpdmF0ZToKKyAgICBib29sICAgICBtRGF0YVB1bGxlZEF1dG9tYXRpY2FsbHkgPSB0cnVlOworICAgIGJvb2wgICAgIG1CbG9ja1JlY3Vyc2lvbiA9IGZhbHNlOworICAgIGludDMyX3QgIG1MYXN0RnJhbWVDb3VudCA9IDA7CisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGlzIGlzIGEgY29ubmVjdG9yIHRoYXQgYWxsb3dzIGRhdGEgdG8gZmxvdyBiZXR3ZWVuIG1vZHVsZXMuCisgICoKKyAgKiBUaGUgcG9ydHMgYXJlIHRoZSBwcmltYXJ5IG1lYW5zIG9mIGludGVyYWN0aW5nIHdpdGggYSBtb2R1bGUuCisgICogU28gdGhleSBhcmUgZ2VuZXJhbGx5IGRlY2xhcmVkIGFzIHB1YmxpYy4KKyAgKgorICAqLworY2xhc3MgRmxvd0dyYXBoUG9ydCB7CitwdWJsaWM6CisgICAgRmxvd0dyYXBoUG9ydChGbG93R3JhcGhOb2RlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBtQ29udGFpbmluZ05vZGUocGFyZW50KQorICAgICAgICAgICAgLCBtU2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFBvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgorICAgIEZsb3dHcmFwaFBvcnQoY29uc3QgRmxvd0dyYXBoUG9ydCYpID0gZGVsZXRlOworICAgIEZsb3dHcmFwaFBvcnQmIG9wZXJhdG9yPShjb25zdCBGbG93R3JhcGhQb3J0JikgPSBkZWxldGU7CisKKyAgICBpbnQzMl90IGdldFNhbXBsZXNQZXJGcmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWU7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBwdWxsUmVzZXQoKSB7fQorCitwcm90ZWN0ZWQ6CisgICAgRmxvd0dyYXBoTm9kZSAmbUNvbnRhaW5pbmdOb2RlOworCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbVNhbXBsZXNQZXJGcmFtZSA9IDE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBUaGlzIHBvcnQgY29udGFpbnMgYSAzMi1iaXQgZmxvYXQgYnVmZmVyIHRoYXQgY2FuIGNvbnRhaW4gc2V2ZXJhbCBmcmFtZXMgb2YgZGF0YS4KKyAqIFByb2Nlc3NpbmcgdGhlIGRhdGEgaW4gYSBibG9jayBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KKyAqCisgKiBUaGUgc2l6ZSBpcyBmcmFtZXNQZXJCdWZmZXIgKiBzYW1wbGVzUGVyRnJhbWUpLgorICovCitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXQgIDogcHVibGljIEZsb3dHcmFwaFBvcnQgeworcHVibGljOgorICAgIEZsb3dHcmFwaFBvcnRGbG9hdChGbG93R3JhcGhOb2RlICZwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdWZmZXIgPSBrRGVmYXVsdEJ1ZmZlclNpemUKKyAgICAgICAgICAgICAgICApOworCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoUG9ydEZsb2F0KCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQnVmZmVyOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCAqZ2V0QnVmZmVyKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQnVmZmVyID0gMTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbUJ1ZmZlcjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhlIHJlc3VsdHMgb2YgYSBub2RlJ3MgcHJvY2Vzc2luZyBhcmUgc3RvcmVkIGluIHRoZSBidWZmZXJzIG9mIHRoZSBvdXRwdXQgcG9ydHMuCisgICovCitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgOiBwdWJsaWMgRmxvd0dyYXBoUG9ydEZsb2F0IHsKK3B1YmxpYzoKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQoRmxvd0dyYXBoTm9kZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogRmxvd0dyYXBoUG9ydEZsb2F0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0KCkgPSBkZWZhdWx0OworCisgICAgdXNpbmcgRmxvd0dyYXBoUG9ydEZsb2F0OjpnZXRCdWZmZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogSWYgeW91IGNvbm5lY3QgYSBzZWNvbmQgb3V0cHV0IHBvcnQgdG8gYW4gaW5wdXQgcG9ydAorICAgICAqIHRoZW4gaXQgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLiBEbyBub3QgbW9kaWZ5IHRoZSBncmFwaCB0b3BvbG9neSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIHJ1bm5pbmcuCisgICAgICogQWxzbyBkbyBub3QgZGVsZXRlIGEgbW9kdWxlIHdoaWxlIGl0IGlzIGNvbm5lY3RlZCB0byBhbm90aGVyIHBvcnQgaWYgdGhlIGdyYXBoIGlzIHJ1bm5pbmcuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEZsb3dHcmFwaFBvcnRGbG9hdElucHV0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KEZsb3dHcmFwaFBvcnRGbG9hdElucHV0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIHBhcmVudCBtb2R1bGUncyBvblByb2Nlc3MoKSBtZXRob2QuCisgICAgICogVGhhdCBtYXkgcHVsbCBkYXRhIGZyb20gaXRzIGlucHV0cyBhbmQgcmVjdXJzaXZlbHkKKyAgICAgKiBwcm9jZXNzIHRoZSBlbnRpcmUgZ3JhcGguCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHB1bGxlZAorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKworICAgIHZvaWQgcHVsbFJlc2V0KCkgb3ZlcnJpZGU7CisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQW4gaW5wdXQgcG9ydCBmb3Igc3RyZWFtaW5nIGF1ZGlvIGRhdGEuCisgKiBZb3UgY2FuIHNldCBhIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwcm9jZXNzaW5nLgorICogSWYgeW91IGNvbm5lY3QgYW4gb3V0cHV0IHBvcnQgdG8gdGhpcyBwb3J0IHRoZW4gaXRzIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICovCitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCA6IHB1YmxpYyBGbG93R3JhcGhQb3J0RmxvYXQgeworcHVibGljOgorICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0KEZsb3dHcmFwaE5vZGUgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEZsb3dHcmFwaFBvcnRGbG9hdChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgICAgICAvLyBBZGQgdG8gcGFyZW50IHNvIGl0IGNhbiBwdWxsIGRhdGEgZnJvbSBlYWNoIGlucHV0LgorICAgICAgICBwYXJlbnQuYWRkSW5wdXRQb3J0KCp0aGlzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhQb3J0RmxvYXRJbnB1dCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KKyAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgorICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCisgICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgorICAgICAqLworICAgIGZsb2F0ICpnZXRCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGV2ZXJ5IHZhbHVlIG9mIHRoZSBmbG9hdCBidWZmZXIuCisgICAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaWYgYW4gb3V0cHV0IHBvcnQgaXMgY29ubmVjdGVkCisgICAgICogdG8gdGhpcyBwb3J0LgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaW50IG51bUZsb2F0cyA9IGtEZWZhdWx0QnVmZmVyU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmxvYXRzOyBpKyspIHsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgb3V0cHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBwb3J0LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgIG1Db25uZWN0ZWQgPSBwb3J0OworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdChGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7CisgICAgICAgICh2b2lkKSBwb3J0OworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1bGwgZGF0YSBmcm9tIGFueSBvdXRwdXQgcG9ydCB0aGF0IGlzIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBwdWxsUmVzZXQoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgKm1Db25uZWN0ZWQgPSBudWxscHRyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbiBlZGdlIG5vZGUgaW4gYSBncmFwaCB0aGF0IGhhcyBubyB1cHN0cmVhbSBub2Rlcy4KKyAqIEl0IG91dHB1dHMgZGF0YSBidXQgZG9lcyBub3QgY29uc3VtZSBkYXRhLgorICogQnkgZGVmYXVsdCwgaXQgd2lsbCByZWFkIGl0cyBkYXRhIGZyb20gYW4gZXh0ZXJuYWwgYnVmZmVyLgorICovCitjbGFzcyBGbG93R3JhcGhTb3VyY2UgOiBwdWJsaWMgRmxvd0dyYXBoTm9kZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoU291cmNlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFNvdXJjZSgpID0gZGVmYXVsdDsKKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFuIGVkZ2Ugbm9kZSBpbiBhIGdyYXBoIHRoYXQgaGFzIG5vIHVwc3RyZWFtIG5vZGVzLgorICogSXQgb3V0cHV0cyBkYXRhIGJ1dCBkb2VzIG5vdCBjb25zdW1lIGRhdGEuCisgKiBCeSBkZWZhdWx0LCBpdCB3aWxsIHJlYWQgaXRzIGRhdGEgZnJvbSBhbiBleHRlcm5hbCBidWZmZXIuCisgKi8KK2NsYXNzIEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkIDogcHVibGljIEZsb3dHcmFwaFNvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IEZsb3dHcmFwaFNvdXJjZShjaGFubmVsQ291bnQpIHt9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhTb3VyY2VCdWZmZXJlZCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgYnVmZmVyIHRoYXQgdGhlIG5vZGUgd2lsbCByZWFkIGZyb20uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBUT0RPIENvbnNpZGVyIHVzaW5nIHN0ZDo6c2hhcmVkX3B0ci4KKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICovCisgICAgdm9pZCBzZXREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbVNpemVJbkZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgbUZyYW1lSW5kZXggPSAwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHZvaWQgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICBtU2l6ZUluRnJhbWVzID0gMDsgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBtRGF0YQorICAgIGludDMyX3QgICAgIG1GcmFtZUluZGV4ID0gMDsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFuIGVkZ2Ugbm9kZSBpbiBhIGdyYXBoIHRoYXQgaGFzIG5vIGRvd25zdHJlYW0gbm9kZXMuCisgKiBJdCBjb25zdW1lcyBkYXRhIGJ1dCBkb2VzIG5vdCBvdXRwdXQgZGF0YS4KKyAqIFRoaXMgZ3JhcGggd2lsbCBiZSBleGVjdXRlZCB3aGVuIGRhdGEgaXMgcmVhZCgpIGZyb20gdGhpcyBub2RlCisgKiBieSBwdWxsaW5nIGRhdGEgZnJvbSB1cHN0cmVhbSBub2Rlcy4KKyAqLworY2xhc3MgRmxvd0dyYXBoU2luayA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBGbG93R3JhcGhTaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoU2luaygpID0gZGVmYXVsdDsKKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworCisgICAgLyoqCisgICAgICogRG8gbm90aGluZy4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogUHVsbCBkYXRhIHRocm91Z2ggdGhlIGdyYXBoIHVzaW5nIHRoaXMgbm9kZXMgbGFzdCBjYWxsQ291bnQuCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDMyX3QgbnVtRnJhbWVzKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGEgbm9kZSB0aGF0IGhhcyBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzLgorICogVGhpcyBtYXkgaW5jbHVkZSB0cmFkaXRpb25hbCBmaWx0ZXJzLCBlZy4gRklSLCBidXQgYWxzbyBpbmNsdWRlCisgKiBhbnkgcHJvY2Vzc2luZyBub2RlIHRoYXQgY29udmVydHMgaW5wdXQgdG8gb3V0cHV0LgorICovCitjbGFzcyBGbG93R3JhcGhGaWx0ZXIgOiBwdWJsaWMgRmxvd0dyYXBoTm9kZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoRmlsdGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaEZpbHRlcigpID0gZGVmYXVsdDsKKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8qIEZMT1dHUkFQSF9GTE9XX0dSQVBIX05PREVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaAppbmRleCBiNzUwNDEwLi41ZTkwNTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBjbGFzcyBGbG93Z3JhcGhVdGlsaXRpZXMgewogcHVibGljOgpAQCAtMzksOSArMzksOSBAQAogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBsaW1uZWcgPSAtMS47CiAKICAgICBpZiAoZiA8PSBsaW1uZWcpIHsKLSAgICAgICAgcmV0dXJuIC0weDgwMDAwMDAwOyAvKiBvciAweDgwMDAwMDAwICovCisgICAgICAgIHJldHVybiBJTlQzMl9NSU47CiAgICAgfSBlbHNlIGlmIChmID49IGxpbXBvcykgewotICAgICAgICByZXR1cm4gMHg3ZmZmZmZmZjsKKyAgICAgICAgcmV0dXJuIElOVDMyX01BWDsKICAgICB9CiAgICAgZiAqPSBzY2FsZTsKICAgICAvKiBpbnRlZ2VyIGNvbnZlcnNpb24gaXMgdGhyb3VnaCB0cnVuY2F0aW9uICh0aG91Z2ggaW50IHRvIGZsb2F0IGlzIG5vdCkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NzNiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJNYW55VG9NdWx0aUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCitNYW55VG9NdWx0aUNvbnZlcnRlcjo6TWFueVRvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXRzKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgaW5wdXRzW2ldID0gc3RkOjptYWtlX3VuaXF1ZTxGbG93R3JhcGhQb3J0RmxvYXRJbnB1dD4oKnRoaXMsIDEpOworICAgIH0KK30KKworaW50MzJfdCBNYW55VG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0c1tjaF0tPmdldEJ1ZmZlcigpOworICAgICAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpICsgY2g7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgLy8gcmVhZCBvbmUsIHdyaXRlIGludG8gdGhlIHByb3BlciBpbnRlcmxlYXZlZCBvdXRwdXQgY2hhbm5lbAorICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKmlucHV0QnVmZmVyKys7CisgICAgICAgICAgICAqb3V0cHV0QnVmZmVyID0gc2FtcGxlOworICAgICAgICAgICAgb3V0cHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsgLy8gYWR2YW5jZSB0byBuZXh0IG11bHRpY2hhbm5lbCBmcmFtZQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXM7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjQ0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX01BTllfVE9fTVVMVElfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01BTllfVE9fTVVMVElfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29tYmluZSBtdWx0aXBsZSBtb25vIGlucHV0cyBpbnRvIG9uZSBpbnRlcmxlYXZlZCBtdWx0aS1jaGFubmVsIG91dHB1dC4KKyAqLworY2xhc3MgTWFueVRvTXVsdGlDb252ZXJ0ZXIgOiBwdWJsaWMgZmxvd2dyYXBoOjpGbG93R3JhcGhOb2RlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNYW55VG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5NYW55VG9NdWx0aUNvbnZlcnRlcigpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgLyplbmFibGVkKi8pIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpGbG93R3JhcGhQb3J0RmxvYXRJbnB1dD4+IGlucHV0czsKKyAgICBmbG93Z3JhcGg6OkZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIk1hbnlUb011bHRpQ29udmVydGVyIjsKKyAgICB9CisKK3ByaXZhdGU6Cit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01BTllfVE9fTVVMVElfQ09OVkVSVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDc1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIk1vbm9CbGVuZC5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCitNb25vQmxlbmQ6Ok1vbm9CbGVuZChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBGbG93R3JhcGhGaWx0ZXIoY2hhbm5lbENvdW50KQorICAgICAgICAsIG1JbnZDaGFubmVsQ291bnQoMS4gLyBjaGFubmVsQ291bnQpCit7Cit9CisKK2ludDMyX3QgTW9ub0JsZW5kOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1GcmFtZXM7ICsraSkgeworICAgICAgICBmbG9hdCBhY2N1bSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGFjY3VtICs9ICppbnB1dEJ1ZmZlcisrOworICAgICAgICB9CisgICAgICAgIGFjY3VtICo9IG1JbnZDaGFubmVsQ291bnQ7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbENvdW50OyArK2opIHsKKyAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IGFjY3VtOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub0JsZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkNDRmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX01PTk9fQkxFTkRfSAorI2RlZmluZSBGTE9XR1JBUEhfTU9OT19CTEVORF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29tYmluZSBkYXRhIGJldHdlZW4gbXVsdGlwbGUgY2hhbm5lbHMgc28gZWFjaCBjaGFubmVsIGlzIGFuIGF2ZXJhZ2UKKyAqIG9mIGFsbCBjaGFubmVscy4KKyAqLworY2xhc3MgTW9ub0JsZW5kIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTW9ub0JsZW5kKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfk1vbm9CbGVuZCgpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiTW9ub0JsZW5kIjsKKyAgICB9Citwcml2YXRlOgorICAgIGNvbnN0IGZsb2F0IG1JbnZDaGFubmVsQ291bnQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01PTk9fQkxFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcAppbmRleCA3OGFhZDUyLi4zM2VlZDUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCkBAIC0xNCwzNCArMTQsMjggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKICNpbmNsdWRlICJNb25vVG9NdWx0aUNvbnZlcnRlci5oIgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAotTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Ok1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Ok1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3Qgb3V0cHV0Q2hhbm5lbENvdW50KQogICAgICAgICA6IGlucHV0KCp0aGlzLCAxKQotICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBvdXRwdXRDaGFubmVsQ291bnQpIHsKIH0KIAotTW9ub1RvTXVsdGlDb252ZXJ0ZXI6On5Nb25vVG9NdWx0aUNvbnZlcnRlcigpIHsgfQotCi1pbnQzMl90IE1vbm9Ub011bHRpQ29udmVydGVyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLQotICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBNb25vVG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICAvLyBUT0RPIG1heWJlIG1vdmUgdG8gYXVkaW9fdXRpbCBhcyBhdWRpb19tb25vX3RvX211bHRpKCkKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvUHJvY2VzczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewogICAgICAgICAvLyByZWFkIG9uZSwgd3JpdGUgbWFueQogICAgICAgICBmbG9hdCBzYW1wbGUgPSAqaW5wdXRCdWZmZXIrKzsKICAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsQ291bnQ7IGNoYW5uZWwrKykgewogICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc2FtcGxlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIG51bUZyYW1lczsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKaW5kZXggMzRkNTNjNy4uNzYyZWRiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCkBAIC0xNCwyOSArMTQsMzYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogI2lmbmRlZiBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAogI2RlZmluZSBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CisvKioKKyAqIENvbnZlcnQgYSBtb25vcGhvbmljIHN0cmVhbSB0byBhIG11bHRpLWNoYW5uZWwgaW50ZXJsZWF2ZWQgc3RyZWFtCisgKiB3aXRoIHRoZSBzYW1lIHNpZ25hbCBvbiBlYWNoIGNoYW5uZWwuCisgKi8KK2NsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKyAgICBleHBsaWNpdCBNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCk7CiAKLSAgICB2aXJ0dWFsIH5Nb25vVG9NdWx0aUNvbnZlcnRlcigpOworICAgIHZpcnR1YWwgfk1vbm9Ub011bHRpQ29udmVydGVyKCkgPSBkZWZhdWx0OwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOwogCi0gICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJNb25vVG9NdWx0aUNvbnZlcnRlciI7CisgICAgfQorCisgICAgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgaW5wdXQ7CisgICAgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0IG91dHB1dDsKIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIk11bHRpVG9NYW55Q29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKK011bHRpVG9NYW55Q29udmVydGVyOjpNdWx0aVRvTWFueUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBvdXRwdXRzKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICBvdXRwdXRzW2ldID0gc3RkOjptYWtlX3VuaXF1ZTxGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ+KCp0aGlzLCAxKTsKKyAgICB9Cit9CisKK011bHRpVG9NYW55Q29udmVydGVyOjp+TXVsdGlUb01hbnlDb252ZXJ0ZXIoKSA9IGRlZmF1bHQ7CisKK2ludDMyX3QgTXVsdGlUb01hbnlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJ1ZmZlcigpICsgY2g7CisgICAgICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXRzW2NoXS0+Z2V0QnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyOworICAgICAgICAgICAgaW5wdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTQwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX01VTFRJX1RPX01BTllfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01VTFRJX1RPX01BTllfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorCituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKworLyoqCisgKiBDb252ZXJ0IGEgbXVsdGktY2hhbm5lbCBpbnRlcmxlYXZlZCBzdHJlYW0gdG8gbXVsdGlwbGUgbW9uby1jaGFubmVsCisgKiBvdXRwdXRzCisgKi8KKyAgICBjbGFzcyBNdWx0aVRvTWFueUNvbnZlcnRlciA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IE11bHRpVG9NYW55Q29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgICAgICB2aXJ0dWFsIH5NdWx0aVRvTWFueUNvbnZlcnRlcigpOworCisgICAgICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgICAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuICJNdWx0aVRvTWFueUNvbnZlcnRlciI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ+PiBvdXRwdXRzOworICAgICAgICBmbG93Z3JhcGg6OkZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgIH07CisKK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfTVVMVElfVE9fTUFOWV9DT05WRVJURVJfSApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdmOTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiTXVsdGlUb01vbm9Db252ZXJ0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKKworTXVsdGlUb01vbm9Db252ZXJ0ZXI6Ok11bHRpVG9Nb25vQ29udmVydGVyKGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGlucHV0Q2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgMSkgeworfQorCitNdWx0aVRvTW9ub0NvbnZlcnRlcjo6fk11bHRpVG9Nb25vQ29udmVydGVyKCkgPSBkZWZhdWx0OworCitpbnQzMl90IE11bHRpVG9Nb25vQ29udmVydGVyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAvLyByZWFkIGZpcnN0IGNoYW5uZWwgb2YgbXVsdGkgc3RyZWFtLCB3cml0ZSBtYW55CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcjsKKyAgICAgICAgaW5wdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTW9ub0NvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjViN2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9NVUxUSV9UT19NT05PX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9NVUxUSV9UT19NT05PX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29udmVydCBhIG11bHRpLWNoYW5uZWwgaW50ZXJsZWF2ZWQgc3RyZWFtIHRvIGEgbW9ub3Bob25pYyBzdHJlYW0KKyAqIGJ5IGV4dHJhY3RpbmcgY2hhbm5lbFswXS4KKyAqLworICAgIGNsYXNzIE11bHRpVG9Nb25vQ29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgTXVsdGlUb01vbm9Db252ZXJ0ZXIoaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCk7CisKKyAgICAgICAgdmlydHVhbCB+TXVsdGlUb01vbm9Db252ZXJ0ZXIoKTsKKworICAgICAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiAiTXVsdGlUb01vbm9Db252ZXJ0ZXIiOworICAgICAgICB9CisKKyAgICAgICAgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgaW5wdXQ7CisgICAgICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CisgICAgfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NVUxUSV9UT19NT05PX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCmluZGV4IGEyNjA4MjguLjgwYWM3MmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCkBAIC0xNCwyMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiUmFtcExpbmVhciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAjaW5jbHVkZSAiUmFtcExpbmVhci5oIgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogUmFtcExpbmVhcjo6UmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQotICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoRmlsdGVyKGNoYW5uZWxDb3VudCkgewogICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7CiB9CiAKQEAgLTM3LDE2ICszMiwxOSBAQAogCiB2b2lkIFJhbXBMaW5lYXI6OnNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKICAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7CisgICAgLy8gSWYgdGhlIHJhbXAgaGFzIG5vdCBiZWVuIHVzZWQgdGhlbiBzdGFydCBpbW1lZGlhdGVseSBhdCB0aGlzIGxldmVsLgorICAgIGlmIChtTGFzdENhbGxDb3VudCA9PSBrSW5pdGlhbENhbGxDb3VudCkgeworICAgICAgICBmb3JjZUN1cnJlbnQodGFyZ2V0KTsKKyAgICB9CiB9CiAKIGZsb2F0IFJhbXBMaW5lYXI6OmludGVycG9sYXRlQ3VycmVudCgpIHsKICAgICByZXR1cm4gbUxldmVsVG8gLSAobVJlbWFpbmluZyAqIG1TY2FsZXIpOwogfQogCi1pbnQzMl90IFJhbXBMaW5lYXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOwotICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBSYW1wTGluZWFyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOwogICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgZmxvYXQgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7CkBAIC01NSwxMiArNTMsMTAgQEAKICAgICAgICAgbUxldmVsRnJvbSA9IGludGVycG9sYXRlQ3VycmVudCgpOwogICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKICAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKLSAgICAgICAgQUxPR1YoIiVzKCkgbUxldmVsRnJvbSA9ICVmLCBtTGV2ZWxUbyA9ICVmLCBtUmVtYWluaW5nID0gJWQsIG1TY2FsZXIgPSAlZiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBtTGV2ZWxGcm9tLCBtTGV2ZWxUbywgbVJlbWFpbmluZywgbVNjYWxlcik7CiAgICAgICAgIG1TY2FsZXIgPSAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1MZW5ndGhJbkZyYW1lczsgLy8gZm9yIGludGVycG9sYXRpb24KICAgICB9CiAKLSAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogCiAgICAgaWYgKG1SZW1haW5pbmcgPiAwKSB7IC8vIFJhbXBpbmc/IFRoaXMgZG9lc24ndCBoYXBwZW4gdmVyeSBvZnRlbi4KICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1JhbXAgPSBzdGQ6Om1pbihmcmFtZXNMZWZ0LCBtUmVtYWluaW5nKTsKQEAgLTgxLDUgKzc3LDUgQEAKICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBtTGV2ZWxUbzsKICAgICB9CiAKLSAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBudW1GcmFtZXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKaW5kZXggYmRjOGY0MS4uMzgzOWQ2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApAQCAtMjEsMTcgKzIxLDI1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFJhbXBMaW5lYXIgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKKy8qKgorICogV2hlbiB0aGUgdGFyZ2V0IGlzIG1vZGlmaWVkIHRoZW4gdGhlIG91dHB1dCB3aWxsIHJhbXAgc21vb3RobHkKKyAqIGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgbmV3IHRhcmdldCB2YWx1ZS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc21vb3RoIG91dCBjb250cm9sIHZhbHVlcyBhbmQgcmVkdWNlIHBvcHMuCisgKgorICogVGhlIHRhcmdldCBtYXkgYmUgdXBkYXRlZCB3aGlsZSBhIHJhbXAgaXMgaW4gcHJvZ3Jlc3MsIHdoaWNoIHdpbGwgdHJpZ2dlcgorICogYSBuZXcgcmFtcCBmcm9tIHRoZSBjdXJyZW50IHZhbHVlLgorICovCitjbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgUmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5SYW1wTGluZWFyKCkgPSBkZWZhdWx0OwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgbmV4dCByYW1wLgpAQCAtNjYsOCArNzQsOSBAQAogICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOwogICAgIH0KIAotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiUmFtcExpbmVhciI7CisgICAgfQogCiBwcml2YXRlOgogCkBAIC04Miw2ICs5MSw2IEBACiAgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NhbXBsZVJhdGVDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWZjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2FtcGxlUmF0ZUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlcjsKKworU2FtcGxlUmF0ZUNvbnZlcnRlcjo6U2FtcGxlUmF0ZUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlDaGFubmVsUmVzYW1wbGVyICZyZXNhbXBsZXIpCisgICAgICAgIDogRmxvd0dyYXBoRmlsdGVyKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBtUmVzYW1wbGVyKHJlc2FtcGxlcikgeworICAgIHNldERhdGFQdWxsZWRBdXRvbWF0aWNhbGx5KGZhbHNlKTsKK30KKwordm9pZCBTYW1wbGVSYXRlQ29udmVydGVyOjpyZXNldCgpIHsKKyAgICBGbG93R3JhcGhOb2RlOjpyZXNldCgpOworICAgIG1JbnB1dEN1cnNvciA9IGtJbml0aWFsQ2FsbENvdW50OworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHNhbXBsZSBhdmFpbGFibGUuCitib29sIFNhbXBsZVJhdGVDb252ZXJ0ZXI6OmlzSW5wdXRBdmFpbGFibGUoKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBjb25zdW1lZCBhbGwgb2YgdGhlIGlucHV0IGRhdGEgdGhlbiBnbyBvdXQgYW5kIGdldCBzb21lIG1vcmUuCisgICAgaWYgKG1JbnB1dEN1cnNvciA+PSBtTnVtVmFsaWRJbnB1dEZyYW1lcykgeworICAgICAgICBtSW5wdXRDYWxsQ291bnQrKzsKKyAgICAgICAgbU51bVZhbGlkSW5wdXRGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtSW5wdXRDYWxsQ291bnQsIGlucHV0LmdldEZyYW1lc1BlckJ1ZmZlcigpKTsKKyAgICAgICAgbUlucHV0Q3Vyc29yID0gMDsKKyAgICB9CisgICAgcmV0dXJuIChtSW5wdXRDdXJzb3IgPCBtTnVtVmFsaWRJbnB1dEZyYW1lcyk7Cit9CisKK2NvbnN0IGZsb2F0ICpTYW1wbGVSYXRlQ29udmVydGVyOjpnZXROZXh0SW5wdXRGcmFtZSgpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICByZXR1cm4gJmlucHV0QnVmZmVyW21JbnB1dEN1cnNvcisrICogaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCldOworfQorCitpbnQzMl90IFNhbXBsZVJhdGVDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgaW50IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIEdhdGhlciBpbnB1dCBzYW1wbGVzIGFzIG5lZWRlZC4KKyAgICAgICAgaWYobVJlc2FtcGxlci5pc1dyaXRlTmVlZGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0lucHV0QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZnJhbWUgPSBnZXROZXh0SW5wdXRGcmFtZSgpOworICAgICAgICAgICAgICAgIG1SZXNhbXBsZXIud3JpdGVOZXh0RnJhbWUoZnJhbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE91dHB1dCBmcmFtZSBpcyBpbnRlcnBvbGF0ZWQgZnJvbSBpbnB1dCBzYW1wbGVzLgorICAgICAgICAgICAgbVJlc2FtcGxlci5yZWFkTmV4dEZyYW1lKG91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgZnJhbWVzTGVmdC0tOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODNlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0FNUExFX1JBVEVfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NBTVBMRV9SQVRFX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKyNpbmNsdWRlICJyZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCitjbGFzcyBTYW1wbGVSYXRlQ29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2FtcGxlUmF0ZUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcjo6TXVsdGlDaGFubmVsUmVzYW1wbGVyICZtUmVzYW1wbGVyKTsKKworICAgIHZpcnR1YWwgflNhbXBsZVJhdGVDb252ZXJ0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNhbXBsZVJhdGVDb252ZXJ0ZXIiOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgc2FtcGxlIGF2YWlsYWJsZS4KKyAgICBib29sIGlzSW5wdXRBdmFpbGFibGUoKTsKKworICAgIC8vIFRoaXMgYXNzdW1lcyBkYXRhIGlzIGF2YWlsYWJsZS4gT25seSBjYWxsIGFmdGVyIGNhbGxpbmcgaXNJbnB1dEF2YWlsYWJsZSgpLgorICAgIGNvbnN0IGZsb2F0ICpnZXROZXh0SW5wdXRGcmFtZSgpOworCisgICAgcmVzYW1wbGVyOjpNdWx0aUNoYW5uZWxSZXNhbXBsZXIgJm1SZXNhbXBsZXI7CisKKyAgICBpbnQzMl90IG1JbnB1dEN1cnNvciA9IDA7ICAgICAgICAgLy8gb2Zmc2V0IGludG8gdGhlIGlucHV0IHBvcnQgYnVmZmVyCisgICAgaW50MzJfdCBtTnVtVmFsaWRJbnB1dEZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiB2YWxpZCBmcmFtZXMgY3VycmVudGx5IGluIHRoZSBpbnB1dCBwb3J0IGJ1ZmZlcgorICAgIC8vIFdlIG5lZWQgb3VyIG93biBjYWxsQ291bnQgZm9yIHVwc3RyZWFtIGNhbGxzIGJlY2F1c2UgY2FsbHMgb2NjdXIgYXQgYSBkaWZmZXJlbnQgcmF0ZS4KKyAgICAvLyBUaGlzIG1lYW5zIHdlIGNhbm5vdCBoYXZlIGN5Y2xpYyBncmFwaHMgb3IgbWVyZ2VzIHRoYXQgY29udGFpbiBhbiBTUkMuCisgICAgaW50NjRfdCBtSW5wdXRDYWxsQ291bnQgPSAwOworCit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NBTVBMRV9SQVRFX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcAppbmRleCBmYjNkY2JjLi45NDBhNjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKQEAgLTE2LDMxICsxNiwzMSBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKICNpbmNsdWRlICJTaW5rRmxvYXQuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNpbmtGbG9hdDo6U2lua0Zsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTaW5rKGNoYW5uZWxDb3VudCkgewogfQogCiBpbnQzMl90IFNpbmtGbG9hdDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIGZsb2F0ICpmbG9hdERhdGEgPSAoZmxvYXQgKikgZGF0YTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CiAgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CiAgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgotICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOwotICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVzUHVsbGVkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNQdWxsZWQgPD0gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUHVsbGVkICogY2hhbm5lbENvdW50OwogICAgICAgICBtZW1jcHkoZmxvYXREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICAgZmxvYXREYXRhICs9IG51bVNhbXBsZXM7Ci0gICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNQdWxsZWQ7CiAgICAgfQogICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaAppbmRleCA3Nzc1YzA4Li4zYmUzZjVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApAQCAtMjEsMTggKzIxLDI1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBBdWRpb1NpbmsgeworLyoqCisgKiBBdWRpb1NpbmsgdGhhdCBsZXRzIHlvdSByZWFkIGRhdGEgYXMgMzItYml0IGZsb2F0cy4KKyAqLworY2xhc3MgU2lua0Zsb2F0IDogcHVibGljIEZsb3dHcmFwaFNpbmsgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisgICAgflNpbmtGbG9hdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CiAKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNpbmtGbG9hdCI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcAppbmRleCBmZmVjOGY1Li42OTA0MzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApAQCAtMTcsMTcgKzE3LDE2IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlICJTaW5rSTE2LmgiCisKKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCi0jaW5jbHVkZSAiU2lua0kxNi5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogU2lua0kxNjo6U2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorICAgICAgICA6IEZsb3dHcmFwaFNpbmsoY2hhbm5lbENvdW50KSB7fQogCiBpbnQzMl90IFNpbmtJMTY6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICBpbnQxNl90ICpzaG9ydERhdGEgPSAoaW50MTZfdCAqKSBkYXRhOwpAQCAtMzYsMTMgKzM1LDEzIEBACiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QnVmZmVyKCk7CiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7Ci0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc2hvcnREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMpOwogICAgICAgICBzaG9ydERhdGEgKz0gbnVtU2FtcGxlczsKICAgICAgICAgc2lnbmFsICs9IG51bVNhbXBsZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKaW5kZXggNmQ4NjI2Ni4uYmYxMjRmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApAQCAtMjAsMTcgKzIwLDI0IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNpbmtJMTYgOiBwdWJsaWMgQXVkaW9TaW5rIHsKKy8qKgorICogQXVkaW9TaW5rIHRoYXQgbGV0cyB5b3UgcmVhZCBkYXRhIGFzIDE2LWJpdCBzaWduZWQgaW50ZWdlcnMuCisgKi8KK2NsYXNzIFNpbmtJMTYgOiBwdWJsaWMgRmxvd0dyYXBoU2luayB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTaW5rSTE2IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcAppbmRleCAwY2IwNzdkLi5kNGY2OGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMTUsMTkgKzE1LDIwIEBACiAgKi8KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiU2lua0kyNC5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNpbmtJMjQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNpbmtJMjQ6OlNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKyAgICAgICAgOiBGbG93R3JhcGhTaW5rKGNoYW5uZWxDb3VudCkge30KIAogaW50MzJfdCBTaW5rSTI0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgdWludDhfdCAqYnl0ZURhdGEgPSAodWludDhfdCAqKSBkYXRhOwpAQCAtMzYsMTMgKzM3LDEzIEBACiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gaW5wdXQuZ2V0QnVmZmVyKCk7CiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7Ci0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgICAgICBtZW1jcHlfdG9fcDI0X2Zyb21fZmxvYXQoYnl0ZURhdGEsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyk7CiAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKICAgICAgICAgYnl0ZURhdGEgKz0gbnVtU2FtcGxlcyAqIGtCeXRlc1BlckkyNFBhY2tlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaAppbmRleCA1YjliNTA1Li42YjQxMzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCkBAIC0yMCwxNyArMjAsMjUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKIAotY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBBdWRpb1NpbmsgeworLyoqCisgKiBBdWRpb1NpbmsgdGhhdCBsZXRzIHlvdSByZWFkIGRhdGEgYXMgcGFja2VkIDI0LWJpdCBzaWduZWQgaW50ZWdlcnMuCisgKiBUaGUgc2FtcGxlIHNpemUgaXMgMyBieXRlcy4KKyAqLworY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBGbG93R3JhcGhTaW5rIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKIAogICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNpbmtJMjQiOworICAgIH0KIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCmluZGV4IGVhYjg2M2QuLmIxNGIzZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCkBAIC0xNCwxOCArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBfX0FORFJPSURfXwotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogI2luY2x1ZGUgIkZsb3dncmFwaFV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlNpbmtJMzIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTaW5rSTMyOjpTaW5rSTMyKGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisgICAgICAgIDogRmxvd0dyYXBoU2luayhjaGFubmVsQ291bnQpIHt9CiAKIGludDMyX3QgU2lua0kzMjo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIGludDMyX3QgKmludERhdGEgPSAoaW50MzJfdCAqKSBkYXRhOwpAQCAtMzQsMTMgKzM0LDEzIEBACiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QnVmZmVyKCk7CiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7Ci0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgICAgICBtZW1jcHlfdG9faTMyX2Zyb21fZmxvYXQoaW50RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKICAgICAgICAgaW50RGF0YSArPSBudW1TYW1wbGVzOwogICAgICAgICBzaWduYWwgKz0gbnVtU2FtcGxlczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaAppbmRleCAwOWQyM2I3Li4zNTUwN2VhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5oCkBAIC0xOSwxOCArMTksMjIgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTaW5rSTMyIDogcHVibGljIEF1ZGlvU2luayB7CitjbGFzcyBTaW5rSTMyIDogcHVibGljIEZsb3dHcmFwaFNpbmsgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNpbmtJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpOwogICAgIH5TaW5rSTMyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU2lua0kzMiI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTMyX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcAppbmRleCA0YmI2NzRmLi5hMGM4ODI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCkBAIC0xNiwyMyArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAjaW5jbHVkZSAiU291cmNlRmxvYXQuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNvdXJjZUZsb2F0OjpTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZChjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBTb3VyY2VGbG9hdDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKK2ludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKLSAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0KLSAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7Ci0gICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOwotICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGNvbnN0IGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKIAogICAgIGNvbnN0IGZsb2F0ICpmbG9hdEJhc2UgPSAoZmxvYXQgKikgbURhdGE7CiAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9ICZmbG9hdEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKaW5kZXggZTZlZWQ5Zi4uNzgwNTNlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCkBAIC0yMCwxNyArMjAsMjUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKIAotY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworLyoqCisgKiBBdWRpb1NvdXJjZSB0aGF0IHJlYWRzIGEgYmxvY2sgb2YgcHJlLWRlZmluZWQgZmxvYXQgZGF0YS4KKyAqLworY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKyAgICB+U291cmNlRmxvYXQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNvdXJjZUZsb2F0IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCmluZGV4IGMzZmNlYzIuLjE2Y2QyYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApAQCAtMTcsMjEgKzE3LDIxIEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiU291cmNlSTE2LmgiCisKKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCi0jaW5jbHVkZSAiU291cmNlSTE2LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTb3VyY2VJMTY6OlNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZChjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CiAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CkBAIC00MSw3ICs0MSw3IEBACiAgICAgY29uc3QgaW50MTZfdCAqc2hvcnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihtRGF0YSk7CiAgICAgY29uc3QgaW50MTZfdCAqc2hvcnREYXRhID0gJnNob3J0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0RGF0YSwgc2hvcnREYXRhLCBudW1TYW1wbGVzKTsKICNlbHNlCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKaW5kZXggMmIxMTZjZi4uOTIzODkwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKQEAgLTIwLDE3ICsyMCwyMyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKLQotY2xhc3MgU291cmNlSTE2IDogcHVibGljIEF1ZGlvU291cmNlIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworLyoqCisgKiBBdWRpb1NvdXJjZSB0aGF0IHJlYWRzIGEgYmxvY2sgb2YgcHJlLWRlZmluZWQgMTYtYml0IGludGVnZXIgZGF0YS4KKyAqLworY2xhc3MgU291cmNlSTE2IDogcHVibGljIEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTb3VyY2VJMTYiOworICAgIH0KIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCmluZGV4IDA5Nzk1NGUuLmQ1NGI5NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApAQCAtMTUsMjUgKzE1LDI1IEBACiAgKi8KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOwogCiBTb3VyY2VJMjQ6OlNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZChjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBTb3VyY2VJMjQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBTb3VyY2VJMjQ6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CiAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CkBAIC00Myw3ICs0Myw3IEBACiAgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKICAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZsb2F0RGF0YSwgYnl0ZURhdGEsIG51bVNhbXBsZXMpOwogI2Vsc2UKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxLiAvIChmbG9hdCkoMVVMIDw8IDMxKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKaW5kZXggMmVkNmYxOC4uZmI2NmQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTE3LDE5ICsxNywyNyBAQAogI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICiAjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKIAotI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworLyoqCisgKiBBdWRpb1NvdXJjZSB0aGF0IHJlYWRzIGEgYmxvY2sgb2YgcHJlLWRlZmluZWQgMjQtYml0IHBhY2tlZCBpbnRlZ2VyIGRhdGEuCisgKi8KK2NsYXNzIFNvdXJjZUkyNCA6IHB1YmxpYyBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU291cmNlSTI0IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcAppbmRleCBlODE3N2FkLi5iMWM4Zjc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAKQEAgLTE3LDMxICsxNywzMSBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkzMi5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNvdXJjZUkzMi5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogU291cmNlSTMyOjpTb3VyY2VJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoY2hhbm5lbENvdW50KSB7CiB9CiAKLWludDMyX3QgU291cmNlSTMyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKK2ludDMyX3QgU291cmNlSTMyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJ1ZmZlcigpOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCi0gICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OwotICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKLSAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CiAKICAgICBjb25zdCBpbnQzMl90ICppbnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPihtRGF0YSk7CiAgICAgY29uc3QgaW50MzJfdCAqaW50RGF0YSA9ICZpbnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMzIoZmxvYXREYXRhLCBpbnREYXRhLCBudW1TYW1wbGVzKTsKICNlbHNlCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKaW5kZXggZTUwZjliZS4uNzEwOTQ2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKQEAgLTE5LDIxICsxOSwyNCBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNvdXJjZUkzMiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitjbGFzcyBTb3VyY2VJMzIgOiBwdWJsaWMgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNvdXJjZUkzMihpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAgICAgflNvdXJjZUkzMigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAorICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU291cmNlSTMyIjsKKyAgICB9CiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1NjYWxlID0gMS4wIC8gKDFVTCA8PCAzMSk7CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kzMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvSHlwZXJib2xpY0Nvc2luZVdpbmRvdy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0h5cGVyYm9saWNDb3NpbmVXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0h5cGVyYm9saWNDb3NpbmVXaW5kb3cuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9IWVBFUkJPTElDX0NPU0lORV9XSU5ET1dfSAorI2RlZmluZSBSRVNBTVBMRVJfSFlQRVJCT0xJQ19DT1NJTkVfV0lORE9XX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIENhbGN1bGF0ZSBhIEh5cGVyYm9saWNDb3NpbmVXaW5kb3cgd2luZG93IGNlbnRlcmVkIGF0IDAuCisgKiBUaGlzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGEgS2Fpc2VyIHdpbmRvdy4KKyAqCisgKiBUaGUgY29kZSBpcyBiYXNlZCBvbiBhbiBhbm9ueW1vdXMgY29udHJpYnV0aW9uIGJ5ICJhIGNvbmNlcm5lZCBjaXRpemVuIjoKKyAqIGh0dHBzOi8vZHNwLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNzcxNC9rYWlzZXItd2luZG93LWFwcHJveGltYXRpb24KKyAqLworY2xhc3MgSHlwZXJib2xpY0Nvc2luZVdpbmRvdyB7CitwdWJsaWM6CisgICAgSHlwZXJib2xpY0Nvc2luZVdpbmRvdygpIHsKKyAgICAgICAgc2V0U3RvcEJhbmRBdHRlbnVhdGlvbig2MCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGF0dGVudWF0aW9uIHR5cGljYWwgdmFsdWVzIHJhbmdlIGZyb20gMzAgdG8gOTAgZEIKKyAgICAgKiBAcmV0dXJuIGJldGEKKyAgICAgKi8KKyAgICBkb3VibGUgc2V0U3RvcEJhbmRBdHRlbnVhdGlvbihkb3VibGUgYXR0ZW51YXRpb24pIHsKKyAgICAgICAgZG91YmxlIGFscGhhID0gKCgtMzI1LjFlLTYgKiBhdHRlbnVhdGlvbiArIDAuMTY3NykgKiBhdHRlbnVhdGlvbikgLSAzLjE0OTsKKyAgICAgICAgc2V0QWxwaGEoYWxwaGEpOworICAgICAgICByZXR1cm4gYWxwaGE7CisgICAgfQorCisgICAgdm9pZCBzZXRBbHBoYShkb3VibGUgYWxwaGEpIHsKKyAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgIG1JbnZlcnNlQ29zaEFscGhhID0gMS4wIC8gY29zaChhbHBoYSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHggcmFuZ2VzIGZyb20gLTEuMCB0byArMS4wCisgICAgICovCisgICAgZG91YmxlIG9wZXJhdG9yKCkoZG91YmxlIHgpIHsKKyAgICAgICAgZG91YmxlIHgyID0geCAqIHg7CisgICAgICAgIGlmICh4MiA+PSAxLjApIHJldHVybiAwLjA7CisgICAgICAgIGRvdWJsZSB3ID0gbUFscGhhICogc3FydCgxLjAgLSB4Mik7CisgICAgICAgIHJldHVybiBjb3NoKHcpICogbUludmVyc2VDb3NoQWxwaGE7CisgICAgfQorCitwcml2YXRlOgorICAgIGRvdWJsZSBtQWxwaGEgPSAwLjA7CisgICAgZG91YmxlIG1JbnZlcnNlQ29zaEFscGhhID0gMS4wOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9IWVBFUkJPTElDX0NPU0lORV9XSU5ET1dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvSW50ZWdlclJhdGlvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWU5YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkludGVnZXJSYXRpby5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCisvLyBFbm91Z2ggcHJpbWVzIHRvIGNvdmVyIHRoZSBjb21tb24gc2FtcGxlIHJhdGVzLgorc3RhdGljIGNvbnN0IGludCBrUHJpbWVzW10gPSB7CisgICAgICAgIDIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsCisgICAgICAgIDQzLCA0NywgNTMsIDU5LCA2MSwgNjcsIDcxLCA3MywgNzksIDgzLCA4OSwgOTcsCisgICAgICAgIDEwMSwgMTAzLCAxMDcsIDEwOSwgMTEzLCAxMjcsIDEzMSwgMTM3LCAxMzksIDE0OSwKKyAgICAgICAgMTUxLCAxNTcsIDE2MywgMTY3LCAxNzMsIDE3OSwgMTgxLCAxOTEsIDE5MywgMTk3LCAxOTl9OworCit2b2lkIEludGVnZXJSYXRpbzo6cmVkdWNlKCkgeworICAgIGZvciAoaW50IHByaW1lIDoga1ByaW1lcykgeworICAgICAgICBpZiAobU51bWVyYXRvciA8IHByaW1lIHx8IG1EZW5vbWluYXRvciA8IHByaW1lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgYmlnZ2VzdCBwcmltZSBmYWN0b3IgZm9yIG51bWVyYXRvci4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCB0b3AgPSBtTnVtZXJhdG9yIC8gcHJpbWU7CisgICAgICAgICAgICBpbnQgYm90dG9tID0gbURlbm9taW5hdG9yIC8gcHJpbWU7CisgICAgICAgICAgICBpZiAoKHRvcCA+PSAxKQorICAgICAgICAgICAgICAgICYmIChib3R0b20gPj0gMSkKKyAgICAgICAgICAgICAgICAmJiAodG9wICogcHJpbWUgPT0gbU51bWVyYXRvcikgLy8gZGl2aWRlZCBldmVubHk/CisgICAgICAgICAgICAgICAgJiYgKGJvdHRvbSAqIHByaW1lID09IG1EZW5vbWluYXRvcikpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJhdG9yID0gdG9wOworICAgICAgICAgICAgICAgIG1EZW5vbWluYXRvciA9IGJvdHRvbTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI1MjRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVTQU1QTEVSX0lOVEVHRVJfUkFUSU9fSAorI2RlZmluZSBSRVNBTVBMRVJfSU5URUdFUl9SQVRJT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIFJlcHJlc2VudCB0aGUgcmF0aW8gb2YgdHdvIGludGVnZXJzLgorICovCitjbGFzcyBJbnRlZ2VyUmF0aW8geworcHVibGljOgorICAgIEludGVnZXJSYXRpbyhpbnQzMl90IG51bWVyYXRvciwgaW50MzJfdCBkZW5vbWluYXRvcikKKyAgICAgICAgICAgIDogbU51bWVyYXRvcihudW1lcmF0b3IpLCBtRGVub21pbmF0b3IoZGVub21pbmF0b3IpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZWR1Y2UgYnkgcmVtb3ZpbmcgY29tbW9uIHByaW1lIGZhY3RvcnMuCisgICAgICovCisgICAgdm9pZCByZWR1Y2UoKTsKKworICAgIGludDMyX3QgZ2V0TnVtZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbU51bWVyYXRvcjsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldERlbm9taW5hdG9yKCkgeworICAgICAgICByZXR1cm4gbURlbm9taW5hdG9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1OdW1lcmF0b3I7CisgICAgaW50MzJfdCBtRGVub21pbmF0b3I7Cit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX0lOVEVHRVJfUkFUSU9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0thaXNlcldpbmRvdy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0thaXNlcldpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWY5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvS2Fpc2VyV2luZG93LmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfS0FJU0VSX1dJTkRPV19ICisjZGVmaW5lIFJFU0FNUExFUl9LQUlTRVJfV0lORE9XX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIENhbGN1bGF0ZSBhIEthaXNlciB3aW5kb3cgY2VudGVyZWQgYXQgMC4KKyAqLworY2xhc3MgS2Fpc2VyV2luZG93IHsKK3B1YmxpYzoKKyAgICBLYWlzZXJXaW5kb3coKSB7CisgICAgICAgIHNldFN0b3BCYW5kQXR0ZW51YXRpb24oNjApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRlbnVhdGlvbiB0eXBpY2FsIHZhbHVlcyByYW5nZSBmcm9tIDMwIHRvIDkwIGRCCisgICAgICogQHJldHVybiBiZXRhCisgICAgICovCisgICAgZG91YmxlIHNldFN0b3BCYW5kQXR0ZW51YXRpb24oZG91YmxlIGF0dGVudWF0aW9uKSB7CisgICAgICAgIGRvdWJsZSBiZXRhID0gMC4wOworICAgICAgICBpZiAoYXR0ZW51YXRpb24gPiA1MCkgeworICAgICAgICAgICAgYmV0YSA9IDAuMTEwMiAqIChhdHRlbnVhdGlvbiAtIDguNyk7CisgICAgICAgIH0gZWxzZSBpZiAoYXR0ZW51YXRpb24gPj0gMjEpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhMjEgPSBhdHRlbnVhdGlvbiAtIDIxOworICAgICAgICAgICAgYmV0YSA9IDAuNTg0MiAqIHBvdyhhMjEsIDAuNCkgKyAoMC4wNzg4NiAqIGEyMSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0QmV0YShiZXRhKTsKKyAgICAgICAgcmV0dXJuIGJldGE7CisgICAgfQorCisgICAgdm9pZCBzZXRCZXRhKGRvdWJsZSBiZXRhKSB7CisgICAgICAgIG1CZXRhID0gYmV0YTsKKyAgICAgICAgbUludmVyc2VCZXNzZWxCZXRhID0gMS4wIC8gYmVzc2VsKGJldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB4IHJhbmdlcyBmcm9tIC0xLjAgdG8gKzEuMAorICAgICAqLworICAgIGRvdWJsZSBvcGVyYXRvcigpKGRvdWJsZSB4KSB7CisgICAgICAgIGRvdWJsZSB4MiA9IHggKiB4OworICAgICAgICBpZiAoeDIgPj0gMS4wKSByZXR1cm4gMC4wOworICAgICAgICBkb3VibGUgdyA9IG1CZXRhICogc3FydCgxLjAgLSB4Mik7CisgICAgICAgIHJldHVybiBiZXNzZWwodykgKiBtSW52ZXJzZUJlc3NlbEJldGE7CisgICAgfQorCisgICAgLy8gQXBwcm94aW1hdGlvbiBvZiBhCisgICAgLy8gbW9kaWZpZWQgemVybyBvcmRlciBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgLy8gQmFzZWQgb24gYSBkaXNjdXNzaW9uIGF0OgorICAgIC8vIGh0dHBzOi8vZHNwLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNzcxNC9rYWlzZXItd2luZG93LWFwcHJveGltYXRpb24KKyAgICBzdGF0aWMgZG91YmxlIGJlc3NlbChkb3VibGUgeCkgeworICAgICAgICBkb3VibGUgeSA9IGNvc2goMC45NzA5NDE4MTc0MjYwNTIgKiB4KTsKKyAgICAgICAgeSArPSBjb3NoKDAuODg1NDU2MDI1NjUzMjA5OSAqIHgpOworICAgICAgICB5ICs9IGNvc2goMC43NDg1MTA3NDgxNzExMDExICogeCk7CisgICAgICAgIHkgKz0gY29zaCgwLjU2ODA2NDc0NjczMTE1NTggKiB4KTsKKyAgICAgICAgeSArPSBjb3NoKDAuMzU0NjA0ODg3MDQyNTM1NiAqIHgpOworICAgICAgICB5ICs9IGNvc2goMC4xMjA1MzY2ODAyNTUzMjMgKiB4KTsKKyAgICAgICAgeSAqPSAyOworICAgICAgICB5ICs9IGNvc2goeCk7CisgICAgICAgIHkgLz0gMTM7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKworcHJpdmF0ZToKKyAgICBkb3VibGUgbUJldGEgPSAwLjA7CisgICAgZG91YmxlIG1JbnZlcnNlQmVzc2VsQmV0YSA9IDEuMDsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfS0FJU0VSX1dJTkRPV19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9MaW5lYXJSZXNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDkzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTGluZWFyUmVzYW1wbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK0xpbmVhclJlc2FtcGxlcjo6TGluZWFyUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBNdWx0aUNoYW5uZWxSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIG1QcmV2aW91c0ZyYW1lID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPihnZXRDaGFubmVsQ291bnQoKSk7CisgICAgbUN1cnJlbnRGcmFtZSA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oZ2V0Q2hhbm5lbENvdW50KCkpOworfQorCit2b2lkIExpbmVhclJlc2FtcGxlcjo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICBtZW1jcHkobVByZXZpb3VzRnJhbWUuZ2V0KCksIG1DdXJyZW50RnJhbWUuZ2V0KCksIHNpemVvZihmbG9hdCkgKiBnZXRDaGFubmVsQ291bnQoKSk7CisgICAgbWVtY3B5KG1DdXJyZW50RnJhbWUuZ2V0KCksIGZyYW1lLCBzaXplb2YoZmxvYXQpICogZ2V0Q2hhbm5lbENvdW50KCkpOworfQorCit2b2lkIExpbmVhclJlc2FtcGxlcjo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIGZsb2F0ICpwcmV2aW91cyA9IG1QcmV2aW91c0ZyYW1lLmdldCgpOworICAgIGZsb2F0ICpjdXJyZW50ID0gbUN1cnJlbnRGcmFtZS5nZXQoKTsKKyAgICBmbG9hdCBwaGFzZSA9IChmbG9hdCkgZ2V0SW50ZWdlclBoYXNlKCkgLyBtRGVub21pbmF0b3I7CisgICAgLy8gaXRlcmF0ZSBhY3Jvc3Mgc2FtcGxlcyBpbiB0aGUgZnJhbWUKKyAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgZmxvYXQgZjAgPSAqcHJldmlvdXMrKzsKKyAgICAgICAgZmxvYXQgZjEgPSAqY3VycmVudCsrOworICAgICAgICAqZnJhbWUrKyA9IGYwICsgKHBoYXNlICogKGYxIC0gZjApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzNDM3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9MaW5lYXJSZXNhbXBsZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9MSU5FQVJfUkVTQU1QTEVSX0gKKyNkZWZpbmUgUkVTQU1QTEVSX0xJTkVBUl9SRVNBTVBMRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKKy8qKgorICogU2ltcGxlIHJlc2FtcGxlciB0aGF0IHVzZXMgYmktbGluZWFyIGludGVycG9sYXRpb24uCisgKi8KK2NsYXNzIExpbmVhclJlc2FtcGxlciA6IHB1YmxpYyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhclJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpOworCisgICAgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBtUHJldmlvdXNGcmFtZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbUN1cnJlbnRGcmFtZTsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfTElORUFSX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTNmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIkludGVnZXJSYXRpby5oIgorI2luY2x1ZGUgIkxpbmVhclJlc2FtcGxlci5oIgorI2luY2x1ZGUgIk11bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlck1vbm8uaCIKKyNpbmNsdWRlICJQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8uaCIKKyNpbmNsdWRlICJTaW5jUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlclN0ZXJlby5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCitNdWx0aUNoYW5uZWxSZXNhbXBsZXI6Ok11bHRpQ2hhbm5lbFJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpCisgICAgICAgIDogbU51bVRhcHMoYnVpbGRlci5nZXROdW1UYXBzKCkpCisgICAgICAgICwgbVgoc3RhdGljX2Nhc3Q8c2l6ZV90PihidWlsZGVyLmdldENoYW5uZWxDb3VudCgpKQorICAgICAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihidWlsZGVyLmdldE51bVRhcHMoKSkgKiAyKQorICAgICAgICAsIG1TaW5nbGVGcmFtZShidWlsZGVyLmdldENoYW5uZWxDb3VudCgpKQorICAgICAgICAsIG1DaGFubmVsQ291bnQoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSkKKyAgICAgICAgeworICAgIC8vIFJlZHVjZSBzYW1wbGUgcmF0ZXMgdG8gdGhlIHNtYWxsZXN0IHJhdGlvLgorICAgIC8vIEZvciBleGFtcGxlIDQ0MTAwLzQ4MDAwIHdvdWxkIGJlY29tZSAxNDcvMTYwLgorICAgIEludGVnZXJSYXRpbyByYXRpbyhidWlsZGVyLmdldElucHV0UmF0ZSgpLCBidWlsZGVyLmdldE91dHB1dFJhdGUoKSk7CisgICAgcmF0aW8ucmVkdWNlKCk7CisgICAgbU51bWVyYXRvciA9IHJhdGlvLmdldE51bWVyYXRvcigpOworICAgIG1EZW5vbWluYXRvciA9IHJhdGlvLmdldERlbm9taW5hdG9yKCk7CisgICAgbUludGVnZXJQaGFzZSA9IG1EZW5vbWluYXRvcjsKK30KKworLy8gc3RhdGljIGZhY3RvcnkgbWV0aG9kCitNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKk11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6bWFrZShpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGl0eSBxdWFsaXR5KSB7CisgICAgQnVpbGRlciBidWlsZGVyOworICAgIGJ1aWxkZXIuc2V0SW5wdXRSYXRlKGlucHV0UmF0ZSk7CisgICAgYnVpbGRlci5zZXRPdXRwdXRSYXRlKG91dHB1dFJhdGUpOworICAgIGJ1aWxkZXIuc2V0Q2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCk7CisKKyAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKKyAgICAgICAgY2FzZSBRdWFsaXR5OjpGYXN0ZXN0OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6TG93OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6TWVkaXVtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6SGlnaDoKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TnVtVGFwcygxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdWFsaXR5OjpCZXN0OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY3V0b2ZmIGZyZXF1ZW5jeSBzbyB0aGF0IHdlIGRvIG5vdCBnZXQgYWxpYXNpbmcgd2hlbiBkb3duLXNhbXBsaW5nLgorICAgIGlmIChpbnB1dFJhdGUgPiBvdXRwdXRSYXRlKSB7CisgICAgICAgIGJ1aWxkZXIuc2V0Tm9ybWFsaXplZEN1dG9mZihrRGVmYXVsdE5vcm1hbGl6ZWRDdXRvZmYpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworfQorCitNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKk11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlcjo6YnVpbGQoKSB7CisgICAgaWYgKGdldE51bVRhcHMoKSA9PSAyKSB7CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRvIGxvdyBwYXNzIGZpbHRlcmluZ2guCisgICAgICAgIHJldHVybiBuZXcgTGluZWFyUmVzYW1wbGVyKCp0aGlzKTsKKyAgICB9CisgICAgSW50ZWdlclJhdGlvIHJhdGlvKGdldElucHV0UmF0ZSgpLCBnZXRPdXRwdXRSYXRlKCkpOworICAgIHJhdGlvLnJlZHVjZSgpOworICAgIGJvb2wgdXNlUG9seXBoYXNlID0gKGdldE51bVRhcHMoKSAqIHJhdGlvLmdldERlbm9taW5hdG9yKCkpIDw9IGtNYXhDb2VmZmljaWVudHM7CisgICAgaWYgKHVzZVBvbHlwaGFzZSkgeworICAgICAgICBpZiAoZ2V0Q2hhbm5lbENvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2x5cGhhc2VSZXNhbXBsZXJNb25vKCp0aGlzKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRDaGFubmVsQ291bnQoKSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbygqdGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlwaGFzZVJlc2FtcGxlcigqdGhpcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgbGVzcyBvcHRpbWl6ZWQgcmVzYW1wbGVyIHRoYXQgdXNlcyBhIGZsb2F0IHBoYXNlSW5jcmVtZW50LgorICAgICAgICAvLyBUT0RPIG1vbm8gcmVzYW1wbGVyCisgICAgICAgIGlmIChnZXRDaGFubmVsQ291bnQoKSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbmNSZXNhbXBsZXJTdGVyZW8oKnRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5jUmVzYW1wbGVyKCp0aGlzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OndyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gTW92ZSBjdXJzb3IgYmVmb3JlIHdyaXRlIHNvIHRoYXQgY3Vyc29yIHBvaW50cyB0byBsYXN0IHdyaXR0ZW4gZnJhbWUgaW4gcmVhZC4KKyAgICBpZiAoLS1tQ3Vyc29yIDwgMCkgeworICAgICAgICBtQ3Vyc29yID0gZ2V0TnVtVGFwcygpIC0gMTsKKyAgICB9CisgICAgZmxvYXQgKmRlc3QgPSAmbVhbc3RhdGljX2Nhc3Q8c2l6ZV90PihtQ3Vyc29yKSAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0Q2hhbm5lbENvdW50KCkpXTsKKyAgICBpbnQgb2Zmc2V0ID0gZ2V0TnVtVGFwcygpICogZ2V0Q2hhbm5lbENvdW50KCk7CisgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgIC8vIFdyaXRlIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIHdoZW4gcmVhZGluZy4KKyAgICAgICAgZGVzdFtjaGFubmVsXSA9IGRlc3RbY2hhbm5lbCArIG9mZnNldF0gPSBmcmFtZVtjaGFubmVsXTsKKyAgICB9Cit9CisKK2Zsb2F0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6c2luYyhmbG9hdCByYWRpYW5zKSB7CisgICAgaWYgKGFicyhyYWRpYW5zKSA8IDEuMGUtOSkgcmV0dXJuIDEuMGY7ICAgLy8gYXZvaWQgZGl2aWRlIGJ5IHplcm8KKyAgICByZXR1cm4gc2luZihyYWRpYW5zKSAvIHJhZGlhbnM7ICAgLy8gU2luYyBmdW5jdGlvbgorfQorCisvLyBHZW5lcmF0ZSBjb2VmZmljaWVudHMgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbCBiZSB1c2VkIGJ5IHJlYWRGcmFtZSgpLgorLy8gVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIGJ1dCByZWFkRnJhbWUoKSBpcyBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgc2hvdWxkIGJlIG9wdGltaXplZC4KK3ZvaWQgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpnZW5lcmF0ZUNvZWZmaWNpZW50cyhpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG91dHB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Sb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtYWxpemVkQ3V0b2ZmKSB7CisgICAgbUNvZWZmaWNpZW50cy5yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1Sb3dzKSk7CisgICAgaW50IGNvZWZmaWNpZW50SW5kZXggPSAwOworICAgIGRvdWJsZSBwaGFzZSA9IDAuMDsgLy8gcmFuZ2VzIGZyb20gMC4wIHRvIDEuMCwgZnJhY3Rpb24gYmV0d2VlbiBzYW1wbGVzCisgICAgLy8gU3RyZXRjaCB0aGUgc2luYyBmdW5jdGlvbiBmb3IgbG93IHBhc3MgZmlsdGVyaW5nLgorICAgIGNvbnN0IGZsb2F0IGN1dG9mZlNjYWxlciA9IG5vcm1hbGl6ZWRDdXRvZmYgKgorICAgICAgICAgICAgKChvdXRwdXRSYXRlIDwgaW5wdXRSYXRlKQorICAgICAgICAgICAgID8gKChmbG9hdClvdXRwdXRSYXRlIC8gaW5wdXRSYXRlKQorICAgICAgICAgICAgIDogKChmbG9hdClpbnB1dFJhdGUgLyBvdXRwdXRSYXRlKSk7CisgICAgY29uc3QgaW50IG51bVRhcHNIYWxmID0gZ2V0TnVtVGFwcygpIC8gMjsgLy8gbnVtVGFwcyBtdXN0IGJlIGV2ZW4uCisgICAgY29uc3QgZmxvYXQgbnVtVGFwc0hhbGZJbnZlcnNlID0gMS4wZiAvIG51bVRhcHNIYWxmOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUm93czsgaSsrKSB7CisgICAgICAgIGZsb2F0IHRhcFBoYXNlID0gcGhhc2UgLSBudW1UYXBzSGFsZjsKKyAgICAgICAgZmxvYXQgZ2FpbiA9IDAuMDsgLy8gc3VtIG9mIHJhdyBjb2VmZmljaWVudHMKKyAgICAgICAgaW50IGdhaW5DdXJzb3IgPSBjb2VmZmljaWVudEluZGV4OworICAgICAgICBmb3IgKGludCB0YXAgPSAwOyB0YXAgPCBnZXROdW1UYXBzKCk7IHRhcCsrKSB7CisgICAgICAgICAgICBmbG9hdCByYWRpYW5zID0gdGFwUGhhc2UgKiBNX1BJOworCisjaWYgTUNSX1VTRV9LQUlTRVIKKyAgICAgICAgICAgIGZsb2F0IHdpbmRvdyA9IG1LYWlzZXJXaW5kb3codGFwUGhhc2UgKiBudW1UYXBzSGFsZkludmVyc2UpOworI2Vsc2UKKyAgICAgICAgICAgIGZsb2F0IHdpbmRvdyA9IG1Db3NoV2luZG93KHN0YXRpY19jYXN0PGRvdWJsZT4odGFwUGhhc2UpICogbnVtVGFwc0hhbGZJbnZlcnNlKTsKKyNlbmRpZgorICAgICAgICAgICAgZmxvYXQgY29lZmZpY2llbnQgPSBzaW5jKHJhZGlhbnMgKiBjdXRvZmZTY2FsZXIpICogd2luZG93OworICAgICAgICAgICAgbUNvZWZmaWNpZW50cy5hdChjb2VmZmljaWVudEluZGV4KyspID0gY29lZmZpY2llbnQ7CisgICAgICAgICAgICBnYWluICs9IGNvZWZmaWNpZW50OworICAgICAgICAgICAgdGFwUGhhc2UgKz0gMS4wOworICAgICAgICB9CisgICAgICAgIHBoYXNlICs9IHBoYXNlSW5jcmVtZW50OworICAgICAgICB3aGlsZSAocGhhc2UgPj0gMS4wKSB7CisgICAgICAgICAgICBwaGFzZSAtPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3JyZWN0IGZvciBnYWluIHZhcmlhdGlvbnMuCisgICAgICAgIGZsb2F0IGdhaW5Db3JyZWN0aW9uID0gMS4wIC8gZ2FpbjsgLy8gbm9ybWFsaXplIHRoZSBnYWluCisgICAgICAgIGZvciAoaW50IHRhcCA9IDA7IHRhcCA8IGdldE51bVRhcHMoKTsgdGFwKyspIHsKKyAgICAgICAgICAgIG1Db2VmZmljaWVudHMuYXQoZ2FpbkN1cnNvciArIHRhcCkgKj0gZ2FpbkNvcnJlY3Rpb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3ZjNmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuaApAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfTVVMVElDSEFOTkVMX1JFU0FNUExFUl9ICisjZGVmaW5lIFJFU0FNUExFUl9NVUxUSUNIQU5ORUxfUkVTQU1QTEVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZm5kZWYgTUNSX1VTRV9LQUlTRVIKKy8vIEl0IGFwcGVhcnMgZnJvbSB0aGUgc3BlY3Ryb2dyYW0gdGhhdCB0aGUgSHlwZXJib2xpY0Nvc2luZSB3aW5kb3cgbGVhZHMgdG8gZmV3ZXIgYXJ0aWZhY3RzLgorLy8gQW5kIGl0IGlzIGZhc3RlciB0byBjYWxjdWxhdGUuCisjZGVmaW5lIE1DUl9VU0VfS0FJU0VSIDAKKyNlbmRpZgorCisjaWYgTUNSX1VTRV9LQUlTRVIKKyNpbmNsdWRlICJLYWlzZXJXaW5kb3cuaCIKKyNlbHNlCisjaW5jbHVkZSAiSHlwZXJib2xpY0Nvc2luZVdpbmRvdy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworY2xhc3MgTXVsdGlDaGFubmVsUmVzYW1wbGVyIHsKKworcHVibGljOgorCisgICAgZW51bSBjbGFzcyBRdWFsaXR5IDogaW50MzJfdCB7CisgICAgICAgIEZhc3Rlc3QsCisgICAgICAgIExvdywKKyAgICAgICAgTWVkaXVtLAorICAgICAgICBIaWdoLAorICAgICAgICBCZXN0LAorICAgIH07CisKKyAgICBjbGFzcyBCdWlsZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYW4gb3B0aW1hbCByZXNhbXBsZXIgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgYSByZXNhbXBsZXIKKyAgICAgICAgICovCisgICAgICAgIE11bHRpQ2hhbm5lbFJlc2FtcGxlciAqYnVpbGQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0YXBzIGluIHRoZSByZXNhbXBsaW5nIGZpbHRlci4KKyAgICAgICAgICogTW9yZSB0YXBzIGdpdmVzIGJldHRlciBxdWFsaXR5IGJ1dCB1c2VzIG1vcmUgQ1BVIHRpbWUuCisgICAgICAgICAqIFRoaXMgdHlwaWNhbGx5IHJhbmdlcyBmcm9tIDQgdG8gNjQuIERlZmF1bHQgaXMgMTYuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBwb2x5cGhhc2UgZmlsdGVycywgbnVtVGFwcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ciBmb3IgbG9vcCB1bnJvbGxpbmcuCisgICAgICAgICAqIEBwYXJhbSBudW1UYXBzIG51bWJlciBvZiB0YXBzIGZvciB0aGUgZmlsdGVyCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXROdW1UYXBzKGludDMyX3QgbnVtVGFwcykgeworICAgICAgICAgICAgbU51bVRhcHMgPSBudW1UYXBzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbywgZXRjLiBEZWZhdWx0IGlzIDEuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXRDaGFubmVsQ291bnQoaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZhdWx0IGlzIDQ4MDAwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5wdXRSYXRlIHNhbXBsZSByYXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICogQHJldHVybiBhZGRyZXNzIG9mIHRoaXMgYnVpbGRlciBmb3IgY2hhaW5pbmcgY2FsbHMKKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIgKnNldElucHV0UmF0ZShpbnQzMl90IGlucHV0UmF0ZSkgeworICAgICAgICAgICAgbUlucHV0UmF0ZSA9IGlucHV0UmF0ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmF1bHQgaXMgNDgwMDAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXRSYXRlIHNhbXBsZSByYXRlIG9mIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXRPdXRwdXRSYXRlKGludDMyX3Qgb3V0cHV0UmF0ZSkgeworICAgICAgICAgICAgbU91dHB1dFJhdGUgPSBvdXRwdXRSYXRlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGN1dG9mZiBmcmVxdWVuY3kgcmVsYXRpdmUgdG8gdGhlIE55cXVpc3QgcmF0ZSBvZiB0aGUgb3V0cHV0IHNhbXBsZSByYXRlLgorICAgICAgICAgKiBTZXQgdG8gMS4wIHRvIG1hdGNoIHRoZSBOeXF1aXN0IGZyZXF1ZW5jeS4KKyAgICAgICAgICogU2V0IGxvd2VyIHRvIHJlZHVjZSBhbGlhc2luZy4KKyAgICAgICAgICogRGVmYXVsdCBpcyAwLjcwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9ybWFsaXplZEN1dG9mZiBhbnRpLWFsaWFzaW5nIGZpbHRlciBjdXRvZmYKKyAgICAgICAgICogQHJldHVybiBhZGRyZXNzIG9mIHRoaXMgYnVpbGRlciBmb3IgY2hhaW5pbmcgY2FsbHMKKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIgKnNldE5vcm1hbGl6ZWRDdXRvZmYoZmxvYXQgbm9ybWFsaXplZEN1dG9mZikgeworICAgICAgICAgICAgbU5vcm1hbGl6ZWRDdXRvZmYgPSBub3JtYWxpemVkQ3V0b2ZmOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGdldE51bVRhcHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU51bVRhcHM7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hhbm5lbENvdW50OworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBnZXRJbnB1dFJhdGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0UmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZ2V0T3V0cHV0UmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0UmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldE5vcm1hbGl6ZWRDdXRvZmYoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU5vcm1hbGl6ZWRDdXRvZmY7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgaW50MzJfdCBtQ2hhbm5lbENvdW50ID0gMTsKKyAgICAgICAgaW50MzJfdCBtTnVtVGFwcyA9IDE2OworICAgICAgICBpbnQzMl90IG1JbnB1dFJhdGUgPSA0ODAwMDsKKyAgICAgICAgaW50MzJfdCBtT3V0cHV0UmF0ZSA9IDQ4MDAwOworICAgICAgICBmbG9hdCAgIG1Ob3JtYWxpemVkQ3V0b2ZmID0ga0RlZmF1bHROb3JtYWxpemVkQ3V0b2ZmOworICAgIH07CisKKyAgICB2aXJ0dWFsIH5NdWx0aUNoYW5uZWxSZXNhbXBsZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgbWFraW5nIGEgcmVzYW1wbGVyIHRoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGdpdmVuIGlucHV0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQgbnVtYmVyIG9mIGNoYW5uZWxzLCAyIGZvciBzdGVyZW8KKyAgICAgKiBAcGFyYW0gaW5wdXRSYXRlIHNhbXBsZSByYXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gb3V0cHV0UmF0ZSAgc2FtcGxlIHJhdGUgb2YgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gcXVhbGl0eSBoaWdoZXIgcXVhbGl0eSBzb3VuZHMgYmV0dGVyIGJ1dCB1c2VzIG1vcmUgQ1BVCisgICAgICogQHJldHVybiBhbiBvcHRpbWFsIHJlc2FtcGxlcgorICAgICAqLworICAgIHN0YXRpYyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKm1ha2UoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpdHkgcXVhbGl0eSk7CisKKyAgICBib29sIGlzV3JpdGVOZWVkZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW50ZWdlclBoYXNlID49IG1EZW5vbWluYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGZyYW1lIGNvbnRhaW5pbmcgTiBzYW1wbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNhbXBsZSBpbiBhIGZyYW1lCisgICAgICovCisgICAgdm9pZCB3cml0ZU5leHRGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAgICAgd3JpdGVGcmFtZShmcmFtZSk7CisgICAgICAgIGFkdmFuY2VXcml0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBmcmFtZSBjb250YWluaW5nIE4gc2FtcGxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZvaWQgcmVhZE5leHRGcmFtZShmbG9hdCAqZnJhbWUpIHsKKyAgICAgICAgcmVhZEZyYW1lKGZyYW1lKTsKKyAgICAgICAgYWR2YW5jZVJlYWQoKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0TnVtVGFwcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1OdW1UYXBzOworICAgIH0KKworICAgIGludCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbENvdW50OworICAgIH0KKworICAgIHN0YXRpYyBmbG9hdCBoYW1taW5nV2luZG93KGZsb2F0IHJhZGlhbnMsIGZsb2F0IHNwcmVhZCk7CisKKyAgICBzdGF0aWMgZmxvYXQgc2luYyhmbG9hdCByYWRpYW5zKTsKKworcHJvdGVjdGVkOgorCisgICAgZXhwbGljaXQgTXVsdGlDaGFubmVsUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGZyYW1lIGNvbnRhaW5pbmcgTiBzYW1wbGVzLgorICAgICAqIENhbGwgYWR2YW5jZVdyaXRlKCkgYWZ0ZXIgY2FsbGluZyB0aGlzLgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgZnJhbWUgY29udGFpbmluZyBOIHNhbXBsZXMgdXNpbmcgaW50ZXJwb2xhdGlvbi4KKyAgICAgKiBDYWxsIGFkdmFuY2VSZWFkKCkgYWZ0ZXIgY2FsbGluZyB0aGlzLgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSA9IDA7CisKKyAgICB2b2lkIGFkdmFuY2VXcml0ZSgpIHsKKyAgICAgICAgbUludGVnZXJQaGFzZSAtPSBtRGVub21pbmF0b3I7CisgICAgfQorCisgICAgdm9pZCBhZHZhbmNlUmVhZCgpIHsKKyAgICAgICAgbUludGVnZXJQaGFzZSArPSBtTnVtZXJhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGluIG9wdGltYWwgb3JkZXIuCisgICAgICogQHBhcmFtIGlucHV0UmF0ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIG91dHB1dFJhdGUgIHNhbXBsZSByYXRlIG9mIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogQHBhcmFtIG51bVJvd3MgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGFycmF5IHRoYXQgY29udGFpbiBhIHNldCBvZiB0YXAgY29lZmZpY2llbnRzCisgICAgICogQHBhcmFtIHBoYXNlSW5jcmVtZW50IGhvdyBtdWNoIHRvIGluY3JlbWVudCB0aGUgcGhhc2UgYmV0d2VlbiByb3dzCisgICAgICogQHBhcmFtIG5vcm1hbGl6ZWRDdXRvZmYgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kgbm9ybWFsaXplZCB0byBOeXF1aXN0IHJhdGUgb2Ygb3V0cHV0CisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUNvZWZmaWNpZW50cyhpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRDdXRvZmYpOworCisKKyAgICBpbnQzMl90IGdldEludGVnZXJQaGFzZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlZ2VyUGhhc2U7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heENvZWZmaWNpZW50cyA9IDggKiAxMDI0OworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1Db2VmZmljaWVudHM7CisKKyAgICBjb25zdCBpbnQgICAgICAgICAgICBtTnVtVGFwczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtQ3Vyc29yID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gICBtWDsgICAgICAgICAgIC8vIGRlbGF5ZWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgRklSCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICAgbVNpbmdsZUZyYW1lOyAvLyBvbmUgZnJhbWUgZm9yIHRlbXBvcmFyeSB1c2UKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBtSW50ZWdlclBoYXNlID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBtTnVtZXJhdG9yID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBtRGVub21pbmF0b3IgPSAwOworCisKK3ByaXZhdGU6CisKKyNpZiBNQ1JfVVNFX0tBSVNFUgorICAgIEthaXNlcldpbmRvdyAgICAgICAgICAgbUthaXNlcldpbmRvdzsKKyNlbHNlCisgICAgSHlwZXJib2xpY0Nvc2luZVdpbmRvdyBtQ29zaFdpbmRvdzsKKyNlbmRpZgorCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE5vcm1hbGl6ZWRDdXRvZmYgPSAwLjcwZjsKKworICAgIGNvbnN0IGludCAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfTVVMVElDSEFOTkVMX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0N2VlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiSW50ZWdlclJhdGlvLmgiCisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK1BvbHlwaGFzZVJlc2FtcGxlcjo6UG9seXBoYXNlUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBNdWx0aUNoYW5uZWxSZXNhbXBsZXIoYnVpbGRlcikKKyAgICAgICAgeworICAgIGFzc2VydCgoZ2V0TnVtVGFwcygpICUgNCkgPT0gMCk7IC8vIFJlcXVpcmVkIGZvciBsb29wIHVucm9sbGluZy4KKworICAgIGludDMyX3QgaW5wdXRSYXRlID0gYnVpbGRlci5nZXRJbnB1dFJhdGUoKTsKKyAgICBpbnQzMl90IG91dHB1dFJhdGUgPSBidWlsZGVyLmdldE91dHB1dFJhdGUoKTsKKworICAgIGludDMyX3QgbnVtUm93cyA9IG1EZW5vbWluYXRvcjsKKyAgICBkb3VibGUgcGhhc2VJbmNyZW1lbnQgPSAoZG91YmxlKSBpbnB1dFJhdGUgLyAoZG91YmxlKSBvdXRwdXRSYXRlOworICAgIGdlbmVyYXRlQ29lZmZpY2llbnRzKGlucHV0UmF0ZSwgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1Sb3dzLCBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldE5vcm1hbGl6ZWRDdXRvZmYoKSk7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IgZm9yIG1peGluZy4KKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lLmJlZ2luKCksIG1TaW5nbGVGcmFtZS5lbmQoKSwgMC4wKTsKKworICAgIC8vIE11bHRpcGx5IGlucHV0IHRpbWVzIHdpbmRvd2VkIHNpbmMgZnVuY3Rpb24uCisgICAgZmxvYXQgKmNvZWZmaWNpZW50cyA9ICZtQ29lZmZpY2llbnRzW21Db2VmZmljaWVudEN1cnNvcl07CisgICAgZmxvYXQgKnhGcmFtZSA9ICZtWFtzdGF0aWNfY2FzdDxzaXplX3Q+KG1DdXJzb3IpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRDaGFubmVsQ291bnQoKSldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVRhcHM7IGkrKykgeworICAgICAgICBmbG9hdCBjb2VmZmljaWVudCA9ICpjb2VmZmljaWVudHMrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBtU2luZ2xlRnJhbWVbY2hhbm5lbF0gKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIGFuZCB3cmFwIHRocm91Z2ggY29lZmZpY2llbnRzLgorICAgIG1Db2VmZmljaWVudEN1cnNvciA9IChtQ29lZmZpY2llbnRDdXJzb3IgKyBtTnVtVGFwcykgJSBtQ29lZmZpY2llbnRzLnNpemUoKTsKKworICAgIC8vIENvcHkgYWNjdW11bGF0b3IgdG8gb3V0cHV0LgorICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICBmcmFtZVtjaGFubmVsXSA9IG1TaW5nbGVGcmFtZVtjaGFubmVsXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MmZjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX0gKKyNkZWZpbmUgUkVTQU1QTEVSX1BPTFlQSEFTRV9SRVNBTVBMRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIk11bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworLyoqCisgKiBSZXNhbXBsZXIgdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGEgcmVkdWNlZCByYXRpbyBvZiBzYW1wbGUgcmF0ZXMuCisgKiBBbGwgb2YgdGhlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBwb3NzaWJsZSBwaGFzZSB2YWx1ZSBhcmUgcHJlLWNhbGN1bGF0ZWQuCisgKi8KK2NsYXNzIFBvbHlwaGFzZVJlc2FtcGxlciA6IHB1YmxpYyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGJ1aWxkZXIgY29udGFpbmluZyBsb3RzIG9mIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBleHBsaWNpdCBQb2x5cGhhc2VSZXNhbXBsZXIoY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZpcnR1YWwgflBvbHlwaGFzZVJlc2FtcGxlcigpID0gZGVmYXVsdDsKKworICAgIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIGludDMyX3QgICAgICAgICAgICAgICAgbUNvZWZmaWNpZW50Q3Vyc29yID0gMDsKKworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFmMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlck1vbm8uaCIKKwordXNpbmcgbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlcjsKKworI2RlZmluZSBNT05PICAxCisKK1BvbHlwaGFzZVJlc2FtcGxlck1vbm86OlBvbHlwaGFzZVJlc2FtcGxlck1vbm8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IFBvbHlwaGFzZVJlc2FtcGxlcihidWlsZGVyKSB7CisgICAgYXNzZXJ0KGJ1aWxkZXIuZ2V0Q2hhbm5lbENvdW50KCkgPT0gTU9OTyk7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyTW9ubzo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAvLyBNb3ZlIGN1cnNvciBiZWZvcmUgd3JpdGUgc28gdGhhdCBjdXJzb3IgcG9pbnRzIHRvIGxhc3Qgd3JpdHRlbiBmcmFtZSBpbiByZWFkLgorICAgIGlmICgtLW1DdXJzb3IgPCAwKSB7CisgICAgICAgIG1DdXJzb3IgPSBnZXROdW1UYXBzKCkgLSAxOworICAgIH0KKyAgICBmbG9hdCAqZGVzdCA9ICZtWFttQ3Vyc29yICogTU9OT107CisgICAgY29uc3QgaW50IG9mZnNldCA9IG1OdW1UYXBzICogTU9OTzsKKyAgICAvLyBXcml0ZSBlYWNoIGNoYW5uZWwgdHdpY2Ugc28gd2UgYXZvaWQgaGF2aW5nIHRvIHdyYXAgd2hlbiBydW5uaW5nIHRoZSBGSVIuCisgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gIGZyYW1lWzBdOworICAgIC8vIFB1dCBvcmRlcmVkIHdyaXRlcyB0b2dldGhlci4KKyAgICBkZXN0WzBdID0gc2FtcGxlOworICAgIGRlc3Rbb2Zmc2V0XSA9IHNhbXBsZTsKK30KKwordm9pZCBQb2x5cGhhc2VSZXNhbXBsZXJNb25vOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IuCisgICAgZmxvYXQgc3VtID0gMC4wOworCisgICAgLy8gTXVsdGlwbHkgaW5wdXQgdGltZXMgcHJlY29tcHV0ZWQgd2luZG93ZWQgc2luYyBmdW5jdGlvbi4KKyAgICBjb25zdCBmbG9hdCAqY29lZmZpY2llbnRzID0gJm1Db2VmZmljaWVudHNbbUNvZWZmaWNpZW50Q3Vyc29yXTsKKyAgICBmbG9hdCAqeEZyYW1lID0gJm1YW21DdXJzb3IgKiBNT05PXTsKKyAgICBjb25zdCBpbnQgbnVtTG9vcHMgPSBtTnVtVGFwcyA+PiAyOyAvLyBuLzQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxvb3BzOyBpKyspIHsKKyAgICAgICAgLy8gTWFudWFsIGxvb3AgdW5yb2xsaW5nLCBtaWdodCBnZXQgY29udmVydGVkIHRvIFNJTUQuCisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgfQorCisgICAgbUNvZWZmaWNpZW50Q3Vyc29yID0gKG1Db2VmZmljaWVudEN1cnNvciArIG1OdW1UYXBzKSAlIG1Db2VmZmljaWVudHMuc2l6ZSgpOworCisgICAgLy8gQ29weSBhY2N1bXVsYXRvciB0byBvdXRwdXQuCisgICAgZnJhbWVbMF0gPSBzdW07Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyTW9uby5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAyMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX01PTk9fSAorI2RlZmluZSBSRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9NT05PX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKK2NsYXNzIFBvbHlwaGFzZVJlc2FtcGxlck1vbm8gOiBwdWJsaWMgUG9seXBoYXNlUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBQb2x5cGhhc2VSZXNhbXBsZXJNb25vKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5Qb2x5cGhhc2VSZXNhbXBsZXJNb25vKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX01PTk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgxODUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKKyNkZWZpbmUgU1RFUkVPICAyCisKK1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbzo6UG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBQb2x5cGhhc2VSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIGFzc2VydChidWlsZGVyLmdldENoYW5uZWxDb3VudCgpID09IFNURVJFTyk7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvOjp3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgeworICAgIC8vIE1vdmUgY3Vyc29yIGJlZm9yZSB3cml0ZSBzbyB0aGF0IGN1cnNvciBwb2ludHMgdG8gbGFzdCB3cml0dGVuIGZyYW1lIGluIHJlYWQuCisgICAgaWYgKC0tbUN1cnNvciA8IDApIHsKKyAgICAgICAgbUN1cnNvciA9IGdldE51bVRhcHMoKSAtIDE7CisgICAgfQorICAgIGZsb2F0ICpkZXN0ID0gJm1YW21DdXJzb3IgKiBTVEVSRU9dOworICAgIGNvbnN0IGludCBvZmZzZXQgPSBtTnVtVGFwcyAqIFNURVJFTzsKKyAgICAvLyBXcml0ZSBlYWNoIGNoYW5uZWwgdHdpY2Ugc28gd2UgYXZvaWQgaGF2aW5nIHRvIHdyYXAgd2hlbiBydW5uaW5nIHRoZSBGSVIuCisgICAgY29uc3QgZmxvYXQgbGVmdCA9ICBmcmFtZVswXTsKKyAgICBjb25zdCBmbG9hdCByaWdodCA9IGZyYW1lWzFdOworICAgIC8vIFB1dCBvcmRlcmVkIHdyaXRlcyB0b2dldGhlci4KKyAgICBkZXN0WzBdID0gbGVmdDsKKyAgICBkZXN0WzFdID0gcmlnaHQ7CisgICAgZGVzdFtvZmZzZXRdID0gbGVmdDsKKyAgICBkZXN0WzEgKyBvZmZzZXRdID0gcmlnaHQ7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3JzLgorICAgIGZsb2F0IGxlZnQgPSAwLjA7CisgICAgZmxvYXQgcmlnaHQgPSAwLjA7CisKKyAgICAvLyBNdWx0aXBseSBpbnB1dCB0aW1lcyBwcmVjb21wdXRlZCB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgorICAgIGNvbnN0IGZsb2F0ICpjb2VmZmljaWVudHMgPSAmbUNvZWZmaWNpZW50c1ttQ29lZmZpY2llbnRDdXJzb3JdOworICAgIGZsb2F0ICp4RnJhbWUgPSAmbVhbbUN1cnNvciAqIFNURVJFT107CisgICAgY29uc3QgaW50IG51bUxvb3BzID0gbU51bVRhcHMgPj4gMjsgLy8gbi80CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgIC8vIE1hbnVhbCBsb29wIHVucm9sbGluZywgbWlnaHQgZ2V0IGNvbnZlcnRlZCB0byBTSU1ELgorICAgICAgICBmbG9hdCBjb2VmZmljaWVudCA9ICpjb2VmZmljaWVudHMrKzsKKyAgICAgICAgbGVmdCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICAgICAgcmlnaHQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisKKyAgICAgICAgY29lZmZpY2llbnQgPSAqY29lZmZpY2llbnRzKys7IC8vIG5leHQgdGFwCisgICAgICAgIGxlZnQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgICAgIHJpZ2h0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworCisgICAgICAgIGNvZWZmaWNpZW50ID0gKmNvZWZmaWNpZW50cysrOyAgLy8gbmV4dCB0YXAKKyAgICAgICAgbGVmdCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICAgICAgcmlnaHQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisKKyAgICAgICAgY29lZmZpY2llbnQgPSAqY29lZmZpY2llbnRzKys7ICAvLyBuZXh0IHRhcAorICAgICAgICBsZWZ0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworICAgICAgICByaWdodCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICB9CisKKyAgICBtQ29lZmZpY2llbnRDdXJzb3IgPSAobUNvZWZmaWNpZW50Q3Vyc29yICsgbU51bVRhcHMpICUgbUNvZWZmaWNpZW50cy5zaXplKCk7CisKKyAgICAvLyBDb3B5IGFjY3VtdWxhdG9ycyB0byBvdXRwdXQuCisgICAgZnJhbWVbMF0gPSBsZWZ0OworICAgIGZyYW1lWzFdID0gcmlnaHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0Y2FiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX1NURVJFT19ICisjZGVmaW5lIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX1NURVJFT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCitjbGFzcyBQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8gOiBwdWJsaWMgUG9seXBoYXNlUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZpcnR1YWwgflBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgd3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCisgICAgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9TVEVSRU9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1JFQURNRS5tZCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMTljNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SRUFETUUubWQKQEAgLTAsMCArMSwxMDEgQEAKKyMgU2FtcGxlIFJhdGUgQ29udmVydGVyCisKK1RoaXMgZm9sZGVyIGNvbnRhaW5zIGEgc2FtcGxlIHJhdGUgY29udmVydGVyLCBvciAicmVzYW1wbGVyIi4KKworVGhlIGNvbnZlcnRlciBpcyBiYXNlZCBvbiBhIHNpbmMgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiB3aW5kb3dlZCBieSBhIGh5cGVyYm9saWMgY29zaW5lLgorV2UgZm91bmQgdGhpcyBoYWQgZmV3ZXIgYXJ0aWZhY3RzIHRoYW4gdGhlIG1vcmUgdHJhZGl0aW9uYWwgS2Fpc2VyIHdpbmRvdy4KKworIyMgQnVpbGRpbmcgdGhlIFJlc2FtcGxlcgorCitJdCBpcyBwYXJ0IG9mIFtPYm9lXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29ib2UpIGJ1dCBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uIE9ib2UuCitTbyB0aGUgY29udGVudHMgb2YgdGhpcyBmb2xkZXIgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiBPYm9lLgorCitUbyBidWlsZCBpdCBmb3IgdXNlIG91dHNpZGUgb2YgT2JvZToKKworMS4gQ29weSB0aGUgInJlc2FtcGxlciIgZm9sZGVyIHRvIGEgZm9sZGVyIGluIHlvdXIgcHJvamVjdCB0aGF0IGlzIGluIHRoZSBpbmNsdWRlIHBhdGguCisyLiBBZGQgYWxsIG9mIHRoZSBcKi5jcHAgZmlsZXMgaW4gdGhlIHJlc2FtcGxlciBmb2xkZXIgdG8geW91ciBwcm9qZWN0IElERSBvciBNYWtlZmlsZS4KKzMuIEluIFJlc2FtcGxlckRlZmluaXRpb25zLmgsIGRlZmluZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFIHdpdGggeW91ciBvd24gcHJvamVjdCBuYW1lLiBBbHRlcm5hdGl2ZWx5LCB1c2UgLURSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFPW15bmFtZXNwYWNlIHdoZW4gY29tcGlsaW5nIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgcmVzYW1wbGVyIGNvZGUuCisKKyMjIENyZWF0aW5nIGEgUmVzYW1wbGVyCisKK0luY2x1ZGUgdGhlIFttYWluIGhlYWRlcl0oTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgpIGZvciB0aGUgcmVzYW1wbGVyLgorCisgICAgI2luY2x1ZGUgInJlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuaCIKKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGEgc3RlcmVvIHJlc2FtcGxlciB0aGF0IHdpbGwgY29udmVydCBmcm9tIDQ0MTAwIHRvIDQ4MDAwIEh6LgorT25seSBkbyB0aGlzIG9uY2UsIHdoZW4geW91IG9wZW4geW91ciBzdHJlYW0uIFRoZW4gdXNlIHRoZSBzYW1wbGUgcmVzYW1wbGVyIHRvIHByb2Nlc3MgbXVsdGlwbGUgYnVmZmVycy4KKworICAgIE11bHRpQ2hhbm5lbFJlc2FtcGxlciAqcmVzYW1wbGVyID0gTXVsdGlDaGFubmVsUmVzYW1wbGVyOjptYWtlKAorICAgICAgICAgICAgMiwgLy8gY2hhbm5lbCBjb3VudAorICAgICAgICAgICAgNDQxMDAsIC8vIGlucHV0IHNhbXBsZVJhdGUKKyAgICAgICAgICAgIDQ4MDAwLCAvLyBvdXRwdXQgc2FtcGxlUmF0ZQorICAgICAgICAgICAgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpRdWFsaXR5OjpNZWRpdW0pOyAvLyBjb252ZXJzaW9uIHF1YWxpdHkKKworUG9zc2libGUgdmFsdWVzIGZvciBxdWFsaXR5IGluY2x1ZGUgeyBGYXN0ZXN0LCBMb3csIE1lZGl1bSwgSGlnaCwgQmVzdCB9LgorSGlnaGVyIHF1YWxpdHkgbGV2ZWxzIHdpbGwgc291bmQgYmV0dGVyIGJ1dCBjb25zdW1lIG1vcmUgQ1BVIGJlY2F1c2UgdGhleSBoYXZlIG1vcmUgdGFwcyBpbiB0aGUgZmlsdGVyLgorCisjIyBGcmFjdGlvbmFsIEZyYW1lIENvdW50cworCitOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzIGdlbmVyYXRlZCBmb3IgYSBnaXZlbiBudW1iZXIgb2YgaW5wdXQgZnJhbWVzIGNhbiB2YXJ5LgorCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgYXJlIGNvbnZlcnRpbmcgZnJvbSA0NDEwMCBIeiB0byA0ODAwMCBIeiBhbmQgdXNpbmcgYW4gaW5wdXQgYnVmZmVyIHdpdGggOTYwIGZyYW1lcy4gSWYgeW91IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgeW91IGdldDoKKworICAgIDk2MCAqIDQ4MDAwICogNDQxMDAgPSAxMDQ0Ljg5Nzk1OS4uLgorCitZb3UgY2Fubm90IGdlbmVyYXRlIGEgZnJhY3Rpb25hbCBudW1iZXIgb2YgZnJhbWVzLiBTbyB0aGUgcmVzYW1wbGVyIHdpbGwgc29tZXRpbWVzIGdlbmVyYXRlIDEwNDQgZnJhbWVzIGFuZCBzb21ldGltZXMgMTA0NSBmcmFtZXMuIE9uIGF2ZXJhZ2UgaXQgd2lsbCBnZW5lcmF0ZSAxMDQ0Ljg5Nzk1OSBmcmFtZXMuIFRoZSByZXNhbXBsZXIgc3RvcmVzIHRoZSBmcmFjdGlvbiBpbnRlcm5hbGx5IGFuZCBrZWVwcyB0cmFjayBvZiB3aGVuIHRvIGNvbnN1bWUgb3IgZ2VuZXJhdGUgYSBmcmFtZS4KKworWW91IGNhbiBlaXRoZXIgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBvciBhIGZpeGVkIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzLiBUaGUgb3RoZXIgZnJhbWUgY291bnQgd2lsbCB2YXJ5LgorCisjIyBDYWxsaW5nIHRoZSBSZXNhbXBsZXIgd2l0aCBhIGZpeGVkIG51bWJlciBvZiBPVVRQVVQgZnJhbWVzCisKK0luIHRoaXMgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcy4KKworQXNzdW1lIHlvdSBzdGFydCB3aXRoIHRoZXNlIHZhcmlhYmxlcyBhbmQgYSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGZyYW1lOgorCisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlcjsgICAgIC8vIG11bHRpLWNoYW5uZWwgYnVmZmVyIHRvIGJlIGZpbGxlZAorICAgIGludCAgICBudW1PdXRwdXRGcmFtZXM7ICAvLyBudW1iZXIgb2YgZnJhbWVzIG9mIG91dHB1dAorCitUaGUgcmVzYW1wbGVyIGhhcyBhIG1ldGhvZCBpc1dyaXRlTmVlZGVkKCkgdGhhdCB0ZWxscyB5b3Ugd2hldGhlciB0byB3cml0ZSB0byBvciByZWFkIGZyb20gdGhlIHJlc2FtcGxlci4KKworICAgIGludCBvdXRwdXRGcmFtZXNMZWZ0ID0gbnVtT3V0cHV0RnJhbWVzOworICAgIHdoaWxlIChvdXRwdXRGcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICBpZihyZXNhbXBsZXItPmlzV3JpdGVOZWVkZWQoKSkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZyYW1lID0gZ2V0TmV4dElucHV0RnJhbWUoKTsgLy8geW91IHByb3ZpZGUgdGhpcworICAgICAgICAgICAgcmVzYW1wbGVyLT53cml0ZU5leHRGcmFtZShmcmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNhbXBsZXItPnJlYWROZXh0RnJhbWUob3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlciArPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBvdXRwdXRGcmFtZXNMZWZ0LS07CisgICAgICAgIH0KKyAgICB9CisKKyMjIENhbGxpbmcgdGhlIFJlc2FtcGxlciB3aXRoIGEgZml4ZWQgbnVtYmVyIG9mIElOUFVUIGZyYW1lcworCitJbiB0aGlzIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBpbnB1dCBmcmFtZXMgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMuCisKK0Fzc3VtZSB5b3Ugc3RhcnQgd2l0aCB0aGVzZSB2YXJpYWJsZXM6CisKKyAgICBmbG9hdCAqaW5wdXRCdWZmZXI7ICAgICAvLyBtdWx0aS1jaGFubmVsIGJ1ZmZlciB0byBiZSBjb25zdW1lZAorICAgIGZsb2F0ICpvdXRwdXRCdWZmZXI7ICAgIC8vIG11bHRpLWNoYW5uZWwgYnVmZmVyIHRvIGJlIGZpbGxlZAorICAgIGludCAgICBudW1JbnB1dEZyYW1lczsgIC8vIG51bWJlciBvZiBmcmFtZXMgb2YgaW5wdXQKKyAgICBpbnQgICAgbnVtT3V0cHV0RnJhbWVzID0gMDsKKyAgICBpbnQgICAgY2hhbm5lbENvdW50OyAgICAvLyAxIGZvciBtb25vLCAyIGZvciBzdGVyZW8KKworICAgIGludCBpbnB1dEZyYW1lc0xlZnQgPSBudW1JbnB1dEZyYW1lczsKKyAgICB3aGlsZSAoaW5wdXRGcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICBpZihyZXNhbXBsZXItPmlzV3JpdGVOZWVkZWQoKSkgeworICAgICAgICAgICAgcmVzYW1wbGVyLT53cml0ZU5leHRGcmFtZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlciArPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnB1dEZyYW1lc0xlZnQtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+cmVhZE5leHRGcmFtZShvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgb3V0cHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIG51bU91dHB1dEZyYW1lcysrOworICAgICAgICB9CisgICAgfQorCisjIyBEZWxldGluZyB0aGUgUmVzYW1wbGVyCisKK1doZW4geW91IGFyZSBkb25lLCB5b3Ugc2hvdWxkIGRlbGV0ZSB0aGUgUmVzYW1wbGVyIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCisKKyAgICBkZWxldGUgcmVzYW1wbGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1Jlc2FtcGxlckRlZmluaXRpb25zLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUmVzYW1wbGVyRGVmaW5pdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc5MWVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1Jlc2FtcGxlckRlZmluaXRpb25zLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gU2V0IGZsYWcgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRSBiYXNlZCBvbiB3aGV0aGVyIGNvbXBpbGVyIGZsYWcKKy8vIF9fQU5EUk9JRF9OREtfXyBpcyBkZWZpbmVkLiBfX0FORFJPSURfTkRLX18gc2hvdWxkIGJlIGRlZmluZWQgaW4gb2JvZQorLy8gYnV0IG5vdCBpbiBhbmRyb2lkLgorCisjaWZuZGVmIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0UKKyNpZmRlZiBfX0FORFJPSURfTkRLX18KKyNkZWZpbmUgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRSBvYm9lCisjZWxzZQorI2RlZmluZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFIGFhdWRpbworI2VuZGlmIC8vIF9fQU5EUk9JRF9OREtfXworI2VuZGlmIC8vIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQwY2EyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXIuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJTaW5jUmVzYW1wbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK1NpbmNSZXNhbXBsZXI6OlNpbmNSZXNhbXBsZXIoY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IE11bHRpQ2hhbm5lbFJlc2FtcGxlcihidWlsZGVyKQorICAgICAgICAsIG1TaW5nbGVGcmFtZTIoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSkgeworICAgIGFzc2VydCgoZ2V0TnVtVGFwcygpICUgNCkgPT0gMCk7IC8vIFJlcXVpcmVkIGZvciBsb29wIHVucm9sbGluZy4KKyAgICBtTnVtUm93cyA9IGtNYXhDb2VmZmljaWVudHMgLyBnZXROdW1UYXBzKCk7IC8vIG5vIGd1YXJkIHJvdyBuZWVkZWQKKyAgICBtUGhhc2VTY2FsZXIgPSAoZG91YmxlKSBtTnVtUm93cyAvIG1EZW5vbWluYXRvcjsKKyAgICBkb3VibGUgcGhhc2VJbmNyZW1lbnQgPSAxLjAgLyBtTnVtUm93czsKKyAgICBnZW5lcmF0ZUNvZWZmaWNpZW50cyhidWlsZGVyLmdldElucHV0UmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0T3V0cHV0UmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1Sb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlSW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0Tm9ybWFsaXplZEN1dG9mZigpKTsKK30KKwordm9pZCBTaW5jUmVzYW1wbGVyOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IgZm9yIG1peGluZy4KKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lLmJlZ2luKCksIG1TaW5nbGVGcmFtZS5lbmQoKSwgMC4wKTsKKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lMi5iZWdpbigpLCBtU2luZ2xlRnJhbWUyLmVuZCgpLCAwLjApOworCisgICAgLy8gRGV0ZXJtaW5lIGluZGljZXMgaW50byBjb2VmZmljaWVudHMgdGFibGUuCisgICAgZG91YmxlIHRhYmxlUGhhc2UgPSBnZXRJbnRlZ2VyUGhhc2UoKSAqIG1QaGFzZVNjYWxlcjsKKyAgICBpbnQgaW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcih0YWJsZVBoYXNlKSk7CisgICAgaWYgKGluZGV4MSA+PSBtTnVtUm93cykgeyAvLyBubyBndWFyZCByb3cgbmVlZGVkIGJlY2F1c2Ugd2Ugd3JhcCB0aGUgaW5kaWNlcworICAgICAgICB0YWJsZVBoYXNlIC09IG1OdW1Sb3dzOworICAgICAgICBpbmRleDEgLT0gbU51bVJvd3M7CisgICAgfQorCisgICAgaW50IGluZGV4MiA9IGluZGV4MSArIDE7CisgICAgaWYgKGluZGV4MiA+PSBtTnVtUm93cykgeyAvLyBubyBndWFyZCByb3cgbmVlZGVkIGJlY2F1c2Ugd2Ugd3JhcCB0aGUgaW5kaWNlcworICAgICAgICBpbmRleDIgLT0gbU51bVJvd3M7CisgICAgfQorCisgICAgZmxvYXQgKmNvZWZmaWNpZW50czEgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MSkKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKyAgICBmbG9hdCAqY29lZmZpY2llbnRzMiA9ICZtQ29lZmZpY2llbnRzW3N0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgyKQorICAgICAgICAgICAgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldE51bVRhcHMoKSldOworCisgICAgZmxvYXQgKnhGcmFtZSA9ICZtWFtzdGF0aWNfY2FzdDxzaXplX3Q+KG1DdXJzb3IpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRDaGFubmVsQ291bnQoKSldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVRhcHM7IGkrKykgeworICAgICAgICBmbG9hdCBjb2VmZmljaWVudDEgPSAqY29lZmZpY2llbnRzMSsrOworICAgICAgICBmbG9hdCBjb2VmZmljaWVudDIgPSAqY29lZmZpY2llbnRzMisrOworICAgICAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICp4RnJhbWUrKzsKKyAgICAgICAgICAgIG1TaW5nbGVGcmFtZVtjaGFubmVsXSArPSAgc2FtcGxlICogY29lZmZpY2llbnQxOworICAgICAgICAgICAgbVNpbmdsZUZyYW1lMltjaGFubmVsXSArPSBzYW1wbGUgKiBjb2VmZmljaWVudDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnRlcnBvbGF0ZSBhbmQgY29weSB0byBvdXRwdXQuCisgICAgZmxvYXQgZnJhY3Rpb24gPSB0YWJsZVBoYXNlIC0gaW5kZXgxOworICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICBmbG9hdCBsb3cgPSBtU2luZ2xlRnJhbWVbY2hhbm5lbF07CisgICAgICAgIGZsb2F0IGhpZ2ggPSBtU2luZ2xlRnJhbWUyW2NoYW5uZWxdOworICAgICAgICBmcmFtZVtjaGFubmVsXSA9IGxvdyArIChmcmFjdGlvbiAqIChoaWdoIC0gbG93KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmZjA5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfSAorI2RlZmluZSBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKKy8qKgorICogUmVzYW1wbGVyIHRoYXQgY2FuIGludGVycG9sYXRlIGJldHdlZW4gY29lZmZpY2llbnRzLgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGFyYml0cmFyeSByYXRpb3MuCisgKi8KK2NsYXNzIFNpbmNSZXNhbXBsZXIgOiBwdWJsaWMgTXVsdGlDaGFubmVsUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5jUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5TaW5jUmVzYW1wbGVyKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1TaW5nbGVGcmFtZTI7IC8vIGZvciBpbnRlcnBvbGF0aW9uCisgICAgaW50MzJfdCAgICAgICAgICAgIG1OdW1Sb3dzID0gMDsKKyAgICBkb3VibGUgICAgICAgICAgICAgbVBoYXNlU2NhbGVyID0gMS4wOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9TSU5DX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyMTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyU3RlcmVvLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJTaW5jUmVzYW1wbGVyU3RlcmVvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKKyNkZWZpbmUgU1RFUkVPICAyCisKK1NpbmNSZXNhbXBsZXJTdGVyZW86OlNpbmNSZXNhbXBsZXJTdGVyZW8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IFNpbmNSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIGFzc2VydChidWlsZGVyLmdldENoYW5uZWxDb3VudCgpID09IFNURVJFTyk7Cit9CisKK3ZvaWQgU2luY1Jlc2FtcGxlclN0ZXJlbzo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAvLyBNb3ZlIGN1cnNvciBiZWZvcmUgd3JpdGUgc28gdGhhdCBjdXJzb3IgcG9pbnRzIHRvIGxhc3Qgd3JpdHRlbiBmcmFtZSBpbiByZWFkLgorICAgIGlmICgtLW1DdXJzb3IgPCAwKSB7CisgICAgICAgIG1DdXJzb3IgPSBnZXROdW1UYXBzKCkgLSAxOworICAgIH0KKyAgICBmbG9hdCAqZGVzdCA9ICZtWFttQ3Vyc29yICogU1RFUkVPXTsKKyAgICBjb25zdCBpbnQgb2Zmc2V0ID0gbU51bVRhcHMgKiBTVEVSRU87CisgICAgLy8gV3JpdGUgZWFjaCBjaGFubmVsIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIHdoZW4gcnVubmluZyB0aGUgRklSLgorICAgIGNvbnN0IGZsb2F0IGxlZnQgPSAgZnJhbWVbMF07CisgICAgY29uc3QgZmxvYXQgcmlnaHQgPSBmcmFtZVsxXTsKKyAgICAvLyBQdXQgb3JkZXJlZCB3cml0ZXMgdG9nZXRoZXIuCisgICAgZGVzdFswXSA9IGxlZnQ7CisgICAgZGVzdFsxXSA9IHJpZ2h0OworICAgIGRlc3Rbb2Zmc2V0XSA9IGxlZnQ7CisgICAgZGVzdFsxICsgb2Zmc2V0XSA9IHJpZ2h0OworfQorCisvLyBNdWx0aXBseSBpbnB1dCB0aW1lcyB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgordm9pZCBTaW5jUmVzYW1wbGVyU3RlcmVvOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IgZm9yIG1peGluZy4KKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lLmJlZ2luKCksIG1TaW5nbGVGcmFtZS5lbmQoKSwgMC4wKTsKKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lMi5iZWdpbigpLCBtU2luZ2xlRnJhbWUyLmVuZCgpLCAwLjApOworCisgICAgLy8gRGV0ZXJtaW5lIGluZGljZXMgaW50byBjb2VmZmljaWVudHMgdGFibGUuCisgICAgZG91YmxlIHRhYmxlUGhhc2UgPSBnZXRJbnRlZ2VyUGhhc2UoKSAqIG1QaGFzZVNjYWxlcjsKKyAgICBpbnQgaW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcih0YWJsZVBoYXNlKSk7CisgICAgZmxvYXQgKmNvZWZmaWNpZW50czEgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MSkKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKyAgICBpbnQgaW5kZXgyID0gKGluZGV4MSArIDEpOworICAgIGlmIChpbmRleDIgPj0gbU51bVJvd3MpIHsgLy8gbm8gZ3VhcmQgcm93IG5lZWRlZCBiZWNhdXNlIHdlIHdyYXAgdGhlIGluZGljZXMKKyAgICAgICAgaW5kZXgyID0gMDsKKyAgICB9CisgICAgZmxvYXQgKmNvZWZmaWNpZW50czIgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MikKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKyAgICBmbG9hdCAqeEZyYW1lID0gJm1YW3N0YXRpY19jYXN0PHNpemVfdD4obUN1cnNvcikgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldENoYW5uZWxDb3VudCgpKV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtVGFwczsgaSsrKSB7CisgICAgICAgIGZsb2F0IGNvZWZmaWNpZW50MSA9ICpjb2VmZmljaWVudHMxKys7CisgICAgICAgIGZsb2F0IGNvZWZmaWNpZW50MiA9ICpjb2VmZmljaWVudHMyKys7CisgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnhGcmFtZSsrOworICAgICAgICAgICAgbVNpbmdsZUZyYW1lW2NoYW5uZWxdICs9ICBzYW1wbGUgKiBjb2VmZmljaWVudDE7CisgICAgICAgICAgICBtU2luZ2xlRnJhbWUyW2NoYW5uZWxdICs9IHNhbXBsZSAqIGNvZWZmaWNpZW50MjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEludGVycG9sYXRlIGFuZCBjb3B5IHRvIG91dHB1dC4KKyAgICBmbG9hdCBmcmFjdGlvbiA9IHRhYmxlUGhhc2UgLSBpbmRleDE7CisgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgIGZsb2F0IGxvdyA9IG1TaW5nbGVGcmFtZVtjaGFubmVsXTsKKyAgICAgICAgZmxvYXQgaGlnaCA9IG1TaW5nbGVGcmFtZTJbY2hhbm5lbF07CisgICAgICAgIGZyYW1lW2NoYW5uZWxdID0gbG93ICsgKGZyYWN0aW9uICogKGhpZ2ggLSBsb3cpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU3NmQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9TSU5DX1JFU0FNUExFUl9TVEVSRU9fSAorI2RlZmluZSBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfU1RFUkVPX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCitjbGFzcyBTaW5jUmVzYW1wbGVyU3RlcmVvIDogcHVibGljIFNpbmNSZXNhbXBsZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmNSZXNhbXBsZXJTdGVyZW8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZpcnR1YWwgflNpbmNSZXNhbXBsZXJTdGVyZW8oKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKKworICAgIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfU1RFUkVPX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAppbmRleCBlOTZlMTM0Li5kZDExMTY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCkBAIC0zNywxOCArMzcsNiBAQAogICAgICAgICA6IEF1ZGlvU3RyZWFtKCkgewogfQogCi1BdWRpb1N0cmVhbUxlZ2FjeTo6fkF1ZGlvU3RyZWFtTGVnYWN5KCkgewotfQotCi0vLyBDYWxsZWQgZnJvbSBBdWRpb1RyYWNrLmNwcCBvciBBdWRpb1JlY29yZC5jcHAKLXN0YXRpYyB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5X2NhbGxiYWNrKGludCBldmVudCwgdm9pZCogdXNlckRhdGEsIHZvaWQgKmluZm8pIHsKLSAgICBBdWRpb1N0cmVhbUxlZ2FjeSAqc3RyZWFtTGVnYWN5ID0gKEF1ZGlvU3RyZWFtTGVnYWN5ICopIHVzZXJEYXRhOwotICAgIHN0cmVhbUxlZ2FjeS0+cHJvY2Vzc0NhbGxiYWNrKGV2ZW50LCBpbmZvKTsKLX0KLQotYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190IEF1ZGlvU3RyZWFtTGVnYWN5OjpnZXRMZWdhY3lDYWxsYmFjaygpIHsKLSAgICByZXR1cm4gQXVkaW9TdHJlYW1MZWdhY3lfY2FsbGJhY2s7Ci19CiAKIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CkBAIC03Niw4MiArNjQsMTQwIEBACiAgICAgcmV0dXJuIChpbnQzMl90KSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlciwgbnVtRnJhbWVzKTsKIH0KIAotdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6cHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pIHsKKwordm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25OZXdJQXVkaW9UcmFjaygpIHsKKyAgICBBTE9HRCgiJXMgc3RyZWFtIGRpc2Nvbm5lY3RlZCIsIF9fZnVuY19fKTsKKyAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKK30KKworc2l6ZV90IEF1ZGlvU3RyZWFtTGVnYWN5Ojpvbk1vcmVEYXRhKGNvbnN0IGFuZHJvaWQ6OkF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSB7CisgICAgLy8gVGhpcyBpbGxlZ2FsIHNpemUgY2FuIGJlIHVzZWQgdG8gdGVsbCBBdWRpb1JlY29yZCBvciBBdWRpb1RyYWNrIHRvIHN0b3AgY2FsbGluZyB1cy4KKyAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGVtIGtpbGxpbmcgdGhlIHN0cmVhbSB3aGVuIHRoZXkgc2VlIGEgc2l6ZSBvdXQgb2YgcmFuZ2UuCisgICAgLy8gVGhhdCBpcyBhbiB1bmRvY3VtZW50ZWQgYmVoYXZpb3IuCisgICAgLy8gVE9ETyBhZGQgdG8gQVBJIGluIEF1ZGlvUmVjb3JkIGFuZCBBdWRpb1RyYWNrCisgICAgLy8gVE9ETyhiLzIxNjE3NTgzMCkgY2xlYW51cCBzaXplIHJlLWNvbXB1dGF0aW9uCisgICAgY29uc3Qgc2l6ZV90IFNJWkVfU1RPUF9DQUxMQkFDS1MgPSBTSVpFX01BWDsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdDsKKyAgICAodm9pZCkgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCh0cnVlKTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKKyAgICAvLyBBdWRpb1JlY29yZDo6QnVmZmVyCisgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgorICAgIHNpemVfdCB3cml0dGVuID0gYnVmZmVyLnNpemUoKTsKKyAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBzdHJlYW0gZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOworICAgICAgICAvLyBUaGlzIHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLgorICAgICAgICAvLyBUaGF0IGlzIE9LIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBkaXNjb25uZWN0ZWQuCisgICAgICAgIHdyaXR0ZW4gPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOworICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCwgc2V0IHNpemU9MCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gRG8gTk9UIHVzZSBTSVpFX1NUT1BfQ0FMTEJBQ0tTIGhlcmUgYmVjYXVzZSB0aGF0IHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZAorICAgICAgICAvLyBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLiBUaGlzIGNhbiBvY2N1ciBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24KKyAgICAgICAgLy8gY2F1c2VkIGJ5IExlZ2FjeSBjYWxsYmFja3MgcnVubmluZyBhZnRlciB0aGUgdHJhY2sgaXMgInN0b3BwZWQiLgorICAgICAgICB3cml0dGVuID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnVmZmVyLmdldEZyYW1lQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBmcmFtZUNvdW50IGlzIHplcm8iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gd3JpdHRlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIGFuIGV4YWN0IHNpemUgdGhlbiB1c2UgYSBibG9jayBzaXplIGFkYXB0ZXIuCisgICAgICAgIGlmIChtQmxvY2tBZGFwdGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYnVmZmVyLmdldEZyYW1lQ291bnQoKSAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbUJsb2NrQWRhcHRlci0+cHJvY2Vzc1ZhcmlhYmxlQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5kYXRhKCksIGJ5dGVDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgorICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldEZyYW1lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKKyAgICAgICAgICAgIHdyaXR0ZW4gPSBidWZmZXIuZ2V0RnJhbWVDb3VudCgpICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXR0ZW4gPSAwOworICAgICAgICAgICAgc3lzdGVtU3RvcEludGVybmFsKCk7CisgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KKyAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZm9yY2VEaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gd3JpdHRlbjsKK30KKworLy8gVE9ETyAoYi8yMTYxNzU4MzApIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgaW4gb3JkZXIgdG8gZWFzZSByZWZhY3RvcmluZyB3aGljaCB3aWxsCisvLyByZWNvbnNvbGlkYXRlLgorc2l6ZV90IEF1ZGlvU3RyZWFtTGVnYWN5Ojpvbk1vcmVEYXRhKGNvbnN0IGFuZHJvaWQ6OkF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcikgewogICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCiAgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgogICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgogICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjawogICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQ7CisgICAgKHZvaWQpIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QodHJ1ZSk7CiAKLSAgICBzd2l0Y2ggKG9wY29kZSkgewotICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fUFJPQ0VTU19EQVRBOiB7Ci0gICAgICAgICAgICAodm9pZCkgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIGFuIEF1ZGlvVHJhY2s6OkJ1ZmZlciBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgotICAgICAgICAgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgotICAgICAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICphdWRpb0J1ZmZlciA9IHN0YXRpY19jYXN0PEF1ZGlvVHJhY2s6OkJ1ZmZlciAqPihpbmZvKTsKLSAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLgotICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgT0sgYmVjYXVzZSB0aGUgc3RyZWFtIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBubyBkYXRhIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQsIHNldCBzaXplPTAiKTsKLSAgICAgICAgICAgICAgICAvLyBEbyBOT1QgdXNlIFNJWkVfU1RPUF9DQUxMQkFDS1MgaGVyZSBiZWNhdXNlIHRoYXQgd2lsbCBraWxsIHRoZSBzdHJlYW0gYW5kCi0gICAgICAgICAgICAgICAgLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uCi0gICAgICAgICAgICAgICAgLy8gY2F1c2VkIGJ5IExlZ2FjeSBjYWxsYmFja3MgcnVubmluZyBhZnRlciB0aGUgdHJhY2sgaXMgInN0b3BwZWQiLgotICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIGZyYW1lQ291bnQgaXMgemVybyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KLSAgICAgICAgICAgICAgICBpZiAobUJsb2NrQWRhcHRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbUJsb2NrQWRhcHRlci0+cHJvY2Vzc1ZhcmlhYmxlQmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgYXVkaW9CdWZmZXItPnJhdywgYnl0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoKHVpbnQ4X3QgKilhdWRpb0J1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcmVzdWx0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN5c3RlbVN0b3BJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKKyAgICAvLyBBdWRpb1JlY29yZDo6QnVmZmVyCisgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgorICAgIHNpemVfdCB3cml0dGVuID0gYnVmZmVyLnNpemUoKTsKKyAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBzdHJlYW0gZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOworICAgICAgICAvLyBUaGlzIHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLgorICAgICAgICAvLyBUaGF0IGlzIE9LIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBkaXNjb25uZWN0ZWQuCisgICAgICAgIHdyaXR0ZW4gPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOworICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCwgc2V0IHNpemU9MCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gRG8gTk9UIHVzZSBTSVpFX1NUT1BfQ0FMTEJBQ0tTIGhlcmUgYmVjYXVzZSB0aGF0IHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZAorICAgICAgICAvLyBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLiBUaGlzIGNhbiBvY2N1ciBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24KKyAgICAgICAgLy8gY2F1c2VkIGJ5IExlZ2FjeSBjYWxsYmFja3MgcnVubmluZyBhZnRlciB0aGUgdHJhY2sgaXMgInN0b3BwZWQiLgorICAgICAgICB3cml0dGVuID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnVmZmVyLmdldEZyYW1lQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBmcmFtZUNvdW50IGlzIHplcm8iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gd3JpdHRlbjsKICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgotICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgQUxPR0QoInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KKyAgICAgICAgaWYgKG1CbG9ja0FkYXB0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW50MzJfdCBieXRlQ291bnQgPSBidWZmZXIuZ2V0RnJhbWVDb3VudCgpICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtQmxvY2tBZGFwdGVyLT5wcm9jZXNzVmFyaWFibGVCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmRhdGEoKSwgYnl0ZUNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbGwgdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoYnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0RnJhbWVDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgeworICAgICAgICAgICAgd3JpdHRlbiA9IGJ1ZmZlci5nZXRGcmFtZUNvdW50KCkgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHJlc3VsdCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGJhY2tSZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdHRlbiA9IDA7CisgICAgICAgICAgICBzeXN0ZW1TdG9wSW50ZXJuYWwoKTsKKyAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSB0aGUgc3lzdGVtIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgorICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXBkYXRlU3RhdGVNYWNoaW5lKCkgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiB3cml0dGVuOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1MZWdhY3k6OmNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoYm9vbCBlcnJvckNhbGxiYWNrRW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggODhlZjI3MC4uNTNmNmUwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC0xNyw4ICsxNywxMCBAQAogI2lmbmRlZiBMRUdBQ1lfQVVESU9fU1RSRUFNX0xFR0FDWV9ICiAjZGVmaW5lIExFR0FDWV9BVURJT19TVFJFQU1fTEVHQUNZX0gKIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCkBAIC0zMCw4ICszMiw2IEBACiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAogCi10eXBlZGVmIHZvaWQgKCphYXVkaW9fbGVnYWN5X2NhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7Ci0KIGVudW0gewogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIGZpbGwgdGhlIGRhdGEgYnVmZmVyIG9mIGFuIG91dHB1dCBzdHJlYW0sCkBAIC01NiwyMSArNTYsMTggQEAKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Q7CiAKIAotY2xhc3MgQXVkaW9TdHJlYW1MZWdhY3kgOiBwdWJsaWMgQXVkaW9TdHJlYW0sIHB1YmxpYyBGaXhlZEJsb2NrUHJvY2Vzc29yIHsKK2NsYXNzIEF1ZGlvU3RyZWFtTGVnYWN5IDogcHVibGljIEF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRml4ZWRCbG9ja1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGFuZHJvaWQ6OkF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBhbmRyb2lkOjpBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2sgewogcHVibGljOgogICAgIEF1ZGlvU3RyZWFtTGVnYWN5KCk7CiAKLSAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUxlZ2FjeSgpOworICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtTGVnYWN5KCkgPSBkZWZhdWx0OwogCi0gICAgYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190IGdldExlZ2FjeUNhbGxiYWNrKCk7CiAKICAgICBpbnQzMl90IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXModWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcyk7CiAKLSAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgQXVkaW9UcmFjay9BdWRpb1JlY29yZCBjbGllbnQuCi0gICAgdmlydHVhbCB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pID0gMDsKLQotICAgIHZvaWQgcHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pOwogCiAgICAgLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKICAgICBpbnQzMl90IG9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSBvdmVycmlkZTsKQEAgLTg2LDcgKzgzLDEyIEBACiAgICAgfQogCiBwcm90ZWN0ZWQ6Ci0KKyAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBhbmRyb2lkOjpBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgLy8gVE9ETyAoYi8yMTYxNzU4MzApIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgaW4gb3JkZXIgdG8gZWFzZSByZWZhY3RvcmluZyB3aGljaCB3aWxsCisgICAgLy8gcmVjb25zb2xpZGF0ZS4KKyAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBhbmRyb2lkOjpBdWRpb1JlY29yZDo6QnVmZmVyJiBidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgb25OZXdJQXVkaW9UcmFjaygpIG92ZXJyaWRlOworICAgIHZvaWQgb25OZXdJQXVkaW9SZWNvcmQoKSBvdmVycmlkZSB7IG9uTmV3SUF1ZGlvVHJhY2soKTsgfQogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRCZXN0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IGRjNjY3NDIuLjFlMzllMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTY1LDExICs2NSw4IEBACiAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CiAKICAgICAvLyBUT0RPIFN1cHBvcnQgVU5TUEVDSUZJRUQgaW4gQXVkaW9SZWNvcmQuIEZvciBub3csIHVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCi0gICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBzYW1wbGVzUGVyRnJhbWUgPD0gMiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2Zvcl9pbmRleF9hc3NpZ25tZW50X2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICBBQXVkaW9fZ2V0Q2hhbm5lbE1hc2tGb3JPcGVuKGdldENoYW5uZWxNYXNrKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCB0cnVlIC8qaXNJbnB1dCovKTsKIAogICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKGJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpID8gMAogICAgICAgICAgICAgICAgICAgICAgICAgOiBidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCk7CkBAIC05OSw0MSArOTYsMTggQEAKICAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KIAotICAgIC8vIE1heWJlIGNoYW5nZSBkZXZpY2UgZm9ybWF0IHRvIGdldCBhIEZBU1QgcGF0aC4KLSAgICAvLyBBdWRpb1JlY29yZCBkb2VzIG5vdCBzdXBwb3J0IEZBU1QgbW9kZSBmb3IgRkxPQVQgZGF0YS4KLSAgICAvLyBUT0RPIEF1ZGlvUmVjb3JkIHNob3VsZCBhbGxvdyBGTE9BVCBkYXRhIHBhdGhzIGZvciBGQVNUIHRyYWNrcy4KLSAgICAvLyBTbyBJRiB0aGUgdXNlciBhc2tzIGZvciBsb3cgbGF0ZW5jeSBGTE9BVAotICAgIC8vIEFORCB0aGUgc2FtcGxlUmF0ZSBpcyBsaWtlbHkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEZBU1QKLSAgICAvLyBUSEVOIHJlcXVlc3QgSTE2IGFuZCBjb252ZXJ0IHRvIEZMT0FUIHdoZW4gcGFzc2luZyB0byB1c2VyLgotICAgIC8vIE5vdGUgdGhhdCBoYXJkIGNvZGluZyA0ODAwMCBIeiBpcyBub3QgaWRlYWwgYmVjYXVzZSB0aGUgc2FtcGxlUmF0ZQotICAgIC8vIGZvciBhIEZBU1QgcGF0aCBtaWdodCBub3QgYmUgNDgwMDAgSHouCi0gICAgLy8gSXQgbm9ybWFsbHkgaXMgYnV0IHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgaXQgaXMgbm90LgotICAgIC8vIEFuZCB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8ga25vdyB0aGF0IGluIGFkdmFuY2UuCi0gICAgLy8gTHVja2lseSB0aGUgY29uc2VxdWVuY2VzIG9mIGEgd3JvbmcgZ3Vlc3MgYXJlIG1pbm9yLgotICAgIC8vIFdlIGp1c3QgbWF5IG5vdCBnZXQgYSBGQVNUIHRyYWNrLgotICAgIC8vIEJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGFueXdheSB3aXRob3V0IHRoaXMgaGFjay4KLSAgICBjb25zdGV4cHIgaW50MzJfdCBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0ID0gNDgwMDA7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgICYmIHBlcmZNb2RlID09IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCi0gICAgICAgICAgICAmJiAoc2FtcGxlc1BlckZyYW1lIDw9IDIpIC8vIEZBU1Qgb25seSBmb3IgbW9ubyBhbmQgc3RlcmVvCi0gICAgICAgICAgICAmJiAoZ2V0U2FtcGxlUmF0ZSgpID09IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QKLSAgICAgICAgICAgICAgICB8fCBnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSkgewotICAgICAgICBzZXREZXZpY2VGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7Ci0gICAgfQorCisgICAgc2V0RGV2aWNlRm9ybWF0KGdldEZvcm1hdCgpKTsKIAogICAgIC8vIFRvIGF2b2lkIGdsaXRjaGluZywgbGV0IEF1ZGlvRmxpbmdlciBwaWNrIHRoZSBvcHRpbWFsIGJ1cnN0IHNpemUuCiAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMDsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCi0gICAgQXVkaW9SZWNvcmQ6OmNhbGxiYWNrX3QgY2FsbGJhY2sgPSBudWxscHRyOwotICAgIHZvaWQgKmNhbGxiYWNrRGF0YSA9IG51bGxwdHI7CisgICAgc3A8QXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrPiBjYWxsYmFjazsKICAgICBBdWRpb1JlY29yZDo6dHJhbnNmZXJfdHlwZSBzdHJlYW1UcmFuc2ZlclR5cGUgPSBBdWRpb1JlY29yZDo6dHJhbnNmZXJfdHlwZTo6VFJBTlNGRVJfU1lOQzsKICAgICBpZiAoYnVpbGRlci5nZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewogICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUgPSBBdWRpb1JlY29yZDo6dHJhbnNmZXJfdHlwZTo6VFJBTlNGRVJfQ0FMTEJBQ0s7Ci0gICAgICAgIGNhbGxiYWNrID0gZ2V0TGVnYWN5Q2FsbGJhY2soKTsKLSAgICAgICAgY2FsbGJhY2tEYXRhID0gdGhpczsKKyAgICAgICAgY2FsbGJhY2sgPSBzcDxBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+Ojpmcm9tRXhpc3RpbmcodGhpcyk7CiAgICAgfQogICAgIG1DYWxsYmFja0J1ZmZlclNpemUgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOwogCkBAIC0xODAsNyArMTU0LDYgQEAKICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YSwKICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLAogICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKQEAgLTIyOCw3ICsyMDEsOSBAQAogICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkdDTElFTlQsIHRvU3RyaW5nKHJlcXVlc3RlZEZvcm1hdCkuY19zdHIoKSkucmVjb3JkKCk7CiAKICAgICAvLyBHZXQgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgQXVkaW9SZWNvcmQuCi0gICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1JlY29yZC0+Y2hhbm5lbENvdW50KCkpOworICAgIHNldENoYW5uZWxNYXNrKEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbE1hc2soCisgICAgICAgICAgICBtQXVkaW9SZWNvcmQtPmNoYW5uZWxNYXNrKCksIHRydWUgLyppc0lucHV0Ki8sCisgICAgICAgICAgICBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGdldENoYW5uZWxNYXNrKCkpKSk7CiAgICAgc2V0U2FtcGxlUmF0ZShtQXVkaW9SZWNvcmQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgc2V0QnVmZmVyQ2FwYWNpdHkoZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkpOwogICAgIHNldEZyYW1lc1BlckJ1cnN0KGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpKTsKQEAgLTM1MSwyMyArMzI2LDYgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TdHJlYW1SZWNvcmQ6OnByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQXVkaW9SZWNvcmQ6OkVWRU5UX01PUkVfREFUQToKLSAgICAgICAgICAgIHByb2Nlc3NDYWxsYmFja0NvbW1vbihBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX1BST0NFU1NfREFUQSwgaW5mbyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgotICAgICAgICBjYXNlIEF1ZGlvUmVjb3JkOjpFVkVOVF9ORVdfSUFVRElPUkVDT1JEOgotICAgICAgICAgICAgcHJvY2Vzc0NhbGxiYWNrQ29tbW9uKEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVELCBpbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnJlcXVlc3RTdGFydF9sKCkKIHsKICAgICBpZiAobUF1ZGlvUmVjb3JkLmdldCgpID09IG51bGxwdHIpIHsKQEAgLTUwNSw3ICs0NjMsNyBAQAogICAgIHJldHVybiAoYWF1ZGlvX3Jlc3VsdF90KSBmcmFtZXNSZWFkOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnNldEJ1ZmZlclNpemUoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnNldEJ1ZmZlclNpemUoaW50MzJfdCAvKnJlcXVlc3RlZEZyYW1lcyovKQogewogICAgIHJldHVybiBnZXRCdWZmZXJTaXplKCk7CiB9CkBAIC01NTMsNyArNTExLDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4udXBkYXRlMzIocG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLnVwZGF0ZTMyKChpbnQzMl90KXBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAppbmRleCA2OTI2NTFkLi41Y2U3M2Y5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKQEAgLTY1LDcgKzY1LDkgQEAKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgdm9pZCBwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pOworCisgICAgdm9pZCBwcm9jZXNzQ2FsbGJhY2tSZWNvcmQoYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbyk7CiAKICAgICBpbnQ2NF90IGluY3JlbWVudENsaWVudEZyYW1lQ291bnRlcihpbnQzMl90IGZyYW1lcykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gaW5jcmVtZW50RnJhbWVzUmVhZChmcmFtZXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAppbmRleCAxZDQxMmMwLi42ZjFkYzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcApAQCAtNjYsMTMgKzY2LDggQEAKICAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CiAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CiAKLSAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvVHJhY2sKLSAgICAvLyBVc2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gc2FtcGxlc1BlckZyYW1lIDw9IDIgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZm9yX2luZGV4X2Fzc2lnbm1lbnRfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIEFBdWRpb19nZXRDaGFubmVsTWFza0Zvck9wZW4oZ2V0Q2hhbm5lbE1hc2soKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGZhbHNlIC8qaXNJbnB1dCovKTsKIAogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKQEAgLTEwOCwxNCArMTAzLDEyIEBACiAgICAgICAgICAgICA6IGdldEZvcm1hdCgpOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KLSAgICBBdWRpb1RyYWNrOjpjYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKLSAgICB2b2lkICpjYWxsYmFja0RhdGEgPSBudWxscHRyOworICAgIHdwPEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2s+IGNhbGxiYWNrOwogICAgIC8vIE5vdGUgdGhhdCBUUkFOU0ZFUl9TWU5DIGRvZXMgbm90IGFsbG93IEZBU1QgdHJhY2sKICAgICBBdWRpb1RyYWNrOjp0cmFuc2Zlcl90eXBlIHN0cmVhbVRyYW5zZmVyVHlwZSA9IEF1ZGlvVHJhY2s6OnRyYW5zZmVyX3R5cGU6OlRSQU5TRkVSX1NZTkM7CiAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlID0gQXVkaW9UcmFjazo6dHJhbnNmZXJfdHlwZTo6VFJBTlNGRVJfQ0FMTEJBQ0s7Ci0gICAgICAgIGNhbGxiYWNrID0gZ2V0TGVnYWN5Q2FsbGJhY2soKTsKLSAgICAgICAgY2FsbGJhY2tEYXRhID0gdGhpczsKKyAgICAgICAgY2FsbGJhY2sgPSB3cDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPjo6ZnJvbUV4aXN0aW5nKHRoaXMpOwogCiAgICAgICAgIC8vIElmIHRoZSB0b3RhbCBidWZmZXIgc2l6ZSBpcyB1bnNwZWNpZmllZCB0aGVuIGJhc2UgdGhlIHNpemUgb24gdGhlIGJ1cnN0IHNpemUuCiAgICAgICAgIGlmIChmcmFtZUNvdW50ID09IDAKQEAgLTE0MCw3ICsxMzMsOSBAQAogICAgIGNvbnN0IGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPQogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoYnVpbGRlci5nZXRVc2FnZSgpKTsKICAgICBjb25zdCBhdWRpb19mbGFnc19tYXNrX3QgYXR0cmlidXRlc0ZsYWdzID0KLSAgICAgICAgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKGJ1aWxkZXIuZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSk7CisgICAgICAgIEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhidWlsZGVyLmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuaXNDb250ZW50U3BhdGlhbGl6ZWQoKSk7CiAKICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKQEAgLTE2MCwxMyArMTU1LDEyIEBACiAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICBjYWxsYmFjaywKLSAgICAgICAgICAgIGNhbGxiYWNrRGF0YSwKICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIDAsICAgICAgIC8vIERFRkFVTFQgc2hhcmVkQnVmZmVyKi8sCisgICAgICAgICAgICBudWxscHRyLCAgICAgICAvLyBERUZBVUxUIHNoYXJlZEJ1ZmZlciovLAogICAgICAgICAgICAgZmFsc2UsICAgLy8gREVGQVVMVCB0aHJlYWRDYW5DYWxsSmF2YQogICAgICAgICAgICAgc2Vzc2lvbklkLAogICAgICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlLAotICAgICAgICAgICAgTlVMTCwgICAgLy8gREVGQVVMVCBhdWRpb19vZmZsb2FkX2luZm9fdAorICAgICAgICAgICAgbnVsbHB0ciwgICAgLy8gREVGQVVMVCBhdWRpb19vZmZsb2FkX2luZm9fdAogICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLCAvLyBERUZBVUxUIHVpZCBhbmQgcGlkCiAgICAgICAgICAgICAmYXR0cmlidXRlcywKICAgICAgICAgICAgIC8vIFdBUk5JTkcgLSBJZiBkb05vdFJlY29ubmVjdCBzZXQgdHJ1ZSB0aGVuIGF1ZGlvIHN0b3BzIGFmdGVyIHBsdWdnaW5nIGFuZCB1bnBsdWdnaW5nCkBAIC0xOTksNyArMTkzLDkgQEAKICAgICBkb1NldFZvbHVtZSgpOwogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvVHJhY2suCi0gICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7CisgICAgc2V0Q2hhbm5lbE1hc2soQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsTWFzaygKKyAgICAgICAgbUF1ZGlvVHJhY2stPmNoYW5uZWxNYXNrKCksIGZhbHNlIC8qaXNJbnB1dCovLAorICAgICAgICBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGdldENoYW5uZWxNYXNrKCkpKSk7CiAgICAgc2V0Rm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CiAgICAgc2V0RGV2aWNlRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CiAgICAgc2V0U2FtcGxlUmF0ZShtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpKTsKQEAgLTIxOCw3ICsyMTQsNiBAQAogICAgICAgICBtQmxvY2tBZGFwdGVyID0gbnVsbHB0cjsKICAgICB9CiAKLSAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOwogICAgIHNldERldmljZUlkKG1BdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpKTsKIAogICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgYWN0dWFsU2Vzc2lvbklkID0KQEAgLTI1MSw2ICsyNDYsMTkgQEAKICAgICAgICAgICAgICAib3BlbigpIHBlcmZNb2RlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgcGVyZk1vZGUsIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CiAKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzIC0gT3BlbiBjYW5jZWxlZCBzaW5jZSBzdGF0ZSA9ICVkIiwgX19mdW5jX18sIGdldFN0YXRlKCkpOworICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIiVzIC0gT3BlbmluZyB3aGlsZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTI4MiwzMSArMjkwLDE5IEBACiAgICAgQXVkaW9TdHJlYW06OmNsb3NlX2woKTsKIH0KIAotdm9pZCBBdWRpb1N0cmVhbVRyYWNrOjpwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSB7CiAKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOgotICAgICAgICAgICAgcHJvY2Vzc0NhbGxiYWNrQ29tbW9uKEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fUFJPQ0VTU19EQVRBLCBpbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBTdHJlYW0gZ290IHJlcm91dGVkIHNvIHdlIGRpc2Nvbm5lY3QuCi0gICAgICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLOgotICAgICAgICAgICAgLy8gcmVxdWVzdCBzdHJlYW0gZGlzY29ubmVjdCBpZiB0aGUgcmVzdG9yZWQgQXVkaW9UcmFjayBoYXMgcHJvcGVydGllcyBub3QgbWF0Y2hpbmcKLSAgICAgICAgICAgIC8vIHdoYXQgd2FzIHJlcXVlc3RlZCBpbml0aWFsbHkKLSAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkgIT0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmZvcm1hdCgpICE9IGdldEZvcm1hdCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCkgIT0gZ2V0U2FtcGxlUmF0ZSgpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgIT0gZ2V0QnVmZmVyQ2FwYWNpdHkoKQotICAgICAgICAgICAgICAgICAgICB8fCBnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSAhPSBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0NhbGxiYWNrQ29tbW9uKEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVELCBpbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKK3ZvaWQgQXVkaW9TdHJlYW1UcmFjazo6b25OZXdJQXVkaW9UcmFjaygpIHsKKyAgICAvLyBTdHJlYW0gZ290IHJlcm91dGVkIHNvIHdlIGRpc2Nvbm5lY3QuCisgICAgLy8gcmVxdWVzdCBzdHJlYW0gZGlzY29ubmVjdCBpZiB0aGUgcmVzdG9yZWQgQXVkaW9UcmFjayBoYXMgcHJvcGVydGllcyBub3QgbWF0Y2hpbmcKKyAgICAvLyB3aGF0IHdhcyByZXF1ZXN0ZWQgaW5pdGlhbGx5CisgICAgaWYgKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSAhPSBnZXRTYW1wbGVzUGVyRnJhbWUoKQorICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5mb3JtYXQoKSAhPSBnZXRGb3JtYXQoKQorICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCkgIT0gZ2V0U2FtcGxlUmF0ZSgpCisgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmdldFJvdXRlZERldmljZUlkKCkgIT0gZ2V0RGV2aWNlSWQoKQorICAgICAgICAgIHx8IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpICE9IGdldEJ1ZmZlckNhcGFjaXR5KCkKKyAgICAgICAgICB8fCBnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSAhPSBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtTGVnYWN5Ojpvbk5ld0lBdWRpb1RyYWNrKCk7CiAgICAgfQotICAgIHJldHVybjsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdGFydF9sKCkgewpAQCAtNTEyLDcgKzUwOCw3IEBACiAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRDoKICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgIG1GcmFtZXNSZWFkLnVwZGF0ZTMyKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIG1GcmFtZXNSZWFkLnVwZGF0ZTMyKChpbnQzMl90KXBvc2l0aW9uKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCmluZGV4IGY2MDQ4NzEuLjBmNGQ3MmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKQEAgLTgxLDkgKzgxLDYgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSBvdmVycmlkZTsKIAotICAgIC8vIFRoaXMgaXMgcHVibGljIHNvIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgQyBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIG92ZXJyaWRlOwotCiAgICAgaW50NjRfdCBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoaW50MzJfdCBmcmFtZXMpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZnJhbWVzKTsKICAgICB9CkBAIC0xMDAsNiArOTcsNyBAQAogCiAgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSBjb25zdCBvdmVycmlkZTsKICAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgb25OZXdJQXVkaW9UcmFjaygpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xpYmFhdWRpby5tYXAudHh0IGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9saWJhYXVkaW8ubWFwLnR4dAppbmRleCAxZGQ0NGQxLi5mNDViODE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xpYmFhdWRpby5tYXAudHh0CisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGliYWF1ZGlvLm1hcC50eHQKQEAgLTI1LDYgKzI1LDkgQEAKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFByaXZhY3lTZW5zaXRpdmU7ICAgIyBpbnRyb2R1Y2VkPTMwCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQYWNrYWdlTmFtZTsgICAjIGludHJvZHVjZWQ9MzEKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEF0dHJpYnV0aW9uVGFnOyAgICMgaW50cm9kdWNlZD0zMQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbE1hc2s7ICAgICMgaW50cm9kdWNlZD0zMgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcjsgIyBpbnRyb2R1Y2VkPTMyCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJc0NvbnRlbnRTcGF0aWFsaXplZDsgICAjIGludHJvZHVjZWQ9MzIKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW07CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGU7CiAgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlOwpAQCAtNjEsNiArNjQsOSBAQAogICAgIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkOwogICAgIEFBdWRpb1N0cmVhbV9pc1ByaXZhY3lTZW5zaXRpdmU7ICAgIyBpbnRyb2R1Y2VkPTMwCiAgICAgQUF1ZGlvU3RyZWFtX3JlbGVhc2U7ICAgICAgICAjIGludHJvZHVjZWQ9MzAKKyAgICBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbE1hc2s7ICAjIGludHJvZHVjZWQ9MzIKKyAgICBBQXVkaW9TdHJlYW1fZ2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcjsgICMgaW50cm9kdWNlZD0zMgorICAgIEFBdWRpb1N0cmVhbV9pc0NvbnRlbnRTcGF0aWFsaXplZDsgICAgICAgIyBpbnRyb2R1Y2VkPTMyCiAgIGxvY2FsOgogICAgICo7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAppbmRleCBkNzk1NzI1Li44NzJmYWNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcApAQCAtMjM1LDIwICsyMzUsNDYgQEAKIH0KIAogYXVkaW9fZmxhZ3NfbWFza190IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzaygKLSAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3ksCisgICAgICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IHNwYXRpYWxpemF0aW9uQmVoYXZpb3IsCisgICAgICAgIGJvb2wgaXNDb250ZW50U3BhdGlhbGl6ZWQpIHsKKyAgICBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3NNYXNrID0gQVVESU9fRkxBR19OT05FOwogICAgIHN3aXRjaCAocG9saWN5KSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgogICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PTkU7CisgICAgICAgICAgICAvLyBmbGFnc01hc2sgaXMgbm90IG1vZGlmaWVkCisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU06Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OOworICAgICAgICAgICAgZmxhZ3NNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihmbGFnc01hc2sgfCBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04pOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORToKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KAorICAgICAgICAgICAgZmxhZ3NNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihmbGFnc01hc2sgfAogICAgICAgICAgICAgICAgICAgICBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04gfCBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBwb2xpY3kpOwotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9ORTsgLy8KKyAgICAgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQgY2FwdHVyZSBwb2xpY3kiLCBfX2Z1bmNfXywgcG9saWN5KTsKKyAgICAgICAgICAgIC8vIGZsYWdzTWFzayBpcyBub3QgbW9kaWZpZWQKICAgICB9CisKKyAgICBzd2l0Y2ggKHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX0FVVE86CisgICAgICAgICAgICAvLyBmbGFnc01hc2sgaXMgbm90IG1vZGlmaWVkCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfTkVWRVI6CisgICAgICAgICAgICBmbGFnc01hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KGZsYWdzTWFzayB8IEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQgc3BhdGlhbGl6YXRpb24gYmVoYXZpb3IiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpOworICAgICAgICAgICAgLy8gZmxhZ3NNYXNrIGlzIG5vdCBtb2RpZmllZAorICAgIH0KKworICAgIGlmIChpc0NvbnRlbnRTcGF0aWFsaXplZCkgeworICAgICAgICBmbGFnc01hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KGZsYWdzTWFzayB8IEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRCk7CisgICAgfQorCisgICAgcmV0dXJuIGZsYWdzTWFzazsKIH0KIAogYXVkaW9fZmxhZ3NfbWFza190IEFBdWRpb0NvbnZlcnRfcHJpdmFjeVNlbnNpdGl2ZVRvQXVkaW9GbGFnc01hc2soCkBAIC0yNTYsNiArMjgyLDI0OCBAQAogICAgIHJldHVybiBwcml2YWN5U2Vuc2l0aXZlID8gQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEUgOiBBVURJT19GTEFHX05PTkU7CiB9CiAKK2F1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkQ2hhbm5lbExheW91dE1hc2soCisgICAgICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYm9vbCBpc0lucHV0KSB7CisgICAgaWYgKGlzSW5wdXQpIHsKKyAgICAgICAgc3dpdGNoIChjaGFubmVsTWFzaykgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9NT05POgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOX01PTk87CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1NURVJFTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU87CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0ZST05UX0JBQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSzsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMFBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQwUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMFBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDE7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpICUjeCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX01PTk86CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1NURVJFTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9UUkk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1RSSTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfVFJJX0JBQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1RSSV9CQUNLOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9RVUFEOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9RVUFEOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9RVUFEX1NJREU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfU1VSUk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9QRU5UQToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEE7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDFfU0lERToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQ0OgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQ0OworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF82UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF83UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQ0OgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0OworICAgICAgICAgICAgLy8gVE9ETzogYWRkIDlwb2ludDFwb2ludDQgYW5kIDlwb2ludDFwb2ludDYgd2hlbiB0aGV5IGFyZSBhZGRlZCBpbiBhdWRpby1oYWwtZW51bXMuaAorICAgICAgICAgICAgLy8gY2FzZSBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ0OgorICAgICAgICAgICAgLy8gICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF85UE9JTlQxUE9JTlQ0OworICAgICAgICAgICAgLy8gY2FzZSBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ2OgorICAgICAgICAgICAgLy8gICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF85UE9JTlQxUE9JTlQ2OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAlI3ggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgICAgICB9CisgICAgfQorfQorCithYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsTGF5b3V0TWFzaygKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGJvb2wgaXNJbnB1dCkgeworICAgIGlmIChpc0lucHV0KSB7CisgICAgICAgIHN3aXRjaCAoY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9NT05POgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9NT05POworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfU1RFUkVPOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX0ZST05UX0JBQ0s7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfMlBPSU5UMFBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF81UE9JTlQxOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAlI3ggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfTU9OTzsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9TVEVSRU87CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzJQT0lOVDE7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1RSSToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfVFJJOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9UUklfQkFDSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfVFJJX0JBQ0s7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzNQT0lOVDE7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzJQT0lOVDFQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX1FVQUQ7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfUVVBRF9TSURFOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfU1VSUk9VTkQ7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9QRU5UQTsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfNVBPSU5UMTsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF81UE9JTlQxX1NJREU7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzVQT0lOVDFQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzVQT0lOVDFQT0lOVDQ7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzZQT0lOVDE7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzdQT0lOVDE7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDQ7CisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgOXBvaW50MXBvaW50NCBhbmQgOXBvaW50MXBvaW50NiB3aGVuIHRoZXkgYXJlIGFkZGVkIGluIGF1ZGlvLWhhbC1lbnVtcy5oCisgICAgICAgICAgICAvLyBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzlQT0lOVDFQT0lOVDQ6CisgICAgICAgICAgICAvLyAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDQ7CisgICAgICAgICAgICAvLyBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzlQT0lOVDFQT0lOVDY6CisgICAgICAgICAgICAvLyAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDY7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpICUjeCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgICAgICB9CisgICAgfQorfQorCitpbnQzMl90IEFBdWRpb0NvbnZlcnRfY2hhbm5lbE1hc2tUb0NvdW50KGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQoY2hhbm5lbE1hc2sgJiB+QUFVRElPX0NIQU5ORUxfQklUX0lOREVYKTsKK30KKworYWF1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfY2hhbm5lbENvdW50VG9NYXNrKGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDAgfHwgY2hhbm5lbENvdW50ID4gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgfQorCisgICAgaWYgKGNoYW5uZWxDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGluZGV4IG1hc2sgaWYgdGhlIGNoYW5uZWwgY291bnQgaXMgZ3JlYXRlciB0aGFuIDIuCisgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgoMSA8PCBjaGFubmVsQ291bnQpIC0gMSk7Cit9CisKK2FhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxJbmRleE1hc2soCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgJSN4IG5vdCBhbiBpbmRleCBtYXNrIiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiAoY2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTkRFWF9IRFIpIHwgQUFVRElPX0NIQU5ORUxfQklUX0lOREVYOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxJbmRleE1hc2soCisgICAgICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgIGlmICghQUF1ZGlvX2lzQ2hhbm5lbEluZGV4TWFzayhjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgJSN4IG5vdCBhbiBpbmRleCBtYXNrIiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KAorICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9jaGFubmVsTWFza1RvQ291bnQoY2hhbm5lbE1hc2spKTsKK30KKworYWF1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbE1hc2soCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBib29sIGlzSW5wdXQsIGJvb2wgaW5kZXhNYXNrUmVxdWlyZWQpIHsKKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkgeworICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsSW5kZXhNYXNrKGNoYW5uZWxNYXNrKTsKKyAgICB9CisgICAgaWYgKGluZGV4TWFza1JlcXVpcmVkKSB7CisgICAgICAgIC8vIFJlcXVpcmUgaW5kZXggbWFzaywgYGNoYW5uZWxNYXNrYCBoZXJlIGlzIGEgcG9zaXRpb24gbWFzay4KKyAgICAgICAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9jaGFubmVsQ291bnRUb01hc2soY2hhbm5lbENvdW50KTsKKyAgICB9CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbExheW91dE1hc2soY2hhbm5lbE1hc2ssIGlzSW5wdXQpOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxNYXNrKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgPyBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxJbmRleE1hc2soY2hhbm5lbE1hc2spCisgICAgICAgICAgICA6IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkQ2hhbm5lbExheW91dE1hc2soY2hhbm5lbE1hc2ssIGlzSW5wdXQpOworfQorCitib29sIEFBdWRpb19pc0NoYW5uZWxJbmRleE1hc2soYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgcmV0dXJuIChjaGFubmVsTWFzayAmIEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCkgPT0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9fZ2V0Q2hhbm5lbE1hc2tGb3JPcGVuKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBib29sIGlzSW5wdXQpIHsKKyAgICBpZiAoY2hhbm5lbE1hc2sgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIGlmIChBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGNoYW5uZWxNYXNrKSAmJiBzYW1wbGVzUGVyRnJhbWUgPD0gMikgeworICAgICAgICAgICAgLy8gV2hlbiBpdCBpcyBpbmRleCBtYXNrIGFuZCB0aGUgY291bnQgaXMgbGVzcyB0aGFuIDMsIHVzZSBwb3NpdGlvbiBtYXNrCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGluZGV4IG1hc2sgZm9yIG9wZW5pbmcgYSBzdHJlYW0uIFRoaXMgbWF5IG5lZWQgdG8gYmUgcmV2aXNpdGVkCisgICAgICAgICAgICAvLyB3aGVuIG1ha2luZyBjaGFubmVsIGluZGV4IG1hc2sgcHVibGljLgorICAgICAgICAgICAgcmV0dXJuIGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrLCBpc0lucHV0KTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gc3RlcmVvIHdoZW4gdW5zcGVjaWZpZWQuCisgICAgcmV0dXJuIGlzSW5wdXQgPyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyA6IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKK30KKwogaW50MzJfdCBBQXVkaW9Db252ZXJ0X2ZyYW1lc1RvQnl0ZXMoaW50MzJfdCBudW1GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzaXplSW5CeXRlcykgewpAQCAtMjc2LDQ1ICs1NDQsNiBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLXN0YXRpYyBpbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1NYXBQcm9wZXJ0eShjb25zdCBjaGFyICpwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlZmF1bHRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY2FsbGVyKSB7Ci0gICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKHByb3BOYW1lLCBkZWZhdWx0VmFsdWUpOwotICAgIHN3aXRjaCAocHJvcCkgewotICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX05FVkVSOgotICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfQUxXQVlTOgotICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfQVVUTzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkID0gJWQiLCBjYWxsZXIsIHByb3ApOwotICAgICAgICAgICAgcHJvcCA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gcHJvcDsKLX0KLQotaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUG9saWN5KCkgewotICAgIHJldHVybiBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUHJvcGVydHkoQUFVRElPX1BST1BfTU1BUF9QT0xJQ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQsIF9fZnVuY19fKTsKLX0KLQotaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwRXhjbHVzaXZlUG9saWN5KCkgewotICAgIHJldHVybiBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUHJvcGVydHkoQUFVRElPX1BST1BfTU1BUF9FWENMVVNJVkVfUE9MSUNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELCBfX2Z1bmNfXyk7Ci19Ci0KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TWl4ZXJCdXJzdHMoKSB7Ci0gICAgY29uc3QgaW50MzJfdCBkZWZhdWx0QnVyc3RzID0gMjsgLy8gYXJiaXRyYXJ5LCB1c2UgMiBmb3IgZG91YmxlIGJ1ZmZlcmVkCi0gICAgY29uc3QgaW50MzJfdCBtYXhCdXJzdHMgPSAxMDI0OyAvLyBhcmJpdHJhcnkKLSAgICBpbnQzMl90IHByb3AgPSBwcm9wZXJ0eV9nZXRfaW50MzIoQUFVRElPX1BST1BfTUlYRVJfQlVSU1RTLCBkZWZhdWx0QnVyc3RzKTsKLSAgICBpZiAocHJvcCA8IDEgfHwgcHJvcCA+IG1heEJ1cnN0cykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvUHJvcGVydHlfZ2V0TWl4ZXJCdXJzdHM6IGludmFsaWQgPSAlZCIsIHByb3ApOwotICAgICAgICBwcm9wID0gZGVmYXVsdEJ1cnN0czsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3A7Ci19Ci0KIGludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0V2FrZXVwRGVsYXlNaWNyb3MoKSB7CiAgICAgY29uc3QgaW50MzJfdCBtaW5NaWNyb3MgPSAwOyAvLyBhcmJpdHJhcnkKICAgICBjb25zdCBpbnQzMl90IGRlZmF1bHRNaWNyb3MgPSAyMDA7IC8vIGFyYml0cmFyeSwgYmFzZWQgb24gc29tZSBvYnNlcnZlZCBqaXR0ZXIKQEAgLTMzMSw5ICs1NjAsMTIgQEAKIH0KIAogaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3MoKSB7Ci0gICAgY29uc3QgaW50MzJfdCBtaW5NaWNyb3MgPSAyMDsgLy8gYXJiaXRyYXJ5Ci0gICAgY29uc3QgaW50MzJfdCBkZWZhdWx0TWljcm9zID0gMjAwOyAvLyBhcmJpdHJhcnkKLSAgICBjb25zdCBpbnQzMl90IG1heE1pY3JvcyA9IDIwMDA7IC8vIGFyYml0cmFyeQorICAgIGNvbnN0IGludDMyX3QgbWluTWljcm9zID0gMTsgLy8gYXJiaXRyYXJ5CisgICAgLy8gSGlnaGVyIHZhbHVlcyBjYW4gaW5jcmVhc2UgbGF0ZW5jeSBmb3IgbW9kZXJhdGUgd29ya2xvYWRzLgorICAgIC8vIFNob3J0IHZhbHVlcyBjYW4gY2F1c2UgdGhlIENQVSB0byBzaG9ydCBjeWNsZSBpZiB0aGVyZSBpcyBhIGJ1ZyBpbgorICAgIC8vIGNhbGN1bGF0aW5nIHRoZSB3YWtldXAgdGltZXMuCisgICAgY29uc3QgaW50MzJfdCBkZWZhdWx0TWljcm9zID0gMTAwOyAvLyBhcmJpdHJhcnkKKyAgICBjb25zdCBpbnQzMl90IG1heE1pY3JvcyA9IDIwMDsgLy8gYXJiaXRyYXJ5CiAgICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01JTklNVU1fU0xFRVBfVVNFQywgZGVmYXVsdE1pY3Jvcyk7CiAgICAgaWYgKHByb3AgPCBtaW5NaWNyb3MpIHsKICAgICAgICAgQUxPR1coIkFBdWRpb1Byb3BlcnR5X2dldE1pbmltdW1TbGVlcE1pY3JvczogY2xpcHBlZCAlZCB0byAlZCIsIHByb3AsIG1pbk1pY3Jvcyk7CkBAIC0zNDUsMTggKzU3Nyw2IEBACiAgICAgcmV0dXJuIHByb3A7CiB9CiAKLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpIHsKLSAgICBjb25zdCBpbnQzMl90IGRlZmF1bHRNaWNyb3MgPSAxMDAwOyAvLyBhcmJpdHJhcnkKLSAgICBjb25zdCBpbnQzMl90IG1heE1pY3JvcyA9IDEwMDAgKiAxMDAwOyAvLyBhcmJpdHJhcnkKLSAgICBpbnQzMl90IHByb3AgPSBwcm9wZXJ0eV9nZXRfaW50MzIoQUFVRElPX1BST1BfSFdfQlVSU1RfTUlOX1VTRUMsIGRlZmF1bHRNaWNyb3MpOwotICAgIGlmIChwcm9wIDwgMSB8fCBwcm9wID4gbWF4TWljcm9zKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zOiBpbnZhbGlkID0gJWQsIHVzZSAlZCIsCi0gICAgICAgICAgICAgIHByb3AsIGRlZmF1bHRNaWNyb3MpOwotICAgICAgICBwcm9wID0gZGVmYXVsdE1pY3JvczsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3A7Ci19Ci0KIHN0YXRpYyBpbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1NYXBPZmZzZXRNaWNyb3MoY29uc3QgY2hhciAqZnVuY3Rpb25OYW1lLAogICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUpIHsKICAgICBjb25zdCBpbnQzMl90IG1pbk1pY3JvcyA9IC0yMDAwMDsgLy8gYXJiaXRyYXJ5CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggODJlYjc3ZC4uYjU5Y2UxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtOTEsMzUgKzkxLDQzIEBACiAgKiBAcmV0dXJuIGludGVybmFsIGF1ZGlvIGZsYWdzIG1hc2sKICAqLwogYXVkaW9fZmxhZ3NfbWFza190IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzaygKLSAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpOworICAgICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSwKKyAgICAgICAgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3Qgc3BhdGlhbGl6YXRpb25CZWhhdmlvciwKKyAgICAgICAgYm9vbCBpc0NvbnRlbnRTcGF0aWFsaXplZCk7CiAKIGF1ZGlvX2ZsYWdzX21hc2tfdCBBQXVkaW9Db252ZXJ0X3ByaXZhY3lTZW5zaXRpdmVUb0F1ZGlvRmxhZ3NNYXNrKAogICAgICAgICBib29sIHByaXZhY3lTZW5zaXRpdmUpOwogCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxMYXlvdXRNYXNrKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGJvb2wgaXNJbnB1dCk7CisKK2FhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxMYXlvdXRNYXNrKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYm9vbCBpc0lucHV0KTsKKworYWF1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbEluZGV4TWFzaygKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spOworCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxJbmRleE1hc2soCisgICAgICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayk7CisKK2FhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxNYXNrKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYm9vbCBpc0lucHV0LCBib29sIGluZGV4TWFza1JlcXVpcmVkKTsKKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsTWFzaygKKyAgICAgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBib29sIGlzSW5wdXQpOworCitib29sIEFBdWRpb19pc0NoYW5uZWxJbmRleE1hc2soYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKTsKKworaW50MzJfdCBBQXVkaW9Db252ZXJ0X2NoYW5uZWxNYXNrVG9Db3VudChhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spOworCithYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9jaGFubmVsQ291bnRUb01hc2soaW50MzJfdCBjaGFubmVsQ291bnQpOworCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9fZ2V0Q2hhbm5lbE1hc2tGb3JPcGVuKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBib29sIGlzSW5wdXQpOworCiAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBiZSByZXBsYWNlZCBieSBTZXR0aW5ncyBvciBieSBzb21lIG90aGVyIHN5c3RlbSBjb25maWd1cmF0aW9uIHRvb2wuCiAKIC8qKgotICogUmVhZCBzeXN0ZW0gcHJvcGVydHkuCi0gKiBAcmV0dXJuIEFBVURJT19VTlNQRUNJRklFRCwgQUFVRElPX1BPTElDWV9ORVZFUiBvciBBQVVESU9fUE9MSUNZX0FVVE8gb3IgQUFVRElPX1BPTElDWV9BTFdBWVMKLSAqLwotaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUG9saWN5KCk7Ci0jZGVmaW5lIEFBVURJT19QUk9QX01NQVBfUE9MSUNZICAgICAgICAgICAiYWF1ZGlvLm1tYXBfcG9saWN5IgotCi0vKioKLSAqIFJlYWQgc3lzdGVtIHByb3BlcnR5LgotICogQHJldHVybiBBQVVESU9fVU5TUEVDSUZJRUQsIEFBVURJT19QT0xJQ1lfTkVWRVIgb3IgQUFVRElPX1BPTElDWV9BVVRPIG9yIEFBVURJT19QT0xJQ1lfQUxXQVlTCi0gKi8KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcEV4Y2x1c2l2ZVBvbGljeSgpOwotI2RlZmluZSBBQVVESU9fUFJPUF9NTUFQX0VYQ0xVU0lWRV9QT0xJQ1kgImFhdWRpby5tbWFwX2V4Y2x1c2l2ZV9wb2xpY3kiCi0KLS8qKgotICogUmVhZCBzeXN0ZW0gcHJvcGVydHkuCi0gKiBAcmV0dXJuIG51bWJlciBvZiBidXJzdHMgcGVyIEFBdWRpbyBzZXJ2aWNlIG1peGVyIGN5Y2xlCi0gKi8KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TWl4ZXJCdXJzdHMoKTsKLSNkZWZpbmUgQUFVRElPX1BST1BfTUlYRVJfQlVSU1RTICAgICAgICAgICAiYWF1ZGlvLm1peGVyX2J1cnN0cyIKLQotLyoqCiAgKiBSZWFkIGEgc3lzdGVtIHByb3BlcnR5IHRoYXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZXh0cmEgbWljcm9zZWNvbmRzIHRoYXQgYSB0aHJlYWQKICAqIHNob3VsZCBzbGVlcCB3aGVuIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIHNlcnZpY2UgYSBGSUZPLiBUaGlzIGlzIHVzZWQKICAqIHRvIGF2b2lkIHRoZSB3YWtpbmcgdGhyZWFkIGZyb20gYmVpbmcgb3Zlcmx5IG9wdGltaXN0aWMgYWJvdXQgdGhlIG90aGVyIHRocmVhZHMKQEAgLTE0MCwxOSArMTQ4LDYgQEAKICNkZWZpbmUgQUFVRElPX1BST1BfTUlOSU1VTV9TTEVFUF9VU0VDICAgICAgImFhdWRpby5taW5pbXVtX3NsZWVwX3VzZWMiCiAKIC8qKgotICogUmVhZCBzeXN0ZW0gcHJvcGVydHkuCi0gKiBUaGlzIGlzIGhhbmR5IGluIGNhc2UgdGhlIERNQSBpcyBidXJzdGluZyB0b28gcXVpY2tseSBmb3IgdGhlIENQVSB0byBrZWVwIHVwLgotICogRm9yIGV4YW1wbGUsIHRoZXJlIG1heSBiZSBhIERNQSBidXJzdCBldmVyeSAxMDAgdXNlYyBidXQgeW91IG9ubHkKLSAqIHdhbnQgdG8gZmVlZCB0aGUgTU1BUCBidWZmZXIgZXZlcnkgMjAwMCB1c2VjLgotICoKLSAqIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGZyYW1lc1BlckJ1cnN0IGZvciBhbiBNTUFQIHN0cmVhbS4KLSAqCi0gKiBAcmV0dXJuIG1pbmltdW0gbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBmb3IgYSBNTUFQIEhXIGJ1cnN0Ci0gKi8KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpOwotI2RlZmluZSBBQVVESU9fUFJPUF9IV19CVVJTVF9NSU5fVVNFQyAgICAgICJhYXVkaW8uaHdfYnVyc3RfbWluX3VzZWMiCi0KLS8qKgogICogUmVhZCBhIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IHNwZWNpZmllcyBhbiBvZmZzZXQgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIE1NQVAgdGltZXN0YW1wcy4KICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29ycmVjdCBiaWFzIGluIHRoZSB0aW1lc3RhbXAuCiAgKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFuYWx5emUgdGhlIHRpbWUgZGlzdHJpYnV0aW9uIG9mIHRoZSB0aW1lc3RhbXAKQEAgLTE5OCw3ICsxOTMsNyBAQAogICogQHJldHVybiB0cnVlIGlmIGYoKSBldmVudHVhbGx5IHJldHVybnMgdHJ1ZS4KICAqLwogc3RhdGljIGlubGluZSBib29sIEFBdWRpb190cnlVbnRpbFRydWUoCi0gICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBmLCBpbnQgdGltZXMsIGludCBzbGVlcE1zKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiYgZiwgaW50IHRpbWVzLCBpbnQgc2xlZXBNcykgewogICAgIHN0YXRpYyBjb25zdCB1c2Vjb25kc190IFVTX1BFUl9NUyA9IDEwMDA7CiAKICAgICBzbGVlcE1zID0gc3RkOjptYXgoc2xlZXBNcywgMCk7CkBAIC0yNzAsOSArMjY1LDcgQEAKIAogY2xhc3MgVGltZXN0YW1wIHsKIHB1YmxpYzoKLSAgICBUaW1lc3RhbXAoKQotICAgICAgICAgICAgOiBtUG9zaXRpb24oMCkKLSAgICAgICAgICAgICwgbU5hbm9zZWNvbmRzKDApIHt9CisgICAgVGltZXN0YW1wKCkgPSBkZWZhdWx0OwogICAgIFRpbWVzdGFtcChpbnQ2NF90IHBvc2l0aW9uLCBpbnQ2NF90IG5hbm9zZWNvbmRzKQogICAgICAgICAgICAgOiBtUG9zaXRpb24ocG9zaXRpb24pCiAgICAgICAgICAgICAsIG1OYW5vc2Vjb25kcyhuYW5vc2Vjb25kcykge30KQEAgLTI4Myw4ICsyNzYsOCBAQAogCiBwcml2YXRlOgogICAgIC8vIFRoZXNlIGNhbm5vdCBiZSBjb25zdCBiZWNhdXNlIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoZSBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gICAgaW50NjRfdCBtUG9zaXRpb247Ci0gICAgaW50NjRfdCBtTmFub3NlY29uZHM7CisgICAgaW50NjRfdCBtUG9zaXRpb257MH07CisgICAgaW50NjRfdCBtTmFub3NlY29uZHN7MH07CiB9OwogCiAKQEAgLTMxOCw0ICszMTEsMzYgQEAKICAgICBzdGQ6OmF0b21pYzxpbnQ+IG1SZXF1ZXN0ZWR7MH07CiAgICAgc3RkOjphdG9taWM8aW50PiBtQWNrbm93bGVkZ2VkezB9OwogfTsKKworZW51bSB7CisgICAgLyoqCisgICAgICogQXVkaW8gY2hhbm5lbCBpbmRleCBtYXNrLCBvbmx5IHVzZWQgaW50ZXJuYWxseS4KKyAgICAgKi8KKyAgICBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggPSAweDgwMDAwMDAwLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSA9IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgxIDw8IDEpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAyKSAtIDEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18zID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMykgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCA9IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgxIDw8IDQpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCA1KSAtIDEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgNikgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNyA9IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgxIDw8IDcpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzggPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCA4KSAtIDEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgOSkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTAgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxMCkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTEgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxMSkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTIgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxMikgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTMgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxMykgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTQgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxNCkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTUgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxNSkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTYgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxNikgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTcgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxNykgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTggPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxOCkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTkgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxOSkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjAgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAyMCkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjEgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAyMSkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjIgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAyMikgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjMgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAyMykgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjQgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAyNCkgLSAxLAorfTsKKwogI2VuZGlmIC8vVVRJTElUWV9BQVVESU9fVVRJTElUSUVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmgKaW5kZXggNGRjN2U2OC4uMjkwZTQ3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmgKQEAgLTM1LDcgKzM1LDcgQEAKIGNsYXNzIEZpeGVkQmxvY2tBZGFwdGVyCiB7CiBwdWJsaWM6Ci0gICAgRml4ZWRCbG9ja0FkYXB0ZXIoRml4ZWRCbG9ja1Byb2Nlc3NvciAmZml4ZWRCbG9ja1Byb2Nlc3NvcikKKyAgICBleHBsaWNpdCBGaXhlZEJsb2NrQWRhcHRlcihGaXhlZEJsb2NrUHJvY2Vzc29yICZmaXhlZEJsb2NrUHJvY2Vzc29yKQogICAgIDogbUZpeGVkQmxvY2tQcm9jZXNzb3IoZml4ZWRCbG9ja1Byb2Nlc3Nvcikge30KIAogICAgIHZpcnR1YWwgfkZpeGVkQmxvY2tBZGFwdGVyKCkgPSBkZWZhdWx0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmgKaW5kZXggMTI4ZGQ1Mi4uZGM4MjQxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5oCkBAIC0zMCw3ICszMCw3IEBACiBjbGFzcyBGaXhlZEJsb2NrUmVhZGVyIDogcHVibGljIEZpeGVkQmxvY2tBZGFwdGVyCiB7CiBwdWJsaWM6Ci0gICAgRml4ZWRCbG9ja1JlYWRlcihGaXhlZEJsb2NrUHJvY2Vzc29yICZmaXhlZEJsb2NrUHJvY2Vzc29yKTsKKyAgICBleHBsaWNpdCBGaXhlZEJsb2NrUmVhZGVyKEZpeGVkQmxvY2tQcm9jZXNzb3IgJmZpeGVkQmxvY2tQcm9jZXNzb3IpOwogCiAgICAgdmlydHVhbCB+Rml4ZWRCbG9ja1JlYWRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmgKaW5kZXggZjFkOTE3Yy4uM2U4OWI1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5oCkBAIC0yOCw3ICsyOCw3IEBACiBjbGFzcyBGaXhlZEJsb2NrV3JpdGVyIDogcHVibGljIEZpeGVkQmxvY2tBZGFwdGVyCiB7CiBwdWJsaWM6Ci0gICAgRml4ZWRCbG9ja1dyaXRlcihGaXhlZEJsb2NrUHJvY2Vzc29yICZmaXhlZEJsb2NrUHJvY2Vzc29yKTsKKyAgICBleHBsaWNpdCBGaXhlZEJsb2NrV3JpdGVyKEZpeGVkQmxvY2tQcm9jZXNzb3IgJmZpeGVkQmxvY2tQcm9jZXNzb3IpOwogCiAgICAgdmlydHVhbCB+Rml4ZWRCbG9ja1dyaXRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKaW5kZXggNjNhZGQ0ZS4uNTFlYjY5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCkBAIC0zMCw4ICszMCw4IEBACiBjbGFzcyBNb25vdG9uaWNDb3VudGVyIHsKIAogcHVibGljOgotICAgIE1vbm90b25pY0NvdW50ZXIoKSB7fTsKLSAgICB2aXJ0dWFsIH5Nb25vdG9uaWNDb3VudGVyKCkge307CisgICAgTW9ub3RvbmljQ291bnRlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5Nb25vdG9uaWNDb3VudGVyKCkgPSBkZWZhdWx0OwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudGVyCkBAIC00MSw3ICs0MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIGFkdmFuY2UgdGhlIGN1cnJlbnQgdmFsdWUgdG8gbWF0Y2ggdGhlIGNvdW50ZXIKKyAgICAgKiBBZHZhbmNlIHRoZSBjdXJyZW50IHZhbHVlIHRvIG1hdGNoIHRoZSBjb3VudGVyLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGl0IHdpbGwgdGFrZSBzZXZlcmFsIG1pbGxpb24geWVhcnMgZm9yIHRoZSA2NC1iaXQKKyAgICAgKiBjb3VudGVycyB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBTbyB3ZSBkbyBub3QgdXNlIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cuCisgICAgICogV2Ugd2FudCB0byBrbm93IGlmIG92ZXJmbG93IGhhcHBlbnMgYmVjYXVzZSBvZiBhIGJ1Zy4KICAgICAgKi8KICAgICB2b2lkIGNhdGNoVXBUbyhpbnQ2NF90IGNvdW50ZXIpIHsKICAgICAgICAgaWYgKChjb3VudGVyIC0gbUNvdW50ZXI2NCkgPiAwKSB7CkBAIC03NCw3ICs3OSw4IEBACiAgICAgICogQHJldHVybiBjdXJyZW50IHZhbHVlIG9mIHRoZSA2NC1iaXQgY291bnRlcgogICAgICAqLwogICAgIGludDY0X3QgdXBkYXRlMzIoaW50MzJfdCBjb3VudGVyMzIpIHsKLSAgICAgICAgaW50MzJfdCBkZWx0YSA9IGNvdW50ZXIzMiAtIG1Db3VudGVyMzI7CisgICAgICAgIGludDMyX3QgZGVsdGE7CisgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coY291bnRlcjMyLCBtQ291bnRlcjMyLCAmZGVsdGEpOwogICAgICAgICAvLyBwcm90ZWN0IGFnYWluc3QgdGhlIG1Db3VudGVyNjQgZ29pbmcgYmFja3dhcmRzCiAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKICAgICAgICAgICAgIG1Db3VudGVyNjQgKz0gZGVsdGE7CkBAIC0xMDgsNSArMTE0LDQgQEAKICAgICBpbnQzMl90IG1Db3VudGVyMzIgPSAwOwogfTsKIAotCiAjZW5kaWYgLy9VVElMSVRZX01PTk9UT05JQ19DT1VOVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggOThlOTcyNy4uNGI0NTkwOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEzLDYgKzEzLDExIEBACiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCisgICAgfSwKIH0KIAogY2NfdGVzdCB7CkBAIC00OCw3ICs1Myw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvX2ludGVybmFsIl0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF90aW1lc3RhbXBzIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfdGltZXN0YW1wcy5jcHAiXSwKQEAgLTYwLDEyMSArNjUsNzEgQEAKICAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X25vX2Nsb3NlIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfbm9fY2xvc2UuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3RfYWF1ZGlvX3JlY292ZXJ5IiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfcmVjb3ZlcnkuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3Rfbl9zdHJlYW1zIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfbl9zdHJlYW1zLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X2JhZF9kaXNjb25uZWN0IiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYmFkX2Rpc2Nvbm5lY3QuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF92YXJpb3VzIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfdmFyaW91cy5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X3Nlc3Npb25faWQiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9zZXNzaW9uX2lkLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19tb25rZXkiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9hYXVkaW9fbW9ua2V5LmNwcCJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9hdHRyaWJ1dGVzIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYXR0cmlidXRlcy5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2ludGVyZmVyZW5jZSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2ludGVyZmVyZW5jZS5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKIGNjX3Rlc3QgewpAQCAtMTk3LDI3ICsxNTIsMjkgQEAKIH0KIAogY2NfdGVzdCB7Ci0gICAgbmFtZTogInRlc3RfcmV0dXJuX3N0b3AiLAorICAgIG5hbWU6ICJ0ZXN0X21vbm90b25pY19jb3VudGVyIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfcmV0dXJuX3N0b3AuY3BwIl0sCisgICAgc3JjczogWyJ0ZXN0X21vbm90b25pY19jb3VudGVyLmNwcCJdLAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYWF1ZGlvX2ludGVybmFsIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiB9CiAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInRlc3RfcmV0dXJuX3N0b3AiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9yZXR1cm5fc3RvcC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfY2FsbGJhY2tfcmFjZSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2NhbGxiYWNrX3JhY2UuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCiBjY190ZXN0IHsKQEAgLTIzOCw3ICsxOTUsNyBAQAogICAgIF0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9zdGVhbF9leGNsdXNpdmUiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9zdGVhbF9leGNsdXNpdmUuY3BwIl0sCkBAIC0yNTEsMTUgKzIwOCw5IEBACiAgICAgXSwKIH0KIAotCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3RfZGlzY29ubmVjdF9yYWNlIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfZGlzY29ubmVjdF9yYWNlLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKaW5kZXggZDU0MDg2Ni4uYjg4ZDU2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKQEAgLTE2LDYgKzE2LDEwIEBACiAKIC8vIFRlc3QgQUF1ZGlvIGF0dHJpYnV0ZXMgc3VjaCBhcyBVc2FnZSwgQ29udGVudFR5cGUgYW5kIElucHV0UHJlc2V0LgogCisvLyBUT0RPIE1hbnkgb2YgdGhlc2UgdGVzdHMgYXJlIGR1cGxpY2F0ZXMgb2YgQ1RTIHRlc3RzIGluCisvLyAidGVzdF9hYXVkaW9fYXR0cmlidXRlcy5jcHAiLiBUaGF0IG90aGVyIGZpbGUgaXMgbW9yZSBjdXJyZW50LgorLy8gU28gdGhlc2UgdGVzdHMgY291bGQgYmUgZGVsZXRlZC4KKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTkxLDcgKzk1LDcgQEAKICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGV4cGVjdGVkQ2FwdHVyZVBvbGljeSA9CiAgICAgICAgICAgICAoY2FwdHVyZVBvbGljeSA9PSBET05UX1NFVCB8fCBjYXB0dXJlUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgID8gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMIC8vIGRlZmF1bHQKLSAgICAgICAgICAgIDogcHJlc2V0OworICAgICAgICAgICAgOiBjYXB0dXJlUG9saWN5OwogICAgIEVYUEVDVF9FUShleHBlY3RlZENhcHR1cmVQb2xpY3ksIEFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShhYXVkaW9TdHJlYW0pKTsKIAogICAgIGJvb2wgZXhwZWN0ZWRQcml2YWN5TW9kZSA9CkBAIC0xMzIsMTAgKzEzNiw3IEBACiAgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAogICAgIEFBVURJT19VU0FHRV9HQU1FLAogICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTlQsCi0gICAgQUFVRElPX1NZU1RFTV9VU0FHRV9FTUVSR0VOQ1ksCi0gICAgQUFVRElPX1NZU1RFTV9VU0FHRV9TQUZFVFksCi0gICAgQUFVRElPX1NZU1RFTV9VU0FHRV9WRUhJQ0xFX1NUQVRVUywKLSAgICBBQVVESU9fU1lTVEVNX1VTQUdFX0FOTk9VTkNFTUVOVAorICAgIC8vIE5vdGUgdGhhdCB0aGUgQUFVRElPX1NZU1RFTV9VU0FHRV8qIHZhbHVlcyByZXF1aXJlcyBzcGVjaWFsIHBlcm1pc3Npb24uCiB9OwogCiBzdGF0aWMgY29uc3QgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IHNDb250ZW50eXBlc1tdID0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKaW5kZXggZDU2M2E3ZS4uNjZiNzdlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCkBAIC0xNiw2ICsxNiw5IEBACiAKIC8qCiAgKiBUZXN0IEZsb3dHcmFwaAorICoKKyAqIFRoaXMgZmlsZSBhbHNvIHRlc3RzIGEgZmV3IGRpZmZlcmVudCBjb252ZXJzaW9uIHRlY2huaXF1ZXMgYmVjYXVzZQorICogc29tZXRpbWVzIHRoYXQgaGF2ZSBjYXVzZWQgY29tcGlsZXIgYnVncy4KICAqLwogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CkBAIC0yMywzNSArMjYsMTYxIEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAogI2luY2x1ZGUgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Nb25vQmxlbmQuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlRmxvYXQuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvUmFtcExpbmVhci5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rRmxvYXQuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kxNi5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTI0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMzIuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTE2LmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkyNC5oIgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOwogCitjb25zdGV4cHIgaW50IGtOdW1TYW1wbGVzID0gODsKK2NvbnN0ZXhwciBzdGQ6OmFycmF5PGZsb2F0LCBrTnVtU2FtcGxlcz4ga0lucHV0RmxvYXQgPSB7CisgICAgMS4wZiwgMC41ZiwgLTAuMjVmLCAtMS4wZiwKKyAgICAwLjBmLCA1My45ZiwgLTg3LjJmLCAtMS4wMmZ9OworCisvLyBDb3JyZXNwb25kaW5nIFBDTSB2YWx1ZXMgIGFzIGludGVnZXJzLgorY29uc3RleHByIHN0ZDo6YXJyYXk8aW50MTZfdCwga051bVNhbXBsZXM+ICBrRXhwZWN0ZWRJMTYgPSB7CisgICAgSU5UMTZfTUFYLCAxIDw8IDE0LCBJTlQxNl9NSU4gLyA0LCBJTlQxNl9NSU4sCisgICAgMCwgSU5UMTZfTUFYLCBJTlQxNl9NSU4sIElOVDE2X01JTn07CisKK2NvbnN0ZXhwciBzdGQ6OmFycmF5PGludDMyX3QsIGtOdW1TYW1wbGVzPiAga0V4cGVjdGVkSTMyID0geworICAgIElOVDMyX01BWCwgMSA8PCAzMCwgSU5UMzJfTUlOIC8gNCwgSU5UMzJfTUlOLAorICAgIDAsIElOVDMyX01BWCwgSU5UMzJfTUlOLCBJTlQzMl9NSU59OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGTE9BVCB0byBJMTYgPT09PT09PT09PT09PT0KKworLy8gU2ltcGxlIHRlc3QgdGhhdCB0cmllcyB0byByZXByb2R1Y2UgYSBDbGFuZyBjb21waWxlciBidWcuCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCit2b2lkIGxvY2FsX2NvbnZlcnRfZmxvYXRfdG9faW50MTYoY29uc3QgZmxvYXQgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBuID0gKGludDMyX3QpICgqaW5wdXQrKyAqIDMyNzY4LjBmKTsKKyAgICAgICAgKm91dHB1dCsrID0gc3RkOjptaW4oSU5UMTZfTUFYLCBzdGQ6Om1heChJTlQxNl9NSU4sIG4pKTsgLy8gY2xpcAorICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbG9jYWxfY29udmVydF9mbG9hdF9pbnQxNikgeworICAgIHN0ZDo6YXJyYXk8aW50MTZfdCwga051bVNhbXBsZXM+IG91dHB1dDsKKworICAgIC8vIERvIGl0IGlubGluZSwgd2hpY2ggd2lsbCBwcm9iYWJseSB3b3JrIGV2ZW4gd2l0aCB0aGUgYnVnZ3kgY29tcGlsZXIuCisgICAgLy8gVGhpcyB2YWxpZGF0ZXMgdGhlIGV4cGVjdGVkIGRhdGEuCisgICAgY29uc3QgZmxvYXQgKmluID0ga0lucHV0RmxvYXQuZGF0YSgpOworICAgIGludDE2X3QgKm91dCA9IG91dHB1dC5kYXRhKCk7CisgICAgb3V0cHV0LmZpbGwoNzc3KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBuID0gKGludDMyX3QpICgqaW4rKyAqIDMyNzY4LjBmKTsKKyAgICAgICAgKm91dCsrID0gc3RkOjptaW4oSU5UMTZfTUFYLCBzdGQ6Om1heChJTlQxNl9NSU4sIG4pKTsgLy8gY2xpcAorICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEkxNi5hdChpKSwgb3V0cHV0LmF0KGkpKSA8PCAiLCBpID0gIiA8PCBpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYXVkaW8gc2lnbmFsIHVzaW5nIHRoZSBmdW5jdGlvbi4KKyAgICBvdXRwdXQuZmlsbCg3NzcpOworICAgIGxvY2FsX2NvbnZlcnRfZmxvYXRfdG9faW50MTYoa0lucHV0RmxvYXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpLCBrTnVtU2FtcGxlcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRJMTYuYXQoaSksIG91dHB1dC5hdChpKSkgPDwgIiwgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKIFRFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9zaW5raTE2KSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMC41ZiwgLTAuMjVmLCAtMS4wZiwgMC4wZiwgNTMuOWYsIC04Ny4yZn07Ci0gICAgc3RhdGljIGNvbnN0IGludDE2X3QgZXhwZWN0ZWRbXSA9IHszMjc2NywgMTYzODQsIC04MTkyLCAtMzI3NjgsIDAsIDMyNzY3LCAtMzI3Njh9OwotICAgIGludDE2X3Qgb3V0cHV0WzIwXTsKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTnVtU2FtcGxlcyA9IDg7CisgICAgc3RkOjphcnJheTxpbnQxNl90LCBrTnVtU2FtcGxlcyArIDEwPiBvdXRwdXQ7IC8vIGxhcmdlciB0aGFuIGlucHV0CisKICAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKICAgICBTaW5rSTE2IHNpbmtJMTZ7MX07CiAKLSAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKGlucHV0WzBdKTsKLSAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShrSW5wdXRGbG9hdC5kYXRhKCksIGtOdW1TYW1wbGVzKTsKICAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmc2lua0kxNi5pbnB1dCk7CiAKLSAgICBpbnQgbnVtT3V0cHV0RnJhbWVzID0gc2l6ZW9mKG91dHB1dCkgLyBzaXplb2YoaW50MTZfdCk7Ci0gICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kxNi5yZWFkKG91dHB1dCwgbnVtT3V0cHV0RnJhbWVzKTsKLSAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIG91dHB1dC5maWxsKDc3Nyk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kxNi5yZWFkKG91dHB1dC5kYXRhKCksIG91dHB1dC5zaXplKCkpOworICAgIEFTU0VSVF9FUShrTnVtU2FtcGxlcywgbnVtUmVhZCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKLSAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0pOworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkSTE2LmF0KGkpLCBvdXRwdXQuYXQoaSkpIDw8ICIsIGkgPSAiIDw8IGk7CisgICAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGTE9BVCB0byBJMzIgPT09PT09PT09PT09PT0KKy8vIFNpbXBsZSB0ZXN0IHRoYXQgdHJpZXMgdG8gcmVwcm9kdWNlIGEgQ2xhbmcgY29tcGlsZXIgYnVnLgorX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorc3RhdGljIGludDMyX3QgY2xhbXAzMkZyb21GbG9hdChmbG9hdCBmKQoreworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IChmbG9hdCkoMVVMIDw8IDMxKTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbGltcG9zID0gMS47CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGxpbW5lZyA9IC0xLjsKKworICAgIGlmIChmIDw9IGxpbW5lZykgeworICAgICAgICByZXR1cm4gSU5UMzJfTUlOOworICAgIH0gZWxzZSBpZiAoZiA+PSBsaW1wb3MpIHsKKyAgICAgICAgcmV0dXJuIElOVDMyX01BWDsKKyAgICB9CisgICAgZiAqPSBzY2FsZTsKKyAgICAvKiBpbnRlZ2VyIGNvbnZlcnNpb24gaXMgdGhyb3VnaCB0cnVuY2F0aW9uICh0aG91Z2ggaW50IHRvIGZsb2F0IGlzIG5vdCkuCisgICAgICogZW5zdXJlIHRoYXQgd2Ugcm91bmQgdG8gbmVhcmVzdCwgdGllcyBhd2F5IGZyb20gMC4KKyAgICAgKi8KKyAgICByZXR1cm4gZiA+IDAgPyBmICsgMC41IDogZiAtIDAuNTsKK30KKwordm9pZCBsb2NhbF9jb252ZXJ0X2Zsb2F0X3RvX2ludDMyKGNvbnN0IGZsb2F0ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICpvdXRwdXQrKyA9IGNsYW1wMzJGcm9tRmxvYXQoKmlucHV0KyspOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgc2ltcGxlX2NvbnZlcnRfZmxvYXRfaW50MzIpIHsKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIGtOdW1TYW1wbGVzPiBvdXRwdXQ7CisKKyAgICAvLyBEbyBpdCBpbmxpbmUsIHdoaWNoIHdpbGwgcHJvYmFibHkgd29yayBldmVuIHdpdGggYSBidWdneSBjb21waWxlci4KKyAgICAvLyBUaGlzIHZhbGlkYXRlcyB0aGUgZXhwZWN0ZWQgZGF0YS4KKyAgICBjb25zdCBmbG9hdCAqaW4gPSBrSW5wdXRGbG9hdC5kYXRhKCk7CisgICAgb3V0cHV0LmZpbGwoNzc3KTsKKyAgICBpbnQzMl90ICpvdXQgPSBvdXRwdXQuZGF0YSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7IGkrKykgeworICAgICAgICBpbnQ2NF90IG4gPSAoaW50NjRfdCkgKCppbisrICogMjE0NzQ4MzY0OC4wZik7CisgICAgICAgICpvdXQrKyA9IChpbnQzMl90KXN0ZDo6bWluKChpbnQ2NF90KUlOVDMyX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoKGludDY0X3QpSU5UMzJfTUlOLCBuKSk7IC8vIGNsaXAKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRJMzIuYXQoaSksIG91dHB1dC5hdChpKSkgPDwgIiwgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIGxvY2FsX2NvbnZlcnRfZmxvYXRfaW50MzIpIHsKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIGtOdW1TYW1wbGVzPiBvdXRwdXQ7CisgICAgLy8gQ29udmVydCBhdWRpbyBzaWduYWwgdXNpbmcgdGhlIGZ1bmN0aW9uLgorICAgIG91dHB1dC5maWxsKDc3Nyk7CisgICAgbG9jYWxfY29udmVydF9mbG9hdF90b19pbnQzMihrSW5wdXRGbG9hdC5kYXRhKCksIG91dHB1dC5kYXRhKCksIGtOdW1TYW1wbGVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEkzMi5hdChpKSwgb3V0cHV0LmF0KGkpKSA8PCAiLCBpID0gIiA8PCBpOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3NpbmtpMzIpIHsKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIGtOdW1TYW1wbGVzICsgMTA+IG91dHB1dDsgLy8gbGFyZ2VyIHRoYW4gaW5wdXQKKworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIFNpbmtJMzIgc2lua0kzMnsxfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoa0lucHV0RmxvYXQuZGF0YSgpLCBrTnVtU2FtcGxlcyk7CisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMzIuaW5wdXQpOworCisgICAgb3V0cHV0LmZpbGwoNzc3KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTMyLnJlYWQob3V0cHV0LmRhdGEoKSwgb3V0cHV0LnNpemUoKSk7CisgICAgQVNTRVJUX0VRKGtOdW1TYW1wbGVzLCBudW1SZWFkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkSTMyLmF0KGkpLCBvdXRwdXQuYXQoaSkpIDw8ICIsIGkgPSAiIDw8IGk7CiAgICAgfQogfQogCkBAIC03NiwzMSArMjA1LDQwIEBACiB9CiAKIFRFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9yYW1wX2xpbmVhcikgeworICAgIGNvbnN0ZXhwciBpbnQgc2luZ2xlTnVtT3V0cHV0ID0gMTsKICAgICBjb25zdGV4cHIgaW50IHJhbXBTaXplID0gNTsKICAgICBjb25zdGV4cHIgaW50IG51bU91dHB1dCA9IDEwMDsKICAgICBjb25zdGV4cHIgZmxvYXQgdmFsdWUgPSAxLjBmOwotICAgIGNvbnN0ZXhwciBmbG9hdCB0YXJnZXQgPSAxMDAuMGY7CisgICAgY29uc3RleHByIGZsb2F0IGluaXRpYWxUYXJnZXQgPSAxMC4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgZmluYWxUYXJnZXQgPSAxMDAuMGY7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMWY7IC8vIGFyYml0cmFyeQogICAgIGZsb2F0IG91dHB1dFtudW1PdXRwdXRdID0ge307CiAgICAgUmFtcExpbmVhciByYW1wTGluZWFyezF9OwogICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7MX07CiAKICAgICByYW1wTGluZWFyLmlucHV0LnNldFZhbHVlKHZhbHVlKTsKICAgICByYW1wTGluZWFyLnNldExlbmd0aEluRnJhbWVzKHJhbXBTaXplKTsKLSAgICByYW1wTGluZWFyLnNldFRhcmdldCh0YXJnZXQpOwotICAgIHJhbXBMaW5lYXIuZm9yY2VDdXJyZW50KDAuMGYpOwotCiAgICAgcmFtcExpbmVhci5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKIAorICAgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlcyBnbyB0byB0aGUgaW5pdGlhbCB0YXJnZXQgaW5zdGFudGx5LgorICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KGluaXRpYWxUYXJnZXQpOworICAgIGludDMyX3Qgc2luZ2xlTnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgc2luZ2xlTnVtT3V0cHV0KTsKKyAgICBBU1NFUlRfRVEoc2luZ2xlTnVtUmVhZCwgc2luZ2xlTnVtT3V0cHV0KTsKKyAgICBFWFBFQ1RfTkVBUih2YWx1ZSAqIGluaXRpYWxUYXJnZXQsIG91dHB1dFswXSwgdG9sZXJhbmNlKTsKKworICAgIC8vIE5vdyBzZXQgdGFyZ2V0IGFuZCBjaGVjayB0aGF0IHRoZSBsaW5lYXIgcmFtcCB3b3JrcyBhcyBleHBlY3RlZC4KKyAgICByYW1wTGluZWFyLnNldFRhcmdldChmaW5hbFRhcmdldCk7CiAgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXQpOworICAgIGNvbnN0IGZsb2F0IGluY3JlbWVudFNpemUgPSAoZmluYWxUYXJnZXQgLSBpbml0aWFsVGFyZ2V0KSAvIHJhbXBTaXplOwogICAgIEFTU0VSVF9FUShudW1PdXRwdXQsIG51bVJlYWQpOwotICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKKwogICAgIGludCBpID0gMDsKICAgICBmb3IgKDsgaSA8IHJhbXBTaXplOyBpKyspIHsKLSAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSBpICogdmFsdWUgKiB0YXJnZXQgLyByYW1wU2l6ZTsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIChpbml0aWFsVGFyZ2V0ICsgaSAqIGluY3JlbWVudFNpemUpOwogICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOwogICAgIH0KICAgICBmb3IgKDsgaSA8IG51bU91dHB1dDsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IGV4cGVjdGVkID0gdmFsdWUgKiB0YXJnZXQ7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gdmFsdWUgKiBmaW5hbFRhcmdldDsKICAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKICAgICB9CiB9CkBAIC0xNTUsMyArMjkzLDI5IEBACiAgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CiAgICAgfQogfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfbW9ub19ibGVuZCkgeworICAgIC8vIFR3byBjaGFubmVsIHRvIHR3byBjaGFubmVsIHdpdGggMyBpbnB1dHMgYW5kIG91dHB1dHMuCisgICAgY29uc3RleHByIGludCBudW1DaGFubmVscyA9IDI7CisgICAgY29uc3RleHByIGludCBudW1GcmFtZXMgPSAzOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7LTAuNywgMC41LCAtMC4yNSwgMS4yNSwgMTAwMCwgMjAwMH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGV4cGVjdGVkW10gPSB7LTAuMSwgLTAuMSwgMC41LCAwLjUsIDE1MDAsIDE1MDB9OworICAgIGZsb2F0IG91dHB1dFsxMDBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0e251bUNoYW5uZWxzfTsKKyAgICBNb25vQmxlbmQgbW9ub0JsZW5ke251bUNoYW5uZWxzfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0e251bUNoYW5uZWxzfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUZyYW1lcyk7CisKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmbW9ub0JsZW5kLmlucHV0KTsKKyAgICBtb25vQmxlbmQub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bUZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bVJlYWQsIG51bUZyYW1lcyk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X21vbm90b25pY19jb3VudGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X21vbm90b25pY19jb3VudGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JiYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbW9ub3RvbmljX2NvdW50ZXIuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUZXN0IE1vbm90b25pY0NvdW50ZXIKKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAidXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgiCisKK1RFU1QodGVzdF9tb25vdG9uaWNfY291bnRlciwgYnVpbHRpbl93cmFwKSB7CisgICAgaW50MzJfdCB4ID0gMHg3RkZGRkZGMDsKKyAgICBpbnQzMl90IHkgPSAweDgwMDAwMDEwOworICAgIGludDMyX3QgZGVsdGE7CisgICAgLy8gZGVsdGEgPSB5IC0geDsgLy8gVGhpcyB3b3VsZCBjYXVzZSBhIG51bWVyaWMgb3ZlcmZsb3chCisgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyh5LCB4LCAmZGVsdGEpOworICAgIEFTU0VSVF9FUSgweDIwLCBkZWx0YSk7Cit9CisKKy8vIHRlc3QgdXBkYXRpbmcgcGFzdCBzb21lIG92ZXJmbG93IHBvaW50cworVEVTVCh0ZXN0X21vbm90b25pY19jb3VudGVyLCBtb25vX2NvdW50ZXJfdXBkYXRlMzJfd3JhcCkgeworICAgIE1vbm90b25pY0NvdW50ZXIgY291bnRlcjsKKyAgICBBU1NFUlRfRVEoMCwgY291bnRlci5nZXQoKSk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHggPSAodWludDMyX3QpIDB4N0ZGRkZGRjA7CisgICAgY291bnRlci51cGRhdGUzMih4KTsKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMHg3RkZGRkZGMCwgY291bnRlci5nZXQoKSk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHkgPSAodWludDMyX3QpIDB4ODAwMDAwMTA7CisgICAgY291bnRlci51cGRhdGUzMih5KTsKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMHg4MDAwMDAxMCwgY291bnRlci5nZXQoKSk7CisKKyAgICBjb3VudGVyLnVwZGF0ZTMyKDApOworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkweDEwMDAwMDAwMCwgY291bnRlci5nZXQoKSk7Cit9CisKK1RFU1QodGVzdF9tb25vdG9uaWNfY291bnRlciwgbW9ub19jb3VudGVyX3JvdW5kdXApIHsKKyAgICBNb25vdG9uaWNDb3VudGVyIGNvdW50ZXI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCB4ID0gMjM0NTsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKHgpOworICAgIEFTU0VSVF9FUSgoaW50NjRfdCl4LCBjb3VudGVyLmdldCgpKTsKKworICAgIGNvdW50ZXIucm91bmRVcDY0KDEwMCk7CisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTI0MDAsIGNvdW50ZXIuZ2V0KCkpOworfQorCitURVNUKHRlc3RfbW9ub3RvbmljX2NvdW50ZXIsIG1vbm9fY291bnRlcl9jYXRjaHVwKSB7CisgICAgTW9ub3RvbmljQ291bnRlciBjb3VudGVyOworICAgIGNvdW50ZXIudXBkYXRlMzIoNzY1NCk7CisgICAgY291bnRlci5jYXRjaFVwVG8oNTAwMCk7IC8vIGFscmVhZHkgcGFzdCA1MDAwIHNvIG5vIGNoYW5nZQorICAgIEFTU0VSVF9FUSgoaW50NjRfdCk3NjU0LCBjb3VudGVyLmdldCgpKTsKKyAgICBjb3VudGVyLmNhdGNoVXBUbyg5ODc2KTsgLy8ganVtcHMKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpOTg3NiwgY291bnRlci5nZXQoKSk7Cit9CisKK1RFU1QodGVzdF9tb25vdG9uaWNfY291bnRlciwgbW9ub19jb3VudGVyX2luY3JlbWVudCkgeworICAgIE1vbm90b25pY0NvdW50ZXIgY291bnRlcjsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKDEwMDApOworICAgIGNvdW50ZXIuaW5jcmVtZW50KC0yMzQpOyAvLyB3aWxsIG5vdCBnbyBiYWNrd2FyZHMKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMTAwMCwgY291bnRlci5nZXQoKSk7CisgICAgY291bnRlci5pbmNyZW1lbnQoOTYpOyAvLyBhZHZhbmNlcworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkxMDk2LCBjb3VudGVyLmdldCgpKTsKK30KKworVEVTVCh0ZXN0X21vbm90b25pY19jb3VudGVyLCBtb25vX2NvdW50ZXJfcmVzZXQpIHsKKyAgICBNb25vdG9uaWNDb3VudGVyIGNvdW50ZXI7CisgICAgY291bnRlci51cGRhdGUzMigxMDAwKTsKKyAgICAvLyBDb3VudGVyIGlzIG1vbm90b25pYyBhbmQgc2hvdWxkIG5vdCBnbyBiYWNrd2FyZHMuCisgICAgY291bnRlci51cGRhdGUzMig1MDApOyAvLyBObyBjaGFuZ2UgYmVjYXVzZSAzMi1iaXQgY291bnRlciBpcyBhbHJlYWR5IHBhc3QgMTAwMC4KKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMTAwMCwgY291bnRlci5nZXQoKSk7CisKKyAgICBjb3VudGVyLnJlc2V0MzIoKTsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKDUwMCk7CisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTE1MDAsIGNvdW50ZXIuZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RlYWxfZXhjbHVzaXZlLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0ZWFsX2V4Y2x1c2l2ZS5jcHAKaW5kZXggMDVjNTYwZC4uY2E0ZjNkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RlYWxfZXhjbHVzaXZlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdGVhbF9leGNsdXNpdmUuY3BwCkBAIC0xMTAsNyArMTEwLDExIEBACiAgICAgICAgIG1PcGVuRGVsYXlNaWxsaXMgPSBvcGVuRGVsYXlNaWxsaXM7CiAgICAgfQogCi0gICAgdm9pZCByZXN0YXJ0U3RyZWFtKCkgeworICAgIHZvaWQgc2V0Q2xvc2VFbmFibGVkKGJvb2wgZW5hYmxlZCkgeworICAgICAgICBtQ2xvc2VFbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdGFydFN0cmVhbSgpIHsKICAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gbU1heFJldHJpZXM7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CiAgICAgICAgIGRvIHsKQEAgLTEyNiw2ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICBtTmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfSB3aGlsZSAocmV0cmllc0xlZnQtLSA+IDAgJiYgcmVzdWx0ICE9IEFBVURJT19PSyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3Qgb25BdWRpb1JlYWR5KApAQCAtMTg5LDEwICsxOTQsMTIgQEAKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgICAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fY2xvc2UobVN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlIHJldHVybmVkICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgICAgIGlmIChtQ2xvc2VFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKG1TdHJlYW0pOworICAgICAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlKCkgcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fY2xvc2UoKSBESVNBQkxFRCFcbiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0cmVhbSA9IG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTIzMiw2ICsyMzksMTIgQEAKICAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQobVN0cmVhbSk7CiAgICAgfQogCisgICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RyZWFtID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShtU3RyZWFtKTsKKyAgICB9CisKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcCgpIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgICAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gMDsKQEAgLTI4Nyw2ICszMDAsNyBAQAogICAgIHN0ZDo6c3RyaW5nICAgICAgICAgbU5hbWU7CiAgICAgaW50ICAgICAgICAgICAgICAgICBtTWF4UmV0cmllcyA9IDE7CiAgICAgaW50ICAgICAgICAgICAgICAgICBtT3BlbkRlbGF5TWlsbGlzID0gMDsKKyAgICBib29sICAgICAgICAgICAgICAgIG1DbG9zZUVuYWJsZWQgPSB0cnVlOwogfTsKIAogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KQEAgLTMxOSwxMSArMzMzLDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkIHNfdXNhZ2UoKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0X3N0ZWFsX2V4Y2x1c2l2ZSBbLWldIFstcnttYXhSZXRyaWVzfV0gWy1ke2RlbGF5fV0gLXNcbiIpOworICAgIHByaW50ZigidGVzdF9zdGVhbF9leGNsdXNpdmUgWy1pXSBbLXJ7bWF4UmV0cmllc31dIFstZHtkZWxheX1dIFstcHtwYXVzZWRUaW1lfV0tcyAtY3tmbGFnfVxuIik7CiAgICAgcHJpbnRmKCIgICAgIC1pIGRpcmVjdGlvbiBJTlBVVCwgb3RoZXJ3aXNlIE9VVFBVVFxuIik7Ci0gICAgcHJpbnRmKCIgICAgIC1kIGRlbGF5IG9wZW4gYnkgbWlsbGlzZWNvbmRzLCBkZWZhdWx0ID0gMFxuIik7Ci0gICAgcHJpbnRmKCIgICAgIC1yIG1heCByZXRyaWVzIGluIHRoZSBlcnJvciBjYWxsYmFjaywgZGVmYXVsdCA9IDFcbiIpOworICAgIHByaW50ZigiICAgICAtZCBEZWxheSBvcGVuIGJ5IG1pbGxpc2Vjb25kcywgZGVmYXVsdCA9IDBcbiIpOworICAgIHByaW50ZigiICAgICAtcCBQYXVzZSBmaXJzdCBzdHJlYW0gdGhlbiBzbGVlcCBmb3IgbXNlYyBiZWZvcmUgb3BlbmluZyBzZWNvbmQgc3RyZWFtcywgZGVmYXVsdCA9IDBcbiIpOworICAgIHByaW50ZigiICAgICAtciBtYXggUmV0cmllcyBpbiB0aGUgZXJyb3IgY2FsbGJhY2ssIGRlZmF1bHQgPSAxXG4iKTsKICAgICBwcmludGYoIiAgICAgLXMgdHJ5IHRvIG9wZW4gaW4gU0hBUkVEIG1vZGVcbiIpOworICAgIHByaW50ZigiICAgICAtYyBlbmFibGUgb3IgZGlzYWJsaW5nIENsb3Npbmcgb2YgdGhlIHN0cmVhbSB3aXRoIDAvMSwgZGVmYXVsdCA9IDFcbiIpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KSB7CkBAIC0zMzQsNyArMzUwLDkgQEAKICAgICBpbnQgZXJyb3JDb3VudCA9IDA7CiAgICAgaW50IG1heFJldHJpZXMgPSAxOwogICAgIGludCBvcGVuRGVsYXlNaWxsaXMgPSAwOworICAgIGJvb2wgY2xvc2VFbmFibGVkID0gdHJ1ZTsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICBpbnQgcGF1c2VkTWlsbGlzID0gMDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgpAQCAtMzQ4LDEyICszNjYsMTggQEAKICAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKICAgICAgICAgICAgIGNoYXIgb3B0aW9uID0gYXJnWzFdOwogICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VFbmFibGVkID0gYXRvaSgmYXJnWzJdKSAhPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICAgb3BlbkRlbGF5TWlsbGlzID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgICAgICBwYXVzZWRNaWxsaXMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgICAgICAgICAgbWF4UmV0cmllcyA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzc2LDYgKzQwMCw4IEBACiAgICAgdGhpZWYuc2V0T3BlbkRlbGF5TWlsbGlzKG9wZW5EZWxheU1pbGxpcyk7CiAgICAgdmljdGltLnNldE1heFJldHJpZXMobWF4UmV0cmllcyk7CiAgICAgdGhpZWYuc2V0TWF4UmV0cmllcyhtYXhSZXRyaWVzKTsKKyAgICB2aWN0aW0uc2V0Q2xvc2VFbmFibGVkKGNsb3NlRW5hYmxlZCk7CisgICAgdGhpZWYuc2V0Q2xvc2VFbmFibGVkKGNsb3NlRW5hYmxlZCk7CiAKICAgICByZXN1bHQgPSB2aWN0aW0ub3BlbkF1ZGlvU3RyZWFtKGRpcmVjdGlvbiwgcmVxdWVzdGVkU2hhcmluZ01vZGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC00MTQsNiArNDQwLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocGF1c2VkTWlsbGlzID4gMCkgeworICAgICAgICBwcmludGYoIlBhdXNpbmcgdGhlIFZJQ1RJTSBmb3IgJWQgbWlsbGlzIGJlZm9yZSBzdGFydGluZyBUSElFRiAtLS0tLVxuIiwgcGF1c2VkTWlsbGlzKTsKKyAgICAgICAgdmljdGltLnBhdXNlKCk7CisgICAgICAgIHVzbGVlcChwYXVzZWRNaWxsaXMgKiAxMDAwKTsKKyAgICB9CisKICAgICBwcmludGYoIlRyeWluZyB0byBzdGFydCB0aGUgVEhJRUYgc3RyZWFtLCB3aGljaCBtYXkgc3RlYWwgdGhlIFZJQ1RJTSBNTUFQIHJlc291cmNlIC0tLS0tXG4iKTsKICAgICByZXN1bHQgPSB0aGllZi5vcGVuQXVkaW9TdHJlYW0oZGlyZWN0aW9uLCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTQyOSw2ICs0NjEsMjUgQEAKICAgICAgICAgZXJyb3JDb3VudCsrOwogICAgIH0KIAorICAgIGlmIChwYXVzZWRNaWxsaXMgPiAwKSB7CisgICAgICAgIHJlc3VsdCA9IHZpY3RpbS5zdGFydCgpOworICAgICAgICBwcmludGYoIlJlc3RhcnRpbmcgVklDVElNLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KFZJQ1RJTSkgcmV0dXJuZWQgJWQgIgorICAgICAgICAgICAgICAgIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBkaXNjb25uZWN0ZWQgZHVlIHRvIHRoaWVmIHN0ZWFsIHRoZSByZXNvdXJjZQorICAgICAgICAgICAgcHJpbnRmKCJWSUNUSU0gd2FzIGRpc2Nvbm5lY3RlZCB3aGlsZSBoYW5naW5nIGFzIHRoZSBUSElFRiAiCisgICAgICAgICAgICAgICAgICAgInN0b2xlIHRoZSByZXNvdXJjZSA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHZpY3RpbS5yZXN0YXJ0U3RyZWFtKCk7CisgICAgICAgICAgICBwcmludGYoIlJlc3RhcnRpbmcgVklDVElNLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KFZJQ1RJTSkgcmV0dXJuZWQgJWQgIgorICAgICAgICAgICAgICAgICAgICI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBHaXZlIHN0cmVhbSB0aW1lIHRvIGFkdmFuY2UuCiAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKIApAQCAtNDQyLDcgKzQ5Myw3IEBACiAgICAgfQogCiAgICAgTE9HSSgiQm90aCBzdHJlYW1zIHJ1bm5pbmcuIEFzayB1c2VyIHRvIHBsdWcgaW4gaGVhZHNldC4gPT09PSIpOwotICAgIHByaW50ZigiXG49PT09XG5QbGVhc2UgUExVRyBJTiBBIEhFQURTRVQgbm93IVxuPT09PVxuXG4iKTsKKyAgICBwcmludGYoIlxuPT09PVxuUGxlYXNlIFBMVUcgSU4gQSBIRUFEU0VUIG5vdyEgLSBPUFRJT05BTFxuPT09PVxuXG4iKTsKIAogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIGNvbnN0IGludCB3YXRjaExvb3BzID0gRFVFVF9EVVJBVElPTl9NU0VDIC8gU0xFRVBfRFVSQVRJT05fTVNFQzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdmFyaW91cy5jcHAKaW5kZXggY2JmODYzZi4uYjY4ZmM3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdmFyaW91cy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdmFyaW91cy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZy4KIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IE5vb3BEYXRhQ2FsbGJhY2tQcm9jKApAQCAtNTEsNiArNTIsNyBAQAogfQogCiBjb25zdGV4cHIgaW50NjRfdCBOQU5PU19QRVJfTUlMTElTRUNPTkQgPSAxMDAwICogMTAwMDsKK2NvbnN0ZXhwciBpbnQ2NF90IE1JQ1JPU19QRVJfTUlMTElTRUNPTkQgPSAxMDAwOwogCiB2b2lkIGNoZWNrUmVsZWFzZVRoZW5DbG9zZShhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlLAogICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCkBAIC03NjIsNiArNzY0LDU4IEBACiAgICAgY2hlY2tDYWxsYmFja09uY2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOwogfQogCit2b2lkIHdhaXRGb3JTdGF0ZUNoYW5nZVRvQ2xvc2luZ29yQ2xvc2VkKEFBdWRpb1N0cmVhbSAqKnN0cmVhbSwgc3RkOjphdG9taWM8Ym9vbD4qIGlzUmVhZHkpCit7CisgICAgKmlzUmVhZHkgPSB0cnVlOworICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTjsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKCpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwICogTkFOT1NfUEVSX01JTExJU0VDT05EKSk7CisgICAgaWYgKChzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcpICYmIChzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkpeworICAgICAgICBGQUlMKCkgPDwgIkVSUk9SIC0gU3RhdGUgbm90IGNsb3Npbmcgb3IgY2xvc2VkLiBDdXJyZW50IHN0YXRlOiAiIDw8CisgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSk7CisgICAgfQorfQorCit2b2lkIHRlc3RXYWl0Rm9yU3RhdGVDaGFuZ2VDbG9zZShhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKworICAgIC8vIFZlcmlmeSBPcGVuIFN0YXRlCisgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOOworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOLCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogTkFOT1NfUEVSX01JTExJU0VDT05EKSk7CisgICAgRVhQRUNUX0VRKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwgc3RhdGUpOworCisgICAgc3RkOjphdG9taWM8Ym9vbD4gaXNXYWl0VGhyZWFkUmVhZHl7ZmFsc2V9OworCisgICAgLy8gU3Bhd24gYSBuZXcgdGhyZWFkIHRvIHdhaXQgZm9yIHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICBzdGQ6OnRocmVhZCB3YWl0VGhyZWFkICh3YWl0Rm9yU3RhdGVDaGFuZ2VUb0Nsb3NpbmdvckNsb3NlZCwgJmFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNXYWl0VGhyZWFkUmVhZHkpOworCisgICAgLy8gV2FpdCBmb3Igd29ya2VyIHRocmVhZCB0byBiZSByZWFkeQorICAgIHdoaWxlICghaXNXYWl0VGhyZWFkUmVhZHkpIHsKKyAgICAgICAgdXNsZWVwKE1JQ1JPU19QRVJfTUlMTElTRUNPTkQpOworICAgIH0KKyAgICAvLyBTbGVlcCBhbiBhZGRpdGlvbmFsIG1pbGxpc2Vjb25kIHRvIG1ha2Ugc3VyZSB3YWl0Rm9yQXVkaW9UaHJlYWQgaXMgY2FsbGVkCisgICAgdXNsZWVwKE1JQ1JPU19QRVJfTUlMTElTRUNPTkQpOworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKKyAgICB3YWl0VGhyZWFkLmpvaW4oKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIHdhaXRfZm9yX3N0YXRlX2NoYW5nZV9jbG9zZV9ub25lKSB7CisgICAgdGVzdFdhaXRGb3JTdGF0ZUNoYW5nZUNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgd2FpdF9mb3Jfc3RhdGVfY2hhbmdlX2Nsb3NlX2xvd2xhdCkgeworICAgIHRlc3RXYWl0Rm9yU3RhdGVDaGFuZ2VDbG9zZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CisKIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogc3RydWN0IFdha2VVcENhbGxiYWNrRGF0YSB7CiAgICAgdm9pZCB3YWtlT3RoZXIoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAKaW5kZXggMzIxZTdmOS4uMTE3MjRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQWlkbENvbnZlcnNpb24uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FpZGxDb252ZXJzaW9uLmNwcApAQCAtMTQsNiArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2RlZmluZSBMT0dfVEFHICJBaWRsQ29udmVyc2lvbiIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTIxLDYgKzI2LDcgQEAKICNpbmNsdWRlICJtZWRpYS9BaWRsQ29udmVyc2lvbi5oIgogCiAjaW5jbHVkZSA8bWVkaWEvU2htZW1Db21wYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBVdGlsaXRpZXMKQEAgLTI4LDYgKzM0LDQwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIGJhc2U6OnVuZXhwZWN0ZWQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnQmFzZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbnRlbnRUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXRUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW5Db25maWc7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0lucHV0RmxhZ3M7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Jb0ZsYWdzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb09mZmxvYWRJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT3V0cHV0RmxhZ3M7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydEV4dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdGFuZGFyZDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OlBjbVR5cGU7CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTIxOSw3NSArMjU5LDcgQEAKICAgICByZXR1cm4gc3RkOjpzdHJpbmcobGVnYWN5LmNfc3RyKCkpOwogfQogCi0vLyBUaGUgbGVnYWN5IGVudW0gaXMgdW5uYW1lZC4gVGh1cywgd2UgdXNlIGludDMyX3QuCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1R5cGVfaW50MzJfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGUgYWlkbCkgewotICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpTQU1QTEVfUkFURToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Q0hBTk5FTF9NQVNLOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Rk9STUFUOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6R0FJTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19HQUlOOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGTEFHUzoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKLSAgICB9Ci0gICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKLX0KLQotLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQzMl90LgotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4gbGVnYWN5MmFpZGxfaW50MzJfdF9BdWRpb1BvcnRDb25maWdUeXBlKAotICAgICAgICBpbnQzMl90IGxlZ2FjeSkgewotICAgIHN3aXRjaCAobGVnYWN5KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OlNBTVBMRV9SQVRFOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Q0hBTk5FTF9NQVNLOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Rk9STUFUOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0dBSU46Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkdBSU47Ci0gICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfRkxBR1M6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZMQUdTOwotICAgIH0KLSAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PHVuc2lnbmVkIGludD4gYWlkbDJsZWdhY3lfaW50MzJfdF9jb25maWdfbWFzayhpbnQzMl90IGFpZGwpIHsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8dW5zaWduZWQgaW50LCBpbnQzMl90LCBpbnQsIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPigKLSAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1R5cGVfaW50MzJfdCwKLSAgICAgICAgICAgIC8vIEF1ZGlvUG9ydENvbmZpZ1R5cGUgZW51bSBpcyBpbmRleC1iYXNlZC4KLSAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPiwKLSAgICAgICAgICAgIC8vIEFVRElPX1BPUlRfQ09ORklHXyogZmxhZ3MgYXJlIG1hc2stYmFzZWQuCi0gICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8dW5zaWduZWQgaW50LCBpbnQ+KTsKLX0KLQotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KHVuc2lnbmVkIGludCBsZWdhY3kpIHsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgdW5zaWduZWQgaW50LCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZSwgaW50PigKLSAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfaW50MzJfdF9BdWRpb1BvcnRDb25maWdUeXBlLAotICAgICAgICAgICAgLy8gQVVESU9fUE9SVF9DT05GSUdfKiBmbGFncyBhcmUgbWFzay1iYXNlZC4KLSAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8dW5zaWduZWQ+LAotICAgICAgICAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnVHlwZSBlbnVtIGlzIGluZGV4LWJhc2VkLgotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4pOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGludDMyX3QgYWlkbCkgewotICAgIC8vIFRPRE8oeXRhaSk6IHNob3VsZCB3ZSBjb252ZXJ0IGJpdC1ieS1iaXQ/Ci0gICAgLy8gT25lIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSByZXByZXNlbnRhdGlvbiBpcyBib3RoIG9wYXF1ZSBhbmQgaXMgZGlmZmVyZW50IGJhc2VkIG9uIHRoZQotICAgIC8vIGNvbnRleHQgKGlucHV0IHZzLiBvdXRwdXQpLiBDYW4gZGV0ZXJtaW5lIGJhc2VkIG9uIHR5cGUgYW5kIHJvbGUsIGFzIHBlciB1c2VJbkNoYW5uZWxNYXNrKCkuCi0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19jaGFubmVsX21hc2tfdD4oYWlkbCk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3kpIHsKLSAgICAvLyBUT0RPKHl0YWkpOiBzaG91bGQgd2UgY29udmVydCBiaXQtYnktYml0PwotICAgIC8vIE9uZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVwcmVzZW50YXRpb24gaXMgYm90aCBvcGFxdWUgYW5kIGlzIGRpZmZlcmVudCBiYXNlZCBvbiB0aGUKLSAgICAvLyBjb250ZXh0IChpbnB1dCB2cy4gb3V0cHV0KS4gQ2FuIGRldGVybWluZSBiYXNlZCBvbiB0eXBlIGFuZCByb2xlLCBhcyBwZXIgdXNlSW5DaGFubmVsTWFzaygpLgotICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5KTsKLX0KLQotQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19jb25maWdfZXZlbnQ+IGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnQoCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50X3QoCiAgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9SRUdJU1RFUkVEOgpAQCAtMzEyLDggKzI4NCw4IEBACiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KAotICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgbGVnYWN5KSB7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90X0F1ZGlvSW9Db25maWdFdmVudCgKKyAgICAgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKICAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfUkVHSVNURVJFRDsKQEAgLTM5Myw4MSArMzY1LDEwMjkgQEAKICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCgKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGFpZGwpIHsKLSAgICAvLyBUaGlzIHJlbGllcyBvbiBBdWRpb0Zvcm1hdCBiZWluZyBrZXB0IGluIHN5bmMgd2l0aCBhdWRpb19mb3JtYXRfdC4KLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQpID09IHNpemVvZihhdWRpb19mb3JtYXRfdCkpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oYWlkbCk7CituYW1lc3BhY2UgeworCituYW1lc3BhY2UgZGV0YWlsIHsKK3VzaW5nIEF1ZGlvQ2hhbm5lbEJpdFBhaXIgPSBzdGQ6OnBhaXI8YXVkaW9fY2hhbm5lbF9tYXNrX3QsIGludD47Cit1c2luZyBBdWRpb0NoYW5uZWxCaXRQYWlycyA9IHN0ZDo6dmVjdG9yPEF1ZGlvQ2hhbm5lbEJpdFBhaXI+OwordXNpbmcgQXVkaW9DaGFubmVsUGFpciA9IHN0ZDo6cGFpcjxhdWRpb19jaGFubmVsX21hc2tfdCwgQXVkaW9DaGFubmVsTGF5b3V0PjsKK3VzaW5nIEF1ZGlvQ2hhbm5lbFBhaXJzID0gc3RkOjp2ZWN0b3I8QXVkaW9DaGFubmVsUGFpcj47Cit1c2luZyBBdWRpb0RldmljZVBhaXIgPSBzdGQ6OnBhaXI8YXVkaW9fZGV2aWNlc190LCBBdWRpb0RldmljZURlc2NyaXB0aW9uPjsKK3VzaW5nIEF1ZGlvRGV2aWNlUGFpcnMgPSBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZVBhaXI+OwordXNpbmcgQXVkaW9Gb3JtYXRQYWlyID0gc3RkOjpwYWlyPGF1ZGlvX2Zvcm1hdF90LCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPjsKK3VzaW5nIEF1ZGlvRm9ybWF0UGFpcnMgPSBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdFBhaXI+OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoCitjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbEJpdFBhaXJzJiBnZXRJbkF1ZGlvQ2hhbm5lbEJpdHMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsQml0UGFpcnMgcGFpcnMgPSB7CisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9MRUZULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfTEVGVCB9LAorICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fUklHSFQsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9GUk9OVF9SSUdIVCB9LAorICAgICAgICAvLyBBVURJT19DSEFOTkVMX0lOX0ZST05UIGlzIGF0IHRoZSBlbmQKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0JBQ0ssIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9CQUNLX0NFTlRFUiB9LAorICAgICAgICAvLyBBVURJT19DSEFOTkVMX0lOXypfUFJPQ0VTU0VEIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl9QUkVTU1VSRSBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfSU5fKl9BWElTIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV8qIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0JBQ0tfTEVGVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0JBQ0tfTEVGVCB9LAorICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fQkFDS19SSUdIVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0JBQ0tfUklHSFQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0NFTlRFUiwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0ZST05UX0NFTlRFUiB9LAorICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fTE9XX0ZSRVFVRU5DWSwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0xPV19GUkVRVUVOQ1kgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfVE9QX1NJREVfTEVGVCB9LAorICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fVE9QX1JJR0hULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfVE9QX1NJREVfUklHSFQgfSwKKyAgICAgICAgLy8gV2hlbiBnb2luZyBmcm9tIGFpZGwgdG8gbGVnYWN5LCBJTl9DRU5URVIgaXMgdXNlZAorICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fRlJPTlQsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9GUk9OVF9DRU5URVIgfQorICAgIH07CisgICAgcmV0dXJuIHBhaXJzOworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbFBhaXJzJiBnZXRJbkF1ZGlvQ2hhbm5lbFBhaXJzKCkgeworICAgIHN0YXRpYyBjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbFBhaXJzIHBhaXJzID0geworI2RlZmluZSBERUZJTkVfSU5QVVRfTEFZT1VUKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8jI24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6bGF5b3V0TWFzaz4oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6TEFZT1VUXyMjbikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVChNT05PKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVChTVEVSRU8pLAorICAgICAgICBERUZJTkVfSU5QVVRfTEFZT1VUKEZST05UX0JBQ0spLAorICAgICAgICAvLyBBVURJT19DSEFOTkVMX0lOXzYgbm90IHN1cHBvcnRlZAorICAgICAgICBERUZJTkVfSU5QVVRfTEFZT1VUKDJQT0lOVDBQT0lOVDIpLAorICAgICAgICBERUZJTkVfSU5QVVRfTEFZT1VUKDJQT0lOVDFQT0lOVDIpLAorICAgICAgICBERUZJTkVfSU5QVVRfTEFZT1VUKDNQT0lOVDBQT0lOVDIpLAorICAgICAgICBERUZJTkVfSU5QVVRfTEFZT1VUKDNQT0lOVDFQT0lOVDIpLAorICAgICAgICBERUZJTkVfSU5QVVRfTEFZT1VUKDVQT0lOVDEpCisjdW5kZWYgREVGSU5FX0lOUFVUX0xBWU9VVAorICAgIH07CisgICAgcmV0dXJuIHBhaXJzOworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbEJpdFBhaXJzJiBnZXRPdXRBdWRpb0NoYW5uZWxCaXRzKCkgeworICAgIHN0YXRpYyBjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbEJpdFBhaXJzIHBhaXJzID0geworI2RlZmluZSBERUZJTkVfT1VUUFVUX0JJVFMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9PVVRfIyNuLCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfIyNuIH0KKworICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhGUk9OVF9SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhGUk9OVF9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoTE9XX0ZSRVFVRU5DWSksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhCQUNLX0xFRlQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoQkFDS19SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhGUk9OVF9MRUZUX09GX0NFTlRFUiksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhGUk9OVF9SSUdIVF9PRl9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoQkFDS19DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoU0lERV9MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFNJREVfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0NFTlRFUiksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfRlJPTlRfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfRlJPTlRfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFRPUF9GUk9OVF9SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfQkFDS19MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFRPUF9CQUNLX0NFTlRFUiksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfQkFDS19SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfU0lERV9MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFRPUF9TSURFX1JJR0hUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJPVFRPTV9GUk9OVF9MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJPVFRPTV9GUk9OVF9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoQk9UVE9NX0ZST05UX1JJR0hUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKExPV19GUkVRVUVOQ1lfMiksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhGUk9OVF9XSURFX0xFRlQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfV0lERV9SSUdIVCksCisjdW5kZWYgREVGSU5FX09VVFBVVF9CSVRTCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9IQVBUSUNfQSB9LAorICAgICAgICB7IEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19CLCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfSEFQVElDX0IgfQorICAgIH07CisgICAgcmV0dXJuIHBhaXJzOworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbFBhaXJzJiBnZXRPdXRBdWRpb0NoYW5uZWxQYWlycygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyBwYWlycyA9IHsKKyNkZWZpbmUgREVGSU5FX09VVFBVVF9MQVlPVVQobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXyMjbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmxheW91dE1hc2s+KCBcCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkxBWU9VVF8jI24pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKE1PTk8pLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChTVEVSRU8pLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgyUE9JTlQxKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoVFJJKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoVFJJX0JBQ0spLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgzUE9JTlQxKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoMlBPSU5UMFBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDJQT0lOVDFQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgzUE9JTlQwUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoM1BPSU5UMVBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFFVQUQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChRVUFEX1NJREUpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChTVVJST1VORCksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFBFTlRBKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoNVBPSU5UMSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDVQT0lOVDFfU0lERSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDVQT0lOVDFQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg1UE9JTlQxUE9JTlQ0KSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoNlBPSU5UMSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDdQT0lOVDEpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg3UE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoN1BPSU5UMVBPSU5UNCksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDEzUE9JTlRfMzYwUkEpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgyMlBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKE1PTk9fSEFQVElDX0EpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChTVEVSRU9fSEFQVElDX0EpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChIQVBUSUNfQUIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChNT05PX0hBUFRJQ19BQiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFNURVJFT19IQVBUSUNfQUIpCisjdW5kZWYgREVGSU5FX09VVFBVVF9MQVlPVVQKKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyYgZ2V0Vm9pY2VBdWRpb0NoYW5uZWxQYWlycygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyBwYWlycyA9IHsKKyNkZWZpbmUgREVGSU5FX1ZPSUNFX0xBWU9VVChuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfIyNuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OnZvaWNlTWFzaz4oICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OlZPSUNFXyMjbikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorICAgICAgICBERUZJTkVfVk9JQ0VfTEFZT1VUKFVQTElOS19NT05PKSwKKyAgICAgICAgREVGSU5FX1ZPSUNFX0xBWU9VVChETkxJTktfTU9OTyksCisgICAgICAgIERFRklORV9WT0lDRV9MQVlPVVQoQ0FMTF9NT05PKQorI3VuZGVmIERFRklORV9WT0lDRV9MQVlPVVQKKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oQXVkaW9EZXZpY2VUeXBlIHR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb25uZWN0aW9uID0gIiIpIHsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIHJlc3VsdDsKKyAgICByZXN1bHQudHlwZSA9IHR5cGU7CisgICAgcmVzdWx0LmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV0YWlsOjpBdWRpb0RldmljZVBhaXJzJiBwYWlycywKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGlucHV0VHlwZSwgYXVkaW9fZGV2aWNlc190IG91dHB1dFR5cGUsCisgICAgICAgIEF1ZGlvRGV2aWNlVHlwZSBpblR5cGUsIEF1ZGlvRGV2aWNlVHlwZSBvdXRUeXBlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29ubmVjdGlvbiA9ICIiKSB7CisgICAgcGFpcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGlucHV0VHlwZSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKGluVHlwZSwgY29ubmVjdGlvbikpKTsKKyAgICBwYWlycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIob3V0cHV0VHlwZSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKG91dFR5cGUsIGNvbm5lY3Rpb24pKSk7Cit9CisKK2NvbnN0IGRldGFpbDo6QXVkaW9EZXZpY2VQYWlycyYgZ2V0QXVkaW9EZXZpY2VQYWlycygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0RldmljZVBhaXJzIHBhaXJzID0gW10oKSB7CisgICAgICAgIGRldGFpbDo6QXVkaW9EZXZpY2VQYWlycyBwYWlycyA9IHt7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX05PTkUsIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb257fQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9TUEVBS0VSX0VBUlBJRUNFKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1NQRUFLRVIpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEUEhPTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0FOQUxPRygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08sIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfU0NPKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0NBUktJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfU0NPKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBRFBIT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9BMkRQKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfQTJEUCgpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfVEVMRVBIT05ZX1RYKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9MSU5FX0FVWCkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1NQRUFLRVJfU0FGRSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBUklOR19BSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX1dJUkVMRVNTKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfRUNIT19DQU5DRUxMRVIsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0VDSE9fQ0FOQ0VMTEVSKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9TUEVBS0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9MRSgpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0JST0FEQ0FTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfTEUoKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCBhbmQgSU5fQ09NTVVOSUNBVElPTiBhcmUgcmVtb3ZlZCBzaW5jZSB0aGV5IHdlcmUgZGVwcmVjYXRlZC4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fTUlDUk9QSE9ORSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX01JQ1JPUEhPTkVfQkFDSykKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9URUxFUEhPTllfUlgpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9UVl9UVU5FUiwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9UVl9UVU5FUikKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0xPT1BCQUNLKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX0xFKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9FQ0hPX1JFRkVSRU5DRSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfX07CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9ERUZBVUxULCBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERUZBVUxULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERUZBVUxUKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0hFQURTRVQsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fSEVBRFNFVCwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX1NDTygpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0hETUksIEFVRElPX0RFVklDRV9PVVRfSERNSSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fSERNSSgpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX1NVQk1JWCwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfU1VCTUlYKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fRE9DSywgQXVkaW9EZXZpY2VUeXBlOjpPVVRfRE9DSywKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0FOQUxPRygpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0RHVExfRE9DS19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fRE9DSywgQXVkaW9EZXZpY2VUeXBlOjpPVVRfRE9DSywKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX1VTQigpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9BQ0NFU1NPUlksIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0FDQ0VTU09SWSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfQUNDRVNTT1JZLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fVVNCKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9VU0IoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiwgQVVESU9fREVWSUNFX09VVF9GTSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0ZNX1RVTkVSLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9GTSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9MSU5FLCBBVURJT19ERVZJQ0VfT1VUX0xJTkUsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0FOQUxPRygpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1NQRElGLCBBVURJT19ERVZJQ0VfT1VUX1NQRElGLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9TUERJRigpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9BMkRQKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSVAsIEFVRElPX0RFVklDRV9PVVRfSVAsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0lQX1Y0KCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVTLCBBVURJT19ERVZJQ0VfT1VUX0JVUywKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlVTKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUFJPWFksIEFVRElPX0RFVklDRV9PVVRfUFJPWFksCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9BRkVfUFJPWFksIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0FGRV9QUk9YWSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0hFQURTRVQsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9VU0IoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JX0FSQywgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQywKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fSERNSV9BUkMoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JX0VBUkMsIEFVRElPX0RFVklDRV9PVVRfSERNSV9FQVJDLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9IRE1JX0VBUkMoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0hFQURTRVQsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9MRSgpKTsKKyAgICAgICAgcmV0dXJuIHBhaXJzOworICAgIH0oKTsKKyAgICByZXR1cm4gcGFpcnM7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZSB0eXBlKSB7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LnR5cGUgPSB0eXBlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGUgcGNtKSB7CisgICAgYXV0byByZXN1bHQgPSBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oQXVkaW9Gb3JtYXRUeXBlOjpQQ00pOworICAgIHJlc3VsdC5wY20gPSBwY207CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKSB7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZSB0cmFuc3BvcnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZykgeworICAgIGF1dG8gcmVzdWx0ID0gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGVuY29kaW5nKTsKKyAgICByZXN1bHQucGNtID0gdHJhbnNwb3J0OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IGRldGFpbDo6QXVkaW9Gb3JtYXRQYWlycyYgZ2V0QXVkaW9Gb3JtYXRQYWlycygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0Zvcm1hdFBhaXJzIHBhaXJzID0ge3sKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oQXVkaW9Gb3JtYXRUeXBlOjpTWVNfUkVTRVJWRURfSU5WQUxJRCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb257fQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8xNl9CSVQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpVSU5UXzhfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8zMl9CSVQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpGSVhFRF9RXzhfMjQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpGTE9BVF8zMl9CSVQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8yNF9CSVQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9NUDMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQU1SX05CLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQU1SX1dCLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX01QNCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19NQUlOLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX01BSU4pCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfU1NSLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1NTUikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MVFAsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTFRQKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YxKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TQ0FMQUJMRSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FUkxDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0VSTEMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfSEVfVjIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0VMRCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEUsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfWEhFKQorICAgICAgICB9LAorICAgICAgICAvLyBBVURJT19GT1JNQVRfSEVfQUFDX1YxIGFuZCBIRV9BQUNfVjIgYXJlIHJlbW92ZWQgc2luY2UgdGhleSB3ZXJlIGRlcHJlY2F0ZWQgbG9uZyB0aW1lCisgICAgICAgIC8vIGFnby4KKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1ZPUkJJUywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX09QVVMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRV9BQzMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EVFMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19EVFMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfSEQpCisgICAgICAgIH0sCisgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIHdlIHdvdWxkIGxpa2UgdG8gcmVwcmVzZW50IGVuY2Fwc3VsYXRlZCBiaXRzdHJlYW1zIGFzCisgICAgICAgIC8vIG5lc3RlZCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9ucy4gVGhlIGxlZ2FjeSAnQVVESU9fRk9STUFUX0lFQzYxOTM3JyB0eXBlIGRvZXNuJ3QKKyAgICAgICAgLy8gc3BlY2lmeSB0aGUgZm9ybWF0IG9mIHRoZSBlbmNhcHN1bGF0ZWQgYml0c3RyZWFtLgorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfSUVDNjE5MzcsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6SU5UXzE2X0JJVCwgTUVESUFfTUlNRVRZUEVfQVVESU9fSUVDNjE5MzcpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfVFJVRUhEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRVZSQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VWUkMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9FVlJDQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNCKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRVZSQ1dCLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ1dCKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRVZSQ05XLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ05XKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FESUYsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURJRikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1dNQSwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX1dNQSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX1dNQV9QUk8sIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1tcy13bWEucHJvIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FNUl9XQl9QTFVTLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCX1BMVVMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9NUDIsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUUNFTFAsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0RTRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQuc29ueS5kc2QiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRkxBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BTEFDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FQRSwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby94LWFwZSIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUUywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfTUFJTiwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19NQUlOKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfTEMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MQykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX1NTUiwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19TU1IpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19MVFAsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTFRQKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjEsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjEpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19TQ0FMQUJMRSwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19TQ0FMQUJMRSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0VSTEMsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRVJMQykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0xELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19IRV9WMiwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19IRV9WMikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0VMRCwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19FTEQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19YSEUsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfWEhFKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuICJ2bmQub2N0ZWwuc2JjIiBpcyBub3QgQlQgU0JDLgorICAgICAgICAgICAgQVVESU9fRk9STUFUX1NCQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby94LXNiYyIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUFRYLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQVBUWCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FQVFhfSEQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8vdm5kLnFjb20uYXB0eC5oZCIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9MREFDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5zb255LmxkYWMiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTUFULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTUFUXzFfMCwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVQgKyBzdGQ6OnN0cmluZygiLjEuMCIpKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMCwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVQgKyBzdGQ6OnN0cmluZygiLjIuMCIpKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMSwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVQgKyBzdGQ6OnN0cmluZygiLjIuMSIpKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xBVE0sIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9MQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0xDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjEsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjEpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMiwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9IRV9WMikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0NFTFQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1jZWx0IikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FQVFhfQURBUFRJVkUsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8vdm5kLnFjb20uYXB0eC5hZGFwdGl2ZSIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9MSERDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5zYXZpdGVjaC5saGRjIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0xIRENfTEwsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8vdm5kLnNhdml0ZWNoLmxoZGMubGwiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQVBUWF9UV1NQLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5xY29tLmFwdHgudHdzcCIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9MQzMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1sYzMiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVBFR0gsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSE0xKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVBFR0hfQkxfTDMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9CTF9MMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdIX0JMX0w0LCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9NUEVHSF9MQ19MMywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0xDX0wzKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVBFR0hfTENfTDQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MNCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYwOTU4LAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8yNF9CSVQsIE1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYwOTU4KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTX1VIRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0RUU19VSEQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EUkEsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19EUkEpCisgICAgICAgIH0sCisgICAgfX07CisgICAgcmV0dXJuIHBhaXJzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorc3RkOjp1bm9yZGVyZWRfbWFwPFMsIFQ+IG1ha2VfRGlyZWN0TWFwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTLCBUPj4mIHYpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8UywgVD4gcmVzdWx0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQuc2l6ZSgpICE9IHYuc2l6ZSgpLCAiRHVwbGljYXRlIGtleSBlbGVtZW50cyBkZXRlY3RlZCIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CitzdGQ6OnVub3JkZXJlZF9tYXA8UywgVD4gbWFrZV9EaXJlY3RNYXAoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTLCBUPj4mIHYxLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UywgVD4+JiB2MikgeworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxTLCBUPiByZXN1bHQodjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0LnNpemUoKSAhPSB2MS5zaXplKCksICJEdXBsaWNhdGUga2V5IGVsZW1lbnRzIGRldGVjdGVkIGluIHYxIik7CisgICAgcmVzdWx0Lmluc2VydCh2Mi5iZWdpbigpLCB2Mi5lbmQoKSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQuc2l6ZSgpICE9IHYxLnNpemUoKSArIHYyLnNpemUoKSwKKyAgICAgICAgICAgICJEdXBsaWNhdGUga2V5IGVsZW1lbnRzIGRldGVjdGVkIGluIHYxK3YyIik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KK3N0ZDo6dW5vcmRlcmVkX21hcDxULCBTPiBtYWtlX1JldmVyc2VNYXAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFMsIFQ+PiYgdikgeworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxULCBTPiByZXN1bHQ7CisgICAgc3RkOjp0cmFuc2Zvcm0odi5iZWdpbigpLCB2LmVuZCgpLCBzdGQ6Omluc2VydGVyKHJlc3VsdCwgcmVzdWx0LmJlZ2luKCkpLAorICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpwYWlyPFMsIFQ+JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHAuc2Vjb25kLCBwLmZpcnN0KTsKKyAgICAgICAgICAgIH0pOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0LnNpemUoKSAhPSB2LnNpemUoKSwgIkR1cGxpY2F0ZSBrZXkgZWxlbWVudHMgZGV0ZWN0ZWQiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2xheW91dF9hdWRpb19jaGFubmVsX21hc2tfdF9iaXRzKAorICAgICAgICBpbnQgYWlkbExheW91dCwgYm9vbCBpc0lucHV0KSB7CisgICAgYXV0byYgYml0TWFwcGluZyA9IGlzSW5wdXQgPyBnZXRJbkF1ZGlvQ2hhbm5lbEJpdHMoKSA6IGdldE91dEF1ZGlvQ2hhbm5lbEJpdHMoKTsKKyAgICBjb25zdCBpbnQgYWlkbExheW91dEluaXRpYWwgPSBhaWRsTGF5b3V0OyAvLyBmb3IgZXJyb3IgbWVzc2FnZQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJpdFBhaXIgOiBiaXRNYXBwaW5nKSB7CisgICAgICAgIGlmICgoYWlkbExheW91dCAmIGJpdFBhaXIuc2Vjb25kKSA9PSBiaXRQYWlyLnNlY29uZCkgeworICAgICAgICAgICAgbGVnYWN5ID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGxlZ2FjeSB8IGJpdFBhaXIuZmlyc3QpOworICAgICAgICAgICAgYWlkbExheW91dCAmPSB+Yml0UGFpci5zZWNvbmQ7CisgICAgICAgICAgICBpZiAoYWlkbExheW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiJXM6IGFpZGwgbGF5b3V0IDB4JXggY29udGFpbnMgYml0cyAweCV4IHRoYXQgaGF2ZSBubyBtYXRjaCB0byBsZWdhY3kgJXMgYml0cyIsCisgICAgICAgICAgICBfX2Z1bmNfXywgYWlkbExheW91dEluaXRpYWwsIGFpZGxMYXlvdXQsIGlzSW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOworICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdCgKKyAgICAgICAgY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBhaWRsLCBib29sIGlzSW5wdXQpIHsKKyAgICB1c2luZyBSZXZlcnNlTWFwID0gc3RkOjp1bm9yZGVyZWRfbWFwPEF1ZGlvQ2hhbm5lbExheW91dCwgYXVkaW9fY2hhbm5lbF9tYXNrX3Q+OworICAgIHVzaW5nIFRhZyA9IEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOworICAgIHN0YXRpYyBjb25zdCBSZXZlcnNlTWFwIG1JbiA9IG1ha2VfUmV2ZXJzZU1hcChnZXRJbkF1ZGlvQ2hhbm5lbFBhaXJzKCkpOworICAgIHN0YXRpYyBjb25zdCBSZXZlcnNlTWFwIG1PdXQgPSBtYWtlX1JldmVyc2VNYXAoZ2V0T3V0QXVkaW9DaGFubmVsUGFpcnMoKSk7CisgICAgc3RhdGljIGNvbnN0IFJldmVyc2VNYXAgbVZvaWNlID0gbWFrZV9SZXZlcnNlTWFwKGdldFZvaWNlQXVkaW9DaGFubmVsUGFpcnMoKSk7CisKKyAgICBhdXRvIGNvbnZlcnQgPSBbXShjb25zdCBBdWRpb0NoYW5uZWxMYXlvdXQmIGFpZGwsIGNvbnN0IFJldmVyc2VNYXAmIG0sCisgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jLCBjb25zdCBjaGFyKiB0eXBlKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiB7CisgICAgICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGFpZGwpOyBpdCAhPSBtLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogbm8gbGVnYWN5ICVzIGF1ZGlvX2NoYW5uZWxfbWFza190IGZvdW5kIGZvciAlcyIsIGZ1bmMsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIGFpZGwudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3dpdGNoIChhaWRsLmdldFRhZygpKSB7CisgICAgICAgIGNhc2UgVGFnOjpub25lOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgY2FzZSBUYWc6OmludmFsaWQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgICAgICBjYXNlIFRhZzo6aW5kZXhNYXNrOgorICAgICAgICAgICAgLy8gSW5kZXggbWFza3MgZG8gbm90IGhhdmUgcHJlLWRlZmluZWQgdmFsdWVzLgorICAgICAgICAgICAgaWYgKGNvbnN0IGludCBiaXRzID0gYWlkbC5nZXQ8VGFnOjppbmRleE1hc2s+KCk7CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9wb3Bjb3VudChiaXRzKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9wb3Bjb3VudChiaXRzKSA8PSBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgsIGJpdHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgaW5kZXhNYXNrIHZhbHVlIDB4JXggaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJpdHMsIGFpZGwudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIFRhZzo6bGF5b3V0TWFzazoKKyAgICAgICAgICAgIC8vIFRoZSBmYXN0IHBhdGggaXMgdG8gZmluZCBhIGRpcmVjdCBtYXRjaCBmb3Igc29tZSBrbm93biBsYXlvdXQgbWFzay4KKyAgICAgICAgICAgIGlmIChjb25zdCBhdXRvIGxheW91dE1hdGNoID0gY29udmVydChhaWRsLCBpc0lucHV0ID8gbUluIDogbU91dCwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIGlzSW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOworICAgICAgICAgICAgICAgICAgICBsYXlvdXRNYXRjaC5vaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxheW91dE1hdGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgYSBtYXRjaCBmb3IgYSBwcmVkZWZpbmVkIGxheW91dCB3YXNuJ3QgZm91bmQsIG1ha2UgYSBjdXN0b20gb25lIGZyb20gYml0cy4KKyAgICAgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfdCBiaXRNYXNrID0KKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2xheW91dF9hdWRpb19jaGFubmVsX21hc2tfdF9iaXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwuZ2V0PFRhZzo6bGF5b3V0TWFzaz4oKSwgaXNJbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGJpdE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpdE1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICBjYXNlIFRhZzo6dm9pY2VNYXNrOgorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoYWlkbCwgbVZvaWNlLCBfX2Z1bmNfXywgInZvaWNlIik7CisgICAgfQorICAgIEFMT0dFKCIlczogdW5leHBlY3RlZCB0YWcgdmFsdWUgJWQiLCBfX2Z1bmNfXywgYWlkbC5nZXRUYWcoKSk7CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworaW50IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2JpdHNfQXVkaW9DaGFubmVsTGF5b3V0X2xheW91dCgKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5LCBib29sIGlzSW5wdXQpIHsKKyAgICBhdXRvJiBiaXRNYXBwaW5nID0gaXNJbnB1dCA/IGdldEluQXVkaW9DaGFubmVsQml0cygpIDogZ2V0T3V0QXVkaW9DaGFubmVsQml0cygpOworICAgIGNvbnN0IGludCBsZWdhY3lJbml0aWFsID0gbGVnYWN5OyAvLyBmb3IgZXJyb3IgbWVzc2FnZQorICAgIGludCBhaWRsTGF5b3V0ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJpdFBhaXIgOiBiaXRNYXBwaW5nKSB7CisgICAgICAgIGlmICgobGVnYWN5ICYgYml0UGFpci5maXJzdCkgPT0gYml0UGFpci5maXJzdCkgeworICAgICAgICAgICAgYWlkbExheW91dCB8PSBiaXRQYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGxlZ2FjeSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihsZWdhY3kgJiB+Yml0UGFpci5maXJzdCk7CisgICAgICAgICAgICBpZiAobGVnYWN5ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWlkbExheW91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiJXM6IGxlZ2FjeSAlcyBhdWRpb19jaGFubmVsX21hc2tfdCAweCV4IGNvbnRhaW5zIHVucmVjb2duaXplZCBiaXRzIDB4JXgiLAorICAgICAgICAgICAgX19mdW5jX18sIGlzSW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIsIGxlZ2FjeUluaXRpYWwsIGxlZ2FjeSk7CisgICAgcmV0dXJuIDA7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9DaGFubmVsTGF5b3V0PiBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgdXNpbmcgRGlyZWN0TWFwID0gc3RkOjp1bm9yZGVyZWRfbWFwPGF1ZGlvX2NoYW5uZWxfbWFza190LCBBdWRpb0NoYW5uZWxMYXlvdXQ+OworICAgIHVzaW5nIFRhZyA9IEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOworICAgIHN0YXRpYyBjb25zdCBEaXJlY3RNYXAgbUluQW5kVm9pY2UgPSBtYWtlX0RpcmVjdE1hcCgKKyAgICAgICAgICAgIGdldEluQXVkaW9DaGFubmVsUGFpcnMoKSwgZ2V0Vm9pY2VBdWRpb0NoYW5uZWxQYWlycygpKTsKKyAgICBzdGF0aWMgY29uc3QgRGlyZWN0TWFwIG1PdXQgPSBtYWtlX0RpcmVjdE1hcChnZXRPdXRBdWRpb0NoYW5uZWxQYWlycygpKTsKKworICAgIGF1dG8gY29udmVydCA9IFtdKGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSwgY29uc3QgRGlyZWN0TWFwJiBtLAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuYywgY29uc3QgY2hhciogdHlwZSkgLT4gQ29udmVyc2lvblJlc3VsdDxBdWRpb0NoYW5uZWxMYXlvdXQ+IHsKKyAgICAgICAgaWYgKGF1dG8gaXQgPSBtLmZpbmQobGVnYWN5KTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IG5vIEF1ZGlvQ2hhbm5lbExheW91dCBmb3VuZCBmb3IgbGVnYWN5ICVzIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBmdW5jLCB0eXBlLCBsZWdhY3kpOworICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAobGVnYWN5ID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0e307CisgICAgfSBlbHNlIGlmIChsZWdhY3kgPT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8VGFnOjppbnZhbGlkPigwKTsKKyAgICB9CisKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX3JlcHJlc2VudGF0aW9uX3QgcmVwciA9IGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24obGVnYWN5KTsKKyAgICBpZiAocmVwciA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfaXNfdmFsaWQobGVnYWN5KSkgeworICAgICAgICAgICAgY29uc3QgaW50IGluZGV4TWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPGludD4oYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGxlZ2FjeSkpKTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8VGFnOjppbmRleE1hc2s+KGluZGV4TWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGxlZ2FjeSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IGlzIGludmFsaWQiLCBfX2Z1bmNfXywgbGVnYWN5KTsKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlcHIgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTikgeworICAgICAgICAvLyBUaGUgZmFzdCBwYXRoIGlzIHRvIGZpbmQgYSBkaXJlY3QgbWF0Y2ggZm9yIHNvbWUga25vd24gbGF5b3V0IG1hc2suCisgICAgICAgIGlmIChjb25zdCBhdXRvIGxheW91dE1hdGNoID0gY29udmVydChsZWdhY3ksIGlzSW5wdXQgPyBtSW5BbmRWb2ljZSA6IG1PdXQsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIGlzSW5wdXQgPyAiaW5wdXQgLyB2b2ljZSIgOiAib3V0cHV0Iik7CisgICAgICAgICAgICAgICAgbGF5b3V0TWF0Y2gub2soKSkgeworICAgICAgICAgICAgcmV0dXJuIGxheW91dE1hdGNoOworICAgICAgICB9CisgICAgICAgIC8vIElmIGEgbWF0Y2ggZm9yIGEgcHJlZGVmaW5lZCBsYXlvdXQgd2Fzbid0IGZvdW5kLCBtYWtlIGEgY3VzdG9tIG9uZSBmcm9tIGJpdHMsCisgICAgICAgIC8vIHJlamVjdGluZyB0aG9zZSB3aXRoIHZvaWNlIGNoYW5uZWwgYml0cy4KKyAgICAgICAgaWYgKCFpc0lucHV0IHx8CisgICAgICAgICAgICAgICAgKGxlZ2FjeSAmIChBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSyB8IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGludCBiaXRNYXNrTGF5b3V0ID0KKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfYml0c19BdWRpb0NoYW5uZWxMYXlvdXRfbGF5b3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeSwgaXNJbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGJpdE1hc2tMYXlvdXQgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8VGFnOjpsYXlvdXRNYXNrPihiaXRNYXNrTGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbGVnYWN5IGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlIDB4JXggY29udGFpbnMgdm9pY2UgYml0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsZWdhY3kpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgQUxPR0UoIiVzOiB1bmtub3duIHJlcHJlc2VudGF0aW9uICVkIGluIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlIDB4JXgiLAorICAgICAgICAgICAgX19mdW5jX18sIHJlcHIsIGxlZ2FjeSk7CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19kZXZpY2VzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KAorICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBhaWRsKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxBdWRpb0RldmljZURlc2NyaXB0aW9uLCBhdWRpb19kZXZpY2VzX3Q+IG0gPQorICAgICAgICAgICAgbWFrZV9SZXZlcnNlTWFwKGdldEF1ZGlvRGV2aWNlUGFpcnMoKSk7CisgICAgaWYgKGF1dG8gaXQgPSBtLmZpbmQoYWlkbCk7IGl0ICE9IG0uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBsZWdhY3kgYXVkaW9fZGV2aWNlc190IGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCBhaWRsLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbGVnYWN5KSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19kZXZpY2VzX3QsIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24+IG0gPQorICAgICAgICAgICAgbWFrZV9EaXJlY3RNYXAoZ2V0QXVkaW9EZXZpY2VQYWlycygpKTsKKyAgICBpZiAoYXV0byBpdCA9IG0uZmluZChsZWdhY3kpOyBpdCAhPSBtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBmb3VuZCBmb3IgbGVnYWN5IGF1ZGlvX2RldmljZXNfdCB2YWx1ZSAweCV4IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVnYWN5KTsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK3N0YXR1c190IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2UmIGFpZGwsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCogbGVnYWN5VHlwZSwgY2hhciogbGVnYWN5QWRkcmVzcykgeworICAgICpsZWdhY3lUeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGFpZGwudHlwZSkpOworICAgIHJldHVybiBhaWRsMmxlZ2FjeV9zdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuYWRkcmVzcy5nZXQ8QXVkaW9EZXZpY2VBZGRyZXNzOjppZD4oKSwKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5QWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3N0YXR1c190IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2UmIGFpZGwsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCogbGVnYWN5VHlwZSwgU3RyaW5nOCogbGVnYWN5QWRkcmVzcykgeworICAgICpsZWdhY3lUeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGFpZGwudHlwZSkpOworICAgICpsZWdhY3lBZGRyZXNzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmc4KAorICAgICAgICAgICAgICAgICAgICBhaWRsLmFkZHJlc3MuZ2V0PEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KCkpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2UmIGFpZGwsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCogbGVnYWN5VHlwZSwgc3RkOjpzdHJpbmcqIGxlZ2FjeUFkZHJlc3MpIHsKKyAgICAqbGVnYWN5VHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKKyAgICAqbGVnYWN5QWRkcmVzcyA9IGFpZGwuYWRkcmVzcy5nZXQ8QXVkaW9EZXZpY2VBZGRyZXNzOjppZD4oKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9EZXZpY2U+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGxlZ2FjeVR5cGUsIGNvbnN0IGNoYXIqIGxlZ2FjeUFkZHJlc3MpIHsKKyAgICBBdWRpb0RldmljZSBhaWRsOworICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGxlZ2FjeVR5cGUpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBhaWRsX2lkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeUFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pKTsKKyAgICBhaWRsLmFkZHJlc3MgPSBBdWRpb0RldmljZUFkZHJlc3M6Om1ha2U8QXVkaW9EZXZpY2VBZGRyZXNzOjppZD4oYWlkbF9pZCk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9EZXZpY2U+CitsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBsZWdhY3lUeXBlLCBjb25zdCBTdHJpbmc4JiBsZWdhY3lBZGRyZXNzKSB7CisgICAgQXVkaW9EZXZpY2UgYWlkbDsKKyAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihsZWdhY3lUeXBlKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWlkbF9pZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX1N0cmluZzhfc3RyaW5nKGxlZ2FjeUFkZHJlc3MpKTsKKyAgICBhaWRsLmFkZHJlc3MgPSBBdWRpb0RldmljZUFkZHJlc3M6Om1ha2U8QXVkaW9EZXZpY2VBZGRyZXNzOjppZD4oYWlkbF9pZCk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZm9ybWF0X3Q+IGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoCisgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGFpZGwpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24sIGF1ZGlvX2Zvcm1hdF90PiBtID0KKyAgICAgICAgICAgIG1ha2VfUmV2ZXJzZU1hcChnZXRBdWRpb0Zvcm1hdFBhaXJzKCkpOworICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGFpZGwpOyBpdCAhPSBtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gbGVnYWN5IGF1ZGlvX2Zvcm1hdF90IGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCBhaWRsLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+IGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGxlZ2FjeSkgewotICAgIC8vIFRoaXMgcmVsaWVzIG9uIEF1ZGlvRm9ybWF0IGJlaW5nIGtlcHQgaW4gc3luYyB3aXRoIGF1ZGlvX2Zvcm1hdF90LgotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCkgPT0gc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4obGVnYWN5KTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPGF1ZGlvX2Zvcm1hdF90LCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiBtID0KKyAgICAgICAgICAgIG1ha2VfRGlyZWN0TWFwKGdldEF1ZGlvRm9ybWF0UGFpcnMoKSk7CisgICAgaWYgKGF1dG8gaXQgPSBtLmZpbmQobGVnYWN5KTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG5vIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZm91bmQgZm9yIGxlZ2FjeSBhdWRpb19mb3JtYXRfdCB2YWx1ZSAweCV4IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVnYWN5KTsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvR2Fpbk1vZGVfYXVkaW9fZ2Fpbl9tb2RlX3QobWVkaWE6OkF1ZGlvR2Fpbk1vZGUgYWlkbCkgeworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX21vZGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdCgKKyAgICAgICAgQXVkaW9HYWluTW9kZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkpPSU5UOgorICAgICAgICBjYXNlIEF1ZGlvR2Fpbk1vZGU6OkpPSU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9KT0lOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Q0hBTk5FTFM6CisgICAgICAgIGNhc2UgQXVkaW9HYWluTW9kZTo6Q0hBTk5FTFM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpSQU1QOgorICAgICAgICBjYXNlIEF1ZGlvR2Fpbk1vZGU6OlJBTVA6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fR0FJTl9NT0RFX1JBTVA7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbk1vZGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X0F1ZGlvR2Fpbk1vZGUoYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KSB7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2Fpbk1vZGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X0F1ZGlvR2Fpbk1vZGUoCisgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fR0FJTl9NT0RFX0pPSU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpKT0lOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0dhaW5Nb2RlOjpKT0lOVDsKICAgICAgICAgY2FzZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOwogICAgICAgICBjYXNlIEFVRElPX0dBSU5fTU9ERV9SQU1QOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpSQU1QOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvR2Fpbk1vZGU6OlJBTVA7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZ2Fpbl9tb2RlX3RfbWFzayhpbnQzMl90IGFpZGwpIHsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8YXVkaW9fZ2Fpbl9tb2RlX3QsIGludDMyX3QsIGF1ZGlvX2dhaW5fbW9kZV90LCBtZWRpYTo6QXVkaW9HYWluTW9kZT4oCisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90LCBpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgQXVkaW9HYWluTW9kZT4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90LAogICAgICAgICAgICAgLy8gQXVkaW9HYWluTW9kZSBpcyBpbmRleC1iYXNlZC4KLSAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb0dhaW5Nb2RlPiwKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PEF1ZGlvR2Fpbk1vZGU+LAogICAgICAgICAgICAgLy8gQVVESU9fR0FJTl9NT0RFXyogY29uc3RhbnRzIGFyZSBtYXNrLWJhc2VkLgogICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90LCBhdWRpb19nYWluX21vZGVfdD4pOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpIHsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgYXVkaW9fZ2Fpbl9tb2RlX3QsIG1lZGlhOjpBdWRpb0dhaW5Nb2RlLCBhdWRpb19nYWluX21vZGVfdD4oCisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIGF1ZGlvX2dhaW5fbW9kZV90LCBBdWRpb0dhaW5Nb2RlLCBhdWRpb19nYWluX21vZGVfdD4oCiAgICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X0F1ZGlvR2Fpbk1vZGUsCiAgICAgICAgICAgICAvLyBBVURJT19HQUlOX01PREVfKiBjb25zdGFudHMgYXJlIG1hc2stYmFzZWQuCiAgICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90PiwKICAgICAgICAgICAgIC8vIEF1ZGlvR2Fpbk1vZGUgaXMgaW5kZXgtYmFzZWQuCi0gICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb0dhaW5Nb2RlPik7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChpbnQzMl90IGFpZGwpIHsKLSAgICAvLyBUT0RPKHl0YWkpOiBiaXRmaWVsZD8KLSAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGF1ZGlvX2RldmljZXNfdD4oYWlkbCk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoYXVkaW9fZGV2aWNlc190IGxlZ2FjeSkgewotICAgIC8vIFRPRE8oeXRhaSk6IGJpdGZpZWxkPwotICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5KTsKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgQXVkaW9HYWluTW9kZT4pOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0dhaW5Db25maWcmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUpIHsKKyAgICAgICAgY29uc3QgQXVkaW9HYWluQ29uZmlnJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKICAgICBhdWRpb19nYWluX2NvbmZpZyBsZWdhY3k7CiAgICAgbGVnYWN5LmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGFpZGwuaW5kZXgpKTsKICAgICBsZWdhY3kubW9kZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soYWlkbC5tb2RlKSk7Ci0gICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9Ci0gICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrKSk7Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKLSAgICBjb25zdCBib29sIGlzSm9pbnQgPSBiaXRtYXNrSXNTZXQoYWlkbC5tb2RlLCBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Sk9JTlQpOworICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaywgaXNJbnB1dCkpOworICAgIGNvbnN0IGJvb2wgaXNKb2ludCA9IGJpdG1hc2tJc1NldChhaWRsLm1vZGUsIEF1ZGlvR2Fpbk1vZGU6OkpPSU5UKTsKICAgICBzaXplX3QgbnVtVmFsdWVzID0gaXNKb2ludCA/IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKTsKQEAgLTQ4MSwxNCArMTQwMSwxMyBAQAogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2FpbkNvbmZpZz4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKAotICAgICAgICBjb25zdCBhdWRpb19nYWluX2NvbmZpZyYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvR2FpbkNvbmZpZyBhaWRsOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKKyAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgQXVkaW9HYWluQ29uZmlnIGFpZGw7CiAgICAgYWlkbC5pbmRleCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmluZGV4KSk7CiAgICAgYWlkbC5tb2RlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhsZWdhY3kubW9kZSkpOwotICAgIGFpZGwuY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobGVnYWN5LmNoYW5uZWxfbWFzaykpOwotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24ocm9sZSwgdHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CisgICAgYWlkbC5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3kuY2hhbm5lbF9tYXNrLCBpc0lucHV0KSk7CiAgICAgY29uc3QgYm9vbCBpc0pvaW50ID0gKGxlZ2FjeS5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSAhPSAwOwogICAgIHNpemVfdCBudW1WYWx1ZXMgPSBpc0pvaW50ID8gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXNJbnB1dCA/IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGxlZ2FjeS5jaGFubmVsX21hc2spCkBAIC01MDIsMTI5ICsxNDIxLDE0MSBAQAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvSW5wdXRGbGFnc19hdWRpb19pbnB1dF9mbGFnc190KAotICAgICAgICBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzIGFpZGwpIHsKKyAgICAgICAgQXVkaW9JbnB1dEZsYWdzIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpGQVNUOgorICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6RkFTVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX0ZBU1Q7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfSE9UV09SRDoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlJBVzoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OlJBVzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1JBVzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpTWU5DOgorICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6U1lOQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1NZTkM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6TU1BUF9OT0lSUToKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJROwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlZPSVBfVFg6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpIV19BVl9TWU5DOgorICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOgorICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUOworICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6VUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1VMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MoCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvSW5wdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MoCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX05PTkU6CiAgICAgICAgICAgICBicmVhazsgLy8gc2hvdWxkbid0IGdldCBoZXJlLiBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfRkFTVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpGQVNUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6RkFTVDsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfSE9UV09SRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19SQVc6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6UkFXOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6UkFXOwogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfU1lOQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpTWU5DOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6U1lOQzsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlE6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6TU1BUF9OT0lSUTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlZPSVBfVFg7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOwogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpIV19BVl9TWU5DOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0RJUkVDVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpESVJFQ1Q7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9JbnB1dEZsYWdzOjpESVJFQ1Q7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19VTFRSQVNPVU5EOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6VUxUUkFTT1VORDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfQXVkaW9PdXRwdXRGbGFnc19hdWRpb19vdXRwdXRfZmxhZ3NfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3MgYWlkbCkgeworICAgICAgICBBdWRpb091dHB1dEZsYWdzIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlBSSU1BUlk6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6UFJJTUFSWToKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpGQVNUOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkZBU1Q6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfRkFTVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkNPTVBSRVNTX09GRkxPQUQ6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6Q09NUFJFU1NfT0ZGTE9BRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpOT05fQkxPQ0tJTkc6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6SFdfQVZfU1lOQzoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpIV19BVl9TWU5DOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlRUUzoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpUVFM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfVFRTOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpSQVc6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6UkFXOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1JBVzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6U1lOQzoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpTWU5DOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1NZTkM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OklFQzk1OF9OT05BVURJTzoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU86CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVF9QQ006CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6TU1BUF9OT0lSUToKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpNTUFQX05PSVJROgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlE7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlZPSVBfUlg6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6Vk9JUF9SWDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJTkNBTExfTVVTSUM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6SU5DQUxMX01VU0lDOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6R0FQTEVTU19PRkZMT0FEOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkdBUExFU1NfT0ZGTE9BRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19HQVBMRVNTX09GRkxPQUQ7CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6VUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19VTFRSQVNPVU5EOworICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlNQQVRJQUxJWkVSOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9BdWRpb091dHB1dEZsYWdzKAorQ29udmVyc2lvblJlc3VsdDxBdWRpb091dHB1dEZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9BdWRpb091dHB1dEZsYWdzKAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX05PTkU6CiAgICAgICAgICAgICBicmVhazsgLy8gc2hvdWxkbid0IGdldCBoZXJlLiBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVDsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpQUklNQVJZOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlBSSU1BUlk7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RkFTVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpGQVNUOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpERUVQX0JVRkZFUjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpERUVQX0JVRkZFUjsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OkNPTVBSRVNTX09GRkxPQUQ7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpOT05fQkxPQ0tJTkc7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6SFdfQVZfU1lOQzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19UVFM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlRUUzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpUVFM7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfUkFXOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpSQVc7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6UkFXOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1NZTkM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlNZTkM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6U1lOQzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU86Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OklFQzk1OF9OT05BVURJTzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU87CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUX1BDTTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlE6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6TU1BUF9OT0lSUTsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpWT0lQX1JYOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlZPSVBfUlg7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJTkNBTExfTVVTSUM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6SU5DQUxMX01VU0lDOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0dBUExFU1NfT0ZGTE9BRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6R0FQTEVTU19PRkZMT0FEOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OkdBUExFU1NfT0ZGTE9BRDsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19VTFRSQVNPVU5EOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlVMVFJBU09VTkQ7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVI6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6U1BBVElBTElaRVI7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CkBAIC02MzQsOSArMTU2NSw5IEBACiAgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD47CiAKICAgICBMZWdhY3lNYXNrIGNvbnZlcnRlZCA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIChjb252ZXJ0Qml0bWFzazxMZWdhY3lNYXNrLCBpbnQzMl90LCBhdWRpb19pbnB1dF9mbGFnc190LCBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPigKKyAgICAgICAgICAgIChjb252ZXJ0Qml0bWFzazxMZWdhY3lNYXNrLCBpbnQzMl90LCBhdWRpb19pbnB1dF9mbGFnc190LCBBdWRpb0lucHV0RmxhZ3M+KAogICAgICAgICAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0lucHV0RmxhZ3NfYXVkaW9faW5wdXRfZmxhZ3NfdCwKLSAgICAgICAgICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4sCisgICAgICAgICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PEF1ZGlvSW5wdXRGbGFncz4sCiAgICAgICAgICAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxMZWdhY3lNYXNrLCBhdWRpb19pbnB1dF9mbGFnc190PikpKTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oY29udmVydGVkKTsKIH0KQEAgLTY0NiwxMCArMTU3NywxMCBAQAogICAgIHVzaW5nIExlZ2FjeU1hc2sgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OwogCiAgICAgTGVnYWN5TWFzayBsZWdhY3lNYXNrID0gc3RhdGljX2Nhc3Q8TGVnYWN5TWFzaz4obGVnYWN5KTsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncywgYXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIExlZ2FjeU1hc2ssIEF1ZGlvSW5wdXRGbGFncywgYXVkaW9faW5wdXRfZmxhZ3NfdD4oCiAgICAgICAgICAgICBsZWdhY3lNYXNrLCBsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X0F1ZGlvSW5wdXRGbGFncywKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8YXVkaW9faW5wdXRfZmxhZ3NfdD4sCi0gICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+KTsKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgQXVkaW9JbnB1dEZsYWdzPik7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzaygKQEAgLTY1Nyw5ICsxNTg4LDkgQEAKICAgICByZXR1cm4gY29udmVydEJpdG1hc2s8YXVkaW9fb3V0cHV0X2ZsYWdzX3QsCiAgICAgICAgICAgICBpbnQzMl90LAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QsCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4oCisgICAgICAgICAgICBBdWRpb091dHB1dEZsYWdzPigKICAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QsCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4sCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxBdWRpb091dHB1dEZsYWdzPiwKICAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxhdWRpb19vdXRwdXRfZmxhZ3NfdCwgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KTsKIH0KIApAQCAtNjY4LDIyNSArMTU5OSwyMTUgQEAKICAgICB1c2luZyBMZWdhY3lNYXNrID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD47CiAKICAgICBMZWdhY3lNYXNrIGxlZ2FjeU1hc2sgPSBzdGF0aWNfY2FzdDxMZWdhY3lNYXNrPihsZWdhY3kpOwotICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncywgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBBdWRpb091dHB1dEZsYWdzLCBhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCiAgICAgICAgICAgICBsZWdhY3lNYXNrLCBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9BdWRpb091dHB1dEZsYWdzLAogICAgICAgICAgICAgaW5kZXhUb0VudW1fYml0bWFzazxhdWRpb19vdXRwdXRfZmxhZ3NfdD4sCi0gICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPik7CisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIEF1ZGlvT3V0cHV0RmxhZ3M+KTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19mbGFncz4gYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0ZsYWdzJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvSW9GbGFncyYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9faW9fZmxhZ3MgbGVnYWN5OwotICAgIERpcmVjdGlvbiBkaXIgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKTsKLSAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIERpcmVjdGlvbjo6SU5QVVQ6IHsKLSAgICAgICAgICAgIGxlZ2FjeS5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBpbnB1dCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRGlyZWN0aW9uOjpPVVRQVVQ6IHsKLSAgICAgICAgICAgIGxlZ2FjeS5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG91dHB1dCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChpc0lucHV0KSB7CisgICAgICAgIGxlZ2FjeS5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lucHV0X2ZsYWdzX3RfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgaW5wdXQpKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxlZ2FjeS5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBvdXRwdXQpKSkpOwogICAgIH0KLQogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9GbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKAotICAgICAgICBjb25zdCBhdWRpb19pb19mbGFncyYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvSW9GbGFncyBhaWRsOwotCi0gICAgRGlyZWN0aW9uIGRpciA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24ocm9sZSwgdHlwZSkpOwotICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgRGlyZWN0aW9uOjpJTlBVVDoKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuaW5wdXQpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEaXJlY3Rpb246Ok9VVFBVVDoKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5vdXRwdXQpKSk7Ci0gICAgICAgICAgICBicmVhazsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Jb0ZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MoCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2ZsYWdzJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvSW9GbGFncyBhaWRsOworICAgIGlmIChpc0lucHV0KSB7CisgICAgICAgIFVOSU9OX1NFVChhaWRsLCBpbnB1dCwKKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2sobGVnYWN5LmlucHV0KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFVOSU9OX1NFVChhaWRsLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzayhsZWdhY3kub3V0cHV0KSkpOwogICAgIH0KICAgICByZXR1cm4gYWlkbDsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0X2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQmIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwsIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMmIGFpZGxEZXZpY2VFeHQpIHsKICAgICBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGwuaHdNb2R1bGUpKTsKLSAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKLSAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwuYWRkcmVzcywgbGVnYWN5LmFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pKTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbERldmljZUV4dC5od01vZHVsZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuZGV2aWNlLCAmbGVnYWN5LnR5cGUsIGxlZ2FjeS5hZGRyZXNzKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dF9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQmIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQgYWlkbDsKLSAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKLSAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5LnR5cGUpKTsKLSAgICBhaWRsLmFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5LmFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pKTsKLSAgICByZXR1cm4gYWlkbDsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0JiBsZWdhY3ksCisgICAgICAgIEF1ZGlvUG9ydERldmljZUV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyogYWlkbERldmljZUV4dCkgeworICAgIGFpZGxEZXZpY2VFeHQtPmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLT5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKGxlZ2FjeS50eXBlLCBsZWdhY3kuYWRkcmVzcykpOworICAgIHJldHVybiBPSzsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdHJlYW1fdHlwZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBhaWRsKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6REVGQVVMVDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OklOVkFMSUQ6CisgICAgICAgICAgICBicmVhazsgIC8vIHJldHVybiBlcnJvcgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6U1lTX1JFU0VSVkVEX0RFRkFVTFQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Vk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6U1lTVEVNOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6U1lTVEVNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UklORzoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlJJTkc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpNVVNJQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QUxBUk06CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpBTEFSTToKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Tk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6Tk9USUZJQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QkxVRVRPT1RIX1NDTzoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ086CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RFRNRjoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkRUTUY6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6VFRTOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6VFRTOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9UVFM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QUNDRVNTSUJJTElUWToKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QVNTSVNUQU5UOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6QVNTSVNUQU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UkVST1VUSU5HOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6U1lTX1JFU0VSVkVEX1JFUk9VVElORzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUkVST1VUSU5HOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlBBVENIOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6U1lTX1JFU0VSVkVEX1BBVENIOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkNBTExfQVNTSVNUQU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9DQUxMX0FTU0lTVEFOVDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9TdHJlYW1UeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZSgKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9TdHJlYW1UeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZSgKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkRFRkFVTFQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpTWVNfUkVTRVJWRURfREVGQVVMVDsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpWT0lDRV9DQUxMOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6Vk9JQ0VfQ0FMTDsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTTsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpSSU5HOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6UklORzsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpNVVNJQzsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QUxBUk07CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpBTEFSTTsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpCTFVFVE9PVEhfU0NPOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6QkxVRVRPT1RIX1NDTzsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpFTkZPUkNFRF9BVURJQkxFOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6RU5GT1JDRURfQVVESUJMRTsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpEVE1GOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6RFRNRjsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlRUUzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlRUUzsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBQ0NFU1NJQklMSVRZOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6QUNDRVNTSUJJTElUWTsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQVNTSVNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJFUk9VVElORzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9SRVJPVVRJTkc7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1BBVENIOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlBBVENIOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6U1lTX1JFU0VSVkVEX1BBVENIOwogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9DQUxMX0FTU0lTVEFOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkNBTExfQVNTSVNUQU5UOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX3NvdXJjZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYWlkbCkgeworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QoCisgICAgICAgIEF1ZGlvU291cmNlIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpJTlZBTElEOgotICAgICAgICAgICAgLy8gVGhpcyB2YWx1ZSBkb2VzIG5vdCBoYXZlIGFuIGVudW0KKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0lOVkFMSUQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6REVGQVVMVDoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6REVGQVVMVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfREVGQVVMVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpNSUM6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6Ok1JQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfTUlDOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1VQTElOSzoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Vk9JQ0VfVVBMSU5LOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfRE9XTkxJTks6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlZPSUNFX0RPV05MSU5LOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DQUxMOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpWT0lDRV9DQUxMOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkNBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Q0FNQ09SREVSOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9DQU1DT1JERVI7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUkVDT0dOSVRJT046CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlZPSUNFX1JFQ09HTklUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlJFTU9URV9TVUJNSVg6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlJFTU9URV9TVUJNSVg6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6VU5QUk9DRVNTRUQ6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlVOUFJPQ0VTU0VEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Vk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkVDSE9fUkVGRVJFTkNFOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpVTFRSQVNPVU5EOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EOworICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpFQ0hPX1JFRkVSRU5DRToKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Rk1fVFVORVI6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OkZNX1RVTkVSOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9GTV9UVU5FUjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpIT1RXT1JEOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpIT1RXT1JEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9IT1RXT1JEOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZSgKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Tb3VyY2U+IGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKAogICAgICAgICBhdWRpb19zb3VyY2VfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9JTlZBTElEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OklOVkFMSUQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlNZU19SRVNFUlZFRF9JTlZBTElEOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkRFRkFVTFQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkRFRkFVTFQ7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpNSUM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6Ok1JQzsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1VQTElOSzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfVVBMSU5LOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9ET1dOTElOSzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfRE9XTkxJTks7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ0FMTDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfQ0FMTDsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkNBTUNPUkRFUjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Q0FNQ09SREVSOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfUkVDT0dOSVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpSRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpSRU1PVEVfU1VCTUlYOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpVTlBST0NFU1NFRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6VU5QUk9DRVNTRUQ7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1BFUkZPUk1BTkNFOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpWT0lDRV9QRVJGT1JNQU5DRTsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6VUxUUkFTT1VORDsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6RUNIT19SRUZFUkVOQ0U7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkVDSE9fUkVGRVJFTkNFOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpGTV9UVU5FUjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Rk1fVFVORVI7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6SE9UV09SRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6SE9UV09SRDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTkwMiw4ICsxODIzLDggQEAKIC8vIFRoaXMgdHlwZSBpcyB1bm5hbWVkIGluIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLCB0aHVzIHdlIG5hbWUgaXQgaGVyZS4KIHVzaW5nIGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZSA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ6OnVzZWNhc2UpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZT4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUpIHsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dF91c2VjYXNlPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHRVc2VDYXNlKAorICAgICAgICBjb25zdCBBdWRpb1BvcnRNaXhFeHRVc2VDYXNlJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dF91c2VjYXNlIGxlZ2FjeTsKIAogICAgIHN3aXRjaCAocm9sZSkgewpAQCAtOTIwLDE2ICsxODQxLDE2IEBACiAKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U0lOSzoKICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgYnVnLiBBIFNJTksgcm9sZSBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGZpZWxkLgotICAgICAgICAgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoCisgICAgICAgICAgICBsZWdhY3kuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KAogICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHNvdXJjZSkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlPiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlKAorQ29udmVyc2lvblJlc3VsdDxBdWRpb1BvcnRNaXhFeHRVc2VDYXNlPiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRNaXhFeHRVc2VDYXNlKAogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2UmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlIGFpZGw7CisgICAgQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSBhaWRsOwogCiAgICAgc3dpdGNoIChyb2xlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX05PTkU6CkBAIC05NDMsNTIgKzE4NjQsNTMgQEAKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU0lOSzoKICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgYnVnLiBBIFNJTksgcm9sZSBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGZpZWxkLgogICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGxlZ2FjeS5zb3VyY2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGxlZ2FjeS5zb3VyY2UpKSk7CiAgICAgICAgICAgICByZXR1cm4gYWlkbDsKICAgICB9CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUpIHsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICBjb25zdCBBdWRpb1BvcnRNaXhFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMmIGFpZGxNaXhFeHQpIHsKICAgICBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGwuaHdNb2R1bGUpKTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbE1peEV4dC5od01vZHVsZSkpOwogICAgIGxlZ2FjeS5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChhaWRsLmhhbmRsZSkpOwotICAgIGxlZ2FjeS51c2VjYXNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UoYWlkbC51c2VjYXNlLCByb2xlKSk7CisgICAgbGVnYWN5LnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZShhaWRsLnVzZWNhc2UsIHJvbGUpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKLSAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dCBhaWRsOwotICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOwotICAgIGFpZGwuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOwotICAgIGFpZGwudXNlY2FzZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlKGxlZ2FjeS51c2VjYXNlLCByb2xlKSk7Ci0gICAgcmV0dXJuIGFpZGw7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgQXVkaW9Qb3J0TWl4RXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzKiBhaWRsTWl4RXh0KSB7CisgICAgYWlkbE1peEV4dC0+aHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwtPmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaGFuZGxlKSk7CisgICAgYWlkbC0+dXNlY2FzZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb1BvcnRNaXhFeHRVc2VDYXNlKGxlZ2FjeS51c2VjYXNlLCByb2xlKSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQmIGFpZGwpIHsKK2FpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoaW50MzJfdCBhaWRsKSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQgbGVnYWN5OwotICAgIGxlZ2FjeS5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwuc2Vzc2lvbikpOworICAgIGxlZ2FjeS5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCgKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X2ludDMyX3QoCiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCBhaWRsOwotICAgIGFpZGwuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpOwotICAgIHJldHVybiBhaWRsOworICAgIHJldHVybiBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbik7CiB9CiAKIC8vIFRoaXMgdHlwZSBpcyB1bm5hbWVkIGluIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLCB0aHVzIHdlIG5hbWUgaXQgaGVyZS4KIHVzaW5nIGF1ZGlvX3BvcnRfY29uZmlnX2V4dCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnOjpleHQpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnRXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlLAotICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0X2F1ZGlvX3BvcnRfY29uZmlnX2V4dCgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlLAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RXh0U3lzJiBhaWRsU3lzKSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfZXh0IGxlZ2FjeTsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6Tk9ORToKQEAgLTk5NywxNiArMTkxOSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFOgogICAgICAgICAgICAgbGVnYWN5LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0X2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSkpOworICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIGRldmljZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbFN5cywgZGV2aWNlKSkpKTsKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKICAgICAgICAgICAgIGxlZ2FjeS5taXggPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dChWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpLCByb2xlKSk7CisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpLCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbFN5cywgbWl4KSkpKTsKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OlNFU1NJT046CiAgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHNlc3Npb24pKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKIApAQCAtMTAxNCw5MCArMTkzOSwxMTMgQEAKICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ0V4dCgKLSAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRXh0IGFpZGw7Ci0KK3N0YXR1c190IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIEF1ZGlvUG9ydEV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydEV4dFN5cyogYWlkbFN5cykgewogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9OT05FOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHVuc3BlY2lmaWVkLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmRldmljZSkpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgbWl4LAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHQobGVnYWN5Lm1peCwgcm9sZSkpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKKyAgICAgICAgICAgIEF1ZGlvUG9ydERldmljZUV4dCBkZXZpY2U7CisgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzIGRldmljZVN5czsKKyAgICAgICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UsICZkZXZpY2UsICZkZXZpY2VTeXMpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgZGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCBkZXZpY2UsIGRldmljZVN5cyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CisgICAgICAgICAgICBBdWRpb1BvcnRNaXhFeHQgbWl4OworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyBtaXhTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydE1peEV4dChsZWdhY3kubWl4LCByb2xlLCAmbWl4LCAmbWl4U3lzKSk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGwsIG1peCwgbWl4KTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgbWl4LCBtaXhTeXMpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX1NFU1NJT046Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbikpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBzZXNzaW9uLCBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X2ludDMyX3QobGVnYWN5LnNlc3Npb24pKSk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGxTeXMsIHVuc3BlY2lmaWVkLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOyAvLyB3aXRoIC1XZXJyb3IsLVdzd2l0Y2ggbWF5IGNvbXBpbGUtdGltZSBmYWlsCiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWc+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZygKICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgYWlkbCkgewotICAgIGF1ZGlvX3BvcnRfY29uZmlnIGxlZ2FjeTsKLSAgICBsZWdhY3kuaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuaWQpKTsKLSAgICBsZWdhY3kucm9sZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KGFpZGwucm9sZSkpOwotICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QoYWlkbC50eXBlKSk7Ci0gICAgbGVnYWN5LmNvbmZpZ19tYXNrID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfY29uZmlnX21hc2soYWlkbC5jb25maWdNYXNrKSk7Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpTQU1QTEVfUkFURSkpIHsKLSAgICAgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGFpZGwuc2FtcGxlUmF0ZSkpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIGxlZ2FjeXt9OworICAgIGxlZ2FjeS5pZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5oYWwuaWQpKTsKKyAgICBsZWdhY3kucm9sZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KGFpZGwuc3lzLnJvbGUpKTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwuc3lzLnR5cGUpKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPQorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihhaWRsLnN5cy5yb2xlLCBhaWRsLnN5cy50eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKKyAgICBpZiAoYWlkbC5oYWwuc2FtcGxlUmF0ZS5oYXNfdmFsdWUoKSkgeworICAgICAgICBsZWdhY3kuc2FtcGxlX3JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5oYWwuc2FtcGxlUmF0ZS52YWx1ZSgpLnZhbHVlKSk7CisgICAgICAgIGxlZ2FjeS5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURTsKICAgICB9Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpDSEFOTkVMX01BU0spKSB7CisgICAgaWYgKGFpZGwuaGFsLmNoYW5uZWxNYXNrLmhhc192YWx1ZSgpKSB7CiAgICAgICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwuaGFsLmNoYW5uZWxNYXNrLnZhbHVlKCksIGlzSW5wdXQpKTsKKyAgICAgICAgbGVnYWN5LmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSzsKICAgICB9Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGT1JNQVQpKSB7Ci0gICAgICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICBpZiAoYWlkbC5oYWwuZm9ybWF0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChhaWRsLmhhbC5mb3JtYXQudmFsdWUoKSkpOworICAgICAgICBsZWdhY3kuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRk9STUFUOwogICAgIH0KLSAgICBpZiAoYml0bWFza0lzU2V0KGFpZGwuY29uZmlnTWFzaywgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkdBSU4pKSB7Ci0gICAgICAgIGxlZ2FjeS5nYWluID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZyhhaWRsLmdhaW4sIGFpZGwucm9sZSwgYWlkbC50eXBlKSk7CisgICAgaWYgKGFpZGwuaGFsLmdhaW4uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbGVnYWN5LmdhaW4gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9HYWluQ29uZmlnX2F1ZGlvX2dhaW5fY29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbC5oYWwuZ2Fpbi52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgICAgIGxlZ2FjeS5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19HQUlOOwogICAgIH0KLSAgICBpZiAoYml0bWFza0lzU2V0KGFpZGwuY29uZmlnTWFzaywgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZMQUdTKSkgeworICAgIGlmIChhaWRsLmhhbC5mbGFncy5oYXNfdmFsdWUoKSkgewogICAgICAgICBsZWdhY3kuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKGFpZGwuZmxhZ3MsIGFpZGwucm9sZSwgYWlkbC50eXBlKSk7CisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKGFpZGwuaGFsLmZsYWdzLnZhbHVlKCksIGlzSW5wdXQpKTsKKyAgICAgICAgbGVnYWN5LmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOwogICAgIH0KLSAgICBsZWdhY3kuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0V4dChhaWRsLmV4dCwgYWlkbC50eXBlLCBhaWRsLnJvbGUpKTsKKyAgICBsZWdhY3kuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0X2F1ZGlvX3BvcnRfY29uZmlnX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5oYWwuZXh0LCBhaWRsLnN5cy50eXBlLCBhaWRsLnN5cy5yb2xlLCBhaWRsLnN5cy5leHQpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCiBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX0F1ZGlvUG9ydENvbmZpZygKICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcmIGxlZ2FjeSkgewogICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWcgYWlkbDsKLSAgICBhaWRsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKLSAgICBhaWRsLnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShsZWdhY3kucm9sZSkpOwotICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKGxlZ2FjeS50eXBlKSk7Ci0gICAgYWlkbC5jb25maWdNYXNrID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2NvbmZpZ19tYXNrX2ludDMyX3QobGVnYWN5LmNvbmZpZ19tYXNrKSk7CisgICAgYWlkbC5oYWwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5pZCkpOworICAgIGFpZGwuc3lzLnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShsZWdhY3kucm9sZSkpOworICAgIGFpZGwuc3lzLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShsZWdhY3kudHlwZSkpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGRpcmVjdGlvbihsZWdhY3kucm9sZSwgbGVnYWN5LnR5cGUpKSA9PSBEaXJlY3Rpb246OklOUFVUOwogICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewotICAgICAgICBhaWRsLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOworICAgICAgICBJbnQgYWlkbF9zYW1wbGVSYXRlOworICAgICAgICBhaWRsX3NhbXBsZVJhdGUudmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOworICAgICAgICBhaWRsLmhhbC5zYW1wbGVSYXRlID0gYWlkbF9zYW1wbGVSYXRlOwogICAgIH0KICAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7Ci0gICAgICAgIGFpZGwuY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKKyAgICAgICAgYWlkbC5oYWwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KGxlZ2FjeS5jaGFubmVsX21hc2ssIGlzSW5wdXQpKTsKICAgICB9CiAgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgewotICAgICAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChsZWdhY3kuZm9ybWF0KSk7CisgICAgICAgIGFpZGwuaGFsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGxlZ2FjeS5mb3JtYXQpKTsKICAgICB9CiAgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgYWlkbC5nYWluID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKLSAgICAgICAgICAgICAgICBsZWdhY3kuZ2FpbiwgbGVnYWN5LnJvbGUsIGxlZ2FjeS50eXBlKSk7CisgICAgICAgIGFpZGwuaGFsLmdhaW4gPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKGxlZ2FjeS5nYWluLCBpc0lucHV0KSk7CiAgICAgfQogICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgewotICAgICAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncyhsZWdhY3kuZmxhZ3MsIGxlZ2FjeS5yb2xlLCBsZWdhY3kudHlwZSkpOworICAgICAgICBhaWRsLmhhbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MobGVnYWN5LmZsYWdzLCBpc0lucHV0KSk7CiAgICAgfQotICAgIGFpZGwuZXh0ID0KLSAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUsIGxlZ2FjeS5yb2xlKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dChsZWdhY3kuZXh0LCBsZWdhY3kudHlwZSwgbGVnYWN5LnJvbGUsCisgICAgICAgICAgICAgICAgICAgICZhaWRsLmhhbC5leHQsICZhaWRsLnN5cy5leHQpKTsKICAgICByZXR1cm4gYWlkbDsKIH0KIApAQCAtMTE0OCwzMyArMjA5Niw0MCBAQAogCiBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvSW9EZXNjcmlwdG9yPj4gYWlkbDJsZWdhY3lfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvciYgYWlkbCkgewotICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBsZWdhY3kobmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCkpOwotICAgIGxlZ2FjeS0+bUlvSGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5pb0hhbmRsZSkpOwotICAgIGxlZ2FjeS0+bVBhdGNoID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2goYWlkbC5wYXRjaCkpOwotICAgIGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuc2FtcGxpbmdSYXRlKSk7Ci0gICAgbGVnYWN5LT5tRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7Ci0gICAgbGVnYWN5LT5tQ2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOwotICAgIGxlZ2FjeS0+bUZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50KSk7Ci0gICAgbGVnYWN5LT5tRnJhbWVDb3VudEhBTCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLmZyYW1lQ291bnRIQUwpKTsKLSAgICBsZWdhY3ktPm1MYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5sYXRlbmN5KSk7Ci0gICAgbGVnYWN5LT5tUG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnBvcnRJZCkpOwotICAgIHJldHVybiBsZWdhY3k7CisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChhaWRsLmlvSGFuZGxlKSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9QYXRjaF9hdWRpb19wYXRjaChhaWRsLnBhdGNoKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gYWlkbC5pc0lucHV0OworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsaW5nX3JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsaW5nUmF0ZSkpOworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaywgaXNJbnB1dCkpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZV9jb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLmZyYW1lQ291bnQpKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVfY291bnRfaGFsID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudEhBTCkpOworICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3kgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmxhdGVuY3kpKTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRfaWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKKyAgICByZXR1cm4gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKGlvX2hhbmRsZSwgcGF0Y2gsIGlzSW5wdXQsIHNhbXBsaW5nX3JhdGUsIGZvcm1hdCwKKyAgICAgICAgICAgIGNoYW5uZWxfbWFzaywgZnJhbWVfY291bnQsIGZyYW1lX2NvdW50X2hhbCwgbGF0ZW5jeSwgcG9ydF9pZCk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yPiBsZWdhY3kyYWlkbF9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcigKICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBsZWdhY3kpIHsKICAgICBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3IgYWlkbDsKLSAgICBhaWRsLmlvSGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LT5tSW9IYW5kbGUpKTsKLSAgICBhaWRsLnBhdGNoID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX0F1ZGlvUGF0Y2gobGVnYWN5LT5tUGF0Y2gpKTsKLSAgICBhaWRsLnNhbXBsaW5nUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LT5tU2FtcGxpbmdSYXRlKSk7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LT5tRm9ybWF0KSk7Ci0gICAgYWlkbC5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobGVnYWN5LT5tQ2hhbm5lbE1hc2spKTsKLSAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS0+bUZyYW1lQ291bnQpKTsKLSAgICBhaWRsLmZyYW1lQ291bnRIQUwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS0+bUZyYW1lQ291bnRIQUwpKTsKLSAgICBhaWRsLmxhdGVuY3kgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+bUxhdGVuY3kpKTsKLSAgICBhaWRsLnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LT5tUG9ydElkKSk7CisgICAgYWlkbC5pb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+Z2V0SW9IYW5kbGUoKSkpOworICAgIGFpZGwucGF0Y2ggPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfQXVkaW9QYXRjaChsZWdhY3ktPmdldFBhdGNoKCkpKTsKKyAgICBhaWRsLmlzSW5wdXQgPSBsZWdhY3ktPmdldElzSW5wdXQoKTsKKyAgICBhaWRsLnNhbXBsaW5nUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LT5nZXRTYW1wbGluZ1JhdGUoKSkpOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihsZWdhY3ktPmdldEZvcm1hdCgpKSk7CisgICAgYWlkbC5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS0+Z2V0Q2hhbm5lbE1hc2soKSwgbGVnYWN5LT5nZXRJc0lucHV0KCkpKTsKKyAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS0+Z2V0RnJhbWVDb3VudCgpKSk7CisgICAgYWlkbC5mcmFtZUNvdW50SEFMID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPmdldEZyYW1lQ291bnRIQUwoKSkpOworICAgIGFpZGwubGF0ZW5jeSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LT5nZXRMYXRlbmN5KCkpKTsKKyAgICBhaWRsLnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LT5nZXRQb3J0SWQoKSkpOwogICAgIHJldHVybiBhaWRsOwogfQogCkBAIC0xMTk1LDEzNyArMjE1MCwxNDMgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb250ZW50X3R5cGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QobWVkaWE6OkF1ZGlvQ29udGVudFR5cGUgYWlkbCkgeworYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdChBdWRpb0NvbnRlbnRUeXBlIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6VU5LTk9XTjoKKyAgICAgICAgY2FzZSBBdWRpb0NvbnRlbnRUeXBlOjpVTktOT1dOOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTUEVFQ0g6CisgICAgICAgIGNhc2UgQXVkaW9Db250ZW50VHlwZTo6U1BFRUNIOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6Ok1VU0lDOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6Ok1VU0lDOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6TU9WSUU6CisgICAgICAgIGNhc2UgQXVkaW9Db250ZW50VHlwZTo6TU9WSUU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ09OVEVOVF9UWVBFX01PVklFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTT05JRklDQVRJT046CisgICAgICAgIGNhc2UgQXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIGNhc2UgQXVkaW9Db250ZW50VHlwZTo6VUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfVUxUUkFTT1VORDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db250ZW50VHlwZT4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Db250ZW50VHlwZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbnRlbnRfdHlwZV90X0F1ZGlvQ29udGVudFR5cGUoYXVkaW9fY29udGVudF90eXBlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6VU5LTk9XTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NvbnRlbnRUeXBlOjpVTktOT1dOOwogICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlNQRUVDSDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NvbnRlbnRUeXBlOjpTUEVFQ0g7CiAgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzsKICAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfTU9WSUU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOwogICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlNPTklGSUNBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NvbnRlbnRUeXBlOjpTT05JRklDQVRJT047CisgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6VUxUUkFTT1VORDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb191c2FnZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Vc2FnZV9hdWRpb191c2FnZV90KG1lZGlhOjpBdWRpb1VzYWdlIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChBdWRpb1VzYWdlIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6VU5LTk9XTjoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpJTlZBTElEOgorICAgICAgICAgICAgYnJlYWs7ICAvLyByZXR1cm4gZXJyb3IKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpVTktOT1dOOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1VOS05PV047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok1FRElBOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6Ok1FRElBOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX01FRElBOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT046CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFMQVJNOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkFMQVJNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FMQVJNOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6U1lTX1JFU0VSVkVEX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpTWVNfUkVTRVJWRURfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlNZU19SRVNFUlZFRF9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpHQU1FOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkdBTUU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfR0FNRTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOVDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBU1NJU1RBTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQVNTSVNUQU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6RU1FUkdFTkNZOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkVNRVJHRU5DWToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9FTUVSR0VOQ1k7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlNBRkVUWToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpTQUZFVFk6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfU0FGRVRZOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9WRUhJQ0xFX1NUQVRVUzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QU5OT1VOQ0VNRU5UOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BTk5PVU5DRU1FTlQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXNhZ2U+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvVXNhZ2U+CiBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UoYXVkaW9fdXNhZ2VfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlVOS05PV047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6VU5LTk9XTjsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6TUVESUE7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6TUVESUE7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QUxBUk07CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6QUxBUk07CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlNZU19SRVNFUlZFRF9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6U1lTX1JFU0VSVkVEX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpTWVNfUkVTRVJWRURfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9FVkVOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9TT05JRklDQVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6R0FNRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpHQU1FOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpWSVJUVUFMX1NPVVJDRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpWSVJUVUFMX1NPVVJDRTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpBU1NJU1RBTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkNBTExfQVNTSVNUQU5UOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkNBTExfQVNTSVNUQU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0VNRVJHRU5DWToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6RU1FUkdFTkNZOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkVNRVJHRU5DWTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9TQUZFVFk6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlNBRkVUWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpTQUZFVFk7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVkVISUNMRV9TVEFUVVM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZFSElDTEVfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlZFSElDTEVfU1RBVFVTOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FOTk9VTkNFTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QU5OT1VOQ0VNRU5UOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTEzNjEsNiArMjMyMiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkU7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6Q0FQVFVSRV9QUklWQVRFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkNPTlRFTlRfU1BBVElBTElaRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19DT05URU5UX1NQQVRJQUxJWkVEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6Ok5FVkVSX1NQQVRJQUxJWkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19ORVZFUl9TUEFUSUFMSVpFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkNBTExfUkVESVJFQ1RJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQpAQCAtMTM5OCw2ICsyMzY1LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6Tk9fU1lTVEVNX0NBUFRVUkU7CiAgICAgICAgIGNhc2UgQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEU6CiAgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6Q0FQVFVSRV9QUklWQVRFOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpDT05URU5UX1NQQVRJQUxJWkVEOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpORVZFUl9TUEFUSUFMSVpFOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQ0FMTF9SRURJUkVDVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpDQUxMX1JFRElSRUNUSU9OOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQpAQCAtMTQyMyw3ICsyMzk2LDcgQEAKICAgICBsZWdhY3kuY29udGVudF90eXBlID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdChhaWRsLmNvbnRlbnRUeXBlKSk7CiAgICAgbGVnYWN5LnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChhaWRsLnVzYWdlKSk7Ci0gICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYWlkbC5zb3VyY2UpKTsKKyAgICBsZWdhY3kuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGFpZGwuc291cmNlKSk7CiAgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZmxhZ3NfbWFza190X21hc2soYWlkbC5mbGFncykpOwogICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC50YWdzLCBsZWdhY3kudGFncywgc2l6ZW9mKGxlZ2FjeS50YWdzKSkpOwogICAgIHJldHVybiBsZWdhY3k7CkBAIC0xNDM1LDUxICsyNDA4LDUxIEBACiAgICAgYWlkbC5jb250ZW50VHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbnRlbnRfdHlwZV90X0F1ZGlvQ29udGVudFR5cGUobGVnYWN5LmNvbnRlbnRfdHlwZSkpOwogICAgIGFpZGwudXNhZ2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKGxlZ2FjeS51c2FnZSkpOwotICAgIGFpZGwuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kuc291cmNlKSk7CisgICAgYWlkbC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UobGVnYWN5LnNvdXJjZSkpOwogICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhsZWdhY3kuZmxhZ3MpKTsKICAgICBhaWRsLnRhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS50YWdzLCBzaXplb2YobGVnYWN5LnRhZ3MpKSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QoQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6Ok5PTkU6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6SU5WQUxJRDoKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gcmV0dXJuIGVycm9yCisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6Tk9ORToKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfTk9ORTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6RUxFTUVOVEFSWV9TVFJFQU06CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6RUxFTUVOVEFSWV9TVFJFQU06CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0VMRU1FTlRBUllfU1RSRUFNOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpIQU5ETEU6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6SEFORExFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9IQU5ETEU7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+CiBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlKGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX05PTkU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6Ok5PTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6Tk9ORTsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfRUxFTUVOVEFSWV9TVFJFQU06Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOwogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9IQU5ETEU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkhBTkRMRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpIQU5ETEU7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb2ZmbG9hZF9pbmZvX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRJbmZvX2F1ZGlvX29mZmxvYWRfaW5mb190KGNvbnN0IG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvJiBhaWRsKSB7Ci0gICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgbGVnYWN5OwotICAgIGxlZ2FjeS52ZXJzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MTZfdD4oYWlkbC52ZXJzaW9uKSk7Ci0gICAgbGVnYWN5LnNpemUgPSBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpOwotICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoYWlkbC5jb25maWcpKTsKLSAgICBsZWdhY3kuc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgbGVnYWN5LmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CithaWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRJbmZvX2F1ZGlvX29mZmxvYWRfaW5mb190KGNvbnN0IEF1ZGlvT2ZmbG9hZEluZm8mIGFpZGwpIHsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBsZWdhY3kgPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgYmFzZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuYmFzZSwgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICBsZWdhY3kuc2FtcGxlX3JhdGUgPSBiYXNlLnNhbXBsZV9yYXRlOworICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBiYXNlLmNoYW5uZWxfbWFzazsKKyAgICBsZWdhY3kuZm9ybWF0ID0gYmFzZS5mb3JtYXQ7CiAgICAgbGVnYWN5LnN0cmVhbV90eXBlID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3QoYWlkbC5zdHJlYW1UeXBlKSk7Ci0gICAgbGVnYWN5LmJpdF9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5iaXRSYXRlKSk7CisgICAgbGVnYWN5LmJpdF9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5iaXRSYXRlUGVyU2Vjb25kKSk7CiAgICAgbGVnYWN5LmR1cmF0aW9uX3VzID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihhaWRsLmR1cmF0aW9uVXMpKTsKICAgICBsZWdhY3kuaGFzX3ZpZGVvID0gYWlkbC5oYXNWaWRlbzsKICAgICBsZWdhY3kuaXNfc3RyZWFtaW5nID0gYWlkbC5pc1N0cmVhbWluZzsKQEAgLTE0OTMsMjEgKzI0NjYsMjAgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb09mZmxvYWRJbmZvPgogbGVnYWN5MmFpZGxfYXVkaW9fb2ZmbG9hZF9pbmZvX3RfQXVkaW9PZmZsb2FkSW5mbyhjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8gYWlkbDsKKyAgICBBdWRpb09mZmxvYWRJbmZvIGFpZGw7CiAgICAgLy8gVmVyc2lvbiAwLjEgZmllbGRzLgogICAgIGlmIChsZWdhY3kuc2l6ZSA8IG9mZnNldG9mKGF1ZGlvX29mZmxvYWRfaW5mb190LCB1c2FnZSkgKyBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3Q6OnVzYWdlKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KLSAgICBhaWRsLnZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS52ZXJzaW9uKSk7Ci0gICAgYWlkbC5jb25maWcuc2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnNhbXBsZV9yYXRlKSk7Ci0gICAgYWlkbC5jb25maWcuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKLSAgICBhaWRsLmNvbmZpZy5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgYmFzZSA9IHsgLnNhbXBsZV9yYXRlID0gbGVnYWN5LnNhbXBsZV9yYXRlLAorICAgICAgICAuY2hhbm5lbF9tYXNrID0gbGVnYWN5LmNoYW5uZWxfbWFzaywgLmZvcm1hdCA9IGxlZ2FjeS5mb3JtYXQgfTsKKyAgICBhaWRsLmJhc2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoCisgICAgICAgICAgICAgICAgICAgIGJhc2UsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYWlkbC5zdHJlYW1UeXBlID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUobGVnYWN5LnN0cmVhbV90eXBlKSk7Ci0gICAgYWlkbC5iaXRSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuYml0X3JhdGUpKTsKKyAgICBhaWRsLmJpdFJhdGVQZXJTZWNvbmQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5iaXRfcmF0ZSkpOwogICAgIGFpZGwuZHVyYXRpb25VcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LmR1cmF0aW9uX3VzKSk7CiAgICAgYWlkbC5oYXNWaWRlbyA9IGxlZ2FjeS5oYXNfdmlkZW87CiAgICAgYWlkbC5pc1N0cmVhbWluZyA9IGxlZ2FjeS5pc19zdHJlYW1pbmc7CkBAIC0xNTMxLDI1ICsyNTAzLDI1IEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGFpZGwpIHsKLSAgICBhdWRpb19jb25maWdfdCBsZWdhY3k7Ci0gICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7Ci0gICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOwotICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbnN0IEF1ZGlvQ29uZmlnJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGxlZ2FjeUJhc2UgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmJhc2UsIGlzSW5wdXQpKTsKKyAgICBhdWRpb19jb25maWdfdCBsZWdhY3kgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gbGVnYWN5QmFzZS5zYW1wbGVfcmF0ZTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gbGVnYWN5QmFzZS5jaGFubmVsX21hc2s7CisgICAgbGVnYWN5LmZvcm1hdCA9IGxlZ2FjeUJhc2UuZm9ybWF0OwogICAgIGxlZ2FjeS5vZmZsb2FkX2luZm8gPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRJbmZvX2F1ZGlvX29mZmxvYWRfaW5mb190KGFpZGwub2ZmbG9hZEluZm8pKTsKICAgICBsZWdhY3kuZnJhbWVfY291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmZyYW1lQ291bnQpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZz4KLWxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Db25maWcgYWlkbDsKLSAgICBhaWRsLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOwotICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKLSAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChsZWdhY3kuZm9ybWF0KSk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ29uZmlnPgorbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uc3QgYXVkaW9fY29uZmlnX3QmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBiYXNlID0geyAuc2FtcGxlX3JhdGUgPSBsZWdhY3kuc2FtcGxlX3JhdGUsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBsZWdhY3kuY2hhbm5lbF9tYXNrLCAuZm9ybWF0ID0gbGVnYWN5LmZvcm1hdCB9OworICAgIEF1ZGlvQ29uZmlnIGFpZGw7CisgICAgYWlkbC5iYXNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGJhc2UsIGlzSW5wdXQpKTsKICAgICBhaWRsLm9mZmxvYWRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fb2ZmbG9hZF9pbmZvX3RfQXVkaW9PZmZsb2FkSW5mbyhsZWdhY3kub2ZmbG9hZF9pbmZvKSk7CiAgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3kuZnJhbWVfY291bnQpKTsKQEAgLTE1NTcsMjIgKzI1MjksMjIgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb25maWdfYmFzZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgYWlkbCkgeworYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uc3QgQXVkaW9Db25maWdCYXNlJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKICAgICBhdWRpb19jb25maWdfYmFzZV90IGxlZ2FjeTsKICAgICBsZWdhY3kuc2FtcGxlX3JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsZVJhdGUpKTsKICAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrKSk7Ci0gICAgbGVnYWN5LmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2ssIGlzSW5wdXQpKTsKKyAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2U+Ci1sZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGFpZGw7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ29uZmlnQmFzZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgQXVkaW9Db25maWdCYXNlIGFpZGw7CiAgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKICAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KGxlZ2FjeS5jaGFubmVsX21hc2ssIGlzSW5wdXQpKTsKKyAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGxlZ2FjeS5mb3JtYXQpKTsKICAgICByZXR1cm4gYWlkbDsKIH0KIApAQCAtMTYzMSw3ICsyNjAzLDcgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb191dWlkX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QoY29uc3QgQXVkaW9VdWlkJiBhaWRsKSB7CiAgICAgYXVkaW9fdXVpZF90IGxlZ2FjeTsKICAgICBsZWdhY3kudGltZUxvdyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0UmVpbnRlcnByZXQ8dWludDMyX3Q+KGFpZGwudGltZUxvdykpOwogICAgIGxlZ2FjeS50aW1lTWlkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MTZfdD4oYWlkbC50aW1lTWlkKSk7CkBAIC0xNjQ0LDkgKzI2MTYsOSBAQAogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXVpZD4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9VdWlkPgogbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZChjb25zdCBhdWRpb191dWlkX3QmIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb1V1aWQgYWlkbDsKKyAgICBBdWRpb1V1aWQgYWlkbDsKICAgICBhaWRsLnRpbWVMb3cgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeS50aW1lTG93KSk7CiAgICAgYWlkbC50aW1lTWlkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudGltZU1pZCkpOwogICAgIGFpZGwudGltZUhpQW5kVmVyc2lvbiA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnRpbWVIaUFuZFZlcnNpb24pKTsKQEAgLTE2ODcsMjggKzI2NTksMjggQEAKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4KIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSBhaWRsKSB7CisgICAgICAgIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6Tk9ORToKKyAgICAgICAgY2FzZSBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6Ok5PTkU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX05PTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RlJBTUVXT1JLX1RVTkVSOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RlJBTUVXT1JLX1RVTkVSOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9GUkFNRVdPUktfVFVORVI7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RFZCX0FEX0RFU0NSSVBUT1I6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpEVkJfQURfREVTQ1JJUFRPUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRFZCX0FEX0RFU0NSSVBUT1I7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlKAogICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6Ok5PTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOwogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9GUkFNRVdPUktfVFVORVI6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RlJBTUVXT1JLX1RVTkVSOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RlJBTUVXT1JLX1RVTkVSOwogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9EVkJfQURfREVTQ1JJUFRPUjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpEVkJfQURfREVTQ1JJUFRPUjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkRWQl9BRF9ERVNDUklQVE9SOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQpAQCAtMTcxOCw5ICsyNjkwLDkgQEAKICAgICByZXR1cm4gY29udmVydEJpdG1hc2s8dWludDMyX3QsCiAgICAgICAgICAgICBpbnQzMl90LAogICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QsCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4oCisgICAgICAgICAgICBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPigKICAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QsCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4sCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPiwKICAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8dWludDMyX3QsIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90Pik7CiB9CiAKQEAgLTE3MjgsMTEgKzI3MDAsMTEgQEAKIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayh1aW50MzJfdCBsZWdhY3kpIHsKICAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwKICAgICAgICAgICAgIHVpbnQzMl90LAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUsCisgICAgICAgICAgICBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLAogICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+KAogICAgICAgICAgICAgbGVnYWN5LCBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLAogICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8YXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+LAotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4pOworICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPik7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CkBAIC0xNzQwLDkgKzI3MTIsOSBAQAogICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1aW50MzJfdCwKICAgICAgICAgICAgIGludDMyX3QsCiAgICAgICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCwKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+KAorICAgICAgICAgICAgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPigKICAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCwKLSAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPiwKICAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8dWludDMyX3QsIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90Pik7CiB9CiAKQEAgLTE3NTAsMTA0ICsyNzIyLDc5IEBACiBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayh1aW50MzJfdCBsZWdhY3kpIHsKICAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwKICAgICAgICAgICAgIHVpbnQzMl90LAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSwKKyAgICAgICAgICAgIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSwKICAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PigKICAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLAogICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8YXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+LAotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPik7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdD4KLWFpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcyBhaWRsKSB7Ci0gICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOjpMT1c6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTEFURU5DWV9MT1c7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOjpOT1JNQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTEFURU5DWV9OT1JNQUw7Ci0gICAgfQotICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzPgotbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcygKLSAgICAgICAgYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdCBsZWdhY3kpIHsKLSAgICBzd2l0Y2ggKGxlZ2FjeSkgewotICAgICAgICBjYXNlIEFVRElPX0xBVEVOQ1lfTE9XOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6TE9XOwotICAgICAgICBjYXNlIEFVRElPX0xBVEVOQ1lfTk9STUFMOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6Tk9STUFMOwotICAgIH0KLSAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+KTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2RldmljZV9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoCisgICAgICAgIGNvbnN0IEF1ZGlvUG9ydERldmljZUV4dCYgYWlkbCwgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyYgYWlkbFN5cykgewogICAgIGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7Ci0gICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC5kZXZpY2UudHlwZSkpOwotICAgIFJFVFVSTl9JRl9FUlJPUigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLmRldmljZS5hZGRyZXNzLCBsZWdhY3kuYWRkcmVzcywgc2l6ZW9mKGxlZ2FjeS5hZGRyZXNzKSkpOworICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsU3lzLmh3TW9kdWxlKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5kZXZpY2UsICZsZWdhY3kudHlwZSwgbGVnYWN5LmFkZHJlc3MpKTsKICAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhhaWRsLmVuY2Fwc3VsYXRpb25Nb2RlcykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGFpZGxTeXMuZW5jYXBzdWxhdGlvbk1vZGVzKSk7CiAgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZXMgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhhaWRsLmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgYWlkbFN5cy5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoY29uc3QgYXVkaW9fcG9ydF9kZXZpY2VfZXh0JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0IGFpZGw7Ci0gICAgYWlkbC5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7Ci0gICAgYWlkbC5kZXZpY2UudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChsZWdhY3kudHlwZSkpOwotICAgIGFpZGwuZGV2aWNlLmFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5LmFkZHJlc3MsIHNpemVvZihsZWdhY3kuYWRkcmVzcykpKTsKLSAgICBhaWRsLmVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTigKK3N0YXR1c190IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCYgbGVnYWN5LAorICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMqIGFpZGxEZXZpY2VFeHQpIHsKKyAgICBhaWRsRGV2aWNlRXh0LT5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7CisgICAgYWlkbC0+ZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZShsZWdhY3kudHlwZSwgbGVnYWN5LmFkZHJlc3MpKTsKKyAgICBhaWRsRGV2aWNlRXh0LT5lbmNhcHN1bGF0aW9uTW9kZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21vZGVzKSk7Ci0gICAgYWlkbC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICBhaWRsRGV2aWNlRXh0LT5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhsZWdhY3kuZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlcykpOwotICAgIHJldHVybiBhaWRsOworICAgIHJldHVybiBPSzsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X21peF9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHRfYXVkaW9fcG9ydF9taXhfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQmIGFpZGwpIHsKLSAgICBhdWRpb19wb3J0X21peF9leHQgbGVnYWN5OwotICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbC5od01vZHVsZSkpOworYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dCgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0TWl4RXh0JiBhaWRsLCBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzJiBhaWRsU3lzKSB7CisgICAgYXVkaW9fcG9ydF9taXhfZXh0IGxlZ2FjeXt9OworICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbFN5cy5od01vZHVsZSkpOwogICAgIGxlZ2FjeS5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChhaWRsLmhhbmRsZSkpOwotICAgIGxlZ2FjeS5sYXRlbmN5X2NsYXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9NaXhMYXRlbmN5Q2xhc3NfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdChhaWRsLmxhdGVuY3lDbGFzcykpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydE1peEV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoY29uc3QgYXVkaW9fcG9ydF9taXhfZXh0JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0IGFpZGw7Ci0gICAgYWlkbC5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7Ci0gICAgYWlkbC5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaGFuZGxlKSk7Ci0gICAgYWlkbC5sYXRlbmN5Q2xhc3MgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzKGxlZ2FjeS5sYXRlbmN5X2NsYXNzKSk7Ci0gICAgcmV0dXJuIGFpZGw7CitzdGF0dXNfdAorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9taXhfZXh0X0F1ZGlvUG9ydE1peEV4dChjb25zdCBhdWRpb19wb3J0X21peF9leHQmIGxlZ2FjeSwKKyAgICAgICAgQXVkaW9Qb3J0TWl4RXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzKiBhaWRsTWl4RXh0KSB7CisgICAgYWlkbE1peEV4dC0+aHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwtPmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaGFuZGxlKSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnRTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQmIGFpZGwpIHsKK2FpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dChpbnQzMl90IGFpZGwpIHsKICAgICBhdWRpb19wb3J0X3Nlc3Npb25fZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb24pKTsKKyAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0U2Vzc2lvbkV4dChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dCBhaWRsOwotICAgIGFpZGwuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpOwotICAgIHJldHVybiBhaWRsOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dF9pbnQzMl90KGNvbnN0IGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQmIGxlZ2FjeSkgeworICAgIHJldHVybiBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbik7CiB9CiAKIC8vIFRoaXMgdHlwZSBpcyB1bm5hbWVkIGluIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLCB0aHVzIHdlIG5hbWUgaXQgaGVyZS4KIHVzaW5nIGF1ZGlvX3BvcnRfdjdfZXh0ID0gZGVjbHR5cGUoYXVkaW9fcG9ydF92Nzo6ZXh0KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdjdfZXh0PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRFeHRfYXVkaW9fcG9ydF92N19leHQoCisgICAgICAgIGNvbnN0IEF1ZGlvUG9ydEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydEV4dFN5cyYgYWlkbFN5cykgewogICAgIGF1ZGlvX3BvcnRfdjdfZXh0IGxlZ2FjeTsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6Tk9ORToKQEAgLTE4NTcsNjYgKzI4MDQsODMgQEAKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFOgogICAgICAgICAgICAgbGVnYWN5LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfZGV2aWNlX2V4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIGRldmljZSkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIGRldmljZSkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpNSVg6CiAgICAgICAgICAgICBsZWdhY3kubWl4ID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHRfYXVkaW9fcG9ydF9taXhfZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgbWl4KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbFN5cywgbWl4KSkpKTsKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OlNFU1NJT046Ci0gICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc2Vzc2lvbikpKSk7CisgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc2Vzc2lvbikpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogCiAgICAgfQogICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOyAvLyB3aXRoIC1XZXJyb3IsLVdzd2l0Y2ggbWF5IGNvbXBpbGUtdGltZSBmYWlsCiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydEV4dD4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0RXh0KAotICAgICAgICBjb25zdCBhdWRpb19wb3J0X3Y3X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydEV4dCBhaWRsOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0RXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X3Y3X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICBBdWRpb1BvcnRFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRFeHRTeXMqIGFpZGxTeXMpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTk9ORToKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGFpZGw7Ci0gICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dChsZWdhY3kuZGV2aWNlKSkpOwotICAgICAgICAgICAgcmV0dXJuIGFpZGw7Ci0gICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDoKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBtaXgsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQobGVnYWN5Lm1peCkpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKKyAgICAgICAgICAgIEF1ZGlvUG9ydERldmljZUV4dCBkZXZpY2U7CisgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzIGRldmljZVN5czsKKyAgICAgICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmRldmljZSwgJmRldmljZSwgJmRldmljZVN5cykpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBkZXZpY2UsIGRldmljZSk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGxTeXMsIGRldmljZSwgZGV2aWNlU3lzKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKKyAgICAgICAgICAgIEF1ZGlvUG9ydE1peEV4dCBtaXg7CisgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzIG1peFN5czsKKyAgICAgICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5Lm1peCwgJm1peCwgJm1peFN5cykpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBtaXgsIG1peCk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGxTeXMsIG1peCwgbWl4U3lzKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0U2Vzc2lvbkV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5zZXNzaW9uKSkpOwotICAgICAgICAgICAgcmV0dXJuIGFpZGw7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGwsIHNlc3Npb24sIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dF9pbnQzMl90KGxlZ2FjeS5zZXNzaW9uKSkpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3Byb2ZpbGU+Ci1haWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZShjb25zdCBBdWRpb1Byb2ZpbGUmIGFpZGwsIGJvb2wgaXNJbnB1dCkgewogICAgIGF1ZGlvX3Byb2ZpbGUgbGVnYWN5OwotICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKIAotICAgIGlmIChhaWRsLnNhbXBsaW5nUmF0ZXMuc2l6ZSgpID4gc3RkOjpzaXplKGxlZ2FjeS5zYW1wbGVfcmF0ZXMpKSB7CisgICAgaWYgKGFpZGwuc2FtcGxlUmF0ZXMuc2l6ZSgpID4gc3RkOjpzaXplKGxlZ2FjeS5zYW1wbGVfcmF0ZXMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIFJFVFVSTl9JRl9FUlJPUigKLSAgICAgICAgICAgIGNvbnZlcnRSYW5nZShhaWRsLnNhbXBsaW5nUmF0ZXMuYmVnaW4oKSwgYWlkbC5zYW1wbGluZ1JhdGVzLmVuZCgpLCBsZWdhY3kuc2FtcGxlX3JhdGVzLAorICAgICAgICAgICAgY29udmVydFJhbmdlKGFpZGwuc2FtcGxlUmF0ZXMuYmVnaW4oKSwgYWlkbC5zYW1wbGVSYXRlcy5lbmQoKSwgbGVnYWN5LnNhbXBsZV9yYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdCwgdW5zaWduZWQgaW50PikpOwotICAgIGxlZ2FjeS5udW1fc2FtcGxlX3JhdGVzID0gYWlkbC5zYW1wbGluZ1JhdGVzLnNpemUoKTsKKyAgICBsZWdhY3kubnVtX3NhbXBsZV9yYXRlcyA9IGFpZGwuc2FtcGxlUmF0ZXMuc2l6ZSgpOwogCiAgICAgaWYgKGFpZGwuY2hhbm5lbE1hc2tzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuY2hhbm5lbF9tYXNrcykpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgUkVUVVJOX0lGX0VSUk9SKAogICAgICAgICAgICAgY29udmVydFJhbmdlKGFpZGwuY2hhbm5lbE1hc2tzLmJlZ2luKCksIGFpZGwuY2hhbm5lbE1hc2tzLmVuZCgpLCBsZWdhY3kuY2hhbm5lbF9tYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KSk7CisgICAgICAgICAgICAgICAgICAgIFtpc0lucHV0XShjb25zdCBBdWRpb0NoYW5uZWxMYXlvdXQmIGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QobCwgaXNJbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICBsZWdhY3kubnVtX2NoYW5uZWxfbWFza3MgPSBhaWRsLmNoYW5uZWxNYXNrcy5zaXplKCk7CiAKICAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl90eXBlID0gVkFMVUVfT1JfUkVUVVJOKApAQCAtMTkyNCwxNyArMjg4OCwxNyBAQAogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKGNvbnN0IGF1ZGlvX3Byb2ZpbGUmIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgYWlkbDsKLSAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChsZWdhY3kuZm9ybWF0KSk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKGNvbnN0IGF1ZGlvX3Byb2ZpbGUmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgQXVkaW9Qcm9maWxlIGFpZGw7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihsZWdhY3kuZm9ybWF0KSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9zYW1wbGVfcmF0ZXMgPiBzdGQ6OnNpemUobGVnYWN5LnNhbXBsZV9yYXRlcykpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgUkVUVVJOX0lGX0VSUk9SKAogICAgICAgICAgICAgY29udmVydFJhbmdlKGxlZ2FjeS5zYW1wbGVfcmF0ZXMsIGxlZ2FjeS5zYW1wbGVfcmF0ZXMgKyBsZWdhY3kubnVtX3NhbXBsZV9yYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5zYW1wbGluZ1JhdGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5zYW1wbGVSYXRlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludCwgaW50MzJfdD4pKTsKIAogICAgIGlmIChsZWdhY3kubnVtX2NoYW5uZWxfbWFza3MgPiBzdGQ6OnNpemUobGVnYWN5LmNoYW5uZWxfbWFza3MpKSB7CkBAIC0xOTQzLDcgKzI5MDcsOSBAQAogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuY2hhbm5lbF9tYXNrcywgbGVnYWN5LmNoYW5uZWxfbWFza3MgKyBsZWdhY3kubnVtX2NoYW5uZWxfbWFza3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuY2hhbm5lbE1hc2tzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIFtpc0lucHV0XShhdWRpb19jaGFubmVsX21hc2tfdCBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KG0sIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICB9KSk7CiAKICAgICBhaWRsLmVuY2Fwc3VsYXRpb25UeXBlID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSgKQEAgLTE5NTIsMTEgKzI5MTgsMTEgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluPgotYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCkgeworYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oY29uc3QgQXVkaW9HYWluJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKICAgICBhdWRpb19nYWluIGxlZ2FjeTsKICAgICBsZWdhY3kubW9kZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soYWlkbC5tb2RlKSk7Ci0gICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KAorICAgICAgICAgICAgICAgICAgICBhaWRsLmNoYW5uZWxNYXNrLCBpc0lucHV0KSk7CiAgICAgbGVnYWN5Lm1pbl92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLm1pblZhbHVlKSk7CiAgICAgbGVnYWN5Lm1heF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLm1heFZhbHVlKSk7CiAgICAgbGVnYWN5LmRlZmF1bHRfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5kZWZhdWx0VmFsdWUpKTsKQEAgLTE5NjYsMTIgKzI5MzIsMTIgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+Ci1sZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9HYWluIGFpZGw7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2Fpbj4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKGNvbnN0IGF1ZGlvX2dhaW4mIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgQXVkaW9HYWluIGFpZGw7CiAgICAgYWlkbC5tb2RlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhsZWdhY3kubW9kZSkpOwogICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3kuY2hhbm5lbF9tYXNrLCBpc0lucHV0KSk7CiAgICAgYWlkbC5taW5WYWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5Lm1pbl92YWx1ZSkpOwogICAgIGFpZGwubWF4VmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5tYXhfdmFsdWUpKTsKICAgICBhaWRsLmRlZmF1bHRWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmRlZmF1bHRfdmFsdWUpKTsKQEAgLTE5ODQsNjMgKzI5NTAsNzYgQEAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF92Nz4KIGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIGFpZGwpIHsKICAgICBhdWRpb19wb3J0X3Y3IGxlZ2FjeTsKLSAgICBsZWdhY3kuaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuaWQpKTsKLSAgICBsZWdhY3kucm9sZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KGFpZGwucm9sZSkpOwotICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QoYWlkbC50eXBlKSk7Ci0gICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLm5hbWUsIGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CisgICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmhhbC5pZCkpOworICAgIGxlZ2FjeS5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFJvbGVfYXVkaW9fcG9ydF9yb2xlX3QoYWlkbC5zeXMucm9sZSkpOworICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QoYWlkbC5zeXMudHlwZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5oYWwubmFtZSwgbGVnYWN5Lm5hbWUsIHNpemVvZihsZWdhY3kubmFtZSkpKTsKIAotICAgIGlmIChhaWRsLnByb2ZpbGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuYXVkaW9fcHJvZmlsZXMpKSB7CisgICAgaWYgKGFpZGwuaGFsLnByb2ZpbGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuYXVkaW9fcHJvZmlsZXMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIFJFVFVSTl9JRl9FUlJPUihjb252ZXJ0UmFuZ2UoYWlkbC5wcm9maWxlcy5iZWdpbigpLCBhaWRsLnByb2ZpbGVzLmVuZCgpLCBsZWdhY3kuYXVkaW9fcHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZSkpOwotICAgIGxlZ2FjeS5udW1fYXVkaW9fcHJvZmlsZXMgPSBhaWRsLnByb2ZpbGVzLnNpemUoKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPQorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihhaWRsLnN5cy5yb2xlLCBhaWRsLnN5cy50eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKKyAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmhhbC5wcm9maWxlcy5iZWdpbigpLCBhaWRsLmhhbC5wcm9maWxlcy5lbmQoKSwgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgQXVkaW9Qcm9maWxlJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUocCwgaXNJbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzID0gYWlkbC5oYWwucHJvZmlsZXMuc2l6ZSgpOwogCi0gICAgaWYgKGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMpKSB7CisgICAgaWYgKGFpZGwuaGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KICAgICBSRVRVUk5fSUZfRVJST1IoCi0gICAgICAgICAgICBjb252ZXJ0UmFuZ2UoYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuYmVnaW4oKSwgYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0V4dHJhQXVkaW9EZXNjcmlwdG9yX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IpKTsKLSAgICBsZWdhY3kubnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzID0gYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuc2l6ZSgpOworICAgICAgICAgICAgY29udmVydFJhbmdlKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmhhbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuYmVnaW4oKSwgYWlkbC5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0V4dHJhQXVkaW9EZXNjcmlwdG9yX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IpKTsKKyAgICBsZWdhY3kubnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzID0gYWlkbC5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLnNpemUoKTsKIAotICAgIGlmIChhaWRsLmdhaW5zLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuZ2FpbnMpKSB7CisgICAgaWYgKGFpZGwuaGFsLmdhaW5zLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuZ2FpbnMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIFJFVFVSTl9JRl9FUlJPUihjb252ZXJ0UmFuZ2UoYWlkbC5nYWlucy5iZWdpbigpLCBhaWRsLmdhaW5zLmVuZCgpLCBsZWdhY3kuZ2FpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5fYXVkaW9fZ2FpbikpOwotICAgIGxlZ2FjeS5udW1fZ2FpbnMgPSBhaWRsLmdhaW5zLnNpemUoKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwuaGFsLmdhaW5zLmJlZ2luKCksIGFpZGwuaGFsLmdhaW5zLmVuZCgpLCBsZWdhY3kuZ2FpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgQXVkaW9HYWluJiBnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGcsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgIGxlZ2FjeS5udW1fZ2FpbnMgPSBhaWRsLmhhbC5nYWlucy5zaXplKCk7CiAKICAgICBsZWdhY3kuYWN0aXZlX2NvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZyhhaWRsLmFjdGl2ZUNvbmZpZykpOwotICAgIGxlZ2FjeS5leHQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0KGFpZGwuZXh0LCBhaWRsLnR5cGUpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZyhhaWRsLnN5cy5hY3RpdmVDb25maWcpKTsKKyAgICBsZWdhY3kuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0X2F1ZGlvX3BvcnRfdjdfZXh0KGFpZGwuaGFsLmV4dCwgYWlkbC5zeXMudHlwZSwgYWlkbC5zeXMuZXh0KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0PgogbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF92N19BdWRpb1BvcnQoY29uc3QgYXVkaW9fcG9ydF92NyYgbGVnYWN5KSB7CiAgICAgbWVkaWE6OkF1ZGlvUG9ydCBhaWRsOwotICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5pZCkpOwotICAgIGFpZGwucm9sZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKGxlZ2FjeS5yb2xlKSk7Ci0gICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKLSAgICBhaWRsLm5hbWUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CisgICAgYWlkbC5oYWwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5pZCkpOworICAgIGFpZGwuc3lzLnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShsZWdhY3kucm9sZSkpOworICAgIGFpZGwuc3lzLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShsZWdhY3kudHlwZSkpOworICAgIGFpZGwuaGFsLm5hbWUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcyA+IHN0ZDo6c2l6ZShsZWdhY3kuYXVkaW9fcHJvZmlsZXMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQorICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24obGVnYWN5LnJvbGUsIGxlZ2FjeS50eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzLCBsZWdhY3kuYXVkaW9fcHJvZmlsZXMgKyBsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLnByb2ZpbGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmhhbC5wcm9maWxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IGF1ZGlvX3Byb2ZpbGUmIHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKHAsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKIAogICAgIGlmIChsZWdhY3kubnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzID4gc3RkOjpzaXplKGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycykpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9CisgICAgYWlkbC5zeXMucHJvZmlsZXMucmVzaXplKGxlZ2FjeS5udW1fYXVkaW9fcHJvZmlsZXMpOwogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycyArIGxlZ2FjeS5udW1fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycyksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmhhbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMpLAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yX0V4dHJhQXVkaW9EZXNjcmlwdG9yKSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9nYWlucyA+IHN0ZDo6c2l6ZShsZWdhY3kuZ2FpbnMpKSB7CkBAIC0yMDQ4LDUzICszMDI3LDY2IEBACiAgICAgfQogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuZ2FpbnMsIGxlZ2FjeS5nYWlucyArIGxlZ2FjeS5udW1fZ2FpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuZ2FpbnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuaGFsLmdhaW5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgYXVkaW9fZ2FpbiYgZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4oZywgaXNJbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgIGFpZGwuc3lzLmdhaW5zLnJlc2l6ZShsZWdhY3kubnVtX2dhaW5zKTsKIAotICAgIGFpZGwuYWN0aXZlQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgIGFpZGwuc3lzLmFjdGl2ZUNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX0F1ZGlvUG9ydENvbmZpZyhsZWdhY3kuYWN0aXZlX2NvbmZpZykpOwotICAgIGFpZGwuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dChsZWdhY3kuZXh0LCBsZWdhY3kudHlwZSkpOworICAgIGFpZGwuc3lzLmFjdGl2ZUNvbmZpZy5oYWwucG9ydElkID0gYWlkbC5oYWwuaWQ7CisgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0RXh0KGxlZ2FjeS5leHQsIGxlZ2FjeS50eXBlLCAmYWlkbC5oYWwuZXh0LCAmYWlkbC5zeXMuZXh0KSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChtZWRpYTo6QXVkaW9Nb2RlIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QoQXVkaW9Nb2RlIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTlZBTElEOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6OkNVUlJFTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ1VSUkVOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NVUlJFTlQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6Tk9STUFMOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6Tk9STUFMOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfTk9STUFMOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6OlJJTkdUT05FOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6UklOR1RPTkU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9SSU5HVE9ORTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DQUxMOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6SU5fQ0FMTDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0lOX0NBTEw7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6SU5fQ09NTVVOSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OklOX0NPTU1VTklDQVRJT046CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6OkNBTExfU0NSRUVOOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6Q0FMTF9TQ1JFRU46CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9DQUxMX1NDUkVFTjsKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9DQUxMX1JFRElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfQ0FMTF9SRURJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9DT01NVU5JQ0FUSU9OX1JFRElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfQ09NTVVOSUNBVElPTl9SRURJUkVDVDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Nb2RlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb01vZGU+CiBsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKGF1ZGlvX21vZGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX01PREVfSU5WQUxJRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTlZBTElEOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTW9kZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQ7CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9DVVJSRU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6OkNVUlJFTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ1VSUkVOVDsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX05PUk1BTDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpOT1JNQUw7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpOT1JNQUw7CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9SSU5HVE9ORToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpSSU5HVE9ORTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OlJJTkdUT05FOwogICAgICAgICBjYXNlIEFVRElPX01PREVfSU5fQ0FMTDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DQUxMOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTW9kZTo6SU5fQ0FMTDsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6SU5fQ09NTVVOSUNBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OklOX0NPTU1VTklDQVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9DQUxMX1NDUkVFTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OkNBTExfU0NSRUVOOworICAgICAgICBjYXNlIEFVRElPX01PREVfQ0FMTF9SRURJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9DQUxMX1JFRElSRUNUOworICAgICAgICBjYXNlIEFVRElPX01PREVfQ09NTVVOSUNBVElPTl9SRURJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9DT01NVU5JQ0FUSU9OX1JFRElSRUNUOwogICAgICAgICBjYXNlIEFVRElPX01PREVfQ05UOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjI0NCwzMCArMzIzNiwzMCBAQAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3N0YW5kYXJkX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb1N0YW5kYXJkX2F1ZGlvX3N0YW5kYXJkX3QobWVkaWE6OkF1ZGlvU3RhbmRhcmQgYWlkbCkgeworYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KEF1ZGlvU3RhbmRhcmQgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0YW5kYXJkOjpOT05FOgorICAgICAgICBjYXNlIEF1ZGlvU3RhbmRhcmQ6Ok5PTkU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RBTkRBUkRfTk9ORTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6RURJRDoKKyAgICAgICAgY2FzZSBBdWRpb1N0YW5kYXJkOjpFRElEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUQU5EQVJEX0VESUQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RhbmRhcmQ+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvU3RhbmRhcmQ+CiBsZWdhY3kyYWlkbF9hdWRpb19zdGFuZGFyZF90X0F1ZGlvU3RhbmRhcmQoYXVkaW9fc3RhbmRhcmRfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX1NUQU5EQVJEX05PTkU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RhbmRhcmQ6Ok5PTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdGFuZGFyZDo6Tk9ORTsKICAgICAgICAgY2FzZSBBVURJT19TVEFOREFSRF9FRElEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0YW5kYXJkOjpFRElEOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RhbmRhcmQ6OkVESUQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcj4KIGFpZGwybGVnYWN5X0V4dHJhQXVkaW9EZXNjcmlwdG9yX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvciYgYWlkbCkgeworICAgICAgICBjb25zdCBFeHRyYUF1ZGlvRGVzY3JpcHRvciYgYWlkbCkgewogICAgIGF1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IgbGVnYWN5OwogICAgIGxlZ2FjeS5zdGFuZGFyZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1N0YW5kYXJkX2F1ZGlvX3N0YW5kYXJkX3QoYWlkbC5zdGFuZGFyZCkpOwogICAgIGlmIChhaWRsLmF1ZGlvRGVzY3JpcHRvci5zaXplKCkgPiBFWFRSQV9BVURJT19ERVNDUklQVE9SX1NJWkUpIHsKQEAgLTIyODIsMTAgKzMyNzQsMTAgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4KK0NvbnZlcnNpb25SZXN1bHQ8RXh0cmFBdWRpb0Rlc2NyaXB0b3I+CiBsZWdhY3kyYWlkbF9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yX0V4dHJhQXVkaW9EZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yJiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3IgYWlkbDsKKyAgICBFeHRyYUF1ZGlvRGVzY3JpcHRvciBhaWRsOwogICAgIGFpZGwuc3RhbmRhcmQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc3RhbmRhcmRfdF9BdWRpb1N0YW5kYXJkKGxlZ2FjeS5zdGFuZGFyZCkpOwogICAgIGlmIChsZWdhY3kuZGVzY3JpcHRvcl9sZW5ndGggPiBFWFRSQV9BVURJT19ERVNDUklQVE9SX1NJWkUpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKQEAgLTIzMDEsMjQgKzMyOTMsMjQgQEAKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdD4KIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlJiBhaWRsKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUmIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6Tk9ORToKKyAgICAgICAgY2FzZSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpOT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fVFlQRV9OT05FOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzoKKyAgICAgICAgY2FzZSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX1RZUEVfSUVDNjE5Mzc7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRW5jYXBzdWxhdGlvblR5cGU+CiBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlKAogICAgICAgICBjb25zdCBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCAmIGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX05PTkU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6Ok5PTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6Tk9ORTsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX1RZUEVfSUVDNjE5Mzc6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6OklFQzYxOTM3OworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6OklFQzYxOTM3OwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQpAQCAtMjM0Nyw0ICszMzM5LDUzIEBACiAgICAgcmV0dXJuIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbzsKIH0KIAorQ29udmVyc2lvblJlc3VsdDxhdWRpb19kaXJlY3RfbW9kZV90PgorYWlkbDJsZWdhY3lfQXVkaW9EaXJlY3RNb2RlX2F1ZGlvX2RpcmVjdF9tb2RlX3QobWVkaWE6OkF1ZGlvRGlyZWN0TW9kZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpPRkZMT0FEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RJUkVDVF9PRkZMT0FEX1NVUFBPUlRFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpPRkZMT0FEX0dBUExFU1M6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRElSRUNUX09GRkxPQURfR0FQTEVTU19TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6QklUU1RSRUFNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RJUkVDVF9CSVRTVFJFQU1fU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EaXJlY3RNb2RlPgorbGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9BdWRpb0RpcmVjdE1vZGUoYXVkaW9fZGlyZWN0X21vZGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fRElSRUNUX09GRkxPQURfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6Ok9GRkxPQUQ7CisgICAgICAgIGNhc2UgQVVESU9fRElSRUNUX09GRkxPQURfR0FQTEVTU19TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6T0ZGTE9BRF9HQVBMRVNTOworICAgICAgICBjYXNlIEFVRElPX0RJUkVDVF9CSVRTVFJFQU1fU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6OkJJVFNUUkVBTTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19kaXJlY3RfbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RpcmVjdF9tb2RlX3RfbWFzayhpbnQzMl90IGFpZGwpIHsKKyAgICB1c2luZyBMZWdhY3lNYXNrID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxhdWRpb19kaXJlY3RfbW9kZV90PjsKKworICAgIExlZ2FjeU1hc2sgY29udmVydGVkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgKGNvbnZlcnRCaXRtYXNrPExlZ2FjeU1hc2ssIGludDMyX3QsIGF1ZGlvX2RpcmVjdF9tb2RlX3QsIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU+KAorICAgICAgICAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0RpcmVjdE1vZGVfYXVkaW9fZGlyZWN0X21vZGVfdCwKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvRGlyZWN0TW9kZT4sCisgICAgICAgICAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxMZWdhY3lNYXNrLCBhdWRpb19kaXJlY3RfbW9kZV90PikpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZGlyZWN0X21vZGVfdD4oY29udmVydGVkKTsKK30KK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9pbnQzMl90X21hc2soYXVkaW9fZGlyZWN0X21vZGVfdCBsZWdhY3kpIHsKKyAgICB1c2luZyBMZWdhY3lNYXNrID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxhdWRpb19kaXJlY3RfbW9kZV90PjsKKworICAgIExlZ2FjeU1hc2sgbGVnYWN5TWFzayA9IHN0YXRpY19jYXN0PExlZ2FjeU1hc2s+KGxlZ2FjeSk7CisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIExlZ2FjeU1hc2ssIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGUsIGF1ZGlvX2RpcmVjdF9tb2RlX3Q+KAorICAgICAgICAgICAgbGVnYWN5TWFzaywgbGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9BdWRpb0RpcmVjdE1vZGUsCisgICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPGF1ZGlvX2RpcmVjdF9tb2RlX3Q+LAorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlPik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAppbmRleCA5YzMwN2ZmLi42OWE5YzY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDEwIEBACiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTI1LDExICsyOSwxMyBAQAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAic3BhdGlhbGl6ZXItYWlkbC1jcHAiLAogICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAogICAgIF0sCiAgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWwogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKKyAgICAgICAgInNwYXRpYWxpemVyLWFpZGwtY3BwIiwKICAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogICAgIHRhcmdldDogewpAQCAtMzksNyArNDUsNyBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeSIsCiAgICAgc3JjczogWwogICAgICAgICAiQXVkaW9BdHRyaWJ1dGVzLmNwcCIsCkBAIC00OSw2ICs1NSw3IEBACiAgICAgICAgICJQb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAiCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCkBAIC02OSw2ICs3Niw3IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCkBAIC0xMDksOSArMTE3LDExIEBACiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKKyAgICAgICAgInNwYXRpYWxpemVyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbC1jcHAiLApAQCAtMTMxLDE0ICsxNDEsMTYgQEAKICAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCiAgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAic3BhdGlhbGl6ZXItYWlkbC1jcHAiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMTkxLDEzICsyMDMsMTUgQEAKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliZXJyb3JfaGVhZGVycyIsCiAgICAgXSwKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliZXJyb3JfaGVhZGVycyIsCiAgICAgXSwKICAgICBhcGV4X2F2YWlsYWJsZTogWwogICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aCIsCiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICBdLApAQCAtMjI0LDE2ICsyMzgsMTkgQEAKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnNobWVtY29tcGF0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCkBAIC0zMDMsNTcgKzMyMCwzMiBAQAogICAgIHNyY3M6IFsKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NsaWVudC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RpcmVjdE1vZGUuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EdWFsTW9ub01vZGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpbkNvbmZpZy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5TeXMuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0NvbmZpZ0V2ZW50LmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9GbGFncy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peExhdGVuY3lDbGFzcy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb091dHB1dEZsYWdzLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUGF0Y2guYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QbGF5YmFja1JhdGUuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFN5cy5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU3lzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHRTeXMuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFJvbGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0cmVhbVR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VbmlxdWVJZFVzZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXVpZC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZpYnJhdG9ySW5mby5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mby5haWRsIiwKICAgICBdLAogICAgIGltcG9ydHM6IFsKLSAgICAgICAgImF1ZGlvX2NvbW1vbi1haWRsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwiLAogICAgIF0sCiAgICAgYmFja2VuZDogewpAQCAtMzY0LDYgKzM1Niw5IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CiBhaWRsX2ludGVyZmFjZSB7CkBAIC0zODksOSArMzg0LDEyIEBACiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9EZXZpY2VSb2xlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25MZXZlbC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbk1vZGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCiAgICAgXSwKICAgICBiYWNrZW5kOiB7CkBAIC00MDIsNiArNDAwLDkgQEAKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgc2RrX3ZlcnNpb246ICJtb2R1bGVfY3VycmVudCIsCisgICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtNDMxLDcgKzQzMiw3IEBACiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2tDYWxsYmFjay5haWRsIiwKICAgICBdLAogICAgIGltcG9ydHM6IFsKLSAgICAgICAgImF1ZGlvX2NvbW1vbi1haWRsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwiLAogICAgICAgICAiYXYtdHlwZXMtYWlkbCIsCiAgICAgICAgICJlZmZlY3QtYWlkbCIsCkBAIC00NDcsNiArNDQ4LDkgQEAKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgc2RrX3ZlcnNpb246ICJtb2R1bGVfY3VycmVudCIsCisgICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtNDU5LDE3ICs0NjMsMTggQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvR2V0SW5wdXRGb3JBdHRyUmVzcG9uc2UuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0ludC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9HZXRTcGF0aWFsaXplclJlc3BvbnNlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCiAgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsIiwKICAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIiwKKyAgICAgICAgInNwYXRpYWxpemVyLWFpZGwiLAogICAgIF0sCiAKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCkBAIC00ODEsNSArNDg2LDM4IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAic3BhdGlhbGl6ZXItYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjay5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXIuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2suYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsIiwKKyAgICBdLAorCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgICAgICAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgc2RrX3ZlcnNpb246ICJtb2R1bGVfY3VycmVudCIsCisgICAgICAgIH0sCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCmluZGV4IDgzYmY1YTcuLjI2MGMwNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApAQCAtMjQsOSArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmg+CiAKLSNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUih4KSBcCi0gICAgeyBhdXRvIF90bXAgPSAoeCk7IGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IEF1ZGlvQXR0cmlidXRlczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCA2YWQ1NDgzLi43YjI3M2VjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC0zMiwxNiArMzIsMTIgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUih4KSAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyBcCi0gICAgfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwogdXNpbmcgbWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkOwogCiBuYW1lc3BhY2UgewogCkBAIC02NSwxOCArNjEsMTggQEAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAotICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlKQorICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCiB7CiAgICAgc3A8bWVkaWE6OklFZmZlY3Q+IGlFZmZlY3Q7CiAgICAgc3A8SU1lbW9yeT4gY2JsazsKICAgICBpbnQgZW5hYmxlZDsKIAotICAgIEFMT0dWKCJzZXQgJXAgbVVzZXJEYXRhOiAlcCB1dWlkOiAlcCB0aW1lTG93ICUwOHgiLCB0aGlzLCB1c2VyLCB0eXBlLCB0eXBlID8gdHlwZS0+dGltZUxvdyA6IDApOworICAgIEFMT0dWKCJzZXQgJXAgdXVpZDogJXAgdGltZUxvdyAlMDh4IiwgdGhpcywgdHlwZSwgdHlwZSA/IHR5cGUtPnRpbWVMb3cgOiAwKTsKIAogICAgIGlmIChtSUVmZmVjdCAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJFZmZlY3QgYWxyZWFkeSBpbiB1c2UiKTsKQEAgLTk5LDkgKzk1LDggQEAKICAgICB9CiAgICAgbVByb2JlID0gcHJvYmU7CiAgICAgbVByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgbUNiZiA9IGNiZjsKLSAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAKICAgICBtZW1zZXQoJm1EZXNjcmlwdG9yLCAwLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgIG1EZXNjcmlwdG9yLnR5cGUgPSAqKHR5cGUgIT0gTlVMTCA/IHR5cGUgOiBFRkZFQ1RfVVVJRF9OVUxMKTsKQEAgLTEyNCwxMiArMTE5LDE2IEBACiAgICAgcmVxdWVzdC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoZGV2aWNlKSk7CiAgICAgcmVxdWVzdC5hdHRyaWJ1dGlvblNvdXJjZSA9IG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZTsKICAgICByZXF1ZXN0LnByb2JlID0gcHJvYmU7CisgICAgcmVxdWVzdC5ub3RpZnlGcmFtZXNQcm9jZXNzZWQgPSBub3RpZnlGcmFtZXNQcm9jZXNzZWQ7CiAKICAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UgcmVzcG9uc2U7CiAKICAgICBtU3RhdHVzID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgJnJlc3BvbnNlKTsKIAogICAgIGlmIChtU3RhdHVzID09IE9LKSB7CisgICAgICAgIGlmIChyZXNwb25zZS5hbHJlYWR5RXhpc3RzKSB7CisgICAgICAgICAgICBtU3RhdHVzID0gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KICAgICAgICAgbUlkID0gcmVzcG9uc2UuaWQ7CiAgICAgICAgIGVuYWJsZWQgPSByZXNwb25zZS5lbmFibGVkOwogICAgICAgICBpRWZmZWN0ID0gcmVzcG9uc2UuZWZmZWN0OwpAQCAtMTg2LDE1ICsxODUsNjUgQEAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBjaGFyICp0eXBlU3RyLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCituYW1lc3BhY2UgeworY2xhc3MgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyIDogcHVibGljIEF1ZGlvRWZmZWN0OjpJQXVkaW9FZmZlY3RDYWxsYmFjayB7CisgcHVibGljOgorICAgIExlZ2FjeUNhbGxiYWNrV3JhcHBlcihBdWRpb0VmZmVjdDo6bGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQqIHVzZXIpOgorICAgICAgICAgICAgbUNhbGxiYWNrKGNhbGxiYWNrKSwgbVVzZXIodXNlcikge30KKyBwcml2YXRlOgorICAgIHZvaWQgb25Db250cm9sU3RhdHVzQ2hhbmdlZChib29sIGlzR3JhbnRlZCkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9FZmZlY3Q6OkVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQsIG1Vc2VyLCAmaXNHcmFudGVkKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGlzRW5hYmxlZCkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9FZmZlY3Q6OkVWRU5UX0VOQUJMRV9TVEFUVVNfQ0hBTkdFRCwgbVVzZXIsICZpc0VuYWJsZWQpOworICAgIH0KKworICAgIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2VkKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb0VmZmVjdDo6RVZFTlRfUEFSQU1FVEVSX0NIQU5HRUQsIG1Vc2VyLCBwYXJhbS5kYXRhKCkpOworICAgIH0KKworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvRWZmZWN0OjpFVkVOVF9FUlJPUiwgbVVzZXIsICZlcnJvckNvZGUpOworICAgIH0KKworICAgIHZvaWQgb25GcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXNQcm9jZXNzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvRWZmZWN0OjpFVkVOVF9GUkFNRVNfUFJPQ0VTU0VELCBtVXNlciwgJmZyYW1lc1Byb2Nlc3NlZCk7CisgICAgfQorCisgICAgY29uc3QgQXVkaW9FZmZlY3Q6OmxlZ2FjeV9jYWxsYmFja190IG1DYWxsYmFjazsKKyAgICB2b2lkKiBjb25zdCBtVXNlcjsKK307Cit9IC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlKQorICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCit7CisgICAgaWYgKGNiZiAhPSBudWxscHRyKSB7CisgICAgICAgIG1MZWdhY3lXcmFwcGVyID0gc3A8TGVnYWN5Q2FsbGJhY2tXcmFwcGVyPjo6bWFrZShjYmYsIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlciAhPSBudWxscHRyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBVc2VyIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIHJldHVybiBzZXQodHlwZSwgdXVpZCwgcHJpb3JpdHksIG1MZWdhY3lXcmFwcGVyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlLAorICAgICAgICAgICAgICAgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKK30KK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKKyAgICAgICAgICAgICAgICBib29sIHByb2JlLAorICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKQogewogICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKICAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IG51bGxwdHI7CkBAIC0yMTEsMTAgKzI2MCwyOSBAQAogICAgICAgICBwVXVpZCA9ICZ1dWlkOwogICAgIH0KIAotICAgIHJldHVybiBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlKTsKKyAgICByZXR1cm4gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNhbGxiYWNrLCBzZXNzaW9uSWQsIGlvLAorICAgICAgICAgICAgICAgZGV2aWNlLCBwcm9iZSwgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKIH0KIAotCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCit7CisgICAgaWYgKGNiZiAhPSBudWxscHRyKSB7CisgICAgICAgIG1MZWdhY3lXcmFwcGVyID0gc3A8TGVnYWN5Q2FsbGJhY2tXcmFwcGVyPjo6bWFrZShjYmYsIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlciAhPSBudWxscHRyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBVc2VyIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIHJldHVybiBzZXQodHlwZVN0ciwgdXVpZFN0ciwgcHJpb3JpdHksIG1MZWdhY3lXcmFwcGVyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlLAorICAgICAgICAgICAgICAgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKK30KIEF1ZGlvRWZmZWN0Ojp+QXVkaW9FZmZlY3QoKQogewogICAgIEFMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CkBAIC00NjgsOSArNTM2LDkgQEAKIHsKICAgICBBTE9HVygiSUVmZmVjdCBkaWVkIik7CiAgICAgbVN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2JmICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIG1DYmYoRVZFTlRfRVJST1IsIG1Vc2VyRGF0YSwgJnN0YXR1cyk7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2ItPm9uRXJyb3IobVN0YXR1cyk7CiAgICAgfQogICAgIG1JRWZmZWN0LmNsZWFyKCk7CiB9CkBAIC00NzksOCArNTQ3LDggQEAKIAogdm9pZCBBdWRpb0VmZmVjdDo6Y29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkKIHsKLSAgICBBTE9HVigiY29udHJvbFN0YXR1c0NoYW5nZWQgJXAgY29udHJvbCAlZCBjYWxsYmFjayAlcCBtVXNlckRhdGEgJXAiLCB0aGlzLCBjb250cm9sR3JhbnRlZCwgbUNiZiwKLSAgICAgICAgICAgIG1Vc2VyRGF0YSk7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgQUxPR1YoImNvbnRyb2xTdGF0dXNDaGFuZ2VkICVwIGNvbnRyb2wgJWQgY2FsbGJhY2sgJXAiLCB0aGlzLCBjb250cm9sR3JhbnRlZCwgY2IuZ2V0KCkpOwogICAgIGlmIChjb250cm9sR3JhbnRlZCkgewogICAgICAgICBpZiAobVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwpAQCAtNDkwLDE4ICs1NTgsMTkgQEAKICAgICAgICAgICAgIG1TdGF0dXMgPSBBTFJFQURZX0VYSVNUUzsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAobUNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCwgbVVzZXJEYXRhLCAmY29udHJvbEdyYW50ZWQpOworICAgIGlmIChjYiAhPSBudWxscHRyKSB7CisgICAgICAgIGNiLT5vbkNvbnRyb2xTdGF0dXNDaGFuZ2VkKGNvbnRyb2xHcmFudGVkKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9FZmZlY3Q6OmVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKQogewotICAgIEFMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkICVwIGVuYWJsZWQgJWQgbUNiZiAlcCIsIHRoaXMsIGVuYWJsZWQsIG1DYmYpOworICAgIGF1dG8gY2IgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIEFMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkICVwIGVuYWJsZWQgJWQgbUNhbGxiYWNrICVwIiwgdGhpcywgZW5hYmxlZCwgY2IuZ2V0KCkpOwogICAgIGlmIChtU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgaWYgKG1DYmYgIT0gTlVMTCkgewotICAgICAgICAgICAgbUNiZihFVkVOVF9FTkFCTEVfU1RBVFVTX0NIQU5HRUQsIG1Vc2VyRGF0YSwgJmVuYWJsZWQpOworICAgICAgICBpZiAoY2IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2ItPm9uRW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTUxMywxMiArNTgyLDIwIEBACiAgICAgaWYgKGNtZERhdGEuZW1wdHkoKSB8fCByZXBseURhdGEuZW1wdHkoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgaWYgKG1DYmYgIT0gTlVMTCAmJiBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNKSB7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNiICE9IG51bGxwdHIgJiYgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTSkgewogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjbWREYXRhQ29weShjbWREYXRhKTsKICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIGNtZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X3BhcmFtX3QgKj4oY21kRGF0YUNvcHkuZGF0YSgpKTsKICAgICAgICAgY21kLT5zdGF0dXMgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KHJlcGx5RGF0YS5kYXRhKCkpOwotICAgICAgICBtQ2JmKEVWRU5UX1BBUkFNRVRFUl9DSEFOR0VELCBtVXNlckRhdGEsIGNtZCk7CisgICAgICAgIGNiLT5vblBhcmFtZXRlckNoYW5nZWQoc3RkOjptb3ZlKGNtZERhdGFDb3B5KSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRWZmZWN0OjpmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMpCit7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2ItPm9uRnJhbWVzUHJvY2Vzc2VkKGZyYW1lcyk7CiAgICAgfQogfQogCkBAIC01NjAsNyArNjM3LDcgQEAKIAogICAgIGludDMyX3QgYXVkaW9TZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb1Nlc3Npb24pKTsKLSAgICBtZWRpYTo6SW50IGNvdW50QWlkbDsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50IGNvdW50QWlkbDsKICAgICBjb3VudEFpZGwudmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqY291bnQpKTsKICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4gcmV0QWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKApAQCAtNjA4LDEyICs2ODUsMTIgQEAKICAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOwogICAgIH0KIAotICAgIG1lZGlhOjpBdWRpb1V1aWQgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodHlwZSkpOwotICAgIG1lZGlhOjpBdWRpb1V1aWQgdXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodXVpZCkpOworICAgIEF1ZGlvVXVpZCB0eXBlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh0eXBlKSk7CisgICAgQXVkaW9VdWlkIHV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHV1aWQpKTsKICAgICBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcob3BQYWNrYWdlTmFtZSkpOwotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShzb3VyY2UpKTsKICAgICBpbnQzMl90IHJldEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCh0eXBlQWlkbCwgb3BQYWNrYWdlTmFtZUFpZGwsIHV1aWRBaWRsLCBwcmlvcml0eSwgc291cmNlQWlkbCwKQEAgLTY1MSwxMSArNzI4LDExIEBACiAgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKICAgICB9CiAKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHR5cGUpKTsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHV1aWQpKTsKKyAgICBBdWRpb1V1aWQgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodHlwZSkpOworICAgIEF1ZGlvVXVpZCB1dWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh1dWlkKSk7CiAgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKG9wUGFja2FnZU5hbWUpKTsKLSAgICBtZWRpYTo6QXVkaW9Vc2FnZSB1c2FnZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1VzYWdlIHVzYWdlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UodXNhZ2UpKTsKICAgICBpbnQzMl90IHJldEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcAppbmRleCBmOTgwMjdhLi5lY2Q0MjNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0yMSw5ICsyMSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KIAotI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpIFwKLSAgICB7IGF1dG8gX3RtcCA9ICh4KTsgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyB9Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdHVzX3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggYTFkM2JkYi4uMTUyMDNkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KQEAgLTM5LDYgKzQxLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiB1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKIApAQCAtNjYsOCArNjksOSBAQAogCiAgICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCi0gICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKLSAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKKyAgICBjb25zdCBhdXRvIHNhbXBsZVNpemUgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgaWYgKHNhbXBsZVNpemUgPT0gMCB8fCAoKCpmcmFtZUNvdW50ID0gKHNpemUgKiAyKSAvIHNhbXBsZVNpemUpID09IDApKSB7CiAgICAgICAgIEFMT0dFKCIlcygpOiBVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE0Miw3ICsxNDYsNyBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAogICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCkBAIC0xNjIsNyArMTY2LDM5IEBACiB7CiAgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UucGlkKSk7Ci0gICAgKHZvaWQpc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYmYsIHVzZXIsCisgICAgKHZvaWQpc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYWxsYmFjaywgdXNlciwKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsCisgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsIHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICAgICAgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKTsKK30KKworQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkKAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pCisgICAgOiBtQWN0aXZlKGZhbHNlKSwKKyAgICAgIG1TdGF0dXMoTk9fSU5JVCksCisgICAgICBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UoY2xpZW50KSwKKyAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCisgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCisgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCisgICAgICBtUHJveHkobnVsbHB0cikKK3sKKyAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKyAgICAodm9pZClzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNhbGxiYWNrLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKICAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgc2VsZWN0ZWREZXZpY2VJZCwgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCiAgICAgICAgICAgICBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pOwpAQCAtMjA1LDI2ICsyNDEsNTggQEAKICAgICAvLyBPdGhlcndpc2UgdGhlIGNhbGxiYWNrIHRocmVhZCB3aWxsIG5ldmVyIGV4aXQuCiAgICAgc3RvcCgpOwogICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCisgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgIH0KLSAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAvLyBUaGlzIG1heSBub3Qgc3RvcCBhbGwgb2YgdGhlc2UgZGV2aWNlIGNhbGxiYWNrcyEKICAgICAgICAgLy8gVE9ETzogQWRkIHNvbWUgc29ydCBvZiBwcm90ZWN0aW9uLgogICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOworICAgICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CituYW1lc3BhY2UgeworY2xhc3MgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyIDogcHVibGljIEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjayB7CisgICAgY29uc3QgQXVkaW9SZWNvcmQ6OmxlZ2FjeV9jYWxsYmFja190IG1DYWxsYmFjazsKKyAgICB2b2lkKiBjb25zdCBtRGF0YTsKKworICBwdWJsaWM6CisgICAgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyKEF1ZGlvUmVjb3JkOjpsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCogdXNlcikKKyAgICAgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtRGF0YSh1c2VyKSB7fQorCisgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVjb3JkOjpCdWZmZXIgY29weSA9IGJ1ZmZlcjsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvUmVjb3JkOjpFVkVOVF9NT1JFX0RBVEEsIG1EYXRhLCAmY29weSk7CisgICAgICAgIHJldHVybiBjb3B5LnNpemUoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3ZlcnJ1bigpIG92ZXJyaWRlIHsgbUNhbGxiYWNrKEF1ZGlvUmVjb3JkOjpFVkVOVF9PVkVSUlVOLCBtRGF0YSwgbnVsbHB0cik7IH0KKworICAgIHZvaWQgb25NYXJrZXIodWludDMyX3QgbWFya2VyUG9zaXRpb24pIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvUmVjb3JkOjpFVkVOVF9NQVJLRVIsIG1EYXRhLCAmbWFya2VyUG9zaXRpb24pOworICAgIH0KKworICAgIHZvaWQgb25OZXdQb3ModWludDMyX3QgbmV3UG9zKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfTkVXX1BPUywgbURhdGEsICZuZXdQb3MpOworICAgIH0KKworICAgIHZvaWQgb25OZXdJQXVkaW9SZWNvcmQoKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfTkVXX0lBVURJT1JFQ09SRCwgbURhdGEsIG51bGxwdHIpOworICAgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UKKwogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldCgKICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBjYWxsYmFja190IGNiZiwKLSAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLApAQCAtMjM5LDggKzMwNyw4IEBACiAgICAgICAgIGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50OwotCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSW5pdGlhbGl6ZWQsICIlczogc2hvdWxkIG5vdCBiZSBjYWxsZWQgdHdpY2UiLCBfX2Z1bmNfXyk7CisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgogICAgIEFMT0dWKCIlcygpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCBmbGFncyAlI3gsIGF0dHJpYnV0aW9uU291cmNlICVzIgpAQCAtMjcxLDM5ICszMzksOSBAQAogICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gbWljcm9waG9uZUZpZWxkRGltZW5zaW9uOwogICAgIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zOwogCi0gICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6Ci0gICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCB0aHJlYWRDYW5DYWxsSmF2YSkgewotICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU1lOQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0NBTExCQUNLOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6Ci0gICAgICAgIGlmIChjYmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgotICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwotCi0gICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5Ci0gICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0KLSAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZTsKKyAgICAvLyBDb3B5IHRoZSBzdGF0ZSB2YXJpYWJsZXMgZWFybHkgc28gdGhleSBhcmUgYXZhaWxhYmxlIGZvciBlcnJvciByZXBvcnRpbmcuCisgICAgaWYgKHBBdHRyaWJ1dGVzID09IG51bGxwdHIpIHsKICAgICAgICAgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOwogICAgICAgICBtQXR0cmlidXRlcy5zb3VyY2UgPSBpbnB1dFNvdXJjZTsKICAgICAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OCkBAIC0zMTQsMzcgKzM1Miw3NCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgQUxPR1YoIiVzOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KLQogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLQotICAgIC8vIHRoZXNlIGJlbG93IHNob3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlIGF1ZGlvRmxpbmdlciB0b28uLi4KICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLQotICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKLSAgICAvLyBBdWRpb0ZsaW5nZXIgY2FwdHVyZSBvbmx5IHN1cHBvcnRzIGxpbmVhciBQQ00KLSAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IEZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBfX2Z1bmNfXywgZm9ybWF0KTsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAvLyBDb21wcmVzc2VkIGNhcHR1cmUgcmVxdWlyZXMgZGlyZWN0CisgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworICAgICAgIEFMT0dJKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtLiBTZXR0aW5nIERJUkVDVCwgdXNpbmcgZmxhZ3MgJSN4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgZm9ybWF0LCBmbGFncyk7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9CiAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwotICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBBTE9HVigiJXM6IG1TZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgbVNlc3Npb25JZCk7CisgICAgbU9yaWdGbGFncyA9IG1GbGFncyA9IGZsYWdzOwogCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKKyAgICBzd2l0Y2ggKG1UcmFuc2ZlcikgeworICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIgfHwgdGhyZWFkQ2FuQ2FsbEphdmEpIHsKKyAgICAgICAgICAgIG1UcmFuc2ZlciA9IFRSQU5TRkVSX1NZTkM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVHJhbnNmZXIgPSBUUkFOU0ZFUl9DQUxMQkFDSzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNhbGxiYWNrID09IG51bGxwdHIiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgorICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgX19mdW5jX18sIG1UcmFuc2Zlcik7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKKyAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KG1Gb3JtYXQpKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IEZvcm1hdCAlI3ggaXMgbm90IHZhbGlkIiwgX19mdW5jX18sIG1Gb3JtYXQpOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKG1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIG1DaGFubmVsTWFzayk7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICB9IGVsc2UgewogICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwogICAgIH0KQEAgLTM1NSwxMyArNDMwLDggQEAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwogICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlUmVjb3JkX2wKIAotICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgQUxPR1YoIiVzKCk6IG1TZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgbVNlc3Npb25JZCk7Ci0KLSAgICBtT3JpZ0ZsYWdzID0gbUZsYWdzID0gZmxhZ3M7Ci0gICAgbUNiZiA9IGNiZjsKLQotICAgIGlmIChjYmYgIT0gTlVMTCkgeworICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgewogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJ1bigiQXVkaW9SZWNvcmQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQpAQCAtMzgxLDEwICs0NTEsMTAgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQorICAgICAgICAvLyBieXBhc3MgZXJyb3IgbWVzc2FnZSB0byBhdm9pZCBsb2dnaW5nIHR3aWNlIChjcmVhdGVSZWNvcmRfbCBsb2dzIHRoZSBlcnJvcikuCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKLSAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIC8vIFRPRE86IGFkZCBhdWRpbyBoYXJkd2FyZSBpbnB1dCBsYXRlbmN5IGhlcmUKICAgICBtTGF0ZW5jeSA9ICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKICAgICBtTWFya2VyUG9zaXRpb24gPSAwOwpAQCAtMzk4LDE0ICs0NjgsNDggQEAKICAgICBtRnJhbWVzUmVhZCA9IDA7CiAgICAgbUZyYW1lc1JlYWRTZXJ2ZXJPZmZzZXQgPSAwOwogCi1leGl0OgotICAgIG1TdGF0dXMgPSBzdGF0dXM7CitlcnJvcjoKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1NZWRpYU1ldHJpY3MubWFya0Vycm9yKHN0YXR1cywgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR0VfSUYoIWVycm9yTWVzc2FnZS5lbXB0eSgpLCAiJXMiLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAgIHJlcG9ydEVycm9yKHN0YXR1cywgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NSRUFURSwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KK2V4aXQ6CisgICAgbVN0YXR1cyA9IHN0YXR1czsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAorICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24sCisgICAgICAgIGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpCit7CisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2FsbGJhY2ssIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJDYWxsYmFjayBkYXRhIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2sgcG9pbnRlciEiKTsKKyAgICB9CisgICAgcmV0dXJuIHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciwKKyAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCB0aHJlYWRDYW5DYWxsSmF2YSwgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCB1aWQsIHBpZCwKKyAgICAgICAgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsIHNlbGVjdGVkTWljRGlyZWN0aW9uLCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24sCisgICAgICAgIG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKQEAgLTUzNSwxMiArNjM5LDEyIEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMKSB7CisgICAgaWYgKG1DYWxsYmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgbU1hcmtlclBvc2l0aW9uID0gbWFya2VyOwogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAKQEAgLTU2NSwxMiArNjY5LDEyIEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOwogCkBAIC02MjEsNiArNzI1LDExIEBACiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXSA9IG1GcmFtZXNSZWFkOwogICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSAwOworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGRvIHJldHJvZ3JhZGUgY29ycmVjdGlvbnMgb3Igc2VydmVyIG9mZnNldCBpZiB0cmFjayBpcworICAgICAgICAgICAgLy8gY29tcHJlc3NlZAorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgICAgIC8vIHNlcnZlciBzaWRlIGZyYW1lIG9mZnNldCBpbiBjYXNlIEF1ZGlvUmVjb3JkIGhhcyBiZWVuIHJlc3RvcmVkLgogICAgICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUjsKICAgICAgICAgICAgICAgICBpIDwgRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWDsgKytpKSB7CkBAIC02NjgsNiArNzc3LDggQEAKIC8vIC0tLS0gRXhwbGljaXQgUm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IGRldmljZUlkPSVkIG1TZWxlY3RlZERldmljZUlkPSVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZXZpY2VJZCwgbVNlbGVjdGVkRGV2aWNlSWQpOwogICAgIGlmIChtU2VsZWN0ZWREZXZpY2VJZCAhPSBkZXZpY2VJZCkgewogICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOwogICAgICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtNzU0LDE1ICs4NjUsMTYgQEAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQgaW5wdXQ7CiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKLSAgICBhdWRpb19zZXNzaW9uX3Qgb3JpZ2luYWxTZXNzaW9uSWQ7CisgICAgW1ttYXliZV91bnVzZWRdXSBhdWRpb19zZXNzaW9uX3Qgb3JpZ2luYWxTZXNzaW9uSWQ7CiAgICAgdm9pZCAqaU1lbVBvaW50ZXI7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4Q3JlYXRlQXR0ZW1wdHMgPSAzOwogICAgIGludDMyX3QgcmVtYWluaW5nQXR0ZW1wdHMgPSBrTWF4Q3JlYXRlQXR0ZW1wdHM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JNZXNzYWdlOwogCiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIiwgX19mdW5jX18sIG1Qb3J0SWQpOworICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC04MjgsOCArOTQwLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgIT0gRkFJTEVEX1RSQU5TQUNUSU9OIHx8IC0tcmVtYWluaW5nQXR0ZW1wdHMgPD0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICAvLyBGQUlMRURfVFJBTlNBQ1RJT04gaGFwcGVucyB1bmRlciB2ZXJ5IHNwZWNpZmljIGNvbmRpdGlvbnMgY2F1c2luZyBhIHN0YXRlIG1pc21hdGNoCkBAIC04NTYsOSArOTY5LDEzIEBACiAgICAgbVJvdXRlZERldmljZUlkID0gb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgbVNlc3Npb25JZCA9IG91dHB1dC5zZXNzaW9uSWQ7CiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKKyAgICBtU2VydmVyQ29uZmlnID0gb3V0cHV0LnNlcnZlckNvbmZpZzsKKyAgICBtU2VydmVyRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobVNlcnZlckNvbmZpZy5jaGFubmVsX21hc2spLCBtU2VydmVyQ29uZmlnLmZvcm1hdCk7CisgICAgbVNlcnZlclNhbXBsZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1TZXJ2ZXJDb25maWcuZm9ybWF0KTsKIAogICAgIGlmIChvdXRwdXQuY2JsayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTg2OCw3ICs5ODUsOCBAQAogICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT51bnNlY3VyZVBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtODg3LDcgKzEwMDUsOCBAQAogICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT51bnNlY3VyZVBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTkxOSw2ICsxMDM4LDEwIEBACiAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdClvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKKyAgICBpZiAobVNlcnZlckNvbmZpZy5mb3JtYXQgIT0gbUZvcm1hdCAmJiBtQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZlJhdyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihtTm90aWZpY2F0aW9uRnJhbWVzQWN0ICogbUZyYW1lU2l6ZSk7CisgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyLnJhdyA9IG1Gb3JtYXRDb252ZXJzaW9uQnVmUmF3LmdldCgpOworICAgIH0KIAogICAgIC8vbUlucHV0ICE9IGlucHV0IGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG1JbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKQEAgLTk0NSw3ICsxMDY4LDcgQEAKICAgICB9CiAKICAgICAvLyB1cGRhdGUgcHJveHkKLSAgICBtUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBtRnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7CisgICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1TZXJ2ZXJGcmFtZVNpemUpOwogICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIApAQCAtOTcyLDE2ICsxMDk1LDQ0IEBACiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUsIChpbnQzMl90KW1TYW1wbGVSYXRlKQogICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBOT1QgaW1tdXRhYmxlCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRFLCBzdGF0ZVRvU3RyaW5nKG1BY3RpdmUpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KXN0YXR1cykKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VMRUNURURNSUNESVJFQ1RJT04sIChpbnQzMl90KW1TZWxlY3RlZE1pY0RpcmVjdGlvbikKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VMRUNURURNSUNGSUVMRERJUkVDVElPTiwgKGRvdWJsZSltU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbikKICAgICAgICAgLnJlY29yZCgpOwogCiBleGl0OgorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0VfSUYoIWVycm9yTWVzc2FnZS5lbXB0eSgpLCAiJXMiLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAgIHJlcG9ydEVycm9yKHN0YXR1cywgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NSRUFURSwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOworICAgIH0KKwogICAgIG1TdGF0dXMgPSBzdGF0dXM7CiAgICAgLy8gc3A8SUF1ZGlvVHJhY2s+IHRyYWNrIGRlc3RydWN0b3Igd2lsbCBjYXVzZSByZWxlYXNlT3V0cHV0KCkgdG8gYmUgY2FsbGVkIGJ5IEF1ZGlvRmxpbmdlcgogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKKy8vIFJlcG9ydCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IGFuZCBzb21lIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4KK3ZvaWQgQXVkaW9SZWNvcmQ6OnJlcG9ydEVycm9yKHN0YXR1c190IHN0YXR1cywgY29uc3QgY2hhciAqZXZlbnQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpIGNvbnN0Cit7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgcmV0dXJuOworICAgIC8vIFdlIHJlcG9ydCBlcnJvciBvbiB0aGUgbmF0aXZlIHNpZGUgYmVjYXVzZSBzb21lIGNhbGxlcnMgZG8gbm90IGNvbWUKKyAgICAvLyBmcm9tIEphdmEuCisgICAgLy8gRW5zdXJlIHRoZXNlIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gc2V0KCkuCisgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX1JFQ09SRF9FUlJPUikKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIGV2ZW50KQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KXN0YXR1cykKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTTUVTU0FHRSwgbWVzc2FnZSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUywgdG9TdHJpbmcobU9yaWdGbGFncykuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VTU0lPTklELCAoaW50MzJfdCltU2Vzc2lvbklkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TT1VSQ0UsIHRvU3RyaW5nKG1BdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VMRUNURURERVZJQ0VJRCwgKGludDMyX3QpbVNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HLCB0b1N0cmluZyhtRm9ybWF0KS5jX3N0cigpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSywgKGludDMyX3QpbUNoYW5uZWxNYXNrKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5ULCAoaW50MzJfdCltRnJhbWVDb3VudCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSwgKGludDMyX3QpbVNhbXBsZVJhdGUpCisgICAgICAgIC5yZWNvcmQoKTsKK30KKwogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCwgc2l6ZV90ICpub25Db250aWcpCiB7CiAgICAgaWYgKGF1ZGlvQnVmZmVyID09IE5VTEwpIHsKQEAgLTk5Miw3ICsxMTQzLDcgQEAKICAgICB9CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9PQlRBSU4pIHsKICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSAwOwotICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgIGF1ZGlvQnVmZmVyLT5tU2l6ZSA9IDA7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBOVUxMOwogICAgICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKICAgICAgICAgICAgICpub25Db250aWcgPSAwOwpAQCAtMTA0NSw3ICsxMTk2LDEzIEBACiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICAgICAgLy8gcmUtY3JlYXRlIHRyYWNrLCB1bmxlc3Mgc29tZW9uZSBlbHNlIGhhcyBhbHJlYWR5IGRvbmUgc28KICAgICAgICAgICAgICAgICBpZiAobmV3U2VxdWVuY2UgPT0gb2xkU2VxdWVuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJvYnRhaW5CdWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBjb21wcmVzc2VkIGNhcHR1cmUsIGRvbid0IGF0dGVtcHQgdG8gcmVzdG9yZSB0aGUgdHJhY2suCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBERUFEX09CSkVDVCBlcnJvciBhbmQgbGV0IHRoZSBjYWxsZXIgcmVjcmVhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICB0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3RvcmVSZWNvcmRfbCgib2J0YWluQnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLm1GcmFtZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tUmF3ID0gTlVMTDsKQEAgLTEwNzUsNyArMTIzMiw3IEBACiAgICAgfSB3aGlsZSAoKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgJiYgKHRyeUNvdW50ZXItLSA+IDApKTsKIAogICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmZmVyLm1GcmFtZUNvdW50OwotICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICBhdWRpb0J1ZmZlci0+bVNpemUgPSBidWZmZXIubUZyYW1lQ291bnQgKiBtU2VydmVyRnJhbWVTaXplOwogICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBidWZmZXIubVJhdzsKICAgICBhdWRpb0J1ZmZlci0+c2VxdWVuY2UgPSBvbGRTZXF1ZW5jZTsKICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKQEAgLTEwODgsNyArMTI0NSw3IEBACiB7CiAgICAgLy8gRklYTUUgYWRkIGVycm9yIGNoZWNraW5nIG9uIG1vZGUsIGJ5IGFkZGluZyBhbiBpbnRlcm5hbCB2ZXJzaW9uCiAKLSAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPnNpemUgLyBtRnJhbWVTaXplOworICAgIHNpemVfdCBzdGVwQ291bnQgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBpZiAoc3RlcENvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTExNTAsOCArMTMwNyw5IEBACiAgICAgICAgICAgICByZXR1cm4gc3NpemVfdChlcnIpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IGF1ZGlvQnVmZmVyLnNpemU7Ci0gICAgICAgIG1lbWNweShidWZmZXIsIGF1ZGlvQnVmZmVyLmk4LCBieXRlc1JlYWQpOworICAgICAgICBzaXplX3QgYnl0ZXNSZWFkID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBtRm9ybWF0LCBhdWRpb0J1ZmZlci5yYXcsIG1TZXJ2ZXJDb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLm1TaXplIC8gbVNlcnZlclNhbXBsZVNpemUpOwogICAgICAgICBidWZmZXIgPSAoKGNoYXIgKikgYnVmZmVyKSArIGJ5dGVzUmVhZDsKICAgICAgICAgdXNlclNpemUgLT0gYnl0ZXNSZWFkOwogICAgICAgICByZWFkICs9IGJ5dGVzUmVhZDsKQEAgLTExNzAsNiArMTMyOCwxMiBAQAogbnNlY3NfdCBBdWRpb1JlY29yZDo6cHJvY2Vzc0F1ZGlvQnVmZmVyKCkKIHsKICAgICBtTG9jay5sb2NrKCk7CisgICAgY29uc3Qgc3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoIWNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IG51bGxwdHI7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm4gTlNfTkVWRVI7CisgICAgfQogICAgIGlmIChtQXdhaXRCb29zdCkgewogICAgICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTEyNDUsMjYgKzE0MDksMjYgQEAKICAgICB1aW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKIAogICAgIC8vIFRoZXNlIGZpZWxkcyBkb24ndCBuZWVkIHRvIGJlIGNhY2hlZCwgYmVjYXVzZSB0aGV5IGFyZSBhc3NpZ25lZCBvbmx5IGJ5IHNldCgpOgotICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1TYW1wbGVSYXRlLCBtRnJhbWVTaXplCisgICAgLy8gICAgICBtVHJhbnNmZXIsIG1DYWxsYmFjaywgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZSwgbUZyYW1lU2l6ZQogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBwZXJmb3JtIGNhbGxiYWNrcyB3aGlsZSB1bmxvY2tlZAogICAgIGlmIChuZXdPdmVycnVuKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfT1ZFUlJVTiwgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgY2FsbGJhY2stPm9uT3ZlcnJ1bigpOworCiAgICAgfQogICAgIGlmIChtYXJrZXJSZWFjaGVkKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfTUFSS0VSLCBtVXNlckRhdGEsICZtYXJrZXJQb3NpdGlvbik7CisgICAgICAgIGNhbGxiYWNrLT5vbk1hcmtlcihtYXJrZXJQb3NpdGlvbi52YWx1ZSgpKTsKICAgICB9CiAgICAgd2hpbGUgKG5ld1Bvc0NvdW50ID4gMCkgewotICAgICAgICBzaXplX3QgdGVtcCA9IG5ld1Bvc2l0aW9uLnZhbHVlKCk7IC8vIEZJWE1FIHNpemVfdCAhPSB1aW50MzJfdAotICAgICAgICBtQ2JmKEVWRU5UX05FV19QT1MsIG1Vc2VyRGF0YSwgJnRlbXApOworICAgICAgICBjYWxsYmFjay0+b25OZXdQb3MobmV3UG9zaXRpb24udmFsdWUoKSk7CiAgICAgICAgIG5ld1Bvc2l0aW9uICs9IHVwZGF0ZVBlcmlvZDsKICAgICAgICAgbmV3UG9zQ291bnQtLTsKICAgICB9CiAgICAgaWYgKG1PYnNlcnZlZFNlcXVlbmNlICE9IHNlcXVlbmNlKSB7CiAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gc2VxdWVuY2U7Ci0gICAgICAgIG1DYmYoRVZFTlRfTkVXX0lBVURJT1JFQ09SRCwgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3SUF1ZGlvUmVjb3JkKCk7CiAgICAgfQogCiAgICAgLy8gaWYgaW5hY3RpdmUsIHRoZW4gZG9uJ3QgcnVuIG1lIGFnYWluIHVudGlsIHJlLXN0YXJ0ZWQKQEAgLTEzNDgsOSArMTUxMiwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwotICAgICAgICBzaXplX3QgcmVhZFNpemUgPSBhdWRpb0J1ZmZlci5zaXplOworICAgICAgICBCdWZmZXIqIGJ1ZmZlciA9ICZhdWRpb0J1ZmZlcjsKKyAgICAgICAgaWYgKG1TZXJ2ZXJDb25maWcuZm9ybWF0ICE9IG1Gb3JtYXQpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9ICZtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICBidWZmZXItPm1TaXplID0gYnVmZmVyLT5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2VxdWVuY2UgPSBhdWRpb0J1ZmZlci5zZXF1ZW5jZTsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLT5yYXcsIG1Gb3JtYXQsIGF1ZGlvQnVmZmVyLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZlckNvbmZpZy5mb3JtYXQsIGF1ZGlvQnVmZmVyLnNpemUoKSAvIG1TZXJ2ZXJTYW1wbGVTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCByZXFTaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCByZWFkU2l6ZSA9IGNhbGxiYWNrLT5vbk1vcmVEYXRhKCpidWZmZXIpOworICAgICAgICBidWZmZXItPm1TaXplID0gcmVhZFNpemU7CiAKICAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGYxZWVhYTMuLmRlOGMyOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKQEAgLTQwLDE5ICs0MCwyNSBAQAogICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoX3RtcC5lcnJvcigpKTsgXAogICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyB9KQogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgXAotICAgIH0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIHVzaW5nIG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlOwotdXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb09mZmxvYWRJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1VzYWdlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludDsKIAogLy8gY2xpZW50IHNpbmdsZXRvbiBmb3IgQXVkaW9GbGluZ2VyIGJpbmRlciBpbnRlcmZhY2UKIE11dGV4IEF1ZGlvU3lzdGVtOjpnTG9jazsKQEAgLTY0LDYgKzcwLDcgQEAKIGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnRHluUG9saWN5Q2FsbGJhY2sgPSBOVUxMOwogcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z1JlY29yZENvbmZpZ0NhbGxiYWNrID0gTlVMTDsKIHJvdXRpbmdfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdSb3V0aW5nQ2FsbGJhY2sgPSBOVUxMOwordm9sX3JhbmdlX2luaXRfcmVxX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnVm9sUmFuZ2VJbml0UmVxQ2FsbGJhY2sgPSBOVUxMOwogCiAvLyBSZXF1aXJlZCB0byBiZSBoZWxkIHdoaWxlIGNhbGxpbmcgaW50byBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIuCiBjbGFzcyBDYXB0dXJlU3RhdGVMaXN0ZW5lckltcGw7CkBAIC0zMzYsNyArMzQzLDcgQEAKICAgICBpZiAoZGVzYyA9PSAwKSB7CiAgICAgICAgICpzYW1wbGluZ1JhdGUgPSBhZi0+c2FtcGxlUmF0ZShpb0hhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKnNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICpzYW1wbGluZ1JhdGUgPSBkZXNjLT5nZXRTYW1wbGluZ1JhdGUoKTsKICAgICB9CiAgICAgaWYgKCpzYW1wbGluZ1JhdGUgPT0gMCkgewogICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZSBmYWlsZWQgZm9yIGlvSGFuZGxlICVkIiwgaW9IYW5kbGUpOwpAQCAtMzcxLDcgKzM3OCw3IEBACiAgICAgaWYgKGRlc2MgPT0gMCkgewogICAgICAgICAqZnJhbWVDb3VudCA9IGFmLT5mcmFtZUNvdW50KGlvSGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICAqZnJhbWVDb3VudCA9IGRlc2MtPm1GcmFtZUNvdW50OworICAgICAgICAqZnJhbWVDb3VudCA9IGRlc2MtPmdldEZyYW1lQ291bnQoKTsKICAgICB9CiAgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50IGZhaWxlZCBmb3IgaW9IYW5kbGUgJWQiLCBpb0hhbmRsZSk7CkBAIC00MDYsNyArNDEzLDcgQEAKICAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CiAgICAgICAgICpsYXRlbmN5ID0gYWYtPmxhdGVuY3kob3V0cHV0KTsKICAgICB9IGVsc2UgewotICAgICAgICAqbGF0ZW5jeSA9IG91dHB1dERlc2MtPm1MYXRlbmN5OworICAgICAgICAqbGF0ZW5jeSA9IG91dHB1dERlc2MtPmdldExhdGVuY3koKTsKICAgICB9CiAKICAgICBBTE9HVigiZ2V0TGF0ZW5jeSgpIG91dHB1dCAlZCwgbGF0ZW5jeSAlZCIsIG91dHB1dCwgKmxhdGVuY3kpOwpAQCAtNDgwLDYgKzQ4NywxMiBAQAogICAgIHJldHVybiBhZi0+c3lzdGVtUmVhZHkoKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmF1ZGlvUG9saWN5UmVhZHkoKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBhZi0+YXVkaW9Qb2xpY3lSZWFkeSgpOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudEhBTChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwpAQCAtNDg4LDcgKzUwMSw3IEBACiAgICAgaWYgKGRlc2MgPT0gMCkgewogICAgICAgICAqZnJhbWVDb3VudCA9IGFmLT5mcmFtZUNvdW50SEFMKGlvSGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICAqZnJhbWVDb3VudCA9IGRlc2MtPm1GcmFtZUNvdW50SEFMOworICAgICAgICAqZnJhbWVDb3VudCA9IGRlc2MtPmdldEZyYW1lQ291bnRIQUwoKTsKICAgICB9CiAgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50SEFMIGZhaWxlZCBmb3IgaW9IYW5kbGUgJWQiLCBpb0hhbmRsZSk7CkBAIC01MjksMTUgKzU0MiwxNSBAQAogU3RhdHVzIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmlvQ29uZmlnQ2hhbmdlZCgKICAgICAgICAgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudCBfZXZlbnQsCiAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvciYgX2lvRGVzYykgewotICAgIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudChfZXZlbnQpKTsKKyAgICBhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90KF9ldmVudCkpOwogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MoCiAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoX2lvRGVzYykpKTsKIAogICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBldmVudCAlZCIsIGV2ZW50KTsKIAotICAgIGlmIChpb0Rlc2MtPm1Jb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBpZiAoaW9EZXNjLT5nZXRJb0hhbmRsZSgpID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gU3RhdHVzOjpvaygpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+IGNhbGxiYWNrc1RvQ2FsbDsKQEAgLTU1MCw5MyArNTYzLDg4IEBACiAgICAgICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9PUEVORUQ6CiAgICAgICAgICAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6IHsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CisgICAgICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLmFkZChpb0Rlc2MtPmdldElvSGFuZGxlKCksIGlvRGVzYyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CisgICAgICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPmdldElvSGFuZGxlKCksIGlvRGVzYyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBpdC0+c2Vjb25kOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgJXMgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgotICAgICAgICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBkZXZpY2VJZCAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyAlcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19PVVRQVVRfUkVHSVNURVJFRCA/CiAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCIgOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fSU5QVVRfT1BFTkVEID8KICAgICAgICAgICAgICAgICAgICAgICAib3BlbmVkIiA6ICJyZWdpc3RlcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tU2FtcGxpbmdSYXRlLCBpb0Rlc2MtPm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tRnJhbWVDb3VudCwgaW9EZXNjLT5nZXREZXZpY2VJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPnRvRGVidWdTdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKICAgICAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfQ0xPU0VEOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgY2xvc2luZyB1bmtub3duICVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ0xPU0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpICVzICVkIGNsb3NlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAKLSAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZXJhc2UoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlbW92ZUl0ZW0oaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZXJhc2UoaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CiAgICAgICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOiB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duICVzISAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCA/ICJvdXRwdXQiIDogImlucHV0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IG9sZERlc2MtPmdldERldmljZUlkKCk7Ci0gICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOworICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPmdldElvSGFuZGxlKCksIGlvRGVzYyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlSWQgIT0gaW9EZXNjLT5nZXREZXZpY2VJZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3IgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4ICIKLSAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBtYXNrICUjeCBmcmFtZUNvdW50ICV6dSBmcmFtZUNvdW50SEFMICV6dSBkZXZpY2VJZCAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBjb25maWcgZm9yICVzICVzIiwKICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSwgaW9EZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUNoYW5uZWxNYXNrLCBpb0Rlc2MtPm1GcmFtZUNvdW50LCBpb0Rlc2MtPm1GcmFtZUNvdW50SEFMLAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT50b0RlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0xJRU5UX1NUQVJURUQ6IHsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgc3RhcnQgY2xpZW50IG9uIHVua25vd24gaW8hICVkIiwgaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgc3RhcnQgY2xpZW50IG9uIHVua25vd24gaW8hICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIEFVRElPX0NMSUVOVF9TVEFSVEVEICBpbyAlZCBwb3J0ICVkIG51bSBjYWxsYmFja3MgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tUG9ydElkLCBtQXVkaW9EZXZpY2VDYWxsYmFja3Muc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBvbGREZXNjLT5tUGF0Y2ggPSBpb0Rlc2MtPm1QYXRjaDsKLSAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSwgaW9EZXNjLT5nZXRQb3J0SWQoKSwgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgb2xkRGVzYy0+c2V0UGF0Y2goaW9EZXNjLT5nZXRQYXRjaCgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2JrcyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gaXQyID0gY2Jrcy5maW5kKGlvRGVzYy0+bVBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQyID0gY2Jrcy5maW5kKGlvRGVzYy0+Z2V0UG9ydElkKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaXQyICE9IGNia3MuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lbXBsYWNlKGlvRGVzYy0+bVBvcnRJZCwgaXQyLT5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmVtcGxhY2UoaW9EZXNjLT5nZXRQb3J0SWQoKSwgaXQyLT5zZWNvbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNjU1LDggKzY2Myw4IEBACiAgICAgLy8gQ2FsbGJhY2tzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgbUxvY2sgaGVsZC4gTWF5IGxlYWQgdG8gZGVhZCBsb2NrIGlmIGNhbGxpbmcgZm9yCiAgICAgLy8gZXhhbXBsZSBnZXRSb3V0ZWREZXZpY2UgdGhhdCB1cGRhdGVzIHRoZSBkZXZpY2UgYW5kIHRyaWVzIHRvIGFjcXVpcmUgbUxvY2suCiAgICAgZm9yIChhdXRvIGNiICA6IGNhbGxiYWNrc1RvQ2FsbCkgewotICAgICAgICAvLyBJZiBjYWxsYmFja3NUb0NhbGwgaXMgbm90IGVtcHR5LCBpdCBpbXBsaWVzIGlvRGVzYy0+bUlvSGFuZGxlIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKLSAgICAgICAgY2ItPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKKyAgICAgICAgLy8gSWYgY2FsbGJhY2tzVG9DYWxsIGlzIG5vdCBlbXB0eSwgaXQgaW1wbGllcyBpb0Rlc2MtPmdldElvSGFuZGxlKCkgYW5kIGRldmljZUlkIGFyZSB2YWxpZAorICAgICAgICBjYi0+b25BdWRpb0RldmljZVVwZGF0ZShpb0Rlc2MtPmdldElvSGFuZGxlKCksIGRldmljZUlkKTsKICAgICB9CiAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwpAQCAtNzc0LDYgKzc4MiwxMSBAQAogICAgIGdSb3V0aW5nQ2FsbGJhY2sgPSBjYjsKIH0KIAorLypzdGF0aWMqLyB2b2lkIEF1ZGlvU3lzdGVtOjpzZXRWb2xJbml0UmVxQ2FsbGJhY2sodm9sX3JhbmdlX2luaXRfcmVxX2NhbGxiYWNrIGNiKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBnVm9sUmFuZ2VJbml0UmVxQ2FsbGJhY2sgPSBjYjsKK30KKwogLy8gY2xpZW50IHNpbmdsZXRvbiBmb3IgQXVkaW9Qb2xpY3lTZXJ2aWNlIGJpbmRlciBpbnRlcmZhY2UKIC8vIHByb3RlY3RlZCBieSBnTG9ja0FQUwogc3A8SUF1ZGlvUG9saWN5U2VydmljZT4gQXVkaW9TeXN0ZW06OmdBdWRpb1BvbGljeVNlcnZpY2U7CkBAIC04MTksNiArODMyLDExIEBACiAgICAgcmV0dXJuIGFwOwogfQogCit2b2lkIEF1ZGlvU3lzdGVtOjpjbGVhckF1ZGlvUG9saWN5U2VydmljZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOworICAgIGdBdWRpb1BvbGljeVNlcnZpY2UuY2xlYXIoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgQXVkaW9TeXN0ZW06Om9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkgewpAQCAtODI3LDM1ICs4NDUsMjAgQEAKICAgICBhcHMtPm9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUsCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgY29uc3QgY2hhciogYWRkcmVzcyA9ICIiOwotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSAiIjsKIAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaWYgKGRldmljZV9hZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOwotICAgIH0KLSAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgewotICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7Ci0gICAgfQotCi0gICAgbWVkaWE6OkF1ZGlvRGV2aWNlIGRldmljZUFpZGw7Ci0gICAgZGV2aWNlQWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKLSAgICBkZXZpY2VBaWRsLmFkZHJlc3MgPSBhZGRyZXNzOwotCiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgIGRldmljZUFpZGwsCiAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90X0F1ZGlvUG9saWN5RGV2aWNlU3RhdGUoc3RhdGUpKSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChlbmNvZGVkRm9ybWF0KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGVuY29kZWRGb3JtYXQpKSkpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtODY0LDkgKzg2Nyw4IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Q+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvRGV2aWNlIGRldmljZUFpZGw7Ci0gICAgICAgIGRldmljZUFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKLSAgICAgICAgZGV2aWNlQWlkbC5hZGRyZXNzID0gZGV2aWNlX2FkZHJlc3M7CisgICAgICAgIEF1ZGlvRGV2aWNlIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpKTsKIAogICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSByZXN1bHQ7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKQEAgLTg5NCwxMyArODk2LDEyIEBACiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9CiAKLSAgICBtZWRpYTo6QXVkaW9EZXZpY2UgZGV2aWNlQWlkbDsKLSAgICBkZXZpY2VBaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOwotICAgIGRldmljZUFpZGwuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgQXVkaW9EZXZpY2UgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoZGV2aWNlLCBhZGRyZXNzKSk7CiAKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2VBaWRsLCBuYW1lLCBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChlbmNvZGVkRm9ybWF0KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihlbmNvZGVkRm9ybWF0KSkpKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlLCB1aWRfdCB1aWQpIHsKQEAgLTk0OSw3ICs5NTAsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogCiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2hhbmRsZV90PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgICAgIGludDMyX3Qgb3V0cHV0QWlkbDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKApAQCAtOTY5LDcgKzk3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QqIHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90KiBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4qIHNlY29uZGFyeU91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90Piogc2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQpIHsKICAgICBpZiAoYXR0ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlcyBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC05OTcsOCArOTk5LDggQEAKICAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKCphdHRyKSk7CiAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbikpOwotICAgIG1lZGlhOjpBdWRpb0NvbmZpZyBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcpKTsKKyAgICBBdWRpb0NvbmZpZyBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgaW50MzJfdCBmbGFnc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CiAgICAgaW50MzJfdCBzZWxlY3RlZERldmljZUlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCkBAIC0xMDIyLDYgKzEwMjQsNyBAQAogICAgICpwb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChyZXNwb25zZUFpZGwucG9ydElkKSk7CiAgICAgKnNlY29uZGFyeU91dHB1dHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+PigKICAgICAgICAgICAgIHJlc3BvbnNlQWlkbC5zZWNvbmRhcnlPdXRwdXRzLCBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgKmlzU3BhdGlhbGl6ZWQgPSByZXNwb25zZUFpZGwuaXNTcGF0aWFsaXplZDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwOTEsOCArMTA5NCw4IEBACiAgICAgaW50MzJfdCBpbnB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoKmlucHV0KSk7CiAgICAgaW50MzJfdCByaWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChyaWlkKSk7CiAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbikpOwotICAgIG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqY29uZmlnKSk7CisgICAgQXVkaW9Db25maWdCYXNlIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKmNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIGludDMyX3QgZmxhZ3NBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOwogICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KCpzZWxlY3RlZERldmljZUlkKSk7CkBAIC0xMTQ4LDEyICsxMTUxLDE5IEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgaW50MzJfdCBpbmRleE1pbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleE1pbikpOwogICAgIGludDMyX3QgaW5kZXhNYXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXhNYXgpKTsKLSAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtQWlkbCwgaW5kZXhNaW5BaWRsLCBpbmRleE1heEFpZGwpKTsKKyAgICBpZiAoc3RhdHVzID09IERFQURfT0JKRUNUKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBjcml0aWNhbCBvcGVyYXRpb24gc2luY2Ugdy9vIHByb3BlciBzdHJlYW0gdm9sdW1lcyBubyBhdWRpbworICAgICAgICAvLyB3aWxsIGJlIGhlYXJkLiBNYWtlIHN1cmUgd2UgcmVjb3ZlciBmcm9tIGEgZmFpbHVyZSBpbiBhbnkgY2FzZS4KKyAgICAgICAgQUxPR0UoIlJlY2VpdmVkIERFQURfT0JKRUNUIGZyb20gQVBTLCBjbGVhcmluZyB0aGUgY2xpZW50Iik7CisgICAgICAgIGNsZWFyQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTExNjIsMTAgKzExNzIsMTEgQEAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICBpbnQzMl90IGluZGV4QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7Ci0gICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1BaWRsLCBkZXZpY2VBaWRsLCBpbmRleEFpZGwpKTsKIH0KQEAgLTExNzYsOSArMTE4NywxMCBAQAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwotICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgIGludDMyX3QgaW5kZXhBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbUFpZGwsIGRldmljZUFpZGwsICZpbmRleEFpZGwpKSk7CkBAIC0xMTk3LDcgKzEyMDksOCBAQAogICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOwogICAgIGludDMyX3QgaW5kZXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXgpKTsKLSAgICBpbnQzMl90IGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyQWlkbCwgZGV2aWNlQWlkbCwgaW5kZXhBaWRsKSk7CiB9CkBAIC0xMjEwLDcgKzEyMjMsOCBAQAogCiAgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyKSk7Ci0gICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgaW50MzJfdCBpbmRleEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJBaWRsLCBkZXZpY2VBaWRsLCAmaW5kZXhBaWRsKSkpOwpAQCAtMTI0OSw3ICsxMjYzLDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8cHJvZHVjdF9zdHJhdGVneV90PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgICAgIGludDMyX3QgcmVzdWx0QWlkbDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKApAQCAtMTI1OSwyMyArMTI3Myw5IEBACiAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihQUk9EVUNUX1NUUkFURUdZX05PTkUpOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwotCi0gICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7Ci0gICAgICAgIGludDMyX3QgcmVzdWx0QWlkbDsKLSAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAotICAgICAgICAgICAgICAgIGFwcy0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW1BaWRsLCAmcmVzdWx0QWlkbCkpKTsKLSAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KHJlc3VsdEFpZGwpOwotICAgIH0oKTsKLSAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX0RFVklDRV9OT05FKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyYgYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciogZGV2aWNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IqIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JWb2x1bWUpIHsKICAgICBpZiAoZGV2aWNlcyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMTI4NCw5ICsxMjg0LDkgQEAKIAogICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCBhYUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9BdHRyaWJ1dGVzX0F1ZGlvQXR0cmlidXRlc0V4KGFhKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiByZXRBaWRsOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiByZXRBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCi0gICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGFhQWlkbCwgJnJldEFpZGwpKSk7CisgICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGFhQWlkbCwgZm9yVm9sdW1lLCAmcmV0QWlkbCkpKTsKICAgICAqZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KAogICAgICAgICAgICAgICAgICAgICByZXRBaWRsLApAQCAtMTM2Miw3ICsxMzYyLDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKIAotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgaW50MzJfdCBpblBhc3RNc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpblBhc3RNcykpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGlmIChzdGF0ZSA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICBpbnQzMl90IGluUGFzdE1zQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluUGFzdE1zKSk7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKQEAgLTEzODksOCArMTM4OSw4IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgaWYgKHN0YXRlID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CiAKLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKHN0cmVhbSkpOworICAgIEF1ZGlvU291cmNlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2Uoc3RyZWFtKSk7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+aXNTb3VyY2VBY3RpdmUoc3RyZWFtQWlkbCwgc3RhdGUpKSk7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTQyNCwxOSArMTQyNCwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGdBdWRpb0ZsaW5nZXIuY2xlYXIoKTsKICAgICB9Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOwotICAgICAgICBnQXVkaW9Qb2xpY3lTZXJ2aWNlLmNsZWFyKCk7Ci0gICAgfQorICAgIGNsZWFyQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMoY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD4mIHN5c3RlbVVzYWdlcykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSBudWxscHRyKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Vc2FnZT4gc3lzdGVtVXNhZ2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1VzYWdlPj4oc3lzdGVtVXNhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZSkpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvVXNhZ2U+IHN5c3RlbVVzYWdlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb1VzYWdlPj4oc3lzdGVtVXNhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKHN5c3RlbVVzYWdlc0FpZGwpKTsKIH0KIApAQCAtMTQ1Niw3ICsxNDUzLDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb2ZmbG9hZF9tb2RlX3Q+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8gaW5mb0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgIEF1ZGlvT2ZmbG9hZEluZm8gaW5mb0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fb2ZmbG9hZF9pbmZvX3RfQXVkaW9PZmZsb2FkSW5mbyhpbmZvKSk7CiAgICAgICAgIG1lZGlhOjpBdWRpb09mZmxvYWRNb2RlIHJldEFpZGw7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUigKQEAgLTE0ODQsNyArMTQ4MSw3IEBACiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKHJvbGUpKTsKICAgICBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKHR5cGUpKTsKLSAgICBtZWRpYTo6SW50IG51bVBvcnRzQWlkbDsKKyAgICBJbnQgbnVtUG9ydHNBaWRsOwogICAgIG51bVBvcnRzQWlkbC52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1fcG9ydHMpKTsKICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qb3J0PiBwb3J0c0FpZGw7CiAgICAgaW50MzJfdCBnZW5lcmF0aW9uQWlkbDsKQEAgLTE1MDIsMTMgKzE0OTksMTIgQEAKICAgICBpZiAocG9ydCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIG1lZGlhOjpBdWRpb1BvcnQgcG9ydEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdjdfQXVkaW9Qb3J0KCpwb3J0KSk7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBwb3J0QWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAotICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXRBdWRpb1BvcnQocG9ydEFpZGwsICZwb3J0QWlkbCkpKTsKKyAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0QXVkaW9Qb3J0KHBvcnQtPmlkLCAmcG9ydEFpZGwpKSk7CiAgICAgKnBvcnQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KHBvcnRBaWRsKSk7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTU1MSw3ICsxNTQ3LDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAogCi0gICAgbWVkaWE6OkludCBudW1QYXRjaGVzQWlkbDsKKyAgICBJbnQgbnVtUGF0Y2hlc0FpZGw7CiAgICAgbnVtUGF0Y2hlc0FpZGwudmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtX3BhdGNoZXMpKTsKICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4gcGF0Y2hlc0FpZGw7CiAgICAgaW50MzJfdCBnZW5lcmF0aW9uQWlkbDsKQEAgLTE2OTAsNyArMTY4Niw4IEBACiAgICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZyZXRBaWRsKSkpOwogICAgICpzZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChyZXRBaWRsLnNlc3Npb24pKTsKICAgICAqaW9IYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmV0QWlkbC5pb0hhbmRsZSkpOwotICAgICpkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KHJldEFpZGwuZGV2aWNlKSk7CisgICAgKmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChyZXRBaWRsLmRldmljZSkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTcwNyw3ICsxNzA0LDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19NT0RFX0lOVkFMSUQ7CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kZV90PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb01vZGUgcmV0QWlkbDsKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZSByZXRBaWRsOwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXRQaG9uZVN0YXRlKCZyZXRBaWRsKSkpOwogICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChyZXRBaWRsKTsKICAgICB9KCk7CkBAIC0xNzMyLDggKzE3MjksOCBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCiAgICAgaW50MzJfdCB1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldFVpZERldmljZUFmZmluaXRpZXModWlkQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KQEAgLTE3NTIsOSArMTc0OSw5IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKICAgICBpbnQzMl90IHVzZXJJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90Pih1c2VySWQpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKHVzZXJJZEFpZGwsIGRldmljZXNBaWRsKSk7CiB9CkBAIC0xODI3LDEwICsxODI0LDExIEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTkFOOwogCiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGZsb2F0PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgICAgIGludDMyX3QgaW5kZXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleCkpOwotICAgICAgICBpbnQzMl90IGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICAgICAgZmxvYXQgcmV0QWlkbDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgIGFwcy0+Z2V0U3RyZWFtVm9sdW1lREIoc3RyZWFtQWlkbCwgaW5kZXhBaWRsLCBkZXZpY2VBaWRsLCAmcmV0QWlkbCkpKTsKQEAgLTE4NjIsMTAgKzE4NjAsMTAgQEAKIAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgbWVkaWE6OkludCBudW1TdXJyb3VuZEZvcm1hdHNBaWRsOworICAgIEludCBudW1TdXJyb3VuZEZvcm1hdHNBaWRsOwogICAgIG51bVN1cnJvdW5kRm9ybWF0c0FpZGwudmFsdWUgPQogICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oKm51bVN1cnJvdW5kRm9ybWF0cykpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gc3Vycm91bmRGb3JtYXRzQWlkbDsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiBzdXJyb3VuZEZvcm1hdHNBaWRsOwogICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmdldFN1cnJvdW5kRm9ybWF0cygmbnVtU3Vycm91bmRGb3JtYXRzQWlkbCwgJnN1cnJvdW5kRm9ybWF0c0FpZGwsCkBAIC0xODc1LDcgKzE4NzMsNyBAQAogICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4obnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSkpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2Uoc3Vycm91bmRGb3JtYXRzQWlkbC5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHNBaWRsLmVuZCgpLCBzdXJyb3VuZEZvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KSk7CiAgICAgc3RkOjpjb3B5KHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRBaWRsLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRBaWRsLmVuZCgpLAogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCk7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTg4OSwxMCArMTg4NywxMCBAQAogCiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICBtZWRpYTo6SW50IG51bVN1cnJvdW5kRm9ybWF0c0FpZGw7CisgICAgSW50IG51bVN1cnJvdW5kRm9ybWF0c0FpZGw7CiAgICAgbnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSA9CiAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtU3Vycm91bmRGb3JtYXRzKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBzdXJyb3VuZEZvcm1hdHNBaWRsOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+IHN1cnJvdW5kRm9ybWF0c0FpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Z2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoJm51bVN1cnJvdW5kRm9ybWF0c0FpZGwsICZzdXJyb3VuZEZvcm1hdHNBaWRsKSkpOwogCkBAIC0xOTAwLDcgKzE4OTgsNyBAQAogICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4obnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSkpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2Uoc3Vycm91bmRGb3JtYXRzQWlkbC5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHNBaWRsLmVuZCgpLCBzdXJyb3VuZEZvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xOTA4LDI2ICsxOTA2LDI4IEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQpKTsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGF1ZGlvRm9ybWF0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGF1ZGlvRm9ybWF0KSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXRBaWRsLCBlbmFibGVkKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBpbnQzMl90IHVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7Ci0gICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0QXNzaXN0YW50VWlkKHVpZEFpZGwpKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB1aWRzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4odWlkcywgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldEFzc2lzdGFudFNlcnZpY2VzVWlkcyh1aWRzQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkX3QgdWlkKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgYWN0aXZlVWlkcykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBpbnQzMl90IHVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7Ci0gICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkQWlkbCkpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFjdGl2ZVVpZHNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihhY3RpdmVVaWRzLCBsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKGFjdGl2ZVVpZHNBaWRsKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgewpAQCAtMTk2MCw4ICsxOTYwLDIxIEBACiAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4qIGZvcm1hdHMpIHsKK2Jvb2wgQXVkaW9TeXN0ZW06OmlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKKyAgICAgICAgYm9vbCByZXRWYWw7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmlzVWx0cmFzb3VuZFN1cHBvcnRlZCgmcmV0VmFsKSkpOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KiBmb3JtYXRzKSB7CiAgICAgaWYgKGZvcm1hdHMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTE5NzAsMTIgKzE5ODMsMTUgQEAKICAgICAgICAgICAgICYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBmb3JtYXRzQWlkbDsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiBmb3JtYXRzQWlkbDsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKLSAgICAgICAgICAgIGFwcy0+Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgmZm9ybWF0c0FpZGwpKSk7CisgICAgICAgICAgICBhcHMtPmdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYShkZXZpY2VBaWRsLCAmZm9ybWF0c0FpZGwpKSk7CiAgICAgKmZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4+KGZvcm1hdHNBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KSk7CisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90Pj4oCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHNBaWRsLAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMTE0LDkgKzIxMzAsOSBAQAogCiAgICAgaW50MzJfdCBzdHJhdGVneUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3Byb2R1Y3Rfc3RyYXRlZ3lfdF9pbnQzMl90KHN0cmF0ZWd5KSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneUFpZGwsIHJvbGVBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQpAQCAtMjE0Miw3ICsyMTU4LDcgQEAKICAgICB9CiAgICAgaW50MzJfdCBzdHJhdGVneUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3Byb2R1Y3Rfc3RyYXRlZ3lfdF9pbnQzMl90KHN0cmF0ZWd5KSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbDsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShzdHJhdGVneUFpZGwsIHJvbGVBaWRsLCAmZGV2aWNlc0FpZGwpKSk7CiAgICAgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCkBAIC0yMTU5LDEyICsyMTc1LDEyIEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2VBaWRsLCByb2xlQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KQEAgLTIxNzYsMTIgKzIxOTIsMTIgQEAKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2VBaWRsLCByb2xlQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KQEAgLTIxOTIsMTIgKzIyMDgsMTIgQEAKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2VBaWRsLCByb2xlQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KQEAgLTIyMDgsOCArMjIyNCw4IEBACiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGF1ZGlvU291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGF1ZGlvU291cmNlKSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5jbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZUFpZGwsIHJvbGVBaWRsKSk7CkBAIC0yMjIyLDEwICsyMjM4LDEwIEBACiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGF1ZGlvU291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGF1ZGlvU291cmNlKSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbDsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsICZkZXZpY2VzQWlkbCkpKTsKICAgICBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKQEAgLTIyMzQsNiArMjI1MCw5NCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFNwYXRpYWxpemVyKGNvbnN0IHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8bWVkaWE6OklTcGF0aWFsaXplcj4qIHNwYXRpYWxpemVyKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoc3BhdGlhbGl6ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBtZWRpYTo6R2V0U3BhdGlhbGl6ZXJSZXNwb25zZSByZXNwb25zZTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXRTcGF0aWFsaXplcihjYWxsYmFjaywgJnJlc3BvbnNlKSkpOworCisgICAgKnNwYXRpYWxpemVyID0gcmVzcG9uc2Uuc3BhdGlhbGl6ZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Y2FuQmVTcGF0aWFsaXplZChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmNhbkJlU3BhdGlhbGl6ZWQpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gYXR0ciAhPSBudWxscHRyID8gKmF0dHIgOiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZ3VyYXRpb24gPSBjb25maWcgIT0gbnVsbHB0ciA/ICpjb25maWcgOiBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisKKyAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbD4gYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHJpYnV0ZXMpKTsKKyAgICBzdGQ6Om9wdGlvbmFsPEF1ZGlvQ29uZmlnPiBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZ3VyYXRpb24sIGZhbHNlIC8qaXNJbnB1dCovKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5jYW5CZVNwYXRpYWxpemVkKGF0dHJBaWRsLCBjb25maWdBaWRsLCBkZXZpY2VzQWlkbCwgY2FuQmVTcGF0aWFsaXplZCkpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kaXJlY3RfbW9kZV90KiBkaXJlY3RNb2RlKSB7CisgICAgaWYgKGF0dHIgPT0gbnVsbHB0ciB8fCBjb25maWcgPT0gbnVsbHB0ciB8fCBkaXJlY3RNb2RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCgqYXR0cikpOworICAgIEF1ZGlvQ29uZmlnIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKKworICAgIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGUgcmV0QWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoYXR0ckFpZGwsIGNvbmZpZ0FpZGwsICZyZXRBaWRsKSkpOworICAgICpkaXJlY3RNb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RpcmVjdF9tb2RlX3RfbWFzaygKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJldEFpZGwpKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3Byb2ZpbGU+KiBhdWRpb1Byb2ZpbGVzKSB7CisgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKCphdHRyKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiBhdWRpb1Byb2ZpbGVzQWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoYXR0ckFpZGwsICZhdWRpb1Byb2ZpbGVzQWlkbCkpKTsKKyAgICAqYXVkaW9Qcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxhdWRpb19wcm9maWxlPj4oCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXNBaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZSwgZmFsc2UgLyppc0lucHV0Ki8pKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogY2xhc3MgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsIDogcHVibGljIG1lZGlhOjpCbkNhcHR1cmVTdGF0ZUxpc3RlbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKIHB1YmxpYzoKQEAgLTIyOTgsNiArMjQwMiwzMSBAQAogICAgIHJldHVybiBhZi0+c2V0VmlicmF0b3JJbmZvcyh2aWJyYXRvckluZm9zKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1tYXBQb2xpY3lJbmZvKAorICAgICAgICBBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsIHN0ZDo6dmVjdG9yPEF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgeworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5nZXRNbWFwUG9saWN5SW5mb3MocG9saWN5VHlwZSwgcG9saWN5SW5mb3MpOworfQorCitpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPmdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpOworfQorCitpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhZi0+Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKQEAgLTI0MDksMTIgKzI1MzgsMTIgQEAKIFN0YXR1cyBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCiAgICAgICAgIGludDMyX3QgZXZlbnQsCiAgICAgICAgIGNvbnN0IG1lZGlhOjpSZWNvcmRDbGllbnRJbmZvJiBjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjbGllbnRDb25maWcsCisgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY2xpZW50Q29uZmlnLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGNsaWVudEVmZmVjdHMsCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGRldmljZUNvbmZpZywKKyAgICAgICAgY29uc3QgQXVkaW9Db25maWdCYXNlJiBkZXZpY2VDb25maWcsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0cywKICAgICAgICAgaW50MzJfdCBwYXRjaEhhbmRsZSwKLSAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2UpIHsKKyAgICAgICAgQXVkaW9Tb3VyY2Ugc291cmNlKSB7CiAgICAgcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBjYiA9IE5VTEw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKQEAgLTI0MjYsMTMgKzI1NTUsMTMgQEAKICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgY2xpZW50SW5mb0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X1JlY29yZENsaWVudEluZm9fcmVjb3JkX2NsaWVudF9pbmZvX3QoY2xpZW50SW5mbykpOwogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZ0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNsaWVudENvbmZpZykpOworICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNsaWVudENvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90Pj4oCiAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFZmZlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfRWZmZWN0RGVzY3JpcHRvcl9lZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoZGV2aWNlQ29uZmlnKSk7CisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoZGV2aWNlQ29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+PigKICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdHMsCkBAIC0yNDQwLDcgKzI1NjksNyBAQAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcGF0Y2hfaGFuZGxlX3QocGF0Y2hIYW5kbGUpKTsKICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZSkpOworICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZSkpOwogICAgICAgICBjYihldmVudExlZ2FjeSwgJmNsaWVudEluZm9MZWdhY3ksICZjbGllbnRDb25maWdMZWdhY3ksIGNsaWVudEVmZmVjdHNMZWdhY3ksCiAgICAgICAgICAgICZkZXZpY2VDb25maWdMZWdhY3ksIGVmZmVjdHNMZWdhY3ksIHBhdGNoSGFuZGxlTGVnYWN5LCBzb3VyY2VMZWdhY3kpOwogICAgIH0KQEAgLTI0NjAsNiArMjU4OSwxOSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKSB7CisgICAgdm9sX3JhbmdlX2luaXRfcmVxX2NhbGxiYWNrIGNiID0gTlVMTDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOworICAgICAgICBjYiA9IGdWb2xSYW5nZUluaXRSZXFDYWxsYmFjazsKKyAgICB9CisKKyAgICBpZiAoY2IgIT0gTlVMTCkgeworICAgICAgICBjYigpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTI0NzAsMTAgKzI2MTIsNyBAQAogICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXS0+b25TZXJ2aWNlRGllZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmdBdWRpb1BvbGljeVNlcnZpY2UuY2xlYXIoKTsKLSAgICB9CisgICAgQXVkaW9TeXN0ZW06OmNsZWFyQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CiAKICAgICBBTE9HVygiQXVkaW9Qb2xpY3lTZXJ2aWNlIHNlcnZlciBkaWVkISIpOwogfQpAQCAtMjQ4NCw3ICsyNjIzLDcgQEAKICAgICBsZWdhY3kucmlpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3VuaXF1ZV9pZF90KGFpZGwucmlpZCkpOwogICAgIGxlZ2FjeS51aWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhaWRsLnVpZCkpOwogICAgIGxlZ2FjeS5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwuc2Vzc2lvbikpOwotICAgIGxlZ2FjeS5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGFpZGwuc291cmNlKSk7CisgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhaWRsLnNvdXJjZSkpOwogICAgIGxlZ2FjeS5wb3J0X2lkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnBvcnRJZCkpOwogICAgIGxlZ2FjeS5zaWxlbmNlZCA9IGFpZGwuc2lsZW5jZWQ7CiAgICAgcmV0dXJuIGxlZ2FjeTsKQEAgLTI0OTYsNyArMjYzNSw3IEBACiAgICAgYWlkbC5yaWlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QobGVnYWN5LnJpaWQpKTsKICAgICBhaWRsLnVpZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGxlZ2FjeS51aWQpKTsKICAgICBhaWRsLnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pKTsKLSAgICBhaWRsLnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5LnNvdXJjZSkpOworICAgIGFpZGwuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGxlZ2FjeS5zb3VyY2UpKTsKICAgICBhaWRsLnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LnBvcnRfaWQpKTsKICAgICBhaWRsLnNpbGVuY2VkID0gbGVnYWN5LnNpbGVuY2VkOwogICAgIHJldHVybiBhaWRsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCA1ZjgwMmRlLi42YWI4MzM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMjEsOSArMjEsMTEgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAKICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtNDMsNiArNDUsNyBAQAogc3RhdGljIGNvbnN0IGludCBrTWF4TG9vcENvdW50Tm90aWZpY2F0aW9ucyA9IDMyOwogCiB1c2luZyA6OmFuZHJvaWQ6OmFpZGxfdXRpbHM6OnN0YXR1c1RGcm9tQmluZGVyU3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTcwLDggKzE3Myw4IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8Ym9vbD4gewotICAgICAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uZmlnKSk7CisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyaWJ1dGVzQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cmlidXRlcykpOwogICAgICAgICBib29sIHJldEFpZGw7CkBAIC0xOTYsNiArMTk5LDcgQEAKIAogI2RlZmluZSBNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay4iIC8vIGF2b2lkIGN1dC1uLXBhc3RlIGVycm9ycy4KIAorICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIHRoZSBNZWRpYU1ldHJpY3NTZXJ2aWNlIHNpZGUuCiAgICAgLy8gSmF2YSBBUEkgMjggZW50cmllcywgZG8gbm90IGNoYW5nZS4KICAgICBtTWV0cmljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJzdHJlYW10eXBlIiwgdG9TdHJpbmcodHJhY2stPnN0cmVhbVR5cGUoKSkuY19zdHIoKSk7CiAgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsCkBAIC0yMTEsNiArMjE1LDcgQEAKICAgICBtTWV0cmljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KXRyYWNrLT5tRnJhbWVDb3VudCk7CiAgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiYXR0cmlidXRlcyIsIHRvU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcykuY19zdHIoKSk7CiAgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAibG9nU2Vzc2lvbklkIiwgdHJhY2stPm1Mb2dTZXNzaW9uSWQuY19zdHIoKSk7CisgICAgbU1ldHJpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInVuZGVycnVuRnJhbWVzIiwgKGludDMyX3QpdHJhY2stPmdldFVuZGVycnVuRnJhbWVzKCkpOwogfQogCiAvLyBoYW5kIHRoZSB1c2VyIGEgc25hcHNob3Qgb2YgdGhlIG1ldHJpY3MuCkBAIC0yNTMsOCArMjU4LDcgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGNvbnN0IHdwPElBdWRpb1RyYWNrQ2FsbGJhY2s+ICYgY2FsbGJhY2ssCiAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKQEAgLTI3MywxMCArMjc3LDkxIEBACiB7CiAgICAgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOwogCi0gICAgKHZvaWQpc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAwIC8qc2hhcmVkQnVmZmVyKi8sIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAotICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgLy8gbWFrZV91bmlxdWUgZG9lcyBub3QgYWdncmVnYXRlIGluaXQgdW50aWwgYysrMjAKKyAgICBtU2V0UGFyYW1zID0gc3RkOjp1bmlxdWVfcHRyPFNldFBhcmFtcz57CisgICAgICAgICAgICBuZXcgU2V0UGFyYW1ze3N0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCAwIC8qc2hhcmVkQnVmZmVyKi8sIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkfX07Cit9CisKK25hbWVzcGFjZSB7CisgICAgY2xhc3MgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyIDogcHVibGljIEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2sgeworICAgICAgY29uc3QgQXVkaW9UcmFjazo6bGVnYWN5X2NhbGxiYWNrX3QgbUNhbGxiYWNrOworICAgICAgdm9pZCAqIGNvbnN0IG1EYXRhOworICAgICAgcHVibGljOgorICAgICAgICBMZWdhY3lDYWxsYmFja1dyYXBwZXIoQXVkaW9UcmFjazo6bGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQqIHVzZXIpCisgICAgICAgICAgICA6IG1DYWxsYmFjayhjYWxsYmFjayksIG1EYXRhKHVzZXIpIHt9CisgICAgICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciAmIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciBjb3B5ID0gYnVmZmVyOworICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEsIG1EYXRhLCBzdGF0aWNfY2FzdDx2b2lkKj4oJmNvcHkpKTsKKyAgICAgICAgICByZXR1cm4gY29weS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvblVuZGVycnVuKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOLCBtRGF0YSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvbkxvb3BFbmQoaW50MzJfdCBsb29wc1JlbWFpbmluZykgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX0xPT1BfRU5ELCBtRGF0YSwgJmxvb3BzUmVtYWluaW5nKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uTWFya2VyKHVpbnQzMl90IG1hcmtlclBvc2l0aW9uKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfTUFSS0VSLCBtRGF0YSwgJm1hcmtlclBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uTmV3UG9zKHVpbnQzMl90IG5ld1Bvcykgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX05FV19QT1MsIG1EYXRhLCAmbmV3UG9zKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uQnVmZmVyRW5kKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX0JVRkZFUl9FTkQsIG1EYXRhLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uTmV3SUF1ZGlvVHJhY2soKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLLCBtRGF0YSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvblN0cmVhbUVuZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5ELCBtRGF0YSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG9uQ2FuV3JpdGVNb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXIgJiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgY29weSA9IGJ1ZmZlcjsKKyAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgbURhdGEsIHN0YXRpY19jYXN0PHZvaWQqPigmY29weSkpOworICAgICAgICAgIHJldHVybiBjb3B5LnNpemUoKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKK0F1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAorICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLAorICAgICAgbVN0YXRlKFNUQVRFX1NUT1BQRUQpLAorICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLAorICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAorICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAorICAgICAgbUF1ZGlvVHJhY2tDYWxsYmFjayhuZXcgQXVkaW9UcmFja0NhbGxiYWNrKCkpCit7CisgICAgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNhbGxiYWNrLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQ2FsbGJhY2sgZGF0YSBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIHBvaW50ZXIhIik7CisgICAgfQorICAgIG1TZXRQYXJhbXMgPSBzdGQ6OnVuaXF1ZV9wdHI8U2V0UGFyYW1zPntuZXcgU2V0UGFyYW1zeworICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIsCisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsCisgICAgICAgICAgICB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZH19OwogfQogCiBBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKApAQCAtMjg2LDggKzM3MSw3IEBACiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGNvbnN0IHdwPElBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLApAQCAtMzA2LDEwICszOTAsNTYgQEAKIHsKICAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CiAKLSAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkKTsKKyAgICBtU2V0UGFyYW1zID0gc3RkOjp1bmlxdWVfcHRyPFNldFBhcmFtcz57CisgICAgICAgICAgICBuZXcgU2V0UGFyYW1ze3N0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBBVURJT19QT1JUX0hBTkRMRV9OT05FfX07Cit9CisKK0F1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAorICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLAorICAgICAgbVN0YXRlKFNUQVRFX1NUT1BQRUQpLAorICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLAorICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAorICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtQXVkaW9UcmFja0NhbGxiYWNrKG5ldyBBdWRpb1RyYWNrQ2FsbGJhY2soKSkKK3sKKyAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNhbGxiYWNrLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQ2FsbGJhY2sgZGF0YSBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIHBvaW50ZXIhIik7CisgICAgfQorICAgIG1TZXRQYXJhbXMgPSBzdGQ6OnVuaXF1ZV9wdHI8U2V0UGFyYW1zPntuZXcgU2V0UGFyYW1zeworICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgMCAvKmZyYW1lQ291bnQqLywgZmxhZ3MsCisgICAgICAgICAgICBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyLCBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLAorICAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgbWF4UmVxdWlyZWRTcGVlZCwgQVVESU9fUE9SVF9IQU5ETEVfTk9ORX19OworfQorCit2b2lkIEF1ZGlvVHJhY2s6Om9uRmlyc3RSZWYoKSB7CisgICAgaWYgKG1TZXRQYXJhbXMpIHsKKyAgICAgICAgc2V0KCptU2V0UGFyYW1zKTsKKyAgICAgICAgbVNldFBhcmFtcy5yZXNldCgpOworICAgIH0KIH0KIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQpAQCAtMzUyLDEyICs0ODIsMTMgQEAKICAgICAvLyBPdGhlcndpc2UgdGhlIGNhbGxiYWNrIHRocmVhZCB3aWxsIG5ldmVyIGV4aXQuCiAgICAgc3RvcCgpOwogICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7IC8vIG5vdCB0aHJlYWQgc2FmZQotICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1RyYWNrLmgKKyAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgIH0KLSAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgLy8gVGhpcyBtYXkgbm90IHN0b3AgYWxsIG9mIHRoZXNlIGRldmljZSBjYWxsYmFja3MhCiAgICAgICAgIC8vIFRPRE86IEFkZCBzb21lIHNvcnQgb2YgcHJvdGVjdGlvbi4KQEAgLTM3Myw4ICs1MDQsOCBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjYWxsYmFja190IGNiZiwKLSAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKiB1c2VyLAogICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKQEAgLTM4NywxMyArNTE4LDQ1IEBACiAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKIHsKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2FsbGJhY2ssIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJDYWxsYmFjayBkYXRhIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2sgcG9pbnRlciEiKTsKKyAgICB9CisgICAgcmV0dXJuIHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsIHRocmVhZENhbkNhbGxKYXZhLAorICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZCk7Cit9CitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXQoCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCwKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUluaXRpYWxpemVkLCAiJXM6IHNob3VsZCBub3QgYmUgY2FsbGVkIHR3aWNlIiwgX19mdW5jX18pOworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKLQorICAgIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZTsKICAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgogICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICVkLCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgdWlkICVkLCBwaWQgJWQiLApAQCAtNDAyLDg2ICs1NjUsMjQgQEAKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgYXR0cmlidXRpb25Tb3VyY2UudWlkLCBhdHRyaWJ1dGlvblNvdXJjZS5waWQpOwogCiAgICAgbVRocmVhZENhbkNhbGxKYXZhID0gdGhyZWFkQ2FuQ2FsbEphdmE7CisKKyAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIHB1bGxlZCBpbiBhbiBlcnJvciByZXBvcnQsIHNvIHdlIGluaXRpYWxpemUgdGhlbSBlYXJseS4KICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IHNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICBtUmVxRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgbU9yaWdpbmFsU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgbUF0dHJpYnV0ZXMgPSBwQXR0cmlidXRlcyAhPSBudWxscHRyID8gKnBBdHRyaWJ1dGVzIDogQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICBtUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwogCi0gICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6Ci0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU0hBUkVEOwotICAgICAgICB9IGVsc2UgaWYgKGNiZiA9PSBOVUxMIHx8IHRocmVhZENhbkNhbGxKYXZhKSB7Ci0gICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9TWU5DOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfQ0FMTEJBQ0s7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKLSAgICBjYXNlIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0s6Ci0gICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgJXMgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIiwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KHRyYW5zZmVyVHlwZSksIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKLSAgICBjYXNlIFRSQU5TRkVSX1NZTkM6Ci0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRSQU5TRkVSX1NIQVJFRDoKLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIiwgX19mdW5jX18pOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKLSAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7Ci0gICAgbURvTm90UmVjb25uZWN0ID0gZG9Ob3RSZWNvbm5lY3Q7Ci0KLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgc2hhcmVkQnVmZmVyLT51bnNlY3VyZVBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwotCi0gICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOwotCi0gICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewotICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotCi0gICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZpcnN0LgotICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBfX2Z1bmNfXywgc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU9yaWdpbmFsU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0KLSAgICB9IGVsc2UgeworICAgIC8vIHVwZGF0ZSBmb3JtYXQgYW5kIGZsYWdzIGJlZm9yZSBzdG9yaW5nIHRoZW0gaW4gbUZvcm1hdCwgbU9yaWdGbGFncyBhbmQgbUZsYWdzCisgICAgaWYgKHBBdHRyaWJ1dGVzICE9IE5VTEwpIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICBBTE9HVigiJXMoKTogQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IgogICAgICAgICAgICAgICAgICIgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKLSAgICAgICAgbU9yaWdpbmFsU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgICAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MobUF0dHJpYnV0ZXMuZmxhZ3MsICZmbGFncyk7CiAgICAgfQogCkBAIC00OTIsMjMgKzU5Myw2IEBACiAgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKTsKICAgICB9CiAKLSAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCi0gICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7Ci0gICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsICBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwotCiAgICAgLy8gZm9yY2UgZGlyZWN0IGZsYWcgaWYgZm9ybWF0IGlzIG5vdCBsaW5lYXIgUENNCiAgICAgLy8gb3Igb2ZmbG9hZCB3YXMgcmVxdWVzdGVkCiAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCkBAIC01MjcsNyArNjExLDk2IEBACiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgfQogCi0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICBtT3JpZ0ZsYWdzID0gbUZsYWdzID0gZmxhZ3M7CisKKyAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgeworICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKKyAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9TSEFSRUQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cnx8IHRocmVhZENhbkNhbGxKYXZhKSB7CisgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9TWU5DOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfQ0FMTEJBQ0s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKKyAgICBjYXNlIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0s6CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyIHx8IHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlczogVHJhbnNmZXIgdHlwZSAlcyBidXQgY2FsbGJhY2sgPT0gbnVsbHB0ciB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dCh0cmFuc2ZlclR5cGUpLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgorICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKKyAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlczogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRkVSX1NIQVJFRDoKKyAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlczogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBtU2hhcmVkQnVmZmVyID0gc2hhcmVkQnVmZmVyOworICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKKyAgICBtRG9Ob3RSZWNvbm5lY3QgPSBkb05vdFJlY29ubmVjdDsKKworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoKTogc2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzaGFyZWRCdWZmZXItPnVuc2VjdXJlUG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisKKyAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQorICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3QuCisgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9CisgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgX19mdW5jX18sIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBtT3JpZ2luYWxTdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT3JpZ2luYWxTdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgfQorCisgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCAgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CiAgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhmb3JtYXQpKSB7CiAgICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwogICAgICAgICB9IGVsc2UgewpAQCAtNTQxLDEzICs3MTQsMTIgQEAKICAgICB9CiAKICAgICAvLyBzYW1wbGluZyByYXRlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBkaXJlY3Qgb3V0cHV0cwotICAgIGlmIChzYW1wbGVSYXRlID09IDAgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCAmJiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJXM6IHNhbXBsZSByYXRlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBkaXJlY3Qgb3V0cHV0cyIsIF9fZnVuY19fKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICBtT3JpZ2luYWxTYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICBtUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwogICAgIC8vIDEuMCA8PSBtTWF4UmVxdWlyZWRTcGVlZCA8PSBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKICAgICBtTWF4UmVxdWlyZWRTcGVlZCA9IG1pbihtYXgobWF4UmVxdWlyZWRTcGVlZCwgMS4wZiksIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCk7CiAKQEAgLTU1NiwzMyArNzI4LDM1IEBACiAgICAgLy8gIChiKSB3ZSBjYW4gc3VwcG9ydCByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzCiAgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKICAgICAgICAgbU9mZmxvYWRJbmZvQ29weSA9ICpvZmZsb2FkSW5mbzsKLSAgICAgICAgbU9mZmxvYWRJbmZvID0gJm1PZmZsb2FkSW5mb0NvcHk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbU9mZmxvYWRJbmZvID0gTlVMTDsKICAgICAgICAgbWVtc2V0KCZtT2ZmbG9hZEluZm9Db3B5LCAwLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKICAgICAgICAgbU9mZmxvYWRJbmZvQ29weSA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkuZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5LnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgbU9mZmxvYWRJbmZvQ29weS5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgbU9mZmxvYWRJbmZvQ29weS5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7CiAgICAgfQogCiAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdID0gMS4wZjsKICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdID0gMS4wZjsKICAgICBtU2VuZExldmVsID0gMC4wZjsKICAgICAvLyBtRnJhbWVDb3VudCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVUcmFja19sCi0gICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIGlmIChub3RpZmljYXRpb25GcmFtZXMgPj0gMCkgewogICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwogICAgICAgICBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCEoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCisgICAgICAgIGlmICghKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlczogbm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5vdGlmaWNhdGlvbkZyYW1lcyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAogICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA9IDA7CiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1pbk5vdGlmaWNhdGlvbnNQZXJCdWZmZXIgPSAxOwpAQCAtNjA3LDExICs3ODEsMTAgQEAKICAgICAgICAgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoY2FsbGluZ1BpZCkpOwogICAgIH0KICAgICBtQXV4RWZmZWN0SWQgPSAwOwotICAgIG1PcmlnRmxhZ3MgPSBtRmxhZ3MgPSBmbGFnczsKLSAgICBtQ2JmID0gY2JmOworICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwogCi0gICAgaWYgKGNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkID0gbmV3IEF1ZGlvVHJhY2tUaHJlYWQoKnRoaXMpOworICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkID0gc3A8QXVkaW9UcmFja1RocmVhZD46Om1ha2UoKnRoaXMpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cnVuKCJBdWRpb1RyYWNrIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTywgMCAvKnN0YWNrKi8pOwogICAgICAgICAvLyB0aHJlYWQgYmVnaW5zIGluIHBhdXNlZCBzdGF0ZSwgYW5kIHdpbGwgbm90IHJlZmVyZW5jZSB1cyB1bnRpbCBzdGFydCgpCiAgICAgfQpAQCAtNjI3LDEwICs4MDAsMTAgQEAKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gV2UgZG8gbm90IGdvdG8gZXJyb3IgdG8gcHJldmVudCBkb3VibGUtbG9nZ2luZyBlcnJvcnMuCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKLSAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1Mb29wQ291bnQgPSAwOwogICAgIG1Mb29wU3RhcnQgPSAwOwogICAgIG1Mb29wRW5kID0gMDsKQEAgLTY2MSw2ICs4MzQsMTIgQEAKICAgICBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSA9IC0xOyAvLyAtMSBpcyBhIHVuaXF1ZSBpbml0aWFsaXplci4KICAgICBtVm9sdW1lSGFuZGxlciA9IG5ldyBtZWRpYTo6Vm9sdW1lSGFuZGxlcigpOwogCitlcnJvcjoKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFX0lGKCFlcnJvck1lc3NhZ2UuZW1wdHkoKSwgIiVzIiwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOworICAgICAgICByZXBvcnRFcnJvcihzdGF0dXMsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUsIGVycm9yTWVzc2FnZS5jX3N0cigpKTsKKyAgICB9CisgICAgLy8gZmFsbCB0aHJvdWdoCiBleGl0OgogICAgIG1TdGF0dXMgPSBzdGF0dXM7CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTY3NCw3ICs4NTMsNyBAQAogICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjYWxsYmFja190IGNiZiwKKyAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCiAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtNjkzLDExICs4NzIsMTUgQEAKICAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QocGlkKSk7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOwotICAgIHJldHVybiBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGNoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgdGhyZWFkQ2FuQ2FsbEphdmEsIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWQpOworICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyID0gc3A8TGVnYWN5Q2FsbGJhY2tXcmFwcGVyPjo6bWFrZShjYWxsYmFjaywgdXNlcik7CisgICAgfSBlbHNlIGlmICh1c2VyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkNhbGxiYWNrIGRhdGEgcHJvdmlkZWQgd2l0aG91dCBjYWxsYmFjayBwb2ludGVyISIpOworICAgIH0KKyAgICByZXR1cm4gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyLCBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgIHRocmVhZENhbkNhbGxKYXZhLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTQ3LDYgKzExMzAsNjEgQEAKICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKIH0KIAorYm9vbCBBdWRpb1RyYWNrOjpwYXVzZUFuZFdhaXQoY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyYgdGltZW91dCkKK3sKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKKyAgICAvLyBXZSB1c2UgYXRvbWljIGFjY2VzcyBoZXJlIGZvciBzdGF0ZSB2YXJpYWJsZXMgLSB0aGVzZSBhcmUgdXNlZCBhcyBoaW50cworICAgIC8vIHRvIGVuc3VyZSB3ZSBoYXZlIHJhbXBlZCBkb3duIGF1ZGlvLgorICAgIGNvbnN0IGludCBwcmlvclN0YXRlID0gbVByb3h5LT5nZXRTdGF0ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IHByaW9yUG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkudW5zaWduZWRWYWx1ZSgpOworCisgICAgcGF1c2UoKTsKKworICAgIC8vIE9ubHkgaWYgd2Ugd2VyZSBwcmV2aW91c2x5IGFjdGl2ZSwgZG8gd2Ugd2FpdCB0byByYW1wIGRvd24gdGhlIGF1ZGlvLgorICAgIGlmIChwcmlvclN0YXRlICE9IENCTEtfU1RBVEVfQUNUSVZFKSByZXR1cm4gdHJ1ZTsKKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAvLyBvZmZsb2FkIGFuZCBkaXJlY3QgdHJhY2tzIGRvIG5vdCB3YWl0IGJlY2F1c2UgcGF1c2Ugdm9sdW1lIHJhbXAgaXMgaGFuZGxlZCBieSBoYXJkd2FyZS4KKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHJldHVybiB0cnVlOworCisgICAgLy8gV2FpdCBmb3IgdGhlIHRyYWNrIHN0YXRlIHRvIGJlIGFueXRoaW5nIGJlc2lkZXMgcGF1c2luZy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdm9sdW1lIGhhcyByYW1wZWQgZG93bi4KKyAgICBjb25zdGV4cHIgYXV0byBTTEVFUF9JTlRFUlZBTF9NUyA9IDEwbXM7CisgICAgY29uc3RleHByIGF1dG8gUE9TSVRJT05fVElNRU9VVF9NUyA9IDQwbXM7IC8vIGRvbid0IHdhaXQgbG9uZ2VyIHRoYW4gdGhpcyBmb3IgcG9zaXRpb24gY2hhbmdlLgorICAgIGF1dG8gYmVnaW4gPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAvLyBXYWl0IGZvciBzdGF0ZSBhbmQgcG9zaXRpb24gdG8gY2hhbmdlLgorICAgICAgICAvLyBBZnRlciBwYXVzZSgpIHRoZSBzZXJ2ZXIgc3RhdGUgc2hvdWxkIGJlIFBBVVNJTkcsIGJ1dCB0aGF0IG1heSBpbW1lZGlhdGVseQorICAgICAgICAvLyBjb252ZXJ0IHRvIFBBVVNFRCBieSBwcmVwYXJlVHJhY2tzIGJlZm9yZSBkYXRhIGlzIHJlYWQgaW50byB0aGUgbWl4ZXIuCisgICAgICAgIC8vIEhlbmNlIHdlIGNoZWNrIHRoYXQgdGhlIHN0YXRlIGlzIG5vdCBQQVVTSU5HIGFuZCB0aGF0IHRoZSBzZXJ2ZXIgcG9zaXRpb24KKyAgICAgICAgLy8gaGFzIGFkdmFuY2VkIHRvIGJlIGEgbW9yZSByZWxpYWJsZSBlc3RpbWF0ZSB0aGF0IHRoZSB2b2x1bWUgcmFtcCBoYXMgY29tcGxldGVkLgorICAgICAgICBjb25zdCBpbnQgc3RhdGUgPSBtUHJveHktPmdldFN0YXRlKCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpLnVuc2lnbmVkVmFsdWUoKTsKKworICAgICAgICBtTG9jay51bmxvY2soKTsgLy8gb25seSBsb2NhbCB2YXJpYWJsZXMgYWNjZXNzZWQgdW50aWwgbG9jay4KKyAgICAgICAgYXV0byBlbGFwc2VkID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCisgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBiZWdpbik7CisgICAgICAgIGlmIChzdGF0ZSAhPSBDQkxLX1NUQVRFX1BBVVNJTkcgJiYKKyAgICAgICAgICAgICAgICAoZWxhcHNlZCA+PSBQT1NJVElPTl9USU1FT1VUX01TIHx8IHBvc2l0aW9uICE9IHByaW9yUG9zaXRpb24pKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IHN1Y2Nlc3Mgc3RhdGU6JWQsIHBvc2l0aW9uOiV1IGFmdGVyICVsbGQgbXMiCisgICAgICAgICAgICAgICAgICAgICIgKHByaW9yIHN0YXRlOiVkICBwcmlvciBwb3NpdGlvbjoldSkiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdGUsIHBvc2l0aW9uLCBlbGFwc2VkLmNvdW50KCksIHByaW9yU3RhdGUsIHByaW9yUG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyByZW1haW5pbmcgPSB0aW1lb3V0IC0gZWxhcHNlZDsKKyAgICAgICAgaWYgKHJlbWFpbmluZy5jb3VudCgpIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogdGltZW91dCBleHBpcmVkIHN0YXRlOiVkIHN0aWxsIHBhdXNpbmc6JWQgYWZ0ZXIgJWxsZCBtcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0ZSwgQ0JMS19TVEFURV9QQVVTSU5HLCBlbGFwc2VkLmNvdW50KCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgdGhlIHRyYWNrIGlzIHJlc3RvcmVkIHdoaWxlIHNsZWVwaW5nOworICAgICAgICAvLyBhcyB0aGlzIGxvZ2ljIGlzIGFkdmlzb3J5LCB3ZSBhbGxvdyB0aGF0LgorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjptaW4ocmVtYWluaW5nLCBTTEVFUF9JTlRFUlZBTF9NUykpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvVHJhY2s6OnBhdXNlKCkKIHsKICAgICBjb25zdCBpbnQ2NF90IGJlZ2luTnMgPSBzeXN0ZW1UaW1lKCk7CkBAIC0xMjc1LDEwICsxNTEzLDYgQEAKICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fCBtUHJveHkuZ2V0KCkgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgLy8gUmVqZWN0IGlmIHRpbWVkIHRyYWNrIG9yIGNvbXByZXNzZWQgYXVkaW8uCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAKICAgICBzc2l6ZV90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IG1Qcm94eS0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCk7CiAgICAgc3NpemVfdCBmaW5hbEJ1ZmZlclNpemUgID0gbVByb3h5LT5zZXRCdWZmZXJTaXplSW5GcmFtZXMoKHVpbnQzMl90KSBidWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtMTM3MSwxMiArMTYwNSwxMiBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgIGlmICghbUNhbGxiYWNrLnByb21vdGUoKSB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1NYXJrZXJQb3NpdGlvbiA9IG1hcmtlcjsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogCkBAIC0xNDA0LDEyICsxNjM4LDEyIEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKHVpbnQzMl90IHVwZGF0ZVBlcmlvZCkKIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgIGlmICghbUNhbGxiYWNrLnByb21vdGUoKSB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOwogCkBAIC0xNTU1LDYgKzE3ODksOCBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBkZXZpY2VJZD0lZCBtU2VsZWN0ZWREZXZpY2VJZD0lZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZGV2aWNlSWQsIG1TZWxlY3RlZERldmljZUlkKTsKICAgICBpZiAobVNlbGVjdGVkRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTE2NDgsMTIgKzE4ODQsMTMgQEAKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgYm9vbCBjYWxsYmFja0FkZGVkID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JNZXNzYWdlOwogCiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwotICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KIApAQCAtMTczMCwxMCArMTk2NywxMSBAQAogICAgIH0KIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0Lm91dHB1dElkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsCisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsgLy8gZGV2aWNlIG5vdCByZWFkeQogICAgICAgICB9CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNzY0LDggKzIwMDIsOCBAQAogICAgIG91dHB1dC5hdWRpb1RyYWNrLT5nZXRDYmxrKCZzZnIpOwogICAgIHNwPElNZW1vcnk+IGlNZW0gPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9OdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShzZnIpKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKLSAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgc3RhdHVzID0gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkgcGl0ZmFsbHMKQEAgLTE3NzQsOCArMjAxMiw5IEBACiAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCiAgICAgdm9pZCAqaU1lbVBvaW50ZXIgPSBpTWVtLT51bnNlY3VyZVBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKLSAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOworICAgICAgICBzdGF0dXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKQEAgLTE3OTksNyArMjAzOCw3IEBACiAgICAgICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAogICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODMzLDggKzIwNzIsMTAgQEAKICAgICAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCiAgICAgICAgIGJ1ZmZlcnMgPSBtU2hhcmVkQnVmZmVyLT51bnNlY3VyZVBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgICAgICBBTE9HRSgiJXMiLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTEyLDYgKzIxNTMsNyBAQAogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9WT0xVTUVfTEVGVCwgKGRvdWJsZSltVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0pCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1ZPTFVNRV9SSUdIVCwgKGRvdWJsZSltVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFURSwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KU5PX0VSUk9SKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9BVVhFRkZFQ1RJRCwgKGludDMyX3QpbUF1eEVmZmVjdElkKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFLCAoaW50MzJfdCltU2FtcGxlUmF0ZSkKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfU1BFRUQsIChkb3VibGUpbVBsYXliYWNrUmF0ZS5tU3BlZWQpCkBAIC0xOTMyLDE3ICsyMTc0LDQ3IEBACiAgICAgfQogCiBleGl0OgotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgY2FsbGJhY2tBZGRlZCkgewotICAgICAgICAvLyBub3RlOiBtT3V0cHV0IGlzIGFsd2F5cyB2YWxpZCBpcyBjYWxsYmFja0FkZGVkIGlzIHRydWUKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAoY2FsbGJhY2tBZGRlZCkgeworICAgICAgICAgICAgLy8gbm90ZTogbU91dHB1dCBpcyBhbHdheXMgdmFsaWQgaXMgY2FsbGJhY2tBZGRlZCBpcyB0cnVlCisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0LCBtUG9ydElkKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRV9JRighZXJyb3JNZXNzYWdlLmVtcHR5KCksICIlcyIsIGVycm9yTWVzc2FnZS5jX3N0cigpKTsKKyAgICAgICAgcmVwb3J0RXJyb3Ioc3RhdHVzLCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1JFQVRFLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CiAgICAgfQotCiAgICAgbVN0YXR1cyA9IHN0YXR1czsKIAogICAgIC8vIHNwPElBdWRpb1RyYWNrPiB0cmFjayBkZXN0cnVjdG9yIHdpbGwgY2F1c2UgcmVsZWFzZU91dHB1dCgpIHRvIGJlIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIKICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvVHJhY2s6OnJlcG9ydEVycm9yKHN0YXR1c190IHN0YXR1cywgY29uc3QgY2hhciAqZXZlbnQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpIGNvbnN0Cit7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgcmV0dXJuOworICAgIC8vIFdlIHJlcG9ydCBlcnJvciBvbiB0aGUgbmF0aXZlIHNpZGUgYmVjYXVzZSBzb21lIGNhbGxlcnMgZG8gbm90IGNvbWUKKyAgICAvLyBmcm9tIEphdmEuCisgICAgLy8gRW5zdXJlIHRoZXNlIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gc2V0KCkuCisgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX1RSQUNLX0VSUk9SKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgZXZlbnQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVUywgKGludDMyX3Qpc3RhdHVzKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNNRVNTQUdFLCBtZXNzYWdlKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9PUklHSU5BTEZMQUdTLCB0b1N0cmluZyhtT3JpZ0ZsYWdzKS5jX3N0cigpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TRVNTSU9OSUQsIChpbnQzMl90KW1TZXNzaW9uSWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0NPTlRFTlRUWVBFLCB0b1N0cmluZyhtQXR0cmlidXRlcy5jb250ZW50X3R5cGUpLmNfc3RyKCkpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1VTQUdFLCB0b1N0cmluZyhtQXR0cmlidXRlcy51c2FnZSkuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VMRUNURURERVZJQ0VJRCwgKGludDMyX3QpbVNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HLCB0b1N0cmluZyhtRm9ybWF0KS5jX3N0cigpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSywgKGludDMyX3QpbUNoYW5uZWxNYXNrKQorICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBOT1QgaW1tdXRhYmxlCisgICAgICAgIC8vIGZyYW1lIGNvdW50IGlzIGluaXRpYWxseSB0aGUgcmVxdWVzdGVkIGZyYW1lIGNvdW50LCBidXQgbWF5IGJlIGFkanVzdGVkCisgICAgICAgIC8vIGJ5IEF1ZGlvRmxpbmdlciBhZnRlciBjcmVhdGlvbi4KKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCwgKGludDMyX3QpbUZyYW1lQ291bnQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUsIChpbnQzMl90KW1TYW1wbGVSYXRlKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZQkFDS19TUEVFRCwgKGRvdWJsZSltUGxheWJhY2tSYXRlLm1TcGVlZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfUElUQ0gsIChkb3VibGUpbVBsYXliYWNrUmF0ZS5tUGl0Y2gpCisgICAgICAgIC5yZWNvcmQoKTsKK30KKwogc3RhdHVzX3QgQXVkaW9UcmFjazo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50LCBzaXplX3QgKm5vbkNvbnRpZykKIHsKICAgICBpZiAoYXVkaW9CdWZmZXIgPT0gTlVMTCkgewpAQCAtMTk1Myw3ICsyMjI1LDcgQEAKICAgICB9CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9PQlRBSU4pIHsKICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSAwOwotICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgIGF1ZGlvQnVmZmVyLT5tU2l6ZSA9IDA7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBOVUxMOwogICAgICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKICAgICAgICAgICAgICpub25Db250aWcgPSAwOwpAQCAtMjA0NSw3ICsyMzE3LDcgQEAKICAgICB9IHdoaWxlICgoKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgfHwgKHN0YXR1cyA9PSBOT1RfRU5PVUdIX0RBVEEpKSAmJiAodHJ5Q291bnRlci0tID4gMCkpOwogCiAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSBidWZmZXIubUZyYW1lQ291bnQ7Ci0gICAgYXVkaW9CdWZmZXItPnNpemUgPSBidWZmZXIubUZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgIGF1ZGlvQnVmZmVyLT5tU2l6ZSA9IGJ1ZmZlci5tRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CiAgICAgYXVkaW9CdWZmZXItPnJhdyA9IGJ1ZmZlci5tUmF3OwogICAgIGF1ZGlvQnVmZmVyLT5zZXF1ZW5jZSA9IG9sZFNlcXVlbmNlOwogICAgIGlmIChub25Db250aWcgIT0gTlVMTCkgewpAQCAtMjA2MSw3ICsyMzMzLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNpemVfdCBzdGVwQ291bnQgPSBhdWRpb0J1ZmZlci0+c2l6ZSAvIG1GcmFtZVNpemU7CisgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGF1ZGlvQnVmZmVyLT5tU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMTQxLDggKzI0MTMsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHNzaXplX3QoZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCB0b1dyaXRlID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgbWVtY3B5KGF1ZGlvQnVmZmVyLmk4LCBidWZmZXIsIHRvV3JpdGUpOworICAgICAgICBzaXplX3QgdG9Xcml0ZSA9IGF1ZGlvQnVmZmVyLnNpemUoKTsKKyAgICAgICAgbWVtY3B5KGF1ZGlvQnVmZmVyLnJhdywgYnVmZmVyLCB0b1dyaXRlKTsKICAgICAgICAgYnVmZmVyID0gKChjb25zdCBjaGFyICopIGJ1ZmZlcikgKyB0b1dyaXRlOwogICAgICAgICB1c2VyU2l6ZSAtPSB0b1dyaXRlOwogICAgICAgICB3cml0dGVuICs9IHRvV3JpdGU7CkBAIC0yMTcyLDEwICsyNDQ0LDE1IEBACiB7CiAgICAgLy8gQ3VycmVudGx5IHRoZSBBdWRpb1RyYWNrIHRocmVhZCBpcyBub3QgY3JlYXRlZCBpZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzLgogICAgIC8vIFdvdWxkIGl0IGV2ZXIgbWFrZSBzZW5zZSB0byBydW4gdGhlIHRocmVhZCwgZXZlbiB3aXRob3V0IGNhbGxiYWNrcz8KLSAgICAvLyBJZiBzbywgdGhlbiByZXBsYWNlIHRoaXMgYnkgY2hlY2tzIGF0IGVhY2ggdXNlIGZvciBtQ2JmICE9IE5VTEwuCisgICAgLy8gSWYgc28sIHRoZW4gcmVwbGFjZSB0aGlzIGJ5IGNoZWNrcyBhdCBlYWNoIHVzZSBmb3IgbUNhbGxiYWNrICE9IE5VTEwuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2JsayA9PSBOVUxMKTsKLQogICAgIG1Mb2NrLmxvY2soKTsKKyAgICBzcDxJQXVkaW9UcmFja0NhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBudWxscHRyOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIE5TX05FVkVSOworICAgIH0KICAgICBpZiAobUF3YWl0Qm9vc3QpIHsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0yMjczLDcgKzI1NTAsNyBAQAogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gcHJveHkgPSBtUHJveHk7CiAKICAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBuZXcgbG9vcCBjYWxsYmFjayhzKSB0aGF0IHdpbGwgYmUgbmVlZGVkLCB3aGlsZSBsb2NrZWQuCi0gICAgaW50IGxvb3BDb3VudE5vdGlmaWNhdGlvbnMgPSAwOworICAgIHVpbnQzMl90IGxvb3BDb3VudE5vdGlmaWNhdGlvbnMgPSAwOwogICAgIHVpbnQzMl90IGxvb3BQZXJpb2QgPSAwOyAvLyB0aW1lIGluIGZyYW1lcyBmb3IgbmV4dCBFVkVOVF9MT09QX0VORCBvciBFVkVOVF9CVUZGRVJfRU5ECiAKICAgICBpZiAobUxvb3BDb3VudCA+IDApIHsKQEAgLTIyOTUsNyArMjU3Miw3IEBACiAgICAgfQogCiAgICAgLy8gVGhlc2UgZmllbGRzIGRvbid0IG5lZWQgdG8gYmUgY2FjaGVkLCBiZWNhdXNlIHRoZXkgYXJlIGFzc2lnbmVkIG9ubHkgYnkgc2V0KCk6Ci0gICAgLy8gICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtRm9ybWF0LCBtRnJhbWVTaXplLCBtRmxhZ3MKKyAgICAvLyBtVHJhbnNmZXIsIG1DYWxsYmFjaywgbVVzZXJEYXRhLCBtRm9ybWF0LCBtRnJhbWVTaXplLCBtRmxhZ3MKICAgICAvLyBtRmxhZ3MgaXMgYWxzbyBhc3NpZ25lZCBieSBjcmVhdGVUcmFja19sKCksIGJ1dCBub3QgdGhlIGJpdCB3ZSBjYXJlIGFib3V0LgogCiAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0yMzIwLDcgKzI1OTcsNyBAQAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgIC8vIGZvciBERUFEX09CSkVDVCwgd2UgZG8gbm90IHNlbmQgYSBFVkVOVF9TVFJFQU1fRU5EIGFmdGVyIHN0b3AoKTsKICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGhhbmRsZSB0aGUgRVZFTlRfTkVXX0lBVURJT1RSQUNLLgotICAgICAgICAgICAgICAgIG1DYmYoRVZFTlRfU1RSRUFNX0VORCwgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25TdHJlYW1FbmQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0yMzQzLDI4ICsyNjIwLDI3IEBACiAKICAgICAvLyBwZXJmb3JtIGNhbGxiYWNrcyB3aGlsZSB1bmxvY2tlZAogICAgIGlmIChuZXdVbmRlcnJ1bikgewotICAgICAgICBtQ2JmKEVWRU5UX1VOREVSUlVOLCBtVXNlckRhdGEsIE5VTEwpOworICAgICAgICBjYWxsYmFjay0+b25VbmRlcnJ1bigpOwogICAgIH0KICAgICB3aGlsZSAobG9vcENvdW50Tm90aWZpY2F0aW9ucyA+IDApIHsKLSAgICAgICAgbUNiZihFVkVOVF9MT09QX0VORCwgbVVzZXJEYXRhLCBOVUxMKTsKICAgICAgICAgLS1sb29wQ291bnROb3RpZmljYXRpb25zOworICAgICAgICBjYWxsYmFjay0+b25Mb29wRW5kKG1Mb29wQ291bnQgPiAwID8gbG9vcENvdW50Tm90aWZpY2F0aW9ucyArIG1Mb29wQ291bnROb3RpZmllZCA6IC0xKTsKICAgICB9CiAgICAgaWYgKGZsYWdzICYgQ0JMS19CVUZGRVJfRU5EKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfQlVGRkVSX0VORCwgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgY2FsbGJhY2stPm9uQnVmZmVyRW5kKCk7CiAgICAgfQogICAgIGlmIChtYXJrZXJSZWFjaGVkKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfTUFSS0VSLCBtVXNlckRhdGEsICZtYXJrZXJQb3NpdGlvbik7CisgICAgICAgIGNhbGxiYWNrLT5vbk1hcmtlcihtYXJrZXJQb3NpdGlvbi52YWx1ZSgpKTsKICAgICB9CiAgICAgd2hpbGUgKG5ld1Bvc0NvdW50ID4gMCkgewotICAgICAgICBzaXplX3QgdGVtcCA9IG5ld1Bvc2l0aW9uLnZhbHVlKCk7IC8vIEZJWE1FIHNpemVfdCAhPSB1aW50MzJfdAotICAgICAgICBtQ2JmKEVWRU5UX05FV19QT1MsIG1Vc2VyRGF0YSwgJnRlbXApOworICAgICAgICBjYWxsYmFjay0+b25OZXdQb3MobmV3UG9zaXRpb24udmFsdWUoKSk7CiAgICAgICAgIG5ld1Bvc2l0aW9uICs9IHVwZGF0ZVBlcmlvZDsKICAgICAgICAgbmV3UG9zQ291bnQtLTsKICAgICB9CiAKICAgICBpZiAobU9ic2VydmVkU2VxdWVuY2UgIT0gc2VxdWVuY2UpIHsKICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBzZXF1ZW5jZTsKLSAgICAgICAgbUNiZihFVkVOVF9ORVdfSUFVRElPVFJBQ0ssIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vbk5ld0lBdWRpb1RyYWNrKCk7CiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzLCBqdXN0IHdhaXQgZm9yIHRoZSB1cHBlciBsYXllcnMgdG8gcmVjcmVhdGUgdGhlIHRyYWNrCiAgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgICAgIHJldHVybiBOU19JTkFDVElWRTsKQEAgLTI0OTYsMTYgKzI3NzIsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKKyAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplKCk7CiAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICAgICAgLy8gd2hlbiBub3RpZnlpbmcgY2xpZW50IGl0IGNhbiB3cml0ZSBtb3JlIGRhdGEsIHBhc3MgdGhlIHRvdGFsIHNpemUgdGhhdCBjYW4gYmUKICAgICAgICAgICAgIC8vIHdyaXR0ZW4gaW4gdGhlIG5leHQgd3JpdGUoKSBjYWxsLCBzaW5jZSBpdCdzIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sKLSAgICAgICAgICAgIGF1ZGlvQnVmZmVyLnNpemUgKz0gbm9uQ29udGlnOworICAgICAgICAgICAgYXVkaW9CdWZmZXIubVNpemUgKz0gbm9uQ29udGlnOwogICAgICAgICB9Ci0gICAgICAgIG1DYmYobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLID8gRVZFTlRfTU9SRV9EQVRBIDogRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwKLSAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7Ci0gICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7Ci0KKyAgICAgICAgY29uc3Qgc2l6ZV90IHdyaXR0ZW5TaXplID0gKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYWxsYmFjay0+b25Nb3JlRGF0YShhdWRpb0J1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjYWxsYmFjay0+b25DYW5Xcml0ZU1vcmVEYXRhKGF1ZGlvQnVmZmVyKTsKICAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCkBAIC0yNTY1LDYgKzI4NDAsOSBAQAogICAgICAgICAgICAgcmV0dXJuIG5zOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVsZWFzZUJ1ZmZlciByZWFkcyBmcm9tIGF1ZGlvQnVmZmVyLnNpemUKKyAgICAgICAgYXVkaW9CdWZmZXIubVNpemUgPSB3cml0dGVuU2l6ZTsKKwogICAgICAgICBzaXplX3QgcmVsZWFzZWRGcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSByZWxlYXNlZEZyYW1lczsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyAtPSByZWxlYXNlZEZyYW1lczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMzU3MTliZS4uZTNiNzliMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTQwOSw3ICs0MDksNyBAQAogICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICAvLyBpdCBzZWVtcyB0aGF0IGEgRlVURVhfV0FLRV9QUklWQVRFIHdpbGwgbm90IHdha2UgYSBGVVRFWF9XQUlULCBldmVuIHdpdGhpbiBzYW1lIHByb2Nlc3MKICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKLSAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICBJTlRfTUFYKTsKICAgICB9CiB9CiAKQEAgLTQxOSw3ICs0MTksNyBAQAogICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5URVJSVVBULCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfSU5URVJSVVBUKSkgewogICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAotICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgIElOVF9NQVgpOwogICAgIH0KIH0KIApAQCAtNDkwLDYgKzQ5MCw4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OndhaXRTdHJlYW1FbmREb25lKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkKQogewogICAgIHN0cnVjdCB0aW1lc3BlYyB0b3RhbDsgICAgICAgICAgLy8gdG90YWwgZWxhcHNlZCB0aW1lIHNwZW50IHdhaXRpbmcKKyAgICBzdHJ1Y3QgdGltZXNwZWMgYmVmb3JlOworICAgIGJvb2wgYmVmb3JlSXNWYWxpZCA9IGZhbHNlOwogICAgIHRvdGFsLnR2X3NlYyA9IDA7CiAgICAgdG90YWwudHZfbnNlYyA9IDA7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CkBAIC01NzAsMTcgKzU3MiwzOCBAQAogICAgICAgICB9CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CisgICAgICAgICAgICBpZiAoIWJlZm9yZUlzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmJlZm9yZSk7CisgICAgICAgICAgICAgICAgYmVmb3JlSXNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAogICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUlUX1BSSVZBVEUgOiBGVVRFWF9XQUlULCBvbGQgJiB+Q0JMS19GVVRFWF9XQUtFLCB0cyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9IGVycm5vOyAvLyBjbG9ja19nZXR0aW1lIGNhbiBhZmZlY3QgZXJybm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgYWZ0ZXI7CisgICAgICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhZnRlcik7CisgICAgICAgICAgICAgICAgdG90YWwudHZfc2VjICs9IGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWM7CisgICAgICAgICAgICAgICAgLy8gVXNlIGF1dG8gaW5zdGVhZCBvZiBsb25nIHRvIGF2b2lkIHRoZSBnb29nbGUtcnVudGltZS1pbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBhdXRvIGRlbHRhTnMgPSBhZnRlci50dl9uc2VjIC0gYmVmb3JlLnR2X25zZWM7CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhTnMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhTnMgKz0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgdG90YWwudHZfc2VjLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodG90YWwudHZfbnNlYyArPSBkZWx0YU5zKSA+PSAxMDAwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgdG90YWwudHZfc2VjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJlZm9yZSA9IGFmdGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChlcnJvcikgewogICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKICAgICAgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKICAgICAgICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAvLyB3YWl0IHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3Igb3RoZXIgc3B1cmlvdXMgd2FrZXVwCiAgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJvcjsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihzdGF0dXMpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0KQEAgLTc0Nyw3ICs3NzAsNyBAQAogICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewogICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIElOVF9NQVgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1GbHVzaGVkICs9IChuZXdGcm9udCAtIGZyb250KSAmIG1hc2s7CkBAIC05MTcsNyArOTQwLDcgQEAKICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CiAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgSU5UX01BWCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAKaW5kZXggMzYxZjdiOC4uYWI5NTI0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAKQEAgLTI2LDExICsyNiwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmg+CiAKLSNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUih4KSBcCi0gICAgeyBhdXRvIF90bXAgPSAoeCk7IGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7CisKIHN0YXR1c190IEF1ZGlvVm9sdW1lR3JvdXA6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQogewogICAgIG1lZGlhOjpBdWRpb1ZvbHVtZUdyb3VwIGFpZGw7CkBAIC01NSw3ICs1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5nZXRBdWRpb0F0dHJpYnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKSk7CiAgICAgYWlkbC5zdHJlYW1zID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9TdHJlYW1UeXBlPj4obGVnYWN5LmdldFN0cmVhbVR5cGVzKCksCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvU3RyZWFtVHlwZT4+KGxlZ2FjeS5nZXRTdHJlYW1UeXBlcygpLAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUpKTsKICAgICByZXR1cm4gYWlkbDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggY2FlODFmMC4uMjkyZDkyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJJQXVkaW9GbGluZ2VyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTMwLDYgKzMxLDEzIEBACiAKIHVzaW5nIGFpZGxfdXRpbHM6OnN0YXR1c1RGcm9tQmluZGVyU3RhdHVzOwogdXNpbmcgYmluZGVyOjpTdGF0dXM7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkOwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CiAKQEAgLTQwLDEyICs0OCw2IEBACiAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7IFwKICAgICAgfSkKIAotI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICAgXAotICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgIFwKLSAgICB9Ci0KICNkZWZpbmUgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUih4KSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTU1LDcgKzU3LDkgQEAKIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdD4gSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dDo6dG9BaWRsKCkgY29uc3QgewogICAgIG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QgYWlkbDsKICAgICBhaWRsLmF0dHIgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKLSAgICBhaWRsLmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICAvLyBEbyBub3QgYmUgbWlzbGVhZCBieSAnSW5wdXQnLS10aGlzIGlzIGFuIGlucHV0IHRvICdjcmVhdGVUcmFjaycsIHdoaWNoIGNyZWF0ZXMgb3V0cHV0IHRyYWNrcy4KKyAgICBhaWRsLmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGFpZGwuY2xpZW50SW5mbyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb0NsaWVudF9BdWRpb0NsaWVudChjbGllbnRJbmZvKSk7CiAgICAgYWlkbC5zaGFyZWRCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfTnVsbGFibGVJTWVtb3J5X1NoYXJlZEZpbGVSZWdpb24oc2hhcmVkQnVmZmVyKSk7CiAgICAgYWlkbC5ub3RpZmljYXRpb25zUGVyQnVmZmVyID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90Pihub3RpZmljYXRpb25zUGVyQnVmZmVyKSk7CkBAIC03NCw3ICs3OCw5IEBACiBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja0lucHV0Ojpmcm9tQWlkbChjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiBhaWRsKSB7CiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBsZWdhY3k7CiAgICAgbGVnYWN5LmF0dHIgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGFpZGwuYXR0cikpOwotICAgIGxlZ2FjeS5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoYWlkbC5jb25maWcpKTsKKyAgICAvLyBEbyBub3QgYmUgbWlzbGVhZCBieSAnSW5wdXQnLS10aGlzIGlzIGFuIGlucHV0IHRvICdjcmVhdGVUcmFjaycsIHdoaWNoIGNyZWF0ZXMgb3V0cHV0IHRyYWNrcy4KKyAgICBsZWdhY3kuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoYWlkbC5jb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgbGVnYWN5LmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoYWlkbC5jbGllbnRJbmZvKSk7CiAgICAgbGVnYWN5LnNoYXJlZEJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9OdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShhaWRsLnNoYXJlZEJ1ZmZlcikpOwogICAgIGxlZ2FjeS5ub3RpZmljYXRpb25zUGVyQnVmZmVyID0gVkFMVUVfT1JfUkVUVVJOKApAQCAtMTM5LDcgKzE0NSw4IEBACiBJQXVkaW9GbGluZ2VyOjpDcmVhdGVSZWNvcmRJbnB1dDo6dG9BaWRsKCkgY29uc3QgewogICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0IGFpZGw7CiAgICAgYWlkbC5hdHRyID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyKSk7Ci0gICAgYWlkbC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uZmlnKSk7CisgICAgYWlkbC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICBhaWRsLmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoY2xpZW50SW5mbykpOwogICAgIGFpZGwucmlpZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KHJpaWQpKTsKICAgICBhaWRsLm1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zID0gVkFMVUVfT1JfUkVUVVJOKApAQCAtMTU5LDcgKzE2Niw4IEBACiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQgbGVnYWN5OwogICAgIGxlZ2FjeS5hdHRyID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGFpZGwuYXR0cikpOwotICAgIGxlZ2FjeS5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoYWlkbC5jb25maWcpKTsKKyAgICBsZWdhY3kuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoYWlkbC5jb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICBsZWdhY3kuY2xpZW50SW5mbyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NsaWVudF9BdWRpb0NsaWVudChhaWRsLmNsaWVudEluZm8pKTsKICAgICBsZWdhY3kucmlpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3VuaXF1ZV9pZF90KGFpZGwucmlpZCkpOwogICAgIGxlZ2FjeS5tYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IFZBTFVFX09SX1JFVFVSTigKQEAgLTE4OSw2ICsxOTcsOCBAQAogICAgIGFpZGwuYnVmZmVycyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9OdWxsYWJsZUlNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihidWZmZXJzKSk7CiAgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOwogICAgIGFpZGwuYXVkaW9SZWNvcmQgPSBhdWRpb1JlY29yZDsKKyAgICBhaWRsLnNlcnZlckNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKHNlcnZlckNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIHJldHVybiBhaWRsOwogfQogCkBAIC0yMDksNiArMjE5LDggQEAKICAgICBsZWdhY3kuYnVmZmVycyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9OdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShhaWRsLmJ1ZmZlcnMpKTsKICAgICBsZWdhY3kucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnBvcnRJZCkpOwogICAgIGxlZ2FjeS5hdWRpb1JlY29yZCA9IGFpZGwuYXVkaW9SZWNvcmQ7CisgICAgbGVnYWN5LnNlcnZlckNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuc2VydmVyQ29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIApAQCAtMjQyLDkgKzI1NCw5IEBACiBhdWRpb19mb3JtYXRfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpmb3JtYXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCB7CiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiB7CiAgICAgICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOwotICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYWlkbFJldDsKKyAgICAgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBhaWRsUmV0OwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5mb3JtYXQob3V0cHV0QWlkbCwgJmFpZGxSZXQpKSk7Ci0gICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsUmV0KTsKKyAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbFJldCk7CiAgICAgfSgpOwogICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fRk9STUFUX0lOVkFMSUQpOwogfQpAQCAtMzA5LDE0ICszMjEsMTQgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtQWlkbCwgdmFsdWUsIG91dHB1dEFpZGwpKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCkgewotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0U3RyZWFtTXV0ZShzdHJlYW1BaWRsLCBtdXRlZCkpOwogfQpAQCAtMzI0LDcgKzMzNiw3IEBACiBmbG9hdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCB7CiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGZsb2F0PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICAgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOwogICAgICAgICBmbG9hdCBhaWRsUmV0OwpAQCAtMzM4LDcgKzM1MCw3IEBACiAKIGJvb2wgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgewogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxib29sPiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICAgICAgYm9vbCBhaWRsUmV0OwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCkBAIC0zNTAsNyArMzYyLDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIG1lZGlhOjpBdWRpb01vZGUgbW9kZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZGVfdF9BdWRpb01vZGUobW9kZSkpOworICAgIEF1ZGlvTW9kZSBtb2RlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShtb2RlKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0TW9kZShtb2RlQWlkbCkpOwogfQogCkBAIC00MTAsMTAgKzQyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QgewogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxzaXplX3Q+IHsKICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlQWlkbCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oc2FtcGxlUmF0ZSkpOwotICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZm9ybWF0QWlkbCA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChmb3JtYXQpKTsKLSAgICAgICAgaW50MzJfdCBjaGFubmVsTWFza0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChjaGFubmVsTWFzaykpOworICAgICAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGZvcm1hdEFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihmb3JtYXQpKTsKKyAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0IGNoYW5uZWxNYXNrQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQoY2hhbm5lbE1hc2ssIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICAgICAgaW50NjRfdCBhaWRsUmV0OwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZUFpZGwsIGZvcm1hdEFpZGwsIGNoYW5uZWxNYXNrQWlkbCwKQEAgLTQ2OSw3ICs0ODEsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbUFpZGwpKTsKIH0KQEAgLTU2OCw5ICs1ODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBwVHlwZVVVSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgY29uc3QgewotICAgIG1lZGlhOjpBdWRpb1V1aWQgZWZmZWN0VXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvVXVpZCBlZmZlY3RVdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKCpwRWZmZWN0VVVJRCkpOwotICAgIG1lZGlhOjpBdWRpb1V1aWQgdHlwZVV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1V1aWQgdHlwZVV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoKnBUeXBlVVVJRCkpOwogICAgIGludDMyX3QgcHJlZmVycmVkVHlwZUZsYWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihwcmVmZXJyZWRUeXBlRmxhZykpOwpAQCAtNzE1LDYgKzcyNywxMCBAQAogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnN5c3RlbVJlYWR5KCkpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjphdWRpb1BvbGljeVJlYWR5KCkgeworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmF1ZGlvUG9saWN5UmVhZHkoKSk7Cit9CisKIHNpemVfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpmcmFtZUNvdW50SEFMKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCB7CiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHNpemVfdD4gewogICAgICAgICBpbnQzMl90IGlvSGFuZGxlQWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlvSGFuZGxlKSk7CkBAIC03NjEsNiArNzc3LDM4IEBACiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+dXBkYXRlU2Vjb25kYXJ5T3V0cHV0cyh0cmFja1NlY29uZGFyeU91dHB1dEluZm9zKSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIHsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5nZXRNbWFwUG9saWN5SW5mb3MocG9saWN5VHlwZSwgcG9saWN5SW5mb3MpKTsKK30KKworaW50MzJfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IHsKKyAgICAgICAgaW50MzJfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitpbnQzMl90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiB7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBhaWRsUG9ydCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydCgqcG9ydCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldERldmljZUNvbm5lY3RlZFN0YXRlKGFpZGxQb3J0LCBjb25uZWN0ZWQpKTsKK30KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcgpAQCAtODA2LDExICs4NTQsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZvcm1hdChpbnQzMl90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3Qob3V0cHV0KSk7CiAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChtRGVsZWdhdGUtPmZvcm1hdChvdXRwdXRMZWdhY3kpKSk7CisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKG1EZWxlZ2F0ZS0+Zm9ybWF0KG91dHB1dExlZ2FjeSkpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC04NTYsNyArOTA0LDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmdldE1hc3RlckJhbGFuY2UoX2FpZGxfcmV0dXJuKSk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGZsb2F0IHZhbHVlLAorU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldFN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXQpIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKQEAgLTg2NSwxMyArOTEzLDEzIEBACiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtTGVnYWN5LCB2YWx1ZSwgb3V0cHV0TGVnYWN5KSk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0U3RyZWFtTXV0ZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSwgbXV0ZWQpKTsKIH0KIAotU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBvdXRwdXQsCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3RyZWFtVm9sdW1lKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CkBAIC04ODEsMTQgKzkyOSwxNCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1NdXRlKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBtRGVsZWdhdGUtPnN0cmVhbU11dGUoc3RyZWFtTGVnYWN5KTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TW9kZShtZWRpYTo6QXVkaW9Nb2RlIG1vZGUpIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRNb2RlKEF1ZGlvTW9kZSBtb2RlKSB7CiAgICAgYXVkaW9fbW9kZV90IG1vZGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobW9kZSkpOwogICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0TW9kZShtb2RlTGVnYWN5KSk7CiB9CkBAIC05MzQsMTMgKzk4MiwxNCBAQAogfQogCiBTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzaywgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoY29udmVydEludGVncmFsPHVpbnQzMl90PihzYW1wbGVSYXRlKSk7CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGZvcm1hdCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChmb3JtYXQpKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoY2hhbm5lbE1hc2ssIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1EZWxlZ2F0ZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGVMZWdhY3ksIGZvcm1hdExlZ2FjeSwgY2hhbm5lbE1hc2tMZWdhY3kpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihzaXplKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTk5MSw3ICsxMDQwLDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNsb3NlSW5wdXQoaW5wdXRMZWdhY3kpKTsKIH0KIAotU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmludmFsaWRhdGVTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtTGVnYWN5KSk7CkBAIC0xMDY2LDggKzExMTUsOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGVmZmVjdFVVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlVVVJRCwKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IEF1ZGlvVXVpZCYgZWZmZWN0VVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVXVpZCYgdHlwZVVVSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgewogICAgIGVmZmVjdF91dWlkX3QgZWZmZWN0VXVpZExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCkBAIC0xMTg5LDYgKzEyMzgsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnN5c3RlbVJlYWR5KCkpOwogfQogCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6YXVkaW9Qb2xpY3lSZWFkeSgpIHsKKyAgICBtRGVsZWdhdGUtPmF1ZGlvUG9saWN5UmVhZHkoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6ZnJhbWVDb3VudEhBTChpbnQzMl90IGlvSGFuZGxlLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGlvSGFuZGxlKSk7CkBAIC0xMjI3LDQgKzEyODEsMjcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnVwZGF0ZVNlY29uZGFyeU91dHB1dHModHJhY2tTZWNvbmRhcnlPdXRwdXRzKSk7CiB9CiAKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKl9haWRsX3JldHVybikgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+Z2V0TW1hcFBvbGljeUluZm9zKHBvbGljeVR5cGUsIF9haWRsX3JldHVybikpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3Q+KG1EZWxlZ2F0ZS0+Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obURlbGVnYXRlLT5nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldERldmljZUNvbm5lY3RlZFN0YXRlKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwb3J0LCBib29sIGNvbm5lY3RlZCkgeworICAgIGF1ZGlvX3BvcnRfdjcgcG9ydExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcocG9ydCkpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoJnBvcnRMZWdhY3ksIGNvbm5lY3RlZCkpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Qb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Qb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAKaW5kZXggMjVmZGI0OS4uNTIwZjA5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUG9saWN5QWlkbENvbnZlcnNpb24uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BvbGljeUFpZGxDb252ZXJzaW9uLmNwcApAQCAtMjUsMTYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgYmFzZTo6dW5leHBlY3RlZDsKLQotQ29udmVyc2lvblJlc3VsdDx2b2x1bWVfZ3JvdXBfdD4KLWFpZGwybGVnYWN5X2ludDMyX3Rfdm9sdW1lX2dyb3VwX3QoaW50MzJfdCBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDx2b2x1bWVfZ3JvdXBfdD4oYWlkbCk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KLWxlZ2FjeTJhaWRsX3ZvbHVtZV9ncm91cF90X2ludDMyX3Qodm9sdW1lX2dyb3VwX3QgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOwotfQordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKIAogQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KIGFpZGwybGVnYWN5X0F1ZGlvTWl4VHlwZV91aW50MzJfdChtZWRpYTo6QXVkaW9NaXhUeXBlIGFpZGwpIHsKQEAgLTE1Miw3ICsxNDMsNyBAQAogCiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZTo6c291cmNlOgogICAgICAgICAgICAgbGVnYWN5Lm1Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChVTklPTl9HRVQoYWlkbCwgc291cmNlKS52YWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KFVOSU9OX0dFVChhaWRsLCBzb3VyY2UpLnZhbHVlKCkpKTsKICAgICAgICAgICAgICpydWxlIHw9IFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKIApAQCAtMTg0LDcgKzE3NSw3IEBACiAKICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDoKICAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kubVNvdXJjZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UobGVnYWN5Lm1Tb3VyY2UpKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgpAQCAtMjMyLDExICsyMjMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihsZWdhY3kubUNyaXRlcmlhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24pKTsKICAgICBsZWdhY3kubU1peFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9NaXhUeXBlX3VpbnQzMl90KGFpZGwubWl4VHlwZSkpOwotICAgIGxlZ2FjeS5tRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGFpZGwuZm9ybWF0KSk7CisgICAgLy8gU2VlICdjb252ZXJ0QXVkaW9NaXhUb05hdGl2ZScgaW4gJ2FuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0uY3BwJyAtLSBvbmx5CisgICAgLy8gYW4gb3V0cHV0IG1hc2sgaXMgZXhwZWN0ZWQgaGVyZS4KKyAgICBsZWdhY3kubUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5mb3JtYXQsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgbGVnYWN5Lm1Sb3V0ZUZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9NaXhSb3V0ZUZsYWdfdWludDMyX3RfbWFzayhhaWRsLnJvdXRlRmxhZ3MpKTsKLSAgICBsZWdhY3kubURldmljZVR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC5kZXZpY2UudHlwZSkpOwotICAgIGxlZ2FjeS5tRGV2aWNlQWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmc4KGFpZGwuZGV2aWNlLmFkZHJlc3MpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmRldmljZSwgJmxlZ2FjeS5tRGV2aWNlVHlwZSwgJmxlZ2FjeS5tRGV2aWNlQWRkcmVzcykpOwogICAgIGxlZ2FjeS5tQ2JGbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb01peENhbGxiYWNrRmxhZ191aW50MzJfdF9tYXNrKGFpZGwuY2JGbGFncykpOwogICAgIGxlZ2FjeS5tQWxsb3dQcml2aWxlZ2VkTWVkaWFQbGF5YmFja0NhcHR1cmUgPSBhaWRsLmFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlOwogICAgIGxlZ2FjeS5tVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQgPSBhaWRsLnZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkOwpAQCAtMjUxLDExICsyNDUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5Lm1Dcml0ZXJpYSwKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9NaXhNYXRjaENyaXRlcmlvbikpOwogICAgIGFpZGwubWl4VHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFR5cGUobGVnYWN5Lm1NaXhUeXBlKSk7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcobGVnYWN5Lm1Gb3JtYXQpKTsKKyAgICAvLyBTZWUgJ2NvbnZlcnRBdWRpb01peFRvTmF0aXZlJyBpbiAnYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAnIC0tIG9ubHkKKyAgICAvLyBhbiBvdXRwdXQgbWFzayBpcyBleHBlY3RlZCBoZXJlLgorICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kubUZvcm1hdCwgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBhaWRsLnJvdXRlRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFJvdXRlRmxhZ19tYXNrKGxlZ2FjeS5tUm91dGVGbGFncykpOwotICAgIGFpZGwuZGV2aWNlLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5Lm1EZXZpY2VUeXBlKSk7Ci0gICAgYWlkbC5kZXZpY2UuYWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhsZWdhY3kubURldmljZUFkZHJlc3MpKTsKKyAgICBhaWRsLmRldmljZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5Lm1EZXZpY2VUeXBlLCBsZWdhY3kubURldmljZUFkZHJlc3MpKTsKICAgICBhaWRsLmNiRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhDYWxsYmFja0ZsYWdfbWFzayhsZWdhY3kubUNiRmxhZ3MpKTsKICAgICBhaWRsLmFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlID0gbGVnYWN5Lm1BbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZTsKICAgICBhaWRsLnZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkID0gbGVnYWN5Lm1Wb2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzUxZjgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTUgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJhdWRpb19haWRsX2NvbnZlcnNpb25fdGVzdHMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNOYXRpdmVNZWRpYUFBdWRpb1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8uQUF1ZGlvVGVzdHMjQUF1ZGlvQmFzaWMuKiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCBlNWU4NDk2Li40NjYyMjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUb25lR2VuZXJhdG9yIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSA8bWF0aC5oPgpAQCAtOTc3LDcgKzk3OCw3IEBACiAvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjpUb25lR2VuZXJhdG9yKCkKIC8vCiAvLyAgICBEZXNjcmlwdGlvbjogICAgQ29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSB0b25lIHNlcXVlbmNlciwgaW50YW50aWF0ZXMgcmVxdWlyZWQgc2luZSB3YXZlCi0vLyAgICAgICAgZ2VuZXJhdG9ycywgaW5zdGFudGlhdGVzIG91dHB1dCBhdWRpbyB0cmFjay4KKy8vICAgICAgICBnZW5lcmF0b3JzLCBkb2VzIG5vdCBpbml0aWFsaXplIG91dHB1dCBhdWRpbyB0cmFjay4KIC8vCiAvLyAgICBJbnB1dDoKIC8vICAgICAgICBzdHJlYW1UeXBlOiAgICAgICAgVHlwZSBvZiBzdHJlYW0gdXNlZCBmb3IgdG9uZSBwbGF5YmFjawpAQCAtMTA0MSw2ICsxMDQyLDIzIEBACiAgICAgICAgIG1SZWdpb24gPSBDRVBUOwogICAgIH0KIAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICAgIE1ldGhvZDogICAgICAgIFRvbmVHZW5lcmF0b3I6Om9uRmlyc3RSZWYoKQorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgQ2FsbGVkIHVwb24gZmlyc3QgUmVmQmFzZSByZWZlcmVuY2UuIEluaXRpYWxpemVzIGF1ZGlvIHRyYWNrCisvLyAgICAgICAgICAgICAgICAgIHdpdGggd2VhayBwb2ludGVyIHRvIHNlbGYgYXMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2suCisvLyAgICBJbnB1dDoKKy8vICAgICAgICBub25lCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIG5vbmUKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRvbmVHZW5lcmF0b3I6Om9uRmlyc3RSZWYoKSB7CiAgICAgaWYgKGluaXRBdWRpb1RyYWNrKCkpIHsKICAgICAgICAgQUxPR1YoIlRvbmVHZW5lcmF0b3IgSU5JVCBPSywgdGltZTogJWQiLCAodW5zaWduZWQgaW50KShzeXN0ZW1UaW1lKCkvMTAwMDAwMCkpOwogICAgIH0gZWxzZSB7CkBAIC0xMDQ4LDkgKzEwNjYsNiBAQAogICAgIH0KIH0KIAotCi0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjp+VG9uZUdlbmVyYXRvcigpCkBAIC0xMjE1LDcgKzEyMzAsOCBAQAogICAgICAgICAgICAgICAgICAgICBzZWMgPSBzZWMgKiAxMDAwICsgbnNlYyAvIDEwMDAwMDA7IC8vIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgICAgICBtTWF4U21wID0gKHVuc2lnbmVkIGludCkoKChpbnQ2NF90KXNlYyAqIG1TYW1wbGluZ1JhdGUpIC8gMTAwMCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wVG9uZSgpIGZvcmNpbmcgbU1heFNtcCB0byAlZCwgdG90YWwgZm9yIGZhciAlZCIsIG1NYXhTbXAsICBtVG90YWxTbXApOworICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wVG9uZSgpIGZvcmNpbmcgbU1heFNtcCB0byAlZCwgdG90YWwgZm9yIGZhciAlIiBQUkl1NjQsIG1NYXhTbXAsCisgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsU21wKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9TVE9QUElORzsKICAgICAgICAgICAgIH0KQEAgLTEyODIsOCArMTI5OCw3IEBACiAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsCi0gICAgICAgICAgICBhdWRpb0NhbGxiYWNrLAotICAgICAgICAgICAgdGhpcywgLy8gdXNlcgorICAgICAgICAgICAgd3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz46OmZyb21FeGlzdGluZyh0aGlzKSwKICAgICAgICAgICAgIDAsICAgIC8vIG5vdGlmaWNhdGlvbkZyYW1lcwogICAgICAgICAgICAgMCwgICAgLy8gc2hhcmVkQnVmZmVyCiAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmEsCkBAIC0xMzA4LDUwICsxMzIzLDQ3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwotLy8gICAgTWV0aG9kOiAgICAgICAgVG9uZUdlbmVyYXRvcjo6YXVkaW9DYWxsYmFjaygpCisvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjpvbk1vcmVEYXRhKCkKIC8vCiAvLyAgICBEZXNjcmlwdGlvbjogICAgQXVkaW9UcmFjayBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4gR2VuZXJhdGVzIGEgYmxvY2sgb2YKIC8vICAgICAgICBQQ00gc2FtcGxlcwogLy8gICAgICAgIGFuZCBtYW5hZ2VzIHRvbmUgZ2VuZXJhdG9yIHNlcXVlbmNlcjogdG9uZXMgcHVsc2VzLCB0b25lIGR1cmF0aW9uLi4uCiAvLwogLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgdXNlciAgICByZWZlcmVuY2UgKHBvaW50ZXIgdG8gb3VyIFRvbmVHZW5lcmF0b3IpCi0vLyAgICAgICAgaW5mbyAgICBhdWRpbyBidWZmZXIgZGVzY3JpcHRvcgorLy8gICAgICAgIGJ1ZmZlciAgQW4gYnVmZmVyIG9iamVjdCBjb250YWluaW5nIGEgcG9pbnRlciB3aGljaCB3ZSB3aWxsIGZpbGwgd2l0aAorLy8gICAgICAgICAgICAgICAgYnVmZmVyLnNpemUoKSBieXRlcy4KIC8vCiAvLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6IGFsd2F5cyB0cnVlLgorLy8gICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2Ugc3VjY2Vzc2Z1bGx5IHdyb3RlLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRvbmVHZW5lcmF0b3I6OmF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKSB7CitzaXplX3QgVG9uZUdlbmVyYXRvcjo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgewogCi0gICAgaWYgKGV2ZW50ICE9IEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSkgcmV0dXJuOwotCi0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7Ci0gICAgVG9uZUdlbmVyYXRvciAqbHBUb25lR2VuID0gc3RhdGljX2Nhc3Q8VG9uZUdlbmVyYXRvciAqPih1c2VyKTsKLSAgICBpbnQxNl90ICpscE91dCA9IGJ1ZmZlci0+aTE2OwotICAgIHVuc2lnbmVkIGludCBsTnVtU21wID0gYnVmZmVyLT5zaXplL3NpemVvZihpbnQxNl90KTsKLSAgICBjb25zdCBUb25lRGVzY3JpcHRvciAqbHBUb25lRGVzYyA9IGxwVG9uZUdlbi0+bXBUb25lRGVzYzsKLQotICAgIGlmIChidWZmZXItPnNpemUgPT0gMCkgcmV0dXJuOwotCisgICAgaW50MTZfdCAqbHBPdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPihidWZmZXIuZGF0YSgpKTsKKyAgICB1aW50MzJfdCBsTnVtU21wID0gKGJ1ZmZlci5zaXplKCkgLyBzaXplb2YoaW50MTZfdCkgPCBVSU5UMzJfTUFYKSA/CisgICAgICAgICAgICBidWZmZXIuc2l6ZSgpIC8gc2l6ZW9mKGludDE2X3QpIDogVUlOVDMyX01BWDsKKyAgICBpZiAoYnVmZmVyLnNpemUoKSA9PSAwKSByZXR1cm4gMDsKKyAgICAvLyBXZSB3aWxsIHdyaXRlIHRvIHRoZSBlbnRpcmUgYnVmZmVyIHVubGVzcyB3ZSBhcmUgc3RvcHBlZCwgdGhlbiB3ZSByZXR1cm4KKyAgICAvLyAwIGF0IGxvb3AgZW5kCisgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbiA9IGxOdW1TbXAgKiBzaXplb2YoaW50MTZfdCk7CiAKICAgICAvLyBDbGVhciBvdXRwdXQgYnVmZmVyOiBXYXZlR2VuZXJhdG9yIGFjY3VtdWxhdGVzIGludG8gbHBPdXQgYnVmZmVyCi0gICAgbWVtc2V0KGxwT3V0LCAwLCBidWZmZXItPnNpemUpOworICAgIG1lbXNldChscE91dCwgMCwgYnVmZmVyLnNpemUoKSk7CiAKICAgICB3aGlsZSAobE51bVNtcCkgewotICAgICAgICB1bnNpZ25lZCBpbnQgbFJlcVNtcCA9IGxOdW1TbXAgPCBscFRvbmVHZW4tPm1Qcm9jZXNzU2l6ZSoyID8gbE51bVNtcCA6IGxwVG9uZUdlbi0+bVByb2Nlc3NTaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgbFJlcVNtcCA9IGxOdW1TbXAgPCBtUHJvY2Vzc1NpemUqMiA/IGxOdW1TbXAgOiBtUHJvY2Vzc1NpemU7CiAgICAgICAgIHVuc2lnbmVkIGludCBsR2VuU21wOwogICAgICAgICB1bnNpZ25lZCBpbnQgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX0NPTlQ7CiAgICAgICAgIGJvb2wgbFNpZ25hbCA9IGZhbHNlOwogCi0gICAgICAgIGxwVG9uZUdlbi0+bUxvY2subG9jaygpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAKIAogICAgICAgICAvLyBVcGRhdGUgcGNtIGZyYW1lIGNvdW50IGFuZCBlbmQgdGltZSAoY3VycmVudCB0aW1lIGF0IHRoZSBlbmQgb2YgdGhpcyBwcm9jZXNzKQotICAgICAgICBscFRvbmVHZW4tPm1Ub3RhbFNtcCArPSBsUmVxU21wOworICAgICAgICBtVG90YWxTbXAgKz0gbFJlcVNtcDsKIAogICAgICAgICAvLyBVcGRhdGUgdG9uZSBnZW4gc3RhdGUgbWFjaGluZSBhbmQgc2VsZWN0IHdhdmUgZ2VuIGNvbW1hbmQKLSAgICAgICAgc3dpdGNoIChscFRvbmVHZW4tPm1TdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFRPTkVfUExBWUlORzoKICAgICAgICAgICAgIGxXYXZlQ21kID0gV2F2ZUdlbmVyYXRvcjo6V0FWRUdFTl9DT05UOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzY1LDcgKzEzNzcsNyBAQAogICAgICAgICAgICAgQUxPR1YoIlN0b3AvcmVzdGFydCBDYmsiKTsKIAogICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUT1A7Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1OZXh0U2VnU21wID0gVE9ORUdFTl9JTkY7IC8vIGZvcmNlZCB0byBza2lwIHN0YXRlIG1hY2hpbmUgbWFuYWdlbWVudCBiZWxvdworICAgICAgICAgICAgbU5leHRTZWdTbXAgPSBUT05FR0VOX0lORjsgLy8gZm9yY2VkIHRvIHNraXAgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50IGJlbG93CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUT05FX1NUT1BQRUQ6CiAgICAgICAgICAgICBBTE9HVigiU3RvcHBlZCBDYmsiKTsKQEAgLTEzNzYsMjAgKzEzODgsMjAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEV4aXQgaWYgdG9uZSBzZXF1ZW5jZSBpcyBvdmVyCi0gICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwIHx8Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1Ub3RhbFNtcCA+IGxwVG9uZUdlbi0+bU1heFNtcCkgewotICAgICAgICAgICAgaWYgKGxwVG9uZUdlbi0+bVN0YXRlID09IFRPTkVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXRlID0gVE9ORV9TVE9QUElORzsKKyAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwIHx8CisgICAgICAgICAgICBtVG90YWxTbXAgPiBtTWF4U21wKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IFRPTkVfUExBWUlORykgeworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfU1RPUFBJTkc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0uZHVyYXRpb24gPT0gMCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ290byBhdWRpb0NhbGxiYWNrX0VuZExvb3A7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmYWRlIG91dCBiZWZvcmUgc3RvcHBpbmcgaWYgbWF4aW11bSBkdXJhdGlvbiByZWFjaGVkCiAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RPUDsKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bU5leHRTZWdTbXAgPSBUT05FR0VOX0lORjsgLy8gZm9yY2VkIHRvIHNraXAgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50IGJlbG93CisgICAgICAgICAgICBtTmV4dFNlZ1NtcCA9IFRPTkVHRU5fSU5GOyAvLyBmb3JjZWQgdG8gc2tpcCBzdGF0ZSBtYWNoaW5lIG1hbmFnZW1lbnQgYmVsb3cKICAgICAgICAgfQogCi0gICAgICAgIGlmIChscFRvbmVHZW4tPm1Ub3RhbFNtcCA+IGxwVG9uZUdlbi0+bU5leHRTZWdTbXApIHsKKyAgICAgICAgaWYgKG1Ub3RhbFNtcCA+IG1OZXh0U2VnU21wICYmIG1OZXh0U2VnU21wICE9IFRPTkVHRU5fSU5GKSB7CiAgICAgICAgICAgICAvLyBUaW1lIHRvIGdvIHRvIG5leHQgc2VxdWVuY2Ugc2VnbWVudAogCiAgICAgICAgICAgICBBTE9HVigiRW5kIFNlZ21lbnQsIHRpbWU6ICVkIiwgKHVuc2lnbmVkIGludCkoc3lzdGVtVGltZSgpLzEwMDAwMDApKTsKQEAgLTEzOTcsNjEgKzE0MDksNjEgQEAKICAgICAgICAgICAgIGxHZW5TbXAgPSBsUmVxU21wOwogCiAgICAgICAgICAgICAvLyBJZiBzZWdtZW50LCAgT04gLT4gT0ZGIHRyYW5zaXRpb24gOiByYW1wIHZvbHVtZSBkb3duCi0gICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUT1A7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxGcmVxSWR4ID0gMDsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBsRnJlcXVlbmN5ID0gbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbbEZyZXFJZHhdOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ud2F2ZUZyZXFbbEZyZXFJZHhdOwogCiAgICAgICAgICAgICAgICAgd2hpbGUgKGxGcmVxdWVuY3kgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBXYXZlR2VuZXJhdG9yICpscFdhdmVHZW4gPSBscFRvbmVHZW4tPm1XYXZlR2Vucy52YWx1ZUZvcihsRnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgV2F2ZUdlbmVyYXRvciAqbHBXYXZlR2VuID0gbVdhdmVHZW5zLnZhbHVlRm9yKGxGcmVxdWVuY3kpOwogICAgICAgICAgICAgICAgICAgICBscFdhdmVHZW4tPmdldFNhbXBsZXMobHBPdXQsIGxHZW5TbXAsIGxXYXZlQ21kKTsKLSAgICAgICAgICAgICAgICAgICAgbEZyZXF1ZW5jeSA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLndhdmVGcmVxWysrbEZyZXFJZHhdOworICAgICAgICAgICAgICAgICAgICBsRnJlcXVlbmN5ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxWysrbEZyZXFJZHhdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiT04tPk9GRiwgbEdlblNtcDogJWQsIGxSZXFTbXA6ICVkIiwgbEdlblNtcCwgbFJlcVNtcCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gbG9vcCBhbmQgbG9vcCBmb3IgdGhlIHJlcWQgdGltZXMKLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5sb29wQ250KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyIDwgbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ubG9vcENudCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250KSB7CisgICAgICAgICAgICAgICAgaWYgKG1Mb29wQ291bnRlciA8IG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWICgiaW4gaWYgbG9vcCBsb29wQ250KCVkKSBsb29wY3RyKCVkKSwgQ3VyU2VnKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BJbmR4OwotICAgICAgICAgICAgICAgICAgICArK2xwVG9uZUdlbi0+bUxvb3BDb3VudGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ubG9vcENudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3BDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BJbmR4OworICAgICAgICAgICAgICAgICAgICArK21Mb29wQ291bnRlcjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgbG9vcC4gZ28gdG8gbmV4dCBzZWdtZW50Ci0gICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCsrOworICAgICAgICAgICAgICAgICAgICBtTG9vcENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCsrOwogICAgICAgICAgICAgICAgICAgICBBTE9HViAoImluIGVsc2UgbG9vcCBsb29wQ250KCVkKSBsb29wY3RyKCVkKSwgQ3VyU2VnKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1clNlZ21lbnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCsrOworICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50Kys7CiAgICAgICAgICAgICAgICAgQUxPR1YgKCJHb3RvIG5leHQgc2VnIGxvb3BDbnQoJWQpIGxvb3BjdHIoJWQpLCBDdXJTZWcoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5sb29wQ250LAotICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQpOworICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250LAorICAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCk7CiAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSGFuZGxlIGxvb3AgaWYgbGFzdCBzZWdtZW50IHJlYWNoZWQKLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkxhc3QgU2VnOiAlZCIsIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQpOworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkxhc3QgU2VnOiAlZCIsIG1DdXJTZWdtZW50KTsKIAogICAgICAgICAgICAgICAgIC8vIFByZSBpbmNyZW1lbnQgbG9vcCBjb3VudCBhbmQgcmVzdGFydCBpZiB0b3RhbCBjb3VudCBub3QgcmVhY2hlZC4gU3RvcCBzZXF1ZW5jZSBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICBpZiAoKytscFRvbmVHZW4tPm1DdXJDb3VudCA8PSBscFRvbmVEZXNjLT5yZXBlYXRDbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlcGVhdGluZyBDb3VudDogJWQiLCBscFRvbmVHZW4tPm1DdXJDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCsrbUN1ckNvdW50IDw9IG1wVG9uZURlc2MtPnJlcGVhdENudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVwZWF0aW5nIENvdW50OiAlZCIsIG1DdXJDb3VudCk7CiAKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCA9IGxwVG9uZURlc2MtPnJlcGVhdFNlZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVEZXNjLT5yZXBlYXRTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50ID0gbXBUb25lRGVzYy0+cmVwZWF0U2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21wVG9uZURlc2MtPnJlcGVhdFNlZ21lbnRdLndhdmVGcmVxWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxXYXZlQ21kID0gV2F2ZUdlbmVyYXRvcjo6V0FWRUdFTl9TVEFSVDsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJOZXcgc2VnbWVudCAlZCwgTmV4dCBUaW1lOiAlbGxkIiwgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobHBUb25lR2VuLT5tTmV4dFNlZ1NtcCkqMTAwMCkvbHBUb25lR2VuLT5tU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBtQ3VyU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobU5leHRTZWdTbXApKjEwMDApL21TYW1wbGluZ1JhdGUpOwogCiAKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQ1OSwxMCArMTQ3MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiRW5kIHJlcGVhdCwgdGltZTogJWQiLCAodW5zaWduZWQgaW50KShzeXN0ZW1UaW1lKCkvMTAwMDAwMCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBscFRvbmVHZW4tPm1DdXJTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgKChsb25nIGxvbmcpKGxwVG9uZUdlbi0+bU5leHRTZWdTbXApKjEwMDApL2xwVG9uZUdlbi0+bVNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBtQ3VyU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgobG9uZyBsb25nKShtTmV4dFNlZ1NtcCkqMTAwMCkvbVNhbXBsaW5nUmF0ZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBJZiBuZXh0IHNlZ21lbnQgaXMgbm90IHNpbGVudCwgIE9GRiAtPiBPTiB0cmFuc2l0aW9uIDogcmVzZXQgd2F2ZSBnZW5lcmF0b3IKICAgICAgICAgICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUQVJUOwogCkBAIC0xNDcyLDEzICsxNDg0LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBVcGRhdGUgbmV4dCBzZWdtZW50IHRyYW5zaXRpb24gcG9zaXRpb24uIE5vIGhhcm0gdG8gZG8gaXQgYWxzbyBmb3IgbGFzdCBzZWdtZW50IGFzIGxwVG9uZUdlbi0+bU5leHRTZWdTbXAgd29uJ3QgYmUgdXNlZCBhbnkgbW9yZQotICAgICAgICAgICAgbHBUb25lR2VuLT5tTmV4dFNlZ1NtcAotICAgICAgICAgICAgICAgICAgICArPSAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0uZHVyYXRpb24gKiBscFRvbmVHZW4tPm1TYW1wbGluZ1JhdGUpIC8gMTAwMDsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBuZXh0IHNlZ21lbnQgdHJhbnNpdGlvbiBwb3NpdGlvbi4gTm8gaGFybSB0byBkbyBpdCBhbHNvIGZvciBsYXN0IHNlZ21lbnQgYXMKKyAgICAgICAgICAgIC8vIG1OZXh0U2VnU21wIHdvbid0IGJlIHVzZWQgYW55IG1vcmUuCisgICAgICAgICAgICAvLyBIYW5kbGUgMzIgYml0IHdyYXBhcm91bmQgZ3JhY2VmdWxseS4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihtTmV4dFNlZ1NtcCkgKworICAgICAgICAgICAgICAgICAgICAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmR1cmF0aW9uICogbVNhbXBsaW5nUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgbU5leHRTZWdTbXAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjptaW48dWludDY0X3Q+KFRPTkVHRU5fSU5GLCByZXMpKTsKIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSW5zaWRlIGEgc2VnbWVudCBrZWVwIHRvbmUgT04gb3IgT0ZGCi0gICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gPT0gMCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVswXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgbEdlblNtcCA9IDA7ICAvLyBJZiBvZGQgc2VnbWVudCwgdG9uZSBpcyBjdXJyZW50bHkgT0ZGCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxHZW5TbXAgPSBsUmVxU21wOyAgLy8gSWYgZXZlbnQgc2VnbWVudCwgdG9uZSBpcyBjdXJyZW50bHkgT04KQEAgLTE0ODgsMTIgKzE1MDMsMTIgQEAKICAgICAgICAgaWYgKGxHZW5TbXApIHsKICAgICAgICAgICAgIC8vIElmIHNhbXBsZXMgbXVzdCBiZSBnZW5lcmF0ZWQsIGNhbGwgYWxsIGFjdGl2ZSB3YXZlIGdlbmVyYXRvcnMgYW5kIGFjdW11bGF0ZSB3YXZlcyBpbiBscE91dAogICAgICAgICAgICAgdW5zaWduZWQgaW50IGxGcmVxSWR4ID0gMDsKLSAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVtsRnJlcUlkeF07CisgICAgICAgICAgICB1aW50MTZfdCBsRnJlcXVlbmN5ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxW2xGcmVxSWR4XTsKIAogICAgICAgICAgICAgd2hpbGUgKGxGcmVxdWVuY3kgIT0gMCkgewotICAgICAgICAgICAgICAgIFdhdmVHZW5lcmF0b3IgKmxwV2F2ZUdlbiA9IGxwVG9uZUdlbi0+bVdhdmVHZW5zLnZhbHVlRm9yKGxGcmVxdWVuY3kpOworICAgICAgICAgICAgICAgIFdhdmVHZW5lcmF0b3IgKmxwV2F2ZUdlbiA9IG1XYXZlR2Vucy52YWx1ZUZvcihsRnJlcXVlbmN5KTsKICAgICAgICAgICAgICAgICBscFdhdmVHZW4tPmdldFNhbXBsZXMobHBPdXQsIGxHZW5TbXAsIGxXYXZlQ21kKTsKLSAgICAgICAgICAgICAgICBsRnJlcXVlbmN5ID0gbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbKytsRnJlcUlkeF07CisgICAgICAgICAgICAgICAgbEZyZXF1ZW5jeSA9IG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVsrK2xGcmVxSWR4XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTAxLDIxICsxNTE2LDE5IEBACiAgICAgICAgIGxwT3V0ICs9IGxSZXFTbXA7CiAKIGF1ZGlvQ2FsbGJhY2tfRW5kTG9vcDoKLQotICAgICAgICBzd2l0Y2ggKGxwVG9uZUdlbi0+bVN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgVE9ORV9SRVNUQVJUSU5HOgogICAgICAgICAgICAgQUxPR1YoIkNiayByZXN0YXJ0aW5nIHRyYWNrIik7Ci0gICAgICAgICAgICBpZiAobHBUb25lR2VuLT5wcmVwYXJlV2F2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tU3RhdGUgPSBUT05FX1NUQVJUSU5HOwotICAgICAgICAgICAgICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmxwVG9uZUdlbi0+bVN0YXJ0VGltZSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1TdGFydFRpbWUudHZfc2VjID0gMDsKKyAgICAgICAgICAgIGlmIChwcmVwYXJlV2F2ZSgpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9TVEFSVElORzsKKyAgICAgICAgICAgICAgICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZtU3RhcnRUaW1lKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUudHZfc2VjID0gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbXVzdCByZWxvYWQgbHBUb25lRGVzYyBhcyBwcmVwYXJlV2F2ZSgpIG1heSBjaGFuZ2UgbXBUb25lRGVzYwotICAgICAgICAgICAgICAgIGxwVG9uZURlc2MgPSBscFRvbmVHZW4tPm1wVG9uZURlc2M7CisgICAgICAgICAgICAgICAgLy8gbXVzdCByZWxvYWQgbXBUb25lRGVzYyBhcyBwcmVwYXJlV2F2ZSgpIG1heSBjaGFuZ2UgbXBUb25lRGVzYwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiQ2JrIHJlc3RhcnRpbmcgcHJlcGFyZVdhdmUoKSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfSURMRTsKLSAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1wQXVkaW9UcmFjay0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfSURMRTsKKyAgICAgICAgICAgICAgICBtcEF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICAgICAgICAgICAgICAvLyBGb3JjZSBsb29wIGV4aXQKICAgICAgICAgICAgICAgICBsTnVtU21wID0gMDsKICAgICAgICAgICAgIH0KQEAgLTE1MjMsMjIgKzE1MzYsMjIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfU1RPUFBJTkc6CiAgICAgICAgICAgICBBTE9HVigiQ2JrIFN0b3BwaW5nIik7Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfU1RPUFBFRDsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfU1RPUFBFRDsKICAgICAgICAgICAgIC8vIEZvcmNlIGxvb3AgZXhpdAogICAgICAgICAgICAgbE51bVNtcCA9IDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUT05FX1NUT1BQRUQ6Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfSU5JVDsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfSU5JVDsKICAgICAgICAgICAgIEFMT0dWKCJDYmsgU3RvcHBlZCB0cmFjayIpOwotICAgICAgICAgICAgbHBUb25lR2VuLT5tcEF1ZGlvVHJhY2stPnN0b3AoKTsKKyAgICAgICAgICAgIG1wQXVkaW9UcmFjay0+c3RvcCgpOwogICAgICAgICAgICAgLy8gRm9yY2UgbG9vcCBleGl0CiAgICAgICAgICAgICBsTnVtU21wID0gMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgbFNpZ25hbCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUT05FX1NUQVJUSU5HOgogICAgICAgICAgICAgQUxPR1YoIkNiayBzdGFydGluZyB0cmFjayIpOwotICAgICAgICAgICAgbHBUb25lR2VuLT5tU3RhdGUgPSBUT05FX1BMQVlJTkc7CisgICAgICAgICAgICBtU3RhdGUgPSBUT05FX1BMQVlJTkc7CiAgICAgICAgICAgICBsU2lnbmFsID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfUExBWUlORzoKQEAgLTE1NDYsMTQgKzE1NTksMTUgQEAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIEZvcmNlIGxvb3AgZXhpdAogICAgICAgICAgICAgbE51bVNtcCA9IDA7Ci0gICAgICAgICAgICBidWZmZXItPnNpemUgPSAwOworICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxTaWduYWwpCi0gICAgICAgICAgICBscFRvbmVHZW4tPm1XYWl0Q2JrQ29uZC5icm9hZGNhc3QoKTsKLSAgICAgICAgbHBUb25lR2VuLT5tTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1XYWl0Q2JrQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQorICAgIHJldHVybiBieXRlc1dyaXR0ZW47CiB9CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKaW5kZXggMTg4ZjMyMS4uNGZjMWM0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCkBAIC0zMywxMSArMzMsMTQgQEAKICAgICBkb0Rlc3Ryb3koKTsKIH0KIAotdm9pZCBUcmFja1BsYXllckJhc2U6OmluaXQoQXVkaW9UcmFjayogcGF0LCBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKK3ZvaWQgVHJhY2tQbGF5ZXJCYXNlOjppbml0KGNvbnN0IHNwPEF1ZGlvVHJhY2s+JiBwYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSB7CiAgICAgUGxheWVyQmFzZTo6aW5pdChwbGF5ZXJUeXBlLCB1c2FnZSwgc2Vzc2lvbklkKTsKICAgICBtQXVkaW9UcmFjayA9IHBhdDsKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2tIYW5kbGUgPSBjYWxsYmFjazsKICAgICAgICAgbVNlbGZBdWRpb0RldmljZUNhbGxiYWNrID0gbmV3IFNlbGZBdWRpb0RldmljZUNhbGxiYWNrKCp0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobVNlbGZBdWRpb0RldmljZUNhbGxiYWNrKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPnNldFBsYXllcklJZChtUElJZCk7IC8vIHNldCBpbiBQbGF5ZXJCYXNlOjppbml0KCkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzRXguYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCmluZGV4IDA0YTAyYzcuLjMzNTg2NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXMgQysrIHR5cGUuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCmluZGV4IDY5OWRmMGEuLjJlNzQyMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCkBAIC0xNiw5ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db250ZW50VHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db250ZW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1VzYWdlOwogCiAvKioKICAqIFRoZSAiSW50ZXJuYWwiIHN1ZmZpeCBvZiB0aGlzIHR5cGUgbmFtZSBpcyB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSB0aGUKQEAgLTI4LDcgKzI4LDcgQEAKIHBhcmNlbGFibGUgQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgewogICAgIEF1ZGlvQ29udGVudFR5cGUgY29udGVudFR5cGU7CiAgICAgQXVkaW9Vc2FnZSB1c2FnZTsKLSAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworICAgIEF1ZGlvU291cmNlIHNvdXJjZTsKICAgICAvLyBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvRmxhZy4KICAgICBpbnQgZmxhZ3M7CiAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgdGFnczsgLyogVVRGOCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjOTdkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvT2ZmbG9hZEluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvQ29uZmlnIHsKLSAgICBpbnQgc2FtcGxlUmF0ZTsKLSAgICAvKioKLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4KLSAgICAgKiBUT0RPKHl0YWkpOiBDcmVhdGUgYSBkZXNpZ25hdGVkIHR5cGUuCi0gICAgICovCi0gICAgaW50IGNoYW5uZWxNYXNrOwotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKLSAgICBBdWRpb09mZmxvYWRJbmZvIG9mZmxvYWRJbmZvOwotICAgIGxvbmcgZnJhbWVDb3VudDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1M2MwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWdCYXNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvQ29uZmlnQmFzZSB7Ci0gICAgaW50IHNhbXBsZVJhdGU7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLwotICAgIGludCBjaGFubmVsTWFzazsKLSAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29udGVudFR5cGUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczNGZiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvQ29udGVudFR5cGUgewotICAgIFVOS05PV04gPSAwLAotICAgIFNQRUVDSCA9IDEsCi0gICAgTVVTSUMgPSAyLAotICAgIE1PVklFID0gMywKLSAgICBTT05JRklDQVRJT04gPSA0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMDY5Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvRGV2aWNlIHsKLSAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fZGV2aWNlc190LiAqLwotICAgIGludCB0eXBlOwotICAgIEB1dGY4SW5DcHAgU3RyaW5nIGFkZHJlc3M7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGlyZWN0TW9kZS5haWRsCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RpcmVjdE1vZGUuYWlkbAppbmRleCBlMTMxZDBkLi4wZGE0NzIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RpcmVjdE1vZGUuYWlkbApAQCAtMTUsMTMgKzE1LDEwIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotLyoqCi0gKiBUaGUgYXVkaW8gc3RhbmRhcmQgdGhhdCBkZXNjcmliZSBhdWRpbyBwbGF5YmFjay9jYXB0dXJlIGNhcGFiaWxpdGVzLgotICoKLSAqIHtAaGlkZX0KLSAqLwogQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9TdGFuZGFyZCB7CitlbnVtIEF1ZGlvRGlyZWN0TW9kZSB7CiAgICAgTk9ORSA9IDAsCi0gICAgRURJRCA9IDEsCisgICAgT0ZGTE9BRCA9IDEsCisgICAgT0ZGTE9BRF9HQVBMRVNTID0gMiwKKyAgICBCSVRTVFJFQU0gPSA0LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNhZGZlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIHsKLSAgICBOT05FID0gMCwKLSAgICBGUkFNRVdPUktfVFVORVIgPSAxLAotICAgIERWQl9BRF9ERVNDUklQVE9SID0gMiwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbAppbmRleCA1OGI0OTNiLi5hY2Y0ZTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsCkBAIC0zNCw0ICszNCw3IEBACiAgICAgTVVURV9IQVBUSUMgPSAxMSwKICAgICBOT19TWVNURU1fQ0FQVFVSRSA9IDEyLAogICAgIENBUFRVUkVfUFJJVkFURSA9IDEzLAorICAgIENPTlRFTlRfU1BBVElBTElaRUQgPSAxNCwKKyAgICBORVZFUl9TUEFUSUFMSVpFID0gMTUsCisgICAgQ0FMTF9SRURJUkVDVElPTiA9IDE2LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDhiMjk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvR2FpbiB7Ci0gICAgaW50IGluZGV4OwotICAgIGJvb2xlYW4gdXNlSW5DaGFubmVsTWFzazsKLSAgICBib29sZWFuIHVzZUZvclZvbHVtZTsKLSAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0dhaW5Nb2RlLiAqLwotICAgIGludCBtb2RlOwotICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KLSAgICBpbnQgY2hhbm5lbE1hc2s7Ci0gICAgaW50IG1pblZhbHVlOwotICAgIGludCBtYXhWYWx1ZTsKLSAgICBpbnQgZGVmYXVsdFZhbHVlOwotICAgIGludCBzdGVwVmFsdWU7Ci0gICAgaW50IG1pblJhbXBNczsKLSAgICBpbnQgbWF4UmFtcE1zOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpbkNvbmZpZy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpbkNvbmZpZy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTNjMmRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Db25maWcuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvR2FpbkNvbmZpZyB7Ci0gICAgLyoqIEluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvX2dhaW4gaW4gdGhlIGF1ZGlvX3BvcnQgZ2FpbnNbXSB0YWJsZS4gKi8KLSAgICBpbnQgaW5kZXg7Ci0KLSAgICAvKiogTW9kZSByZXF1ZXN0ZWQgZm9yIHRoaXMgY29tbWFuZC4gQml0ZmllbGQgaW5kZXhlZCBieSBBdWRpb0dhaW5Nb2RlLiAqLwotICAgIGludCBtb2RlOwotCi0gICAgLyoqCi0gICAgICogQ2hhbm5lbHMgd2hpY2ggZ2FpbiB2YWx1ZSBmb2xsb3dzLiBOL0EgaW4gam9pbnQgbW9kZS4KLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4KLSAgICAgKi8KLSAgICBpbnQgY2hhbm5lbE1hc2s7Ci0KLSAgICAvKioKLSAgICAgKiBHYWluIHZhbHVlcyBpbiBtaWxsaWJlbHMuCi0gICAgICogRm9yIGVhY2ggY2hhbm5lbCBvcmRlcmVkIGZyb20gTFNiIHRvIE1TYiBpbiBjaGFubmVsIG1hc2suIFRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEgaW4gam9pbnQKLSAgICAgKiBtb2RlLCBvdGhlcndpc2UgZXF1YWxzIHRoZSBudW1iZXIgb2YgYml0cyBpbXBsaWVkIGJ5IGNoYW5uZWxNYXNrLgotICAgICAqLwotICAgIGludFtdICB2YWx1ZXM7Ci0KLSAgICAvKiogUmFtcCBkdXJhdGlvbiBpbiBtcy4gKi8KLSAgICBpbnQgcmFtcER1cmF0aW9uTXM7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiOWYwYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0dhaW5Nb2RlIHsKLSAgICBKT0lOVCAgICA9IDAsCi0gICAgQ0hBTk5FTFMgPSAxLAotICAgIFJBTVAgICAgID0gMiwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpblN5cy5haWRsCmluZGV4IDllMDRlODIuLjQyNmY0ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpblN5cy5haWRsCkBAIC0xMywxNCArMTMsMTUgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogLyoqCisgKiBQcm92aWRlcyBhZGRpdGlvbmFsIHJ1bnRpbWUgaW5mb3JtYXRpb24gZm9yIEF1ZGlvR2FpbiwgdXNlZCBieSB0aGUgZnJhbWV3b3JrLgorICoKICAqIHtAaGlkZX0KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSB7Ci0gICAgIE5PTkUgPSAwLAotICAgICBFTEVNRU5UQVJZX1NUUkVBTSA9IDEsCi0gICAgIEhBTkRMRSA9IDIsCitwYXJjZWxhYmxlIEF1ZGlvR2FpblN5cyB7CisgICAgaW50IGluZGV4OworICAgIGJvb2xlYW4gaXNJbnB1dDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjMGViMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9JbnB1dEZsYWdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvSW5wdXRGbGFncyB7Ci0gICAgRkFTVCAgICAgICA9IDAsCi0gICAgSFdfSE9UV09SRCA9IDEsCi0gICAgUkFXICAgICAgICA9IDIsCi0gICAgU1lOQyAgICAgICA9IDMsCi0gICAgTU1BUF9OT0lSUSA9IDQsCi0gICAgVk9JUF9UWCAgICA9IDUsCi0gICAgSFdfQVZfU1lOQyA9IDYsCi0gICAgRElSRUNUICAgICA9IDcsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsCmluZGV4IDg3NmVmOWIuLmIwMWY5MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsCkBAIC0xNyw3ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUGF0Y2g7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9DaGFubmVsTGF5b3V0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0RGVzY3JpcHRpb247CiAKIC8qKgogICoge0BoaWRlfQpAQCAtMjYsMTAgKzI3LDEwIEBACiAgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLwogICAgIGludCBpb0hhbmRsZTsKICAgICBBdWRpb1BhdGNoIHBhdGNoOworICAgIGJvb2xlYW4gaXNJbnB1dDsKICAgICBpbnQgc2FtcGxpbmdSYXRlOwotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKLSAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuICovCi0gICAgaW50IGNoYW5uZWxNYXNrOworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZm9ybWF0OworICAgIEF1ZGlvQ2hhbm5lbExheW91dCBjaGFubmVsTWFzazsKICAgICBsb25nIGZyYW1lQ291bnQ7CiAgICAgbG9uZyBmcmFtZUNvdW50SEFMOwogICAgIC8qKiBPbmx5IHZhbGlkIGZvciBvdXRwdXQuICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjI1YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9GbGFncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIEF1ZGlvSW9GbGFncyB7Ci0gICAgLyoqIEJpdG1hc2sgaW5kZXhlZCBieSBBdWRpb0lucHV0RmxhZ3MuICovCi0gICAgaW50IGlucHV0OwotICAgIC8qKiBCaXRtYXNrIGluZGV4ZWQgYnkgQXVkaW9PdXRwdXRGbGFncy4gKi8KLSAgICBpbnQgb3V0cHV0OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXguYWlkbAppbmRleCA3NDczMzcyLi44OGIwNDUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXguYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXguYWlkbApAQCAtMTYsMTIgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4Q2FsbGJhY2tGbGFnOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhNYXRjaENyaXRlcmlvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4Um91dGVGbGFnOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRGV2aWNlOwogCiAvKioKICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peExhdGVuY3lDbGFzcy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGIzNjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvTWl4TGF0ZW5jeUNsYXNzIHsKLSAgICBMT1cgPSAwLAotICAgIE5PUk1BTCA9IDEsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlLmFpZGwKaW5kZXggZTI2YTllMS4uOTIxYTkzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUuYWlkbApAQCAtMTYsMTUgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Vc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1VzYWdlOwogCiAvKioKICAqIHtAaGlkZX0KICAqLwogdW5pb24gQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlIHsKICAgICBBdWRpb1VzYWdlIHVzYWdlID0gQXVkaW9Vc2FnZS5VTktOT1dOOwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlOwogICAgIC8qKiBJbnRlcnByZXRlZCBhcyB1aWRfdC4gKi8KICAgICBpbnQgdWlkOwogICAgIGludCB1c2VySWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjdkZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb01vZGUgewotICAgIElOVkFMSUQgPSAtMiwKLSAgICBDVVJSRU5UID0gLTEsCi0gICAgTk9STUFMID0gMCwKLSAgICBSSU5HVE9ORSA9IDEsCi0gICAgSU5fQ0FMTCA9IDIsCi0gICAgSU5fQ09NTVVOSUNBVElPTiA9IDMsCi0gICAgQ0FMTF9TQ1JFRU4gPSA0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb09mZmxvYWRJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NmIzZjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb09mZmxvYWRJbmZvIHsKLSAgICAvKiogVmVyc2lvbiBvZiB0aGUgaW5mbyBzdHJ1Y3R1cmUuIEludGVycHJldGVkIGFzIGEgdWludDE2X3QgdmVyc2lvbiBjb25zdGFudC4gKi8KLSAgICBpbnQgdmVyc2lvbjsKLSAgICAvKiogQXVkaW8gY29uZmlndXJhdGlvbi4gKi8KLSAgICBBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnOwotICAgIC8qKiBTdHJlYW0gdHlwZS4gKi8KLSAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtVHlwZTsKLSAgICAvKiogQml0IHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiAqLwotICAgIGludCBiaXRSYXRlOwotICAgIC8qKiBEdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMsIC0xIGlmIHVua25vd24uICovCi0gICAgbG9uZyBkdXJhdGlvblVzOwotICAgIC8qKiB0cnVlIGlmIHN0cmVhbSBpcyB0aWVkIHRvIGEgdmlkZW8gc3RyZWFtLiAqLwotICAgIGJvb2xlYW4gaGFzVmlkZW87Ci0gICAgLyoqIHRydWUgaWYgc3RyZWFtaW5nLCBmYWxzZSBpZiBsb2NhbCBwbGF5YmFjay4gKi8KLSAgICBib29sZWFuIGlzU3RyZWFtaW5nOwotICAgIGludCBiaXRXaWR0aDsKLSAgICAvKiogT2ZmbG9hZCBmcmFnbWVudCBzaXplLiAqLwotICAgIGludCBvZmZsb2FkQnVmZmVyU2l6ZTsKLSAgICBBdWRpb1VzYWdlIHVzYWdlOwotICAgIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgZW5jYXBzdWxhdGlvbk1vZGU7Ci0gICAgLyoqIENvbnRlbnQgaWQgZnJvbSB0dW5lciBIQUwgKDAgaWYgbm9uZSkuICovCi0gICAgaW50IGNvbnRlbnRJZDsKLSAgICAvKiogU3luYyBpZCBmcm9tIHR1bmVyIEhBTCAoMCBpZiBub25lKS4gKi8KLSAgICBpbnQgc3luY0lkOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb091dHB1dEZsYWdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYmQ4ZjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9PdXRwdXRGbGFncyB7Ci0gICAgRElSRUNUICAgICAgICAgICA9IDAsCi0gICAgUFJJTUFSWSAgICAgICAgICA9IDEsCi0gICAgRkFTVCAgICAgICAgICAgICA9IDIsCi0gICAgREVFUF9CVUZGRVIgICAgICA9IDMsCi0gICAgQ09NUFJFU1NfT0ZGTE9BRCA9IDQsCi0gICAgTk9OX0JMT0NLSU5HICAgICA9IDUsCi0gICAgSFdfQVZfU1lOQyAgICAgICA9IDYsCi0gICAgVFRTICAgICAgICAgICAgICA9IDcsCi0gICAgUkFXICAgICAgICAgICAgICA9IDgsCi0gICAgU1lOQyAgICAgICAgICAgICA9IDksCi0gICAgSUVDOTU4X05PTkFVRElPICA9IDEwLAotICAgIERJUkVDVF9QQ00gICAgICAgPSAxMSwKLSAgICBNTUFQX05PSVJRICAgICAgID0gMTIsCi0gICAgVk9JUF9SWCAgICAgICAgICA9IDEzLAotICAgIElOQ0FMTF9NVVNJQyAgICAgPSAxNCwKLSAgICBHQVBMRVNTX09GRkxPQUQgID0gMTUsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwKaW5kZXggYmYwZTViNy4uZmYxNzdjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuYWlkbApAQCAtMTYsMzUgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9HYWluOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1Byb2ZpbGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5FeHRyYUF1ZGlvRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFN5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1BvcnQ7CiAKIC8qKgogICoge0BoaWRlfQogICovCiBwYXJjZWxhYmxlIEF1ZGlvUG9ydCB7Ci0gICAgLyoqIFBvcnQgdW5pcXVlIElELiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLwotICAgIGludCBpZDsKLSAgICAvKiogU2luayBvciBzb3VyY2UuICovCi0gICAgQXVkaW9Qb3J0Um9sZSByb2xlOwotICAgIC8qKiBEZXZpY2UsIG1peCAuLi4gKi8KLSAgICBBdWRpb1BvcnRUeXBlIHR5cGU7Ci0gICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKLSAgICAvKiogQXVkaW9Qcm9maWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwb3J0IChmb3JtYXQsIFJhdGVzLCBDaGFubmVscykuICovCi0gICAgQXVkaW9Qcm9maWxlW10gcHJvZmlsZXM7Ci0gICAgLyoqCi0gICAgICogRXh0cmFBdWRpb0Rlc2NyaXB0b3JzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQuIFRoZSBmb3JtYXQgaXMgbm90IHVucmVjb2duaXplZCB0byB0aGUKLSAgICAgKiBwbGF0Zm9ybS4gVGhlIGF1ZGlvIGNhcGFiaWxpdHkgaXMgZGVzY3JpYmVkIGJ5IGEgaGFyZHdhcmUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBFeHRyYUF1ZGlvRGVzY3JpcHRvcltdIGV4dHJhQXVkaW9EZXNjcmlwdG9yczsKLSAgICAvKiogR2FpbiBjb250cm9sbGVycy4gKi8KLSAgICBBdWRpb0dhaW5bXSBnYWluczsKLSAgICAvKiogQ3VycmVudCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uICovCi0gICAgQXVkaW9Qb3J0Q29uZmlnIGFjdGl2ZUNvbmZpZzsKLSAgICBBdWRpb1BvcnRFeHQgZXh0OworICAgIEF1ZGlvUG9ydCBoYWw7CisgICAgQXVkaW9Qb3J0U3lzIHN5czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbAppbmRleCAyZGQzMGE0Li4zYTRjYTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsCkBAIC0xNiw0NCArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0dhaW5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0lvRmxhZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdFeHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdUeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdTeXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Qb3J0Q29uZmlnOwogCiAvKioKICAqIHtAaGlkZX0KICAqLwogcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWcgewotICAgIC8qKgotICAgICAqIFBvcnQgdW5pcXVlIElELgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuCi0gICAgICovCi0gICAgaW50IGlkOwotICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KLSAgICBBdWRpb1BvcnRSb2xlIHJvbGU7Ci0gICAgLyoqIERldmljZSwgbWl4IC4uLiAqLwotICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKLSAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb1BvcnRDb25maWdUeXBlLiAqLwotICAgIGludCBjb25maWdNYXNrOwotICAgIC8qKiBTYW1wbGluZyByYXRlIGluIEh6LiAqLwotICAgIGludCBzYW1wbGVSYXRlOwotICAgIC8qKgotICAgICAqIENoYW5uZWwgbWFzaywgaWYgYXBwbGljYWJsZS4KLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4KLSAgICAgKiBUT0RPOiBiaXRtYXNrPwotICAgICAqLwotICAgIGludCBjaGFubmVsTWFzazsKLSAgICAvKioKLSAgICAgKiBGb3JtYXQsIGlmIGFwcGxpY2FibGUuCi0gICAgICovCi0gICAgQXVkaW9Gb3JtYXQgZm9ybWF0OwotICAgIC8qKiBHYWluIHRvIGFwcGx5LCBpZiBhcHBsaWNhYmxlLiAqLwotICAgIEF1ZGlvR2FpbkNvbmZpZyBnYWluOwotICAgIC8qKiBGcmFtZXdvcmsgb25seTogSFdfQVZfU1lOQywgRElSRUNULCAuLi4gKi8KLSAgICBBdWRpb0lvRmxhZ3MgZmxhZ3M7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnRXh0IGV4dDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGFsOworICAgIEF1ZGlvUG9ydENvbmZpZ1N5cyBzeXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OWFhOWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0IHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGUgdGhlIGRldmljZSBpcyBhdHRhY2hlZCB0by4KLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCi0gICAgICovCi0gICAgaW50IGh3TW9kdWxlOwotICAgIC8qKgotICAgICAqIERldmljZSB0eXBlIChlLmcgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKS4KLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19kZXZpY2VzX3QuCi0gICAgICogVE9ETzogQ29udmVydCB0byBhIHN0YW5kYWxvbmUgQUlETCByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBpbnQgdHlwZTsKLSAgICAvKiogRGV2aWNlIGFkZHJlc3MuICIiIGlmIE4vQS4gKi8KLSAgICBAdXRmOEluQ3BwIFN0cmluZyBhZGRyZXNzOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDYzNWI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdFeHQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ01peEV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi11bmlvbiBBdWRpb1BvcnRDb25maWdFeHQgewotICAgIC8qKgotICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB1bmlvbi4gVmFsdWUgaXMgaWdub3JlZC4KLSAgICAgKiBUT0RPKHl0YWkpOiByZXBsYWNlIHdpdGggdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb3IgYW4gZW1wdHkgdW5pb24sIGFzIHNvb24gYXMgaXQgaXMKLSAgICAgKiAgICAgICAgICAgICBlc3RhYmxpc2hlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHVuc3BlY2lmaWVkOwotICAgIC8qKiBEZXZpY2Ugc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQgZGV2aWNlOwotICAgIC8qKiBNaXggc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRDb25maWdNaXhFeHQgbWl4OwotICAgIC8qKiBTZXNzaW9uIHNwZWNpZmljIGluZm8uICovCi0gICAgQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCBzZXNzaW9uOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzIyNmYyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2U7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvUG9ydENvbmZpZ01peEV4dCB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxlIHRoZSBzdHJlYW0gaXMgYXR0YWNoZWQgdG8uCi0gICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LgotICAgICAqLwotICAgIGludCBod01vZHVsZTsKLSAgICAvKioKLSAgICAgKiBJL08gaGFuZGxlIG9mIHRoZSBpbnB1dC9vdXRwdXQgc3RyZWFtLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LgotICAgICAqLwotICAgIGludCBoYW5kbGU7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSB1c2VjYXNlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MWYwNDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIEF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UgewotICAgIC8qKgotICAgICAqIFRoaXMgdG8gYmUgc2V0IGlmIHRoZSBjb250YWluaW5nIGNvbmZpZyBoYXMgdGhlIEF1ZGlvUG9ydFJvbGU6Ok5PTkUgcm9sZS4KLSAgICAgKiBUaGlzIHJlcHJlc2VudHMgYW4gZW1wdHkgdmFsdWUgKHZhbHVlIGlzIGlnbm9yZWQpLgotICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcwotICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7Ci0gICAgLyoqIFRoaXMgdG8gYmUgc2V0IGlmIHRoZSBjb250YWluaW5nIGNvbmZpZyBoYXMgdGhlIEF1ZGlvUG9ydFJvbGU6OlNPVVJDRSByb2xlLiAqLwotICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW07Ci0gICAgLyoqIFRoaXMgdG8gYmUgc2V0IGlmIHRoZSBjb250YWluaW5nIGNvbmZpZyBoYXMgdGhlIEF1ZGlvUG9ydFJvbGU6OlNJTksgcm9sZS4gKi8KLSAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0ludC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1N5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JbnQuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1N5cy5haWRsCmluZGV4IDI0ZjRkNjIuLjg2OTI4NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JbnQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU3lzLmFpZGwKQEAgLTE2LDEyICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydEV4dFN5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFJvbGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRUeXBlOworCiAvKioKLSAqIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgYW4gJ2ludCcsIHB1dHRpbmcgaXQgaW4gYSBwYXJjZWxhYmxlLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhbgotICogaW5vdXQgcGFyYW1ldGVyLCBiZSBtYWRlIEBudWxsYWJsZSwgZXRjLgotICoKICAqIHtAaGlkZX0KICAqLwotcGFyY2VsYWJsZSBJbnQgewotICAgIGludCB2YWx1ZTsKK3BhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnU3lzIHsKKyAgICAvKiogU2luayBvciBzb3VyY2UuICovCisgICAgQXVkaW9Qb3J0Um9sZSByb2xlOworICAgIC8qKiBEZXZpY2UsIG1peCAuLi4gKi8KKyAgICBBdWRpb1BvcnRUeXBlIHR5cGU7CisgICAgQXVkaW9Qb3J0RXh0U3lzIGV4dDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyYjhkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvUG9ydENvbmZpZ1R5cGUgewotICAgIFNBTVBMRV9SQVRFICA9IDAsCi0gICAgQ0hBTk5FTF9NQVNLID0gMSwKLSAgICBGT1JNQVQgICAgICAgPSAyLAotICAgIEdBSU4gICAgICAgICA9IDMsCi0gICAgRkxBR1MgICAgICAgID0gNCwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHRTeXMuYWlkbApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0LmFpZGwKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHRTeXMuYWlkbAppbmRleCBiNzU4ZjIzLi4wZjVhOWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTUgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7Ci0KIC8qKgogICoge0BoaWRlfQogICovCi1wYXJjZWxhYmxlIEF1ZGlvUG9ydERldmljZUV4dCB7CitwYXJjZWxhYmxlIEF1ZGlvUG9ydERldmljZUV4dFN5cyB7CiAgICAgLyoqIE1vZHVsZSB0aGUgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuICovCiAgICAgaW50IGh3TW9kdWxlOwotICAgIEF1ZGlvRGV2aWNlIGRldmljZTsKICAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLiAqLwogICAgIGludCBlbmNhcHN1bGF0aW9uTW9kZXM7CiAgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTM3ODRiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydERldmljZUV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydE1peEV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFNlc3Npb25FeHQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi11bmlvbiBBdWRpb1BvcnRFeHQgewotICAgIC8qKgotICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB1bmlvbi4gVmFsdWUgaXMgaWdub3JlZC4KLSAgICAgKiBUT0RPKHl0YWkpOiByZXBsYWNlIHdpdGggdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb3IgYW4gZW1wdHkgdW5pb24sIGFzIHNvb24gYXMgaXQgaXMKLSAgICAgKiAgICAgICAgICAgICBlc3RhYmxpc2hlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHVuc3BlY2lmaWVkOwotICAgIC8qKiBEZXZpY2Ugc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlOwotICAgIC8qKiBNaXggc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRNaXhFeHQgbWl4OwotICAgIC8qKiBTZXNzaW9uIHNwZWNpZmljIGluZm8uICovCi0gICAgQXVkaW9Qb3J0U2Vzc2lvbkV4dCBzZXNzaW9uOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHRTeXMuYWlkbApzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbApjb3B5IHRvIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHRTeXMuYWlkbAppbmRleCBiMDhhNjA0Li4yY2RmNGY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHRTeXMuYWlkbApAQCAtMTYsMTQgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RGV2aWNlRXh0U3lzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0TWl4RXh0U3lzOworCiAvKioKLSAqIEF1ZGlvIGVuY2Fwc3VsYXRpb24gdHlwZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGlmIHRoZSBhdWRpbyBkYXRhIHNob3VsZCBiZSBzZW50IHdpdGggYSBwYXJ0aWN1bGFyCi0gKiBlbmNhcHN1bGF0aW9uIHR5cGUgb3Igbm90LgotICoKICAqIHtAaGlkZX0KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSB7Ci0gICAgTk9ORSAgICAgPSAwLAotICAgIElFQzYxOTM3ID0gMSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit1bmlvbiBBdWRpb1BvcnRFeHRTeXMgeworICAgIC8qKgorICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB1bmlvbi4gVmFsdWUgaXMgaWdub3JlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHVuc3BlY2lmaWVkOworICAgIC8qKiBTeXN0ZW0tb25seSBwYXJhbWV0ZXJzIHdoZW4gdGhlIHBvcnQgaXMgYW4gYXVkaW8gZGV2aWNlLiAqLworICAgIEF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2U7CisgICAgLyoqIFN5c3RlbS1vbmx5IHBhcmFtZXRlcnMgd2hlbiB0aGUgcG9ydCBpcyBhbiBhdWRpbyBtaXguICovCisgICAgQXVkaW9Qb3J0TWl4RXh0U3lzIG1peDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjZGI4ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peExhdGVuY3lDbGFzczsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0TWl4RXh0IHsKLSAgICAvKiogTW9kdWxlIHRoZSBzdHJlYW0gaXMgYXR0YWNoZWQgdG8uIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KLSAgICBpbnQgaHdNb2R1bGU7Ci0gICAgLyoqIEkvTyBoYW5kbGUgb2YgdGhlIGlucHV0L291dHB1dCBzdHJlYW0uIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLwotICAgIGludCBoYW5kbGU7Ci0gICAgLyoqIExhdGVuY3kgY2xhc3MgKi8KLSAgICBBdWRpb01peExhdGVuY3lDbGFzcyBsYXRlbmN5Q2xhc3M7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dFN5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggODElCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsCmNvcHkgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dFN5cy5haWRsCmluZGV4IGUxMzFkMGQuLjU5OTk4ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dFN5cy5haWRsCkBAIC0xMywxNSArMTMsMTMgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogLyoqCi0gKiBUaGUgYXVkaW8gc3RhbmRhcmQgdGhhdCBkZXNjcmliZSBhdWRpbyBwbGF5YmFjay9jYXB0dXJlIGNhcGFiaWxpdGVzLgotICoKICAqIHtAaGlkZX0KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9TdGFuZGFyZCB7Ci0gICAgTk9ORSA9IDAsCi0gICAgRURJRCA9IDEsCitwYXJjZWxhYmxlIEF1ZGlvUG9ydE1peEV4dFN5cyB7CisgICAgLyoqIE1vZHVsZSB0aGUgc3RyZWFtIGlzIGF0dGFjaGVkIHRvLiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuICovCisgICAgaW50IGh3TW9kdWxlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2ExNjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvUG9ydFNlc3Npb25FeHQgewotICAgIC8qKiBBdWRpbyBzZXNzaW9uLiBJbnRlcnByZXRlZCBhcyBhdWRpb19zZXNzaW9uX3QuICovCi0gICAgaW50IHNlc3Npb247Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U3lzLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U3lzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNWMxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTeXMuYWlkbApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0dhaW5TeXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRFeHRTeXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUHJvZmlsZVN5czsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Qb3J0U3lzIHsKKyAgICAvKiogU2luayBvciBzb3VyY2UuICovCisgICAgQXVkaW9Qb3J0Um9sZSByb2xlOworICAgIC8qKiBEZXZpY2UsIG1peCAuLi4gKi8KKyAgICBBdWRpb1BvcnRUeXBlIHR5cGU7CisgICAgLyoqIFN5c3RlbS1vbmx5IHBhcmFtZXRlcnMgZm9yIGVhY2ggQXVkaW9Qcm9maWxlIGZyb20gJ3BvcnQucHJvZmlsZXMnLiAqLworICAgIEF1ZGlvUHJvZmlsZVN5c1tdIHByb2ZpbGVzOworICAgIC8qKiBTeXN0ZW0tb25seSBwYXJhbWV0ZXJzIGZvciBlYWNoIEF1ZGlvR2FpbiBmcm9tICdwb3J0LmdhaW5zJy4gKi8KKyAgICBBdWRpb0dhaW5TeXNbXSBnYWluczsKKyAgICAvKiogQ3VycmVudCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uICovCisgICAgQXVkaW9Qb3J0Q29uZmlnIGFjdGl2ZUNvbmZpZzsKKyAgICAvKiogU3lzdGVtLW9ubHkgZXh0cmEgcGFyYW1ldGVycyBmb3IgJ3BvcnQuZXh0Jy4gKi8KKyAgICBBdWRpb1BvcnRFeHRTeXMgZXh0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmIyODhmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvUHJvZmlsZSB7Ci0gICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKLSAgICAvKiogVGhlIGZvcm1hdCBmb3IgYW4gYXVkaW8gcHJvZmlsZSBzaG91bGQgb25seSBiZSBzZXQgd2hlbiBpbml0aWFsaXplZC4gKi8KLSAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLwotICAgIGludFtdIGNoYW5uZWxNYXNrczsKLSAgICBpbnRbXSBzYW1wbGluZ1JhdGVzOwotICAgIGJvb2xlYW4gaXNEeW5hbWljRm9ybWF0OwotICAgIGJvb2xlYW4gaXNEeW5hbWljQ2hhbm5lbHM7Ci0gICAgYm9vbGVhbiBpc0R5bmFtaWNSYXRlOwotICAgIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgZW5jYXBzdWxhdGlvblR5cGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZVN5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggNjglCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCmNvcHkgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZVN5cy5haWRsCmluZGV4IDllMDRlODIuLjMyOWM5ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZVN5cy5haWRsCkBAIC0xMywxNCArMTMsMTggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogLyoqCisgKiBQcm92aWRlcyBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIEF1ZGlvUHJvZmlsZXMgaW4gdGhlCisgKiBBdWRpb1BvcnQgYXJlIGR5bmFtaWMuIEVhY2ggaW5zdGFuY2Ugb2YgQXVkaW9Qcm9maWxlU3lzIGNvcnJlc3BvbmRzCisgKiB0byBhbiBpbnN0YW5jZSBvZiBBdWRpb1Byb2ZpbGUuCisgKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIHsKLSAgICAgTk9ORSA9IDAsCi0gICAgIEVMRU1FTlRBUllfU1RSRUFNID0gMSwKLSAgICAgSEFORExFID0gMiwKK3BhcmNlbGFibGUgQXVkaW9Qcm9maWxlU3lzIHsKKyAgICBib29sZWFuIGlzRHluYW1pY0Zvcm1hdDsKKyAgICBib29sZWFuIGlzRHluYW1pY0NoYW5uZWxzOworICAgIGJvb2xlYW4gaXNEeW5hbWljUmF0ZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3M2I5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Tb3VyY2VUeXBlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvU291cmNlVHlwZSB7Ci0gICAgSU5WQUxJRCA9IC0xLAotICAgIERFRkFVTFQgPSAwLAotICAgIE1JQyA9IDEsCi0gICAgVk9JQ0VfVVBMSU5LID0gMiwKLSAgICBWT0lDRV9ET1dOTElOSyA9IDMsCi0gICAgVk9JQ0VfQ0FMTCA9IDQsCi0gICAgQ0FNQ09SREVSID0gNSwKLSAgICBWT0lDRV9SRUNPR05JVElPTiA9IDYsCi0gICAgVk9JQ0VfQ09NTVVOSUNBVElPTiA9IDcsCi0gICAgUkVNT1RFX1NVQk1JWCA9IDgsCi0gICAgVU5QUk9DRVNTRUQgPSA5LAotICAgIFZPSUNFX1BFUkZPUk1BTkNFID0gMTAsCi0gICAgRUNIT19SRUZFUkVOQ0UgPSAxOTk3LAotICAgIEZNX1RVTkVSID0gMTk5OCwKLSAgICAvKioKLSAgICAgKiBBIGxvdy1wcmlvcml0eSwgcHJlZW1wdGlibGUgYXVkaW8gc291cmNlIGZvciBmb3IgYmFja2dyb3VuZCBzb2Z0d2FyZQotICAgICAqIGhvdHdvcmQgZGV0ZWN0aW9uLiBTYW1lIHR1bmluZyBhcyBWT0lDRV9SRUNPR05JVElPTi4KLSAgICAgKiBVc2VkIG9ubHkgaW50ZXJuYWxseSBieSB0aGUgZnJhbWV3b3JrLgotICAgICAqLwotICAgIEhPVFdPUkQgPSAxOTk5LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzc3ODgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0cmVhbVR5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9TdHJlYW1UeXBlIHsKLSAgICBERUZBVUxUID0gLTEsCi0gICAgVk9JQ0VfQ0FMTCA9IDAsCi0gICAgU1lTVEVNID0gMSwKLSAgICBSSU5HID0gMiwKLSAgICBNVVNJQyA9IDMsCi0gICAgQUxBUk0gPSA0LAotICAgIE5PVElGSUNBVElPTiA9IDUsCi0gICAgQkxVRVRPT1RIX1NDTyA9IDYsCi0gICAgRU5GT1JDRURfQVVESUJMRSA9IDcsCi0gICAgRFRNRiA9IDgsCi0gICAgVFRTID0gOSwKLSAgICBBQ0NFU1NJQklMSVRZID0gMTAsCi0gICAgQVNTSVNUQU5UID0gMTEsCi0gICAgLyoqIEZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMuIE9ubHkgdXNlZCBieSB0aGUgYXVkaW8gcG9saWN5ICovCi0gICAgUkVST1VUSU5HID0gMTIsCi0gICAgLyoqIEZvciBhdWRpbyBmbGluZ2VyIHRyYWNrcyB2b2x1bWUuIE9ubHkgdXNlZCBieSB0aGUgYXVkaW9mbGluZ2VyICovCi0gICAgUEFUQ0ggPSAxMywKLSAgICAvKiogc3RyZWFtIGZvciBjb3JyZXNwb25kaW5nIHRvIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UICovCi0gICAgQ0FMTF9BU1NJU1RBTlQgPSAxNCwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Vc2FnZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmM1YzMwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvVXNhZ2UgewotICAgIFVOS05PV04gPSAwLAotICAgIE1FRElBID0gMSwKLSAgICBWT0lDRV9DT01NVU5JQ0FUSU9OID0gMiwKLSAgICBWT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcgPSAzLAotICAgIEFMQVJNID0gNCwKLSAgICBOT1RJRklDQVRJT04gPSA1LAotICAgIE5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUgPSA2LAotICAgIE5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QgPSA3LAotICAgIE5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQgPSA4LAotICAgIE5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQgPSA5LAotICAgIE5PVElGSUNBVElPTl9FVkVOVCA9IDEwLAotICAgIEFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSA9IDExLAotICAgIEFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSA9IDEyLAotICAgIEFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OID0gMTMsCi0gICAgR0FNRSA9IDE0LAotICAgIFZJUlRVQUxfU09VUkNFID0gMTUsCi0gICAgQVNTSVNUQU5UID0gMTYsCi0gICAgQ0FMTF9BU1NJU1RBTlQgPSAxNywKLSAgICBFTUVSR0VOQ1kgPSAxMDAwLAotICAgIFNBRkVUWSA9IDEwMDEsCi0gICAgVkVISUNMRV9TVEFUVVMgPSAxMDAyLAotICAgIEFOTk9VTkNFTUVOVCA9IDEwMDMsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTkwMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXVpZC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvVXVpZCB7Ci0gICAgaW50IHRpbWVMb3c7Ci0gICAgaW50IHRpbWVNaWQ7Ci0gICAgaW50IHRpbWVIaUFuZFZlcnNpb247Ci0gICAgaW50IGNsb2NrU2VxOwotICAgIGJ5dGVbXSBub2RlOyAgLy8gTGVuZ3RoID0gNgotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVmlicmF0b3JJbmZvLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uYWlkbAppbmRleCBmODhmYzNjLi44NTM4ZDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uYWlkbApAQCAtMjQsNCArMjQsNSBAQAogICAgIGludCBpZDsKICAgICBmbG9hdCByZXNvbmFudEZyZXF1ZW5jeTsKICAgICBmbG9hdCBxRmFjdG9yOworICAgIGZsb2F0IG1heEFtcGxpdHVkZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsCmluZGV4IDNhMjlhMDguLmI5NWExZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbApAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1N0cmVhbVR5cGU7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwKaW5kZXggMmQyNzRmNC4uYmNjYTA0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5haWRsCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkVmZmVjdERlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JRWZmZWN0Q2xpZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRGV2aWNlOwogCiAvKioKICAqIElucHV0IGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlRWZmZWN0KCkgbWV0aG9kLgpAQCAtMzcsNCArMzcsNiBAQAogICAgIEF1ZGlvRGV2aWNlIGRldmljZTsKICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOwogICAgIGJvb2xlYW4gcHJvYmU7CisgICAgLyoqIHRydWUgaWYgYSBjYWxsYmFjayBtdXN0IGJlIHNlbnQgZWFjaCB0aW1lIGF1ZGlvIGZyYW1lcyBhcmUgcHJvY2Vzc2VkICovCisgICAgYm9vbGVhbiBub3RpZnlGcmFtZXNQcm9jZXNzZWQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5haWRsCmluZGV4IDBhYTY0MGEuLmUyNzU1ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5haWRsCkBAIC0yOSw0ICsyOSw1IEBACiAgICAgYm9vbGVhbiBlbmFibGVkOwogICAgIEBudWxsYWJsZSBJRWZmZWN0IGVmZmVjdDsKICAgICBFZmZlY3REZXNjcmlwdG9yIGRlc2M7CisgICAgYm9vbGVhbiBhbHJlYWR5RXhpc3RzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmFpZGwKaW5kZXggN2UzYzI0MC4uYjkzOGEzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsCkBAIC0xOCw3ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9DbGllbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZ0Jhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWdCYXNlOwogCiAvKioKICAqIENyZWF0ZVJlY29yZFJlcXVlc3QgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvUmVjb3JkIHRvIEF1ZGlvRmxpbmdlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuYWlkbAppbmRleCBkNzhiM2ZjLi43ZDE1OWQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuYWlkbApAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JQXVkaW9SZWNvcmQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5TaGFyZWRGaWxlUmVnaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnQmFzZTsKIAogLyoqCiAgKiBDcmVhdGVSZWNvcmRSZXNwb25zZSBjb250YWlucyBhbGwgb3V0cHV0IGFyZ3VtZW50cyByZXR1cm5lZCBieSBBdWRpb0ZsaW5nZXIgdG8gQXVkaW9SZWNvcmQKQEAgLTQzLDQgKzQ0LDUgQEAKICAgICBpbnQgcG9ydElkOwogICAgIC8qKiBUaGUgbmV3bHkgY3JlYXRlZCByZWNvcmQuICovCiAgICAgQG51bGxhYmxlIElBdWRpb1JlY29yZCBhdWRpb1JlY29yZDsKKyAgICBBdWRpb0NvbmZpZ0Jhc2Ugc2VydmVyQ29uZmlnOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5haWRsCmluZGV4IDAxNGIzY2EuLjIxMjIyMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmFpZGwKQEAgLTE4LDkgKzE4LDkgQEAKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NsaWVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvVHJhY2tDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CiAKIC8qKgogICogQ3JlYXRlVHJhY2tJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9UcmFjayB0byBBdWRpb0ZsaW5nZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXNwb25zZS5haWRsCmluZGV4IDQwNDczZmEuLmRhNmY0NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1N0cmVhbVR5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JQXVkaW9UcmFjazsKIAogLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuYWlkbAppbmRleCAzNWEzZDc0Li5lNWI1MTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1V1aWQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9VdWlkOwogCiAvKioKICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNWI2N2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0VuY2Fwc3VsYXRpb25UeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdGFuZGFyZDsKLQotLyoqCi0gKiBUaGUgYXVkaW8gZGVzY3JpcHRvciB0aGF0IGRlc2NpYmVzIHBsYXliYWNrL2NhcHR1cmUgY2FwYWJpbGl0aWVzIGFjY29yZGluZyB0bwotICogYSBwYXJ0aWN1bGFyIHN0YW5kYXJkLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBFeHRyYUF1ZGlvRGVzY3JpcHRvciB7Ci0gICAgQXVkaW9TdGFuZGFyZCBzdGFuZGFyZDsKLSAgICBieXRlW10gYXVkaW9EZXNjcmlwdG9yOwotICAgIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgZW5jYXBzdWxhdGlvblR5cGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwKaW5kZXggMTY0ZmI5ZC4uZjE4NDhiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldE91dHB1dEZvckF0dHJSZXNwb25zZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UuYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1N0cmVhbVR5cGU7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtMzEsNCArMzEsNiBAQAogICAgIGludCBwb3J0SWQ7CiAgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90W10uICovCiAgICAgaW50W10gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICAvKiogVHJ1ZSBpZiB0aGUgdHJhY2sgaXMgY29ubmVjdGVkIHRvIGEgc3BhdGlhbGl6ZXIgbWl4ZXIgYW5kIGFjdHVhbGx5IHNwYXRpYWxpemVkICovCisgICAgYm9vbGVhbiBpc1NwYXRpYWxpemVkOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRTcGF0aWFsaXplclJlc3BvbnNlLmFpZGwKc2ltaWxhcml0eSBpbmRleCA3MiUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldFNwYXRpYWxpemVyUmVzcG9uc2UuYWlkbAppbmRleCBiMDhhNjA0Li4yNTExNWFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRTcGF0aWFsaXplclJlc3BvbnNlLmFpZGwKQEAgLTE2LDE0ICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklTcGF0aWFsaXplcjsKKwogLyoqCi0gKiBBdWRpbyBlbmNhcHN1bGF0aW9uIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSBpZiB0aGUgYXVkaW8gZGF0YSBzaG91bGQgYmUgc2VudCB3aXRoIGEgcGFydGljdWxhcgotICogZW5jYXBzdWxhdGlvbiB0eXBlIG9yIG5vdC4KLSAqCisgKiBVc2VkIGFzIGEgcmV0dXJuIHZhbHVlIGZvciBJQXVkaW9Qb2xpY3lTZXJ2aWNlLmdldFNwYXRpYWxpemVyKCkgbWV0aG9kCiAgKiB7QGhpZGV9CiAgKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgewotICAgIE5PTkUgICAgID0gMCwKLSAgICBJRUM2MTkzNyA9IDEsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorIHBhcmNlbGFibGUgR2V0U3BhdGlhbGl6ZXJSZXNwb25zZSB7CisgICAgLyogVGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UgaWYgc3VjY2Vzc2Z1bCwgbnVsbCBpZiBub3QgKi8KKyAgICBAbnVsbGFibGUgSVNwYXRpYWxpemVyIHNwYXRpYWxpemVyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbAppbmRleCBkMmNhZTZkLi4xMGRhMDI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbApAQCAtMTYsMTMgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Nb2RlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVW5pcXVlSWRVc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1V1aWQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1ZpYnJhdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkNyZWF0ZUVmZmVjdFJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVFZmZlY3RSZXNwb25zZTsKQEAgLTQxLDcgKzM4LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NaWNyb3Bob25lSW5mb0RhdGE7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5SZW5kZXJQb3NpdGlvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NoYW5uZWxMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb01NYXBQb2xpY3lJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvTU1hcFBvbGljeVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Nb2RlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1V1aWQ7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtNjIsNyArNjUsNyBAQAogICAgICAqLwogICAgIGludCBzYW1wbGVSYXRlKGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBpb0hhbmRsZSk7CiAKLSAgICBBdWRpb0Zvcm1hdCBmb3JtYXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dCk7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBmb3JtYXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dCk7CiAKICAgICBsb25nIGZyYW1lQ291bnQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlKTsKIApAQCAtMTE1LDggKzExOCw4IEBACiAgICAgLy8gUmV0cmlldmUgdGhlIGF1ZGlvIHJlY29yZGluZyBidWZmZXIgc2l6ZSBpbiBieXRlcy4KICAgICAvLyBGSVhNRSBUaGlzIEFQSSBhc3N1bWVzIGEgcm91dGUsIGFuZCBzbyBzaG91bGQgYmUgZGVwcmVjYXRlZC4KICAgICBsb25nIGdldElucHV0QnVmZmVyU2l6ZShpbnQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2NoYW5uZWxfbWFza190ICovIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0NoYW5uZWxMYXlvdXQgY2hhbm5lbE1hc2spOwogCiAgICAgT3Blbk91dHB1dFJlc3BvbnNlIG9wZW5PdXRwdXQoaW4gT3Blbk91dHB1dFJlcXVlc3QgcmVxdWVzdCk7CiAgICAgaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG9wZW5EdXBsaWNhdGVPdXRwdXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dDEsCkBAIC0xOTcsNiArMjAwLDkgQEAKICAgICAvKiBJbmRpY2F0ZSBKQVZBIHNlcnZpY2VzIGFyZSByZWFkeSAoc2NoZWR1bGluZywgcG93ZXIgbWFuYWdlbWVudCAuLi4pICovCiAgICAgb25ld2F5IHZvaWQgc3lzdGVtUmVhZHkoKTsKIAorICAgIC8qIEluZGljYXRlIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGlzIHJlYWR5ICovCisgICAgb25ld2F5IHZvaWQgYXVkaW9Qb2xpY3lSZWFkeSgpOworCiAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgYXVkaW8gSEFMIGJ1ZmZlci4KICAgICBsb25nIGZyYW1lQ291bnRIQUwoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlKTsKIApAQCAtMjEzLDQgKzIxOSwxNyBAQAogICAgIC8vIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgYSBkeW5hbWljIHBvbGljeSByZWdpc3RlcmVkLgogICAgIHZvaWQgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGluIFRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1tdIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb3MpOworCisgICAgQXVkaW9NTWFwUG9saWN5SW5mb1tdIGdldE1tYXBQb2xpY3lJbmZvcyhBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUpOworCisgICAgaW50IGdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpOworCisgICAgaW50IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCk7CisKKyAgICB2b2lkIHNldERldmljZUNvbm5lY3RlZFN0YXRlKGluIEF1ZGlvUG9ydCBkZXZpY2VQb3J0LCBib29sZWFuIGNvbm5lY3RlZCk7CisKKyAgICAvLyBXaGVuIGFkZGluZyBhIG5ldyBtZXRob2QsIHBsZWFzZSByZXZpZXcgYW5kIHVwZGF0ZQorICAgIC8vIElBdWRpb0ZsaW5nZXIuaCBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpEZWxlZ2F0ZTo6VHJhbnNhY3Rpb25Db2RlCisgICAgLy8gQXVkaW9GbGluZ2VyLmNwcCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3RXcmFwcGVyKCkKKyAgICAvLyBBdWRpb0ZsaW5nZXIuY3BwIElBVURJT0ZMSU5HRVJfQklOREVSX01FVEhPRF9NQUNST19MSVNUCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuYWlkbAppbmRleCA0YzM5NTVhLi44YWM4OWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwKQEAgLTE4LDE2ICsxOCwxMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKLQogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzRXg7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RpcmVjdE1vZGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvT2ZmbG9hZEluZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb09mZmxvYWRNb2RlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9saWN5RGV2aWNlU3RhdGU7CkBAIC0zOCwxOSArMzIsMzAgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFJvbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRUeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qcm9kdWN0U3RyYXRlZ3k7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9VdWlkOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Wb2x1bWVHcm91cDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkRldmljZVJvbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuR2V0SW5wdXRGb3JBdHRyUmVzcG9uc2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5HZXRTcGF0aWFsaXplclJlc3BvbnNlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklDYXB0dXJlU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkludDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuU291bmRUcmlnZ2VyU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZ0Jhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvTW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1Byb2ZpbGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9PZmZsb2FkSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1BvcnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Tb3VyY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9VdWlkOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkludDsKIAogLyoqCiAgKiBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKS4KQEAgLTYwLDE2ICs2NSwxNSBAQAogaW50ZXJmYWNlIElBdWRpb1BvbGljeVNlcnZpY2UgewogICAgIG9uZXdheSB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CiAKLSAgICB2b2lkIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShpbiBBdWRpb0RldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBkZXZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXQpOworICAgIHZvaWQgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGluIEF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Qb3J0IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBlbmNvZGVkRm9ybWF0KTsKIAogICAgIEF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGluIEF1ZGlvRGV2aWNlIGRldmljZSk7CiAKICAgICB2b2lkIGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShpbiBBdWRpb0RldmljZSBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgZGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGVuY29kZWRGb3JtYXQpOwogCiAgICAgdm9pZCBzZXRQaG9uZVN0YXRlKEF1ZGlvTW9kZSBzdGF0ZSwgaW50IC8qIHVpZF90ICovIHVpZCk7CiAKQEAgLTExNCwxOCArMTE4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CiAKICAgICB2b2lkIHNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fZGV2aWNlc190ICovIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAogICAgIGludCBnZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fZGV2aWNlc190ICovIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlKTsKIAogICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAogICAgIGludCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlKTsKIAogICAgIGludCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0cik7CiAKQEAgLTEzMyw5ICsxMzcsNyBAQAogCiAgICAgaW50IC8qIHByb2R1Y3Rfc3RyYXRlZ3lfdCAqLyBnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKTsKIAotICAgIGludCAvKiBiaXRtYXNrIG9mIGF1ZGlvX2RldmljZXNfdCAqLyBnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pOwotCi0gICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNFeCBhdHRyKTsKKyAgICBBdWRpb0RldmljZVtdIGdldERldmljZXNGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0V4IGF0dHIsIGJvb2xlYW4gZm9yVm9sdW1lKTsKIAogICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBnZXRPdXRwdXRGb3JFZmZlY3QoaW4gRWZmZWN0RGVzY3JpcHRvciBkZXNjKTsKIApAQCAtMTU1LDcgKzE1Nyw3IEBACiAKICAgICBib29sZWFuIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50IGluUGFzdE1zKTsKIAotICAgIGJvb2xlYW4gaXNTb3VyY2VBY3RpdmUoQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSk7CisgICAgYm9vbGVhbiBpc1NvdXJjZUFjdGl2ZShBdWRpb1NvdXJjZSBzb3VyY2UpOwogCiAgICAgLyoqCiAgICAgICogT24gaW5wdXQsIGNvdW50IHJlcHJlc2VudHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBhcnJheS4KQEAgLTE3MCw3ICsxNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9VdWlkIHV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlIHNvdXJjZSk7CiAKICAgICBpbnQgLyogYXVkaW9fdW5pcXVlX2lkX3QgKi8gYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChpbiBBdWRpb1V1aWQgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBvcFBhY2thZ2VOYW1lLApAQCAtMjEyLDggKzIxNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGlub3V0IEludCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0IEF1ZGlvUG9ydFtdIHBvcnRzKTsKIAotICAgIC8qKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LiAqLwotICAgIEF1ZGlvUG9ydCBnZXRBdWRpb1BvcnQoaW4gQXVkaW9Qb3J0IHBvcnQpOworICAgIC8qKiBHZXQgYXR0cmlidXRlcyBmb3IgdGhlIGF1ZGlvIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQgKEF1ZGlvUG9ydC5oYWwuaWQgZmllbGQpLiAqLworICAgIEF1ZGlvUG9ydCBnZXRBdWRpb1BvcnQoaW50IC8qIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKi8gcG9ydElkKTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgpAQCAtMjY4LDcgKzI3MCw3IEBACiAKICAgICBib29sZWFuIGdldE1hc3Rlck1vbm8oKTsKIAotICAgIGZsb2F0IGdldFN0cmVhbVZvbHVtZURCKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludCBpbmRleCwgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UpOworICAgIGZsb2F0IGdldFN0cmVhbVZvbHVtZURCKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludCBpbmRleCwgaW4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2UpOwogCiAgICAgLyoqCiAgICAgICogUG9wdWxhdGVzIHN1cHBvcnRlZCBzdXJyb3VuZCBmb3JtYXRzIGFuZCB0aGVpciBlbmFibGVkIHN0YXRlIGluIGZvcm1hdHMgYW5kIGZvcm1hdHNFbmFibGVkLgpAQCAtMjc5LDcgKzI4MSw3IEBACiAgICAgICogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgYWN0dWFsbHkgcmV0cmlldmluZyB0aGVtLgogICAgICAqLwogICAgIHZvaWQgZ2V0U3Vycm91bmRGb3JtYXRzKGlub3V0IEludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Gb3JtYXRbXSBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uW10gZm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgYm9vbGVhbltdIGZvcm1hdHNFbmFibGVkKTsKIAogICAgIC8qKgpAQCAtMjkxLDE1ICsyOTMsMTYgQEAKICAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aG91dCBhY3R1YWxseSByZXRyaWV2aW5nIHRoZW0uCiAgICAgICovCiAgICAgdm9pZCBnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0cyhpbm91dCBJbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Gb3JtYXRbXSBmb3JtYXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uW10gZm9ybWF0cyk7CiAKLSAgICBBdWRpb0Zvcm1hdFtdIGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoKTsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uW10gZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2UpOwogCi0gICAgdm9pZCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXQsIGJvb2xlYW4gZW5hYmxlZCk7CisgICAgdm9pZCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoaW4gQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBhdWRpb0Zvcm1hdCwgYm9vbGVhbiBlbmFibGVkKTsKIAotICAgIHZvaWQgc2V0QXNzaXN0YW50VWlkKGludCAvKiB1aWRfdCAqLyB1aWQpOworICAgIHZvaWQgc2V0QXNzaXN0YW50U2VydmljZXNVaWRzKGluIGludFtdIC8qIHVpZF90W10gKi8gdWlkcyk7CiAKLSAgICB2b2lkIHNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKGludCAvKiB1aWRfdCAqLyB1aWQpOworICAgIHZvaWQgc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKGluIGludFtdIC8qIHVpZF90W10gKi8gYWN0aXZlVWlkcyk7CiAKICAgICB2b2lkIHNldEExMXlTZXJ2aWNlc1VpZHMoaW4gaW50W10gLyogdWlkX3RbXSAqLyB1aWRzKTsKIApAQCAtMzA3LDYgKzMxMCw4IEBACiAKICAgICBib29sZWFuIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKIAorICAgIGJvb2xlYW4gaXNVbHRyYXNvdW5kU3VwcG9ydGVkKCk7CisKICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneVtdIGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKCk7CiAgICAgaW50IC8qIHByb2R1Y3Rfc3RyYXRlZ3lfdCAqLyBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0V4IGFhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZhbGxiYWNrT25EZWZhdWx0KTsKQEAgLTMyOSwyMyArMzM0LDY0IEBACiAgICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KGludCAvKiBwcm9kdWN0X3N0cmF0ZWd5X3QgKi8gc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSk7CiAKLSAgICB2b2lkIHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgdm9pZCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CiAKLSAgICB2b2lkIGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgdm9pZCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CiAKLSAgICB2b2lkIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgdm9pZCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CiAKLSAgICB2b2lkIGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICB2b2lkIGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlKTsKIAotICAgIEF1ZGlvRGV2aWNlW10gZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICBBdWRpb0RldmljZVtdIGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUpOwogCiAgICAgYm9vbGVhbiByZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKElDYXB0dXJlU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKiogSWYgYSBzcGF0aWFsaXplciBzdGFnZSBlZmZlY3QgaXMgcHJlc2VudCBvbiB0aGUgcGxhdGZvcm0sIHRoaXMgd2lsbCByZXR1cm4gYW4KKyAgICAgKiBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlIChzZWUgR2V0U3BhdGlhbGl6ZXJSZXNwb25zZSxhaWRsKSB0byBjb250cm9sIHRoaXMKKyAgICAgKiBmZWF0dXJlLgorICAgICAqIElmIG5vIHNwYXRpYWxpemVyIHN0YWdlIGlzIHByZXNlbnQsIGEgbnVsbCBpbnRlcmZhY2UgaXMgcmV0dXJuZWQuCisgICAgICogVGhlIElOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrIHBhc3NlZCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqIE9ubHkgb25lIElTcGF0aWFsaXplciBpbnRlcmZhY2UgY2FuIGV4aXN0IGF0IGEgZ2l2ZW4gdGltZS4gVGhlIG5hdGl2ZSBhdWRpbyBwb2xpY3kKKyAgICAgKiBzZXJ2aWNlIHdpbGwgcmVqZWN0IHRoZSByZXF1ZXN0IGlmIGFuIGludGVyZmFjZSB3YXMgYWxyZWFkeSBhY3F1aXJlZCBhbmQgcHJldmlvdXMgb3duZXIKKyAgICAgKiBkaWQgbm90IGRpZSBvciBjYWxsIElTcGF0aWFsaXplci5yZWxlYXNlKCkuCisgICAgICovCisgICAgR2V0U3BhdGlhbGl6ZXJSZXNwb25zZSBnZXRTcGF0aWFsaXplcihJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKiogUXVlcmllcyBpZiBzb21lIGtpbmQgb2Ygc3BhdGlhbGl6YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgaWYgdGhlIGF1ZGlvIHBsYXliYWNrIGNvbnRleHQKKyAgICAgKiBkZXNjcmliZWQgYnkgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBpcyBwcmVzZW50LgorICAgICAqIFRoZSBjb250ZXh0IGlzIG1hZGUgb2Y6CisgICAgICogLSBUaGUgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZS4KKyAgICAgKiAtIFRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsaW5nIHJhdGUuLi4KKyAgICAgKiAtIFRoZSBkZXZpY2VzIGRlc2NyaWJpbmcgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjay4KKyAgICAgKiBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbCBhbmQgb25seSB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogc3VwcG9ydGVkIGNyaXRlcmlhLiBGb3IgaW5zdGFuY2UsIHN1cHBseWluZyBubyBhcmd1bWVudCB3aWxsIHRlbGwgaWYgc3BhdGlhbGl6YXRpb24gaXMKKyAgICAgKiBzdXBwb3J0ZWQgb3Igbm90IGluIGdlbmVyYWwuCisgICAgICovCisgICAgYm9vbGVhbiBjYW5CZVNwYXRpYWxpemVkKGluIEBudWxsYWJsZSBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBAbnVsbGFibGUgQXVkaW9Db25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZVtdIGRldmljZXMpOworCisgICAgLyoqCisgICAgICogUXVlcnkgaG93IHRoZSBkaXJlY3QgcGxheWJhY2sgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLgorICAgICAqLworICAgIEF1ZGlvRGlyZWN0TW9kZSBnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0NvbmZpZyBjb25maWcpOworCisgICAgLyoqCisgICAgICogUXVlcnkgYXVkaW8gcHJvZmlsZXMgYXZhaWxhYmxlIGZvciBkaXJlY3QgcGxheWJhY2sgb24gdGhlIGN1cnJlbnQgb3V0cHV0IGRldmljZShzKQorICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgQXVkaW9Qcm9maWxlW10gZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIpOworCisgICAgLy8gV2hlbiBhZGRpbmcgYSBuZXcgbWV0aG9kLCBwbGVhc2UgcmV2aWV3IGFuZCB1cGRhdGUKKyAgICAvLyBBdWRpb1BvbGljeVNlcnZpY2UuY3BwIEF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgpCisgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBJQVVESU9QT0xJQ1lTRVJWSUNFX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwKaW5kZXggYTc3ODJiOC4uYzBjZGQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5haWRsCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZ0Jhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuUmVjb3JkQ2xpZW50SW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZ0Jhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Tb3VyY2U7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtNDMsNyArNDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0NvbmZpZ0Jhc2UgZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEVmZmVjdERlc2NyaXB0b3JbXSBlZmZlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19wYXRjaF9oYW5kbGVfdCAqLyBwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZSBzb3VyY2UpOwogICAgICAvKiogTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcm91dGluZyAqLwogICAgICB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKTsKKyAgICAgLyoqIE5vdGlmaWVzIGEgcmVxdWVzdCBmb3Igdm9sdW1lIGluZGV4IHJhbmdlcyB0byBiZSByZXNldCBhZnRlciB0aGV5IHdlcmUgb2JzZXJ2ZWQgYXMgaW52YWxpZAorICAgICAgKi8KKyAgICAgdm9pZCBvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsCmluZGV4IDgxM2NkNWMuLjZlYzA0MDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbApAQCAtNjIsNCArNjIsOCBAQAogICAgICAqIFRPRE8oeXRhaSk6IEV4cGxhaW4gaG93IHRoaXMgc2hvdWxkIGJlIHVzZWQgZXhhY3RseS4KICAgICAgKi8KICAgICBTaGFyZWRGaWxlUmVnaW9uIGdldENibGsoKTsKKworICAgIC8vIFdoZW4gYWRkaW5nIGEgbmV3IG1ldGhvZCwgcGxlYXNlIHJldmlldyBhbmQgdXBkYXRlCisgICAgLy8gRWZmZWN0cy5jcHAgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6Om9uVHJhbnNhY3QoKQorICAgIC8vIEVmZmVjdHMuY3BwIElFRkZFQ1RfQklOREVSX01FVEhPRF9NQUNST19MSVNUCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3RDbGllbnQuYWlkbAppbmRleCAzYjZiY2YxLi4zN2I0NDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0Q2xpZW50LmFpZGwKQEAgLTQzLDQgKzQzLDEwIEBACiAgICAgICogVE9ETyh5dGFpKTogcmVwbGFjZSBvcGFxdWUgYnl0ZSBhcnJheXMgd2l0aCBzdHJvbmdseSB0eXBlZCBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIG9uZXdheSB2b2lkIGNvbW1hbmRFeGVjdXRlZChpbnQgY21kQ29kZSwgaW4gYnl0ZVtdIGNtZERhdGEsIGluIGJ5dGVbXSByZXBseURhdGEpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW5ldmVyIGF1ZGlvIGZyYW1lcyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBlZmZlY3QgZW5naW5lLgorICAgICAqIEBwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyBwcm9jZXNzZWQuCisgICAgICovCisgICAgb25ld2F5IHZvaWQgZnJhbWVzUHJvY2Vzc2VkKGludCBmcmFtZXMpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI4MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TcGF0aWFsaXphdGlvbkxldmVsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOworCisvKioKKyAqIFRoZSBJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjayBpbnRlcmZhY2UgaXMgYSBjYWxsYmFjayBhc3NvY2lhdGVkIHRvIHRoZQorICogSVNwYXRpYWxpemVyIGludGVyZmFjZS4gVGhlIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIHNwYXRpYWxpemVyCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBuYXRpdmUgYXVkaW8gc2VydmVyIHRvIGNvbW11bmljYXRlIHN0YXRlIGNoYW5nZXMgdG8gdGhlCisgKiBjbGllbnQgY29udHJvbGxpbmcgdGhlIHNwYXRpYWxpemVyIHdpdGggdGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UuCisgKiB7QGhpZGV9CisgKi8KK29uZXdheSBpbnRlcmZhY2UgSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2sgeworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgc3BhdGlhbGl6YXRpb24gbGV2ZWwgYXBwbGllZCBieSB0aGUgc3BhdGlhbGl6ZXIgY2hhbmdlcworICAgICAqIChlLmcuIHdoZW4gdGhlIHNwYXRpYWxpemVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQpCisgICAgICovCisgICAgdm9pZCBvbkxldmVsQ2hhbmdlZChTcGF0aWFsaXphdGlvbkxldmVsIGxldmVsKTsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgb3V0cHV0IHN0cmVhbSB0aGUgU3BhdGlhbGl6ZXIgaXMgYXR0YWNoZWQgdG8gY2hhbmdlcy4KKyAgICAgKiBJbmRpY2F0ZXMgdGhlIElPIEhhbmRsZSBvZiB0aGUgbmV3IG91dHB1dC4KKyAgICAgKi8KKyAgICB2b2lkIG9uT3V0cHV0Q2hhbmdlZChpbnQgb3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXIuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFhZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplci5haWRsCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3BhdGlhbGl6YXRpb25MZXZlbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNwYXRpYWxpemF0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTsKKworCisvKioKKyAqIFRoZSBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgbmF0aXZlIGF1ZGlvIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBzcGF0aWFsaXplciBzdGFnZSB3aXRoIGhlYWR0cmFja2luZyB3aGVuIHByZXNlbnQgb24gYSBwbGF0Zm9ybS4KKyAqIEl0IGlzIGludGVuZGVkIGZvciBleGNsdXNpdmUgdXNlIGJ5IHRoZSBqYXZhIEF1ZGlvU2VydmljZSBydW5uaW5nIGluIHN5c3RlbV9zZXJ2ZXIuCisgKiBJdCBwcm92aWRlcyBBUElzIHRvIGRpc2NvdmVyIHRoZSBmZWF0dXJlIGF2YWlsYWJpbGl0eSBhbmQgb3B0aW9ucyBhcyB3ZWxsIGFzIGNvbnRyb2wgYW5kIHJlcG9ydAorICogdGhlIGFjdGl2ZSBzdGF0ZSBhbmQgbW9kZXMgb2YgdGhlIHNwYXRpYWxpemVyIGFuZCBoZWFkIHRyYWNraW5nIGVmZmVjdC4KKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElTcGF0aWFsaXplciB7CisgICAgLyoqIFJlbGVhc2VzIGEgSVNwYXRpYWxpemVyIGludGVyZmFjZSBwcmV2aW91c2x5IGFjcXVpcmVkLiAqLworICAgIHZvaWQgcmVsZWFzZSgpOworCisgICAgLyoqIFJlcG9ydHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNwYXRpYWxpemF0aW9uIGxldmVscyAoc2VlIFNwYXRpYWxpemF0aW9uTGV2ZWwuYWlkbCkuCisgICAgICogVGhlIGxpc3Qgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGlmIGFuIElTcGF0aWFsaXplciBpbnRlcmZhY2Ugd2FzIHN1Y2Nlc3NmdWxseQorICAgICAqIHJldHJpZXZlZCB3aXRoIElBdWRpb1BvbGljeVNlcnZpY2UuZ2V0U3BhdGlhbGl6ZXIoKS4KKyAgICAgKi8KKyAgICBTcGF0aWFsaXphdGlvbkxldmVsW10gZ2V0U3VwcG9ydGVkTGV2ZWxzKCk7CisKKyAgICAvKiogU2VsZWN0cyB0aGUgZGVzaXJlZCBzcGF0aWFsaXphdGlvbiBsZXZlbCAoc2VlIFNwYXRpYWxpemF0aW9uTGV2ZWwuYWlkbCkuIFNlbGVjdGluZyBhIGxldmVsCisgICAgICogZGlmZmVyZW50IGZyb20gU3BhdGlhbGl6YXRpb25MZXZlbC5OT05FIHdpdGggY3JlYXRlIHRoZSBzcGVjaWFsaXplZCBtdWx0aWNoYW5uZWwgb3V0cHV0CisgICAgICogbWl4ZXIsIGNyZWF0ZSBhbmQgZW5hYmxlIHRoZSBzcGF0aWFsaXplciBlZmZlY3QgYW5kIGxldCB0aGUgYXVkaW8gcG9saWN5IGF0dGFjaCBlbGlnaWJsZQorICAgICAqIEF1ZGlvVHJhY2sgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHZvaWQgc2V0TGV2ZWwoU3BhdGlhbGl6YXRpb25MZXZlbCBsZXZlbCk7CisKKyAgICAvKiogR2V0cyB0aGUgc2VsZWN0ZWQgc3BhdGlhbGl6YXRpb24gbGV2ZWwgKHNlZSBTcGF0aWFsaXphdGlvbkxldmVsLmFpZGwpICovCisgICAgU3BhdGlhbGl6YXRpb25MZXZlbCBnZXRMZXZlbCgpOworCisgICAgLyoqIFJlcG9ydHMgaWYgdGhlIHNwYXRpYWxpemVyIGVuZ2luZSBzdXBwb3J0cyBoZWFkIHRyYWNraW5nIG9yIG5vdC4KKyAgICAgKiBUaGlzIGlzIGEgcHJlIGNvbmRpdGlvbiBpbmRlcGVuZGVudCBvZiB0aGUgZmFjdCB0aGF0IGEgaGVhZCB0cmFja2luZyBzZW5zb3IgaXMKKyAgICAgKiByZWdpc3RlcmVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzSGVhZFRyYWNraW5nU3VwcG9ydGVkKCk7CisKKyAgICAvKiogUmVwb3J0cyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgaGVhZCB0cmFja2luZyBtb2RlcyAoc2VlIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZS5haWRsKS4KKyAgICAgKiBUaGUgbGlzdCBhbHdheXMgY29udGFpbnMgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLkRJU0FCTEVEIGFuZCBjYW4gaW5jbHVkZSBvdGhlciBtb2RlcworICAgICAqIGlmIHRoZSBzcGF0aWFsaXplciBlZmZlY3QgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgaGVhZCB0cmFja2luZy4KKyAgICAgKiBUaGUgcmVzdWx0IGRvZXMgbm90IGRlcGVuZCBvbiBjdXJyZW50bHkgY29ubmVjdGVkIHNlbnNvcnMgYnV0IHJlZmxlY3RzIHRoZSBjYXBhYmlsaXRpZXMKKyAgICAgKiB3aGVuIHNlbnNvcnMgYXJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGVbXSBnZXRTdXBwb3J0ZWRIZWFkVHJhY2tpbmdNb2RlcygpOworCisgICAgLyoqIFNlbGVjdHMgdGhlIGRlc2lyZWQgaGVhZCB0cmFja2luZyBtb2RlIChzZWUgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLmFpZGwpICovCisgICAgdm9pZCBzZXREZXNpcmVkSGVhZFRyYWNraW5nTW9kZShTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUgbW9kZSk7CisKKyAgICAvKiogR2V0cyB0aGUgYWN0dWFsIGhlYWQgdHJhY2tpbmcgbW9kZS4gQ2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZXNpcmVkIG1vZGUgaWYgY29uZGl0aW9ucyB0bworICAgICAqIGVuYWJsZSB0aGUgZGVzaXJlZCBtb2RlIGFyZSBub3QgbWV0IChlLmcgaWYgdGhlIGhlYWQgdHJhY2tpbmcgZGV2aWNlIHdhcyByZW1vdmVkKQorICAgICAqLworICAgIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZSBnZXRBY3R1YWxIZWFkVHJhY2tpbmdNb2RlKCk7CisKKyAgICAvKiogUmVzZXQgdGhlIGhlYWQgdHJhY2tpbmcgYWxnb3JpdGhtIHRvIGNvbnNpZGVyIGN1cnJlbnQgaGVhZCBwb3NlIGFzIG5ldXRyYWwgKi8KKyAgICB2b2lkIHJlY2VudGVySGVhZFRyYWNrZXIoKTsKKworICAgIC8qKiBTZXQgdGhlIHNjcmVlbiB0byBzdGFnZSB0cmFuc2Zvcm0gdG8gdXNlIGJ5IHRoZSBoZWFkIHRyYWNraW5nIGFsZ29yaXRobQorICAgICAqIFRoZSBzY3JlZW4gdG8gc3RhZ2UgdHJhbnNmb3JtIGlzIGNvbnZleWVkIGFzIGEgdmVjdG9yIG9mIDYgZWxlbWVudHMsCisgICAgICogd2hlcmUgdGhlIGZpcnN0IHRocmVlIGFyZSBhIHRyYW5zbGF0aW9uIHZlY3RvciBhbmQKKyAgICAgKiB0aGUgbGFzdCB0aHJlZSBhcmUgYSByb3RhdGlvbiB2ZWN0b3IuCisgICAgICovCisgICAgdm9pZCBzZXRHbG9iYWxUcmFuc2Zvcm0oaW4gZmxvYXRbXSBzY3JlZW5Ub1N0YWdlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vuc29yIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgaGVhZC10cmFja2luZy4KKyAgICAgKiAtMSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGhlYWQtdHJhY2tpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRIZWFkU2Vuc29yKGludCBzZW5zb3JIYW5kbGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZW5zb3IgdGhhdCBpcyB0byBiZSB1c2VkIGZvciBzY3JlZW4tdHJhY2tpbmcuCisgICAgICogLTEgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBzY3JlZW4tdHJhY2tpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRTY3JlZW5TZW5zb3IoaW50IHNlbnNvckhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkaXNwbGF5IG9yaWVudGF0aW9uLgorICAgICAqIE9yaWVudGF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0aGUgYW5nbGUgb2Ygcm90YXRpb24gZnJvbSB0aGUgcGh5c2ljYWwgInVwIiBzaWRlIG9mIHRoZSBzY3JlZW4KKyAgICAgKiB0byB0aGUgbG9naWNhbCAidXAiIHNpZGUgb2YgdGhlIGNvbnRlbnQgZGlzcGxheWVkIHRoZSBzY3JlZW4uIENvdW50ZXJjbG9ja3dpc2UgYW5nbGVzLCBhcworICAgICAqIHZpZXdlZCB3aGlsZSBmYWNpbmcgdGhlIHNjcmVlbiBhcmUgcG9zaXRpdmUuCisgICAgICovCisgICAgdm9pZCBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBoaW5nZSBhbmdsZSBmb3IgZm9sZGFibGUgZGV2aWNlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEhpbmdlQW5nbGUoZmxvYXQgaGluZ2VBbmdsZSk7CisKKyAgICAvKiogUmVwb3J0cyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc3BhdGlhbGl6YXRpb24gbW9kZXNzIChzZWUgU3BhdGlhbGl6YXRpb25Nb2RlLmFpZGwpLgorICAgICAqIFRoZSBsaXN0IHNob3VsZCBuZXZlciBiZSBlbXB0eSBpZiBhbiBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlIHdhcyBzdWNjZXNzZnVsbHkKKyAgICAgKiByZXRyaWV2ZWQgd2l0aCBJQXVkaW9Qb2xpY3lTZXJ2aWNlLmdldFNwYXRpYWxpemVyKCkuCisgICAgICovCisgICAgU3BhdGlhbGl6YXRpb25Nb2RlW10gZ2V0U3VwcG9ydGVkTW9kZXMoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIG1vbml0b3IgaGVhZCB0cmFja2luZyBmdW5jdGlvbnMuCisgICAgICogT25seSBvbmUgY2FsbGJhY2sgY2FuIGJlIHJlZ2lzdGVyZWQgb24gYSBTcGF0aWFsaXplci4KKyAgICAgKiBUaGUgbGFzdCBjYWxsYmFjayByZWdpc3RlcmVkIHdpbnMgYW5kIHBhc3NpbmcgYSBudWxscHRyIHVucmVnaXN0ZXJzCisgICAgICogbGFzdCByZWdpc3RlcmVkIGNhbGxiYWNrLgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJIZWFkVHJhY2tpbmdDYWxsYmFjayhAbnVsbGFibGUgSVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2sgY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHBhcmFtZXRlciB0byB0aGUgc3BhdGlhbGl6ZXIgZW5naW5lLiBVc2VkIGJ5IGVmZmVjdCBpbXBsZW1lbnRvciBmb3IgdmVuZG9yCisgICAgICogc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICAgdm9pZCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgaW4gYnl0ZVtdIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBwYXJhbWV0ZXIgZnJvbSB0aGUgc3BhdGlhbGl6ZXIgZW5naW5lLiBVc2VkIGJ5IGVmZmVjdCBpbXBsZW1lbnRvciBmb3IgdmVuZG9yCisgICAgICogc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICAgdm9pZCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgaW5vdXQgYnl0ZVtdIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGlvIGhhbmRsZSBvZiB0aGUgb3V0cHV0IHN0cmVhbSB0aGUgc3BhdGlhbGl6ZXIgaXMgY29ubmVjdGVkIHRvLgorICAgICAqLworICAgICBpbnQgZ2V0T3V0cHV0KCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2suYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDVlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNwYXRpYWxpemF0aW9uTGV2ZWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU7CisKKy8qKgorICogVGhlIElTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrIGludGVyZmFjZSBpcyBhIGNhbGxiYWNrIGFzc29jaWF0ZWQgdG8gdGhlCisgKiBTcGF0aWFsaXplciBoZWFkIHRyYWNraW5nIGZ1bmN0aW9uLiBJdCBjYW4gYmUgcmVnaXN0ZXJlZCB2aWEgdGhlIElTcGF0aWFsaXplcgorICogaW50ZXJmYWNlIHRvIG1vbml0b3IgaGVhZCB0cmFja2luZyByZWxhdGVkIHN0YXRlcy4KKyAqIHtAaGlkZX0KKyAqLworb25ld2F5IGludGVyZmFjZSBJU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjayB7CisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBoZWFkIHRyYWNraW5nIG1vZGUgaGFzIGNoYW5nZWQKKyAgICAgKi8KKyAgICB2b2lkIG9uSGVhZFRyYWNraW5nTW9kZUNoYW5nZWQoU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIG1vZGUpOworCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBoZWFkIHRvIHN0YWdlIHBvc2UgaGFzZSBiZWVuIHVwZGF0ZWQKKyAgICAgKiBUaGUgaGVhZCB0byBzdGFnZSBwb3NlIGlzIGNvbnZleWVkIGFzIGEgdmVjdG9yIG9mIDYgZWxlbWVudHMsCisgICAgICogd2hlcmUgdGhlIGZpcnN0IHRocmVlIGFyZSBhIHRyYW5zbGF0aW9uIHZlY3RvciBhbmQKKyAgICAgKiB0aGUgbGFzdCB0aHJlZSBhcmUgYSByb3RhdGlvbiB2ZWN0b3IuCisgICAgICovCisgICAgdm9pZCBvbkhlYWRUb1NvdW5kU3RhZ2VQb3NlVXBkYXRlZChpbiBmbG9hdFtdIGhlYWRUb1N0YWdlKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsCmluZGV4IDJlNTU1MjYuLjc1ZmY4ZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbApAQCAtMTYsOSArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Tb3VyY2U7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtMzAsNyArMzAsNyBAQAogICAgIGludCBpbnB1dDsKICAgICBBdWRpb0NvbmZpZyBjb25maWc7CiAgICAgQXVkaW9EZXZpY2UgZGV2aWNlOwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlOwogICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvSW5wdXRGbGFnLiAqLwogICAgIGludCBmbGFnczsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwKaW5kZXggYjYxM2JhNS4uNDFiYzM4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwKQEAgLTE2LDggKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRGV2aWNlOwogCiAvKioKICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwKaW5kZXggMDZiMTJlOS4uOTBlN2VhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwKQEAgLTE2LDggKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZ0Jhc2U7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtMjUsNyArMjYsOCBAQAogcGFyY2VsYWJsZSBPcGVuT3V0cHV0UmVxdWVzdCB7CiAgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KICAgICBpbnQgbW9kdWxlOwotICAgIEF1ZGlvQ29uZmlnIGNvbmZpZzsKKyAgICBBdWRpb0NvbmZpZyBoYWxDb25maWc7CisgICAgQXVkaW9Db25maWdCYXNlIG1peGVyQ29uZmlnOwogICAgIC8qKiBUeXBlIG11c3QgYmUgREVWSUNFLiAqLwogICAgIEF1ZGlvUG9ydCBkZXZpY2U7CiAgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9PdXRwdXRGbGFnLiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5haWRsCmluZGV4IGEwNTE5NjkuLjQ1MWEwYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKIAogLyoqCiAgKiB7QGhpZGV9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvUmVjb3JkQ2xpZW50SW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbAppbmRleCAzMjgwNDYwLi43ZGFkNThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvUmVjb3JkQ2xpZW50SW5mby5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Tb3VyY2U7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtMjgsNyArMjgsNyBAQAogICAgIGludCB1aWQ7CiAgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3Nlc3Npb25fdC4gKi8KICAgICBpbnQgc2Vzc2lvbjsKLSAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworICAgIEF1ZGlvU291cmNlIHNvdXJjZTsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KICAgICBpbnQgcG9ydElkOwogICAgIGJvb2xlYW4gc2lsZW5jZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU291bmRUcmlnZ2VyU2Vzc2lvbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbAppbmRleCBhODI5ZTU5Li40YjU0MGE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU291bmRUcmlnZ2VyU2Vzc2lvbi5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmFpZGwKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKKwogLyoqCiAgKiB7QGhpZGV9CiAgKi8KQEAgLTI0LDYgKzI2LDYgQEAKICAgICBpbnQgc2Vzc2lvbjsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCiAgICAgaW50IGlvSGFuZGxlOwotICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19kZXZpY2VzX3QuICovCi0gICAgaW50IGRldmljZTsKKyAgICAvKiogRGV2aWNlIHR5cGUuICovCisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2U7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25MZXZlbC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTGV2ZWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFjNWExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTGV2ZWwuYWlkbApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogVGhlIHNwYXRpYWxpemF0aW9uIGxldmVsIHN1cHBvcnRlZCBieSB0aGUgc3BhdGlhbGl6ZXIgc3RhZ2UgZWZmZWN0IGltcGxlbWVudGF0aW9uLgorICogVXNlZCBieSBtZXRob2RzIG9mIHRoZSBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlLgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJieXRlIikKK2VudW0gU3BhdGlhbGl6YXRpb25MZXZlbCB7CisgICAgLyoqIFNwYXRpYWxpemF0aW9uIGlzIGRpc2FibGVkLiAqLworICAgIE5PTkUgPSAwLAorICAgIC8qKiBUaGUgc3BhdGlhbGl6ZXIgYWNjZXB0cyBhdWRpbyB3aXRoIHBvc2l0aW9uYWwgbXVsdGljaGFubmVsIG1hc2tzIChlLmcgNS4xKS4gKi8KKyAgICBTUEFUSUFMSVpFUl9NVUxUSUNIQU5ORUwgPSAxLAorICAgIC8qKiBUaGUgc3BhdGlhbGl6ZXIgYWNjZXB0cyBhdWRpbyBtYWRlIG9mIGEgY2hhbm5lbCBiZWQgb2YgcG9zaXRpb25hbCBtdWx0aWNoYW5uZWxzIChlLmcgNS4xKQorICAgICAqIGFuZCBhdWRpbyBvYmplY3RzIHBvc2l0aW9uZWQgaW5kZXBlbmRlbnRseSB2aWEgbWV0YSBkYXRhLgorICAgICAqLworICAgIFNQQVRJQUxJWkVSX01DSEFOX0JFRF9QTFVTX09CSkVDVFMgPSAyLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTW9kZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWZmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25Nb2RlLmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFRoZSBzcGF0aWFsaXphdGlvbiBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3BhdGlhbGl6ZXIgc3RhZ2UgZWZmZWN0IGltcGxlbWVudGF0aW9uLgorICogVXNlZCBieSBtZXRob2RzIG9mIHRoZSBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlLgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJieXRlIikKK2VudW0gU3BhdGlhbGl6YXRpb25Nb2RlIHsKKyAgICAvKiogVGhlIHNwYXRpYWxpemVyIHN1cHBvcnRzIGJpbmF1cmFsIG1vZGUgKG92ZXIgaGVhZHBob25lcyB0eXBlIGRldmljZXMpLiAqLworICAgIFNQQVRJQUxJWkVSX0JJTkFVUkFMID0gMCwKKyAgICAvKiogVGhlIHNwYXRpYWxpemVyIHN1cHBvcnRzIHRyYW5zYXVyYWwgbW9kZSAob3ZlciBzcGVha2VyIHR5cGUgZGV2aWNlcykuICovCisgICAgU1BBVElBTElaRVJfVFJBTlNBVVJBTCA9IDEsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlMGY2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUuYWlkbApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKworLyoqCisgKiBUaGUgaGVhZCB0cmFja2luZyBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3BhdGlhbGl6ZXIgZWZmZWN0IGltcGxlbWVudGF0aW9uLgorICogVXNlZCBieSBtZXRob2RzIG9mIHRoZSBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlLgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJieXRlIikKK2VudW0gU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIHsKKyAgICAvKiogSGVhZCB0cmFja2luZyBpcyBhY3RpdmUgaW4gYSBtb2RlIG5vdCBsaXN0ZWQgYmVsb3cgKGZvcndhcmQgY29tcGF0aWJpbGl0eSkgKi8KKyAgICBPVEhFUiA9IDAsCisgICAgLyoqIEhlYWQgdHJhY2tpbmcgaXMgZGlzYWJsZWQgKi8KKyAgICBESVNBQkxFRCA9IDEsCisgICAgLyoqIEhlYWQgdHJhY2tpbmcgaXMgcGVyZm9ybWVkIHJlbGF0aXZlIHRvIHRoZSByZWFsIHdvcmsgZW52aXJvbm1lbnQgKi8KKyAgICBSRUxBVElWRV9XT1JMRCA9IDIsCisgICAgLyoqIEhlYWQgdHJhY2tpbmcgaXMgcGVyZm9ybWVkIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UncyBzY3JlZW4gKi8KKyAgICBSRUxBVElWRV9TQ1JFRU4gPSAzLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCBiMjkwYWE4Li45NjllM2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvQW5kcm9pZC5icApAQCAtNDYsNiArNDYsNyBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvYXVkaW9mbGluZ2VyX2Z1enplci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvYXVkaW9mbGluZ2VyX2Z1enplci5jcHAKaW5kZXggZDAzYzZmYS4uMDM2ZTcyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL2F1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9hdWRpb2ZsaW5nZXJfZnV6emVyLmNwcApAQCAtNTgsNyArNTgsOCBAQAogCiBjb25zdGV4cHIgYXVkaW9fbW9kZV90IGtNb2Rlc1tdID0gewogICAgIEFVRElPX01PREVfSU5WQUxJRCwgQVVESU9fTU9ERV9DVVJSRU5ULCAgICAgICAgICBBVURJT19NT0RFX05PUk1BTCwgICAgIEFVRElPX01PREVfUklOR1RPTkUsCi0gICAgQVVESU9fTU9ERV9JTl9DQUxMLCBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04sIEFVRElPX01PREVfQ0FMTF9TQ1JFRU59OworICAgIEFVRElPX01PREVfSU5fQ0FMTCwgQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OLCBBVURJT19NT0RFX0NBTExfU0NSRUVOLAorICAgIEFVRElPX01PREVfQ0FMTF9SRURJUkVDVCwgQVVESU9fTU9ERV9DT01NVU5JQ0FUSU9OX1JFRElSRUNUfTsKIAogY29uc3RleHByIGF1ZGlvX3Nlc3Npb25fdCBrU2Vzc2lvbklkW10gPSB7QVVESU9fU0VTU0lPTl9OT05FLCBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fREVWSUNFfTsKQEAgLTIzMSw3ICsyMzIsNyBAQAogICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAgICAgdHJhY2stPnNldChBVURJT19TVFJFQU1fREVGQVVMVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG51bGxwdHIsCi0gICAgICAgICAgICAgICBudWxscHRyLCBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLCBmYWxzZSwgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgKChmYXN0ICYmIHNoYXJlZEJ1ZmZlciA9PSAwKSB8fCBvZmZsb2FkKSA/IEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgIG9mZmxvYWQgPyAmb2ZmbG9hZEluZm8gOiBudWxscHRyLCBhdHRyaWJ1dGlvblNvdXJjZSwgJmF0dHJpYnV0ZXMsIGZhbHNlLCAxLjBmLApAQCAtMzE0LDcgKzMxNSw3IEBACiAgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUgPSBzdGQ6OnN0cmluZyhtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAgICAgc3A8QXVkaW9SZWNvcmQ+IHJlY29yZCA9IG5ldyBBdWRpb1JlY29yZChhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgcmVjb3JkLT5zZXQoQVVESU9fU09VUkNFX0RFRkFVTFQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG51bGxwdHIsIG51bGxwdHIsCisgICAgcmVjb3JkLT5zZXQoQVVESU9fU09VUkNFX0RFRkFVTFQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG51bGxwdHIsCiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSwgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgIGZhc3QgPyBBdWRpb1JlY29yZDo6VFJBTlNGRVJfQ0FMTEJBQ0sgOiBBdWRpb1JlY29yZDo6VFJBTlNGRVJfREVGQVVMVCwgZmxhZ3MsCiAgICAgICAgICAgICAgICAgZ2V0dWlkKCksIGdldHBpZCgpLCAmYXR0cmlidXRlcywgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CkBAIC0zNTQsNyArMzU1LDcgQEAKICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CiAgICAgcmVjb3JkLT5vYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCB3YWl0Q291bnQsICZub25Db250aWcpOwogICAgIGJvb2wgYmxvY2tpbmcgPSBmYWxzZTsKLSAgICByZWNvcmQtPnJlYWQoYXVkaW9CdWZmZXIucmF3LCBhdWRpb0J1ZmZlci5zaXplLCBibG9ja2luZyk7CisgICAgcmVjb3JkLT5yZWFkKGF1ZGlvQnVmZmVyLmRhdGEoKSwgYXVkaW9CdWZmZXIuc2l6ZSgpLCBibG9ja2luZyk7CiAgICAgcmVjb3JkLT5nZXRJbnB1dEZyYW1lc0xvc3QoKTsKICAgICByZWNvcmQtPmdldEZsYWdzKCk7CiAKQEAgLTM4Myw2ICszODQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcmVwbHlEYXRhIF9fdW51c2VkKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9CisgICAgYmluZGVyOjpTdGF0dXMgZnJhbWVzUHJvY2Vzc2VkKGludDMyX3QgZnJhbWVzIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CiB9OwogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXJGdXp6ZXI6Omludm9rZUF1ZGlvRWZmZWN0KCkgewpAQCAtNDI0LDYgKzQyOCw3IEBACiAgICAgcmVxdWVzdC5hdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CiAgICAgcmVxdWVzdC5hdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKICAgICByZXF1ZXN0LnByb2JlID0gZmFsc2U7CisgICAgcmVxdWVzdC5ub3RpZnlGcmFtZXNQcm9jZXNzZWQgPSBmYWxzZTsKIAogICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSByZXNwb25zZXt9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgJnJlc3BvbnNlKTsKQEAgLTU5Nyw5ICs2MDIsMTAgQEAKICAgICBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCByZXF1ZXN0e307CiAgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOwogICAgIHJlcXVlc3QuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW5wdXQpKTsKLSAgICByZXF1ZXN0LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7CisgICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgcmVxdWVzdC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoZGV2aWNlVHlwZUFkZHIpKTsKLSAgICByZXF1ZXN0LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKHNvdXJjZSkpOworICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShzb3VyY2UpKTsKICAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOwogCiAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlIHJlc3BvbnNle307CkBAIC02NDgsMTEgKzY1NCwxNiBAQAogICAgIHNwPERldmljZURlc2NyaXB0b3JCYXNlPiBkZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoZ2V0VmFsdWUoJm1GZHAsIGtEZXZpY2VzKSk7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBnZXRWYWx1ZSgmbUZkcCwga091dHB1dEZsYWdzKTsKIAorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgbWl4ZXJDb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKwogICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCByZXF1ZXN0e307CiAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSByZXNwb25zZXt9OwogCiAgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOwotICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICByZXF1ZXN0LmhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CisgICAgcmVxdWVzdC5taXhlckNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShtaXhlckNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlKSk7CiAgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb24uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb24uaAppbmRleCA0ZWM2OWM3Li5lNzY5MzAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvbi5oCkBAIC0yMywzNCArMjMsNDMgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Db25maWdCYXNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0RpcmVjdE1vZGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRHVhbE1vbm9Nb2RlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUGxheWJhY2tSYXRlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHRTeXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVW5pcXVlSWRVc2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9UcmFja1NlY29uZGFyeU91dHB1dEluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0NoYW5uZWxMYXlvdXQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0NvbmZpZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvQ29uZmlnQmFzZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvQ29udGVudFR5cGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0RldmljZURlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9HYWluLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9HYWluQ29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9HYWluTW9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvSW5wdXRGbGFncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTW9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvT2ZmbG9hZEluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb091dHB1dEZsYWdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0RXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0TWl4RXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qcm9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Tb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1N0YW5kYXJkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Vc2FnZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvVXVpZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgpAQCAtODYsMTkgKzk1LDkgQEAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9faHdfc3luY190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2h3X3N5bmNfdChpbnQzMl90IGFpZGwpOwogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19od19zeW5jX3RfaW50MzJfdChhdWRpb19od19zeW5jX3QgbGVnYWN5KTsKIAotLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQzMl90LgotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlX2ludDMyX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlIGFpZGwpOwotLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQzMl90LgotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4gbGVnYWN5MmFpZGxfaW50MzJfdF9BdWRpb1BvcnRDb25maWdUeXBlKAotICAgICAgICBpbnQzMl90IGxlZ2FjeSk7Ci0KIENvbnZlcnNpb25SZXN1bHQ8dW5zaWduZWQgaW50PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2NvbmZpZ19tYXNrKGludDMyX3QgYWlkbCk7CiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2NvbmZpZ19tYXNrX2ludDMyX3QodW5zaWduZWQgaW50IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoaW50MzJfdCBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3kpOwotCiBDb252ZXJzaW9uUmVzdWx0PHBpZF90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGludDMyX3QgYWlkbCk7CiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QocGlkX3QgbGVnYWN5KTsKIApAQCAtMTE2LDEwICsxMTUsMTAgQEAKIENvbnZlcnNpb25SZXN1bHQ8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZ192aWV3Pj4KIGxlZ2FjeTJhaWRsX29wdGlvbmFsX1N0cmluZzE2X29wdGlvbmFsX3N0cmluZyhzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2NvbmZpZ19ldmVudD4gYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudCgKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fY29uZmlnX2V2ZW50X3Q+IGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnRfdCgKICAgICAgICAgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudCBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudD4gbGVnYWN5MmFpZGxfYXVkaW9faW9fY29uZmlnX2V2ZW50X0F1ZGlvSW9Db25maWdFdmVudCgKLSAgICAgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50IGxlZ2FjeSk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90X0F1ZGlvSW9Db25maWdFdmVudCgKKyAgICAgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3JvbGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdCgKICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgYWlkbCk7CkBAIC0xMzEsMzYgKzEzMCw1OSBAQAogQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0VHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZSgKICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdCgKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgbGVnYWN5KTsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dCYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbj4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGF1ZGlvX2RldmljZXNfdCBsZWdhY3kpOworCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZSYgYWlkbCwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190KiBsZWdhY3lUeXBlLCBjaGFyKiBsZWdhY3lBZGRyZXNzKTsKK3N0YXR1c190IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIFN0cmluZzgqIGxlZ2FjeUFkZHJlc3MpOworc3RhdHVzX3QgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2UmIGFpZGwsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCogbGVnYWN5VHlwZSwgc3RkOjpzdHJpbmcqIGxlZ2FjeUFkZHJlc3MpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U+CitsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBsZWdhY3lUeXBlLCBjb25zdCBjaGFyKiBsZWdhY3lBZGRyZXNzKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlPgorbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbGVnYWN5VHlwZSwgY29uc3QgU3RyaW5nOCYgbGVnYWN5QWRkcmVzcyk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZm9ybWF0X3Q+IGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+CitsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGF1ZGlvX2Zvcm1hdF90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjpBdWRpb0dhaW5Nb2RlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluTW9kZT4KK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbk1vZGVfYXVkaW9fZ2Fpbl9tb2RlX3QobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbk1vZGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW5Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfQXVkaW9HYWluTW9kZShhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soaW50MzJfdCBhaWRsKTsKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfaW50MzJfdF9tYXNrKGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChpbnQzMl90IGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChhdWRpb19kZXZpY2VzX3QgbGVnYWN5KTsKLQogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX2NvbmZpZz4gYWlkbDJsZWdhY3lfQXVkaW9HYWluQ29uZmlnX2F1ZGlvX2dhaW5fY29uZmlnKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9HYWluQ29uZmlnJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2FpbkNvbmZpZz4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKAotICAgICAgICBjb25zdCBhdWRpb19nYWluX2NvbmZpZyYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKTsKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbkNvbmZpZyYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbkNvbmZpZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZyhjb25zdCBhdWRpb19nYWluX2NvbmZpZyYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvSW5wdXRGbGFnc19hdWRpb19pbnB1dF9mbGFnc190KAotICAgICAgICBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X0F1ZGlvSW5wdXRGbGFncygKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBsZWdhY3kpOworQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PgorYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvSW5wdXRGbGFncyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvSW5wdXRGbGFncz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfQXVkaW9PdXRwdXRGbGFnc19hdWRpb19vdXRwdXRfZmxhZ3NfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3MgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9BdWRpb091dHB1dEZsYWdzKAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpOworQ29udmVyc2lvblJlc3VsdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4KK2FpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT3V0cHV0RmxhZ3MgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb091dHB1dEZsYWdzPgorbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncyhhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW5wdXRfZmxhZ3NfdF9tYXNrKAogICAgICAgICBpbnQzMl90IGFpZGwpOwpAQCAtMTczLDQwICsxOTUsNDMgQEAKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19mbGFncz4gYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0ZsYWdzJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9GbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKAotICAgICAgICBjb25zdCBhdWRpb19pb19mbGFncyYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKTsKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvSW9GbGFncyYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvSW9GbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKAorICAgICAgICBjb25zdCBhdWRpb19pb19mbGFncyYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHRfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCgKLSAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzJiBhaWRsRGV2aWNlRXh0KTsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0JiBsZWdhY3ksCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQqIGFpZGwsCisgICAgICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMqIGFpZGxEZXZpY2VFeHQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KAotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9TdHJlYW1UeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZSgKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBsZWdhY3kpOworICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlPgorbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX3NvdXJjZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZSgKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc291cmNlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2UgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZT4KKyAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc2Vzc2lvbl90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChpbnQzMl90IGFpZGwpOwogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb19zZXNzaW9uX3QgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSk7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyYgYWlkbE1peEV4dCk7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyogYWlkbE1peEV4dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCgKK2FpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCgKICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWc+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZygKQEAgLTIyMSw3ICsyNDYsNiBAQAogCiBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvSW9EZXNjcmlwdG9yPj4gYWlkbDJsZWdhY3lfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvciYgYWlkbCk7Ci0KIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yPiBsZWdhY3kyYWlkbF9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcigKICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBsZWdhY3kpOwogCkBAIC0yMzEsMTMgKzI1NSwxNCBAQAogICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb250ZW50X3R5cGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QobWVkaWE6OkF1ZGlvQ29udGVudFR5cGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlPgorYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdCgKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29udGVudFR5cGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbnRlbnRUeXBlPgogbGVnYWN5MmFpZGxfYXVkaW9fY29udGVudF90eXBlX3RfQXVkaW9Db250ZW50VHlwZShhdWRpb19jb250ZW50X3R5cGVfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3VzYWdlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QobWVkaWE6OkF1ZGlvVXNhZ2UgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1VzYWdlPgorYWlkbDJsZWdhY3lfQXVkaW9Vc2FnZV9hdWRpb191c2FnZV90KG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1VzYWdlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShhdWRpb191c2FnZV90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZmxhZ3NfbWFza190PgpAQCAtMjU2LDI0ICsyODEsMjcgQEAKIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QoCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUoYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19vZmZsb2FkX2luZm9fdD4KLWFpZGwybGVnYWN5X0F1ZGlvT2ZmbG9hZEluZm9fYXVkaW9fb2ZmbG9hZF9pbmZvX3QoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbz4KK2FpZGwybGVnYWN5X0F1ZGlvT2ZmbG9hZEluZm9fYXVkaW9fb2ZmbG9hZF9pbmZvX3QoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb09mZmxvYWRJbmZvJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT2ZmbG9hZEluZm8+CiBsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ190PgotYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29uZmlnPgotbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uc3QgYXVkaW9fY29uZmlnX3QmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWcmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX2Jhc2VfdD4KLWFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWdCYXNlPgotbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlPgorbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCiBDb252ZXJzaW9uUmVzdWx0PHNwPElNZW1vcnk+PgogYWlkbDJsZWdhY3lfU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGNvbnN0IG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uJiBhaWRsKTsKQEAgLTI5MSw4ICszMTksOCBAQAogbGVnYWN5MmFpZGxfQXVkaW9UaW1lc3RhbXBfQXVkaW9UaW1lc3RhbXBJbnRlcm5hbChjb25zdCBBdWRpb1RpbWVzdGFtcCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb191dWlkX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9VdWlkPgorYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZD4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoY29uc3QgYXVkaW9fdXVpZF90JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGVmZmVjdF9kZXNjcmlwdG9yX3Q+CkBAIC0zMDIsOCArMzMwLDggQEAKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4KIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4KKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSgKICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QgbGVnYWN5KTsKIApAQCAtMzE3LDM3ICszNDUsMzkgQEAKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKHVpbnQzMl90IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdD4KLWFpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcyBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzPgotbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcygKLSAgICAgICAgYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdCBsZWdhY3kpOwotCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfZGV2aWNlX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KGNvbnN0IGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMmIGFpZGxEZXZpY2VFeHQpOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9kZXZpY2VfZXh0JiBsZWdhY3ksCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQqIGFpZGwsCisgICAgICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMqIGFpZGxEZXZpY2VFeHQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfbWl4X2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dCYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGNvbnN0IGF1ZGlvX3BvcnRfbWl4X2V4dCYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQmIGFpZGwsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMmIGFpZGxNaXhFeHQpOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9taXhfZXh0X0F1ZGlvUG9ydE1peEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9taXhfZXh0JiBsZWdhY3ksCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQqIGFpZGwsCisgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMqIGFpZGxNaXhFeHQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnRTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0U2Vzc2lvbkV4dChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X2ludDMyX3QoY29uc3QgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wcm9maWxlPgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+Ci1sZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+CitsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbj4KLWFpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgotbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4oY29uc3QgYXVkaW9fZ2FpbiYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4mIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4+CitsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF92Nz4KIGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIGFpZGwpOwpAQCAtMzU1LDggKzM4NSw4IEBACiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydChjb25zdCBhdWRpb19wb3J0X3Y3JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobWVkaWE6OkF1ZGlvTW9kZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTW9kZT4KK2FpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX21vZGVfdF9BdWRpb01vZGUoYXVkaW9fbW9kZV90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdW5pcXVlX2lkX3VzZV90PgpAQCAtMzkwLDIxICs0MjAsMjEgQEAKIGxlZ2FjeTJhaWRsX2F1ZGlvX3BsYXliYWNrX3JhdGVfdF9BdWRpb1BsYXliYWNrUmF0ZShjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc3RhbmRhcmRfdD4KLWFpZGwybGVnYWN5X0F1ZGlvU3RhbmRhcmRfYXVkaW9fc3RhbmRhcmRfdChtZWRpYTo6QXVkaW9TdGFuZGFyZCBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RhbmRhcmQ+CithaWRsMmxlZ2FjeV9BdWRpb1N0YW5kYXJkX2F1ZGlvX3N0YW5kYXJkX3QobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RhbmRhcmQgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0YW5kYXJkPgogbGVnYWN5MmFpZGxfYXVkaW9fc3RhbmRhcmRfdF9BdWRpb1N0YW5kYXJkKGF1ZGlvX3N0YW5kYXJkX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yPgogYWlkbDJsZWdhY3lfRXh0cmFBdWRpb0Rlc2NyaXB0b3JfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgbWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yPgorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6RXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+CiBsZWdhY3kyYWlkbF9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yX0V4dHJhQXVkaW9EZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yJiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90PgogYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGUmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZT4KKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGUmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUoCiAgICAgICAgIGNvbnN0IGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90ICYgbGVnYWN5KTsKIApAQCAtNDE2LDUgKzQ0NiwxMyBAQAogbGVnYWN5MmFpZGxfVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpcl9UcmFja1NlY29uZGFyeU91dHB1dEluZm8oCiAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1BhaXImIGxlZ2FjeSk7CiAKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGlyZWN0X21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRGlyZWN0TW9kZV9hdWRpb19kaXJlY3RfbW9kZV90KG1lZGlhOjpBdWRpb0RpcmVjdE1vZGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU+CitsZWdhY3kyYWlkbF9hdWRpb19kaXJlY3RfbW9kZV90X0F1ZGlvRGlyZWN0TW9kZShhdWRpb19kaXJlY3RfbW9kZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGlyZWN0X21vZGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kaXJlY3RfbW9kZV90X21hc2soaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9pbnQzMl90X21hc2soYXVkaW9fZGlyZWN0X21vZGVfdCBsZWdhY3kpOworCiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaAppbmRleCBjMWEyYmUzLi44ODE3YzM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmgKQEAgLTIwLDQyICsyMCwxNCBAQAogI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZXhwZWN0ZWQuaD4KKyNpbmNsdWRlIDxiaW5kZXIvRW51bXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8ZXJyb3IvUmVzdWx0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci11c2luZyBDb252ZXJzaW9uUmVzdWx0ID0gYmFzZTo6ZXhwZWN0ZWQ8VCwgc3RhdHVzX3Q+OwotCi0vLyBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIHdvcmtpbmcgd2l0aCBDb252ZXJzaW9uUmVzdWx0LCB1c2VmdWwgZm9yIHdyaXRpbmcgY29udmVydGVkIGZvciBhZ2dyZWdhdGUKLS8vIHR5cGVzLgotCi0jZGVmaW5lIFZBTFVFX09SX1JFVFVSTihyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGF1dG8gX3RtcCA9IChyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChfdG1wLmVycm9yKCkpOyBcCi0gICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSkKLQotI2RlZmluZSBSRVRVUk5fSUZfRVJST1IocmVzdWx0KSBcCi0gICAgaWYgKHN0YXR1c190IF90bXAgPSAocmVzdWx0KTsgX3RtcCAhPSBPSykgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoX3RtcCk7Ci0KLSNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyh4KSAgICAgICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIF90bXAuZXJyb3IoKTsgXAotICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICBcCi0gICAgIH0pCi0KLSNkZWZpbmUgVkFMVUVfT1JfRkFUQUwocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGF1dG8gX3RtcCA9IChyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFfdG1wLm9rKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb246ICVzIExpbmU6ICVkIEZhaWxlZCByZXN1bHQgKCVkKSIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgX3RtcC5lcnJvcigpKTsgICAgIFwKLSAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0pCit1c2luZyBDb252ZXJzaW9uUmVzdWx0ID0gZXJyb3I6OlJlc3VsdDxUPjsKIAogLyoqCiAgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdG8gc2FmZWx5IGNhc3QgYmV0d2VlbiBpbnRlZ3JhbCB0eXBlcywgcmVzcGVjdGluZyBsaW1pdHMgb2YgdGhlIGRlc3RpbmF0aW9uCkBAIC0xMDYsNiArNzgsMjYgQEAKIH0KIAogLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyBjb252ZXJ0IGNvbnRhaW5lcnMgb2YgY29udmVydGlibGUgdHlwZXMsIHVzaW5nIGl0ZXJhdG9ycy4KKyAqIFVzZXMgYSBsaW1pdCBhcyBtYXhpbXVtIGNvbnZlcnNpb24gaXRlbXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3IsIHR5cGVuYW1lIE91dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBGdW5jPgorc3RhdHVzX3QgY29udmVydFJhbmdlV2l0aExpbWl0KElucHV0SXRlcmF0b3Igc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3Igb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmMmIGl0ZW1Db252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBsaW1pdCkgeworICAgIElucHV0SXRlcmF0b3IgbGFzdCA9IGVuZDsKKyAgICBpZiAoZW5kIC0gc3RhcnQgPiBsaW1pdCkgeworICAgICAgICBsYXN0ID0gc3RhcnQgKyBsaW1pdDsKKyAgICB9CisgICAgZm9yIChJbnB1dEl0ZXJhdG9yIGl0ZXIgPSBzdGFydDsgKGl0ZXIgIT0gbGFzdCk7ICsraXRlciwgKytvdXQpIHsKKyAgICAgICAgKm91dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoaXRlbUNvbnZlcnNpb24oKml0ZXIpKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKioKICAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0aGF0IGhlbHBzIGNvbnZlcnQgY29udGFpbmVycyBvZiBjb252ZXJ0aWJsZSB0eXBlcy4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0Q29udGFpbmVyLCB0eXBlbmFtZSBJbnB1dENvbnRhaW5lciwgdHlwZW5hbWUgRnVuYz4KQEAgLTExOSw2ICsxMTEsNjIgQEAKICAgICByZXR1cm4gb3V0cHV0OwogfQogCisvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0aGF0IGhlbHBzIGNvbnZlcnQgY29udGFpbmVycyBvZiBjb252ZXJ0aWJsZSB0eXBlcworICogdXNpbmcgYW4gaXRlbSBjb252ZXJzaW9uIGZ1bmN0aW9uIHdpdGggYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE91dHB1dENvbnRhaW5lciwgdHlwZW5hbWUgSW5wdXRDb250YWluZXIsIHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIFBhcmFtZXRlcj4KK0NvbnZlcnNpb25SZXN1bHQ8T3V0cHV0Q29udGFpbmVyPgorY29udmVydENvbnRhaW5lcihjb25zdCBJbnB1dENvbnRhaW5lciYgaW5wdXQsIGNvbnN0IEZ1bmMmIGl0ZW1Db252ZXJzaW9uLCBjb25zdCBQYXJhbWV0ZXImIHBhcmFtKSB7CisgICAgT3V0cHV0Q29udGFpbmVyIG91dHB1dDsKKyAgICBhdXRvIGlucyA9IHN0ZDo6aW5zZXJ0ZXIob3V0cHV0LCBvdXRwdXQuYmVnaW4oKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogaW5wdXQpIHsKKyAgICAgICAgKmlucyA9IFZBTFVFX09SX1JFVFVSTihpdGVtQ29udmVyc2lvbihpdGVtLCBwYXJhbSkpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCisvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0aGF0IGhlbHBzIHRvICJ6aXAiIHR3byBpbnB1dCBjb250YWluZXJzIG9mIHRoZSBzYW1lIHNpemUKKyAqIGludG8gYSBzaW5nbGUgdmVjdG9yIG9mIGNvbnZlcnRlZCB0eXBlcy4gVGhlIGNvbnZlcnNpb24gZnVuY3Rpb24gbXVzdAorICogdGh1cyBhY2NlcHQgdHdvIGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0Q29udGFpbmVyLCB0eXBlbmFtZSBJbnB1dENvbnRhaW5lcjEsCisgICAgICAgIHR5cGVuYW1lIElucHV0Q29udGFpbmVyMiwgdHlwZW5hbWUgRnVuYz4KK0NvbnZlcnNpb25SZXN1bHQ8T3V0cHV0Q29udGFpbmVyPgorY29udmVydENvbnRhaW5lcnMoY29uc3QgSW5wdXRDb250YWluZXIxJiBpbnB1dDEsIGNvbnN0IElucHV0Q29udGFpbmVyMiYgaW5wdXQyLAorICAgICAgICBjb25zdCBGdW5jJiBpdGVtQ29udmVyc2lvbikgeworICAgIGF1dG8gaXRlcjIgPSBpbnB1dDIuYmVnaW4oKTsKKyAgICBPdXRwdXRDb250YWluZXIgb3V0cHV0OworICAgIGF1dG8gaW5zID0gc3RkOjppbnNlcnRlcihvdXRwdXQsIG91dHB1dC5iZWdpbigpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0xIDogaW5wdXQxKSB7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihpdGVyMiAhPSBpbnB1dDIuZW5kKCkgPyBPSyA6IEJBRF9WQUxVRSk7CisgICAgICAgICppbnMgPSBWQUxVRV9PUl9SRVRVUk4oaXRlbUNvbnZlcnNpb24oaXRlbTEsICppdGVyMisrKSk7CisgICAgfQorICAgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8qKgorICogQSBnZW5lcmljIHRlbXBsYXRlIHRoYXQgaGVscHMgdG8gInVuemlwIiBhIHBlci1lbGVtZW50IGNvbnZlcnNpb24gaW50bworICogYSBwYWlyIG9mIGVsZW1lbnRzIGludG8gYSBwYWlyIG9mIGNvbnRhaW5lcnMuIFRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uCisgKiBtdXN0IGVtaXQgYSBwYWlyIG9mIGVsZW1lbnRzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRDb250YWluZXIxLCB0eXBlbmFtZSBPdXRwdXRDb250YWluZXIyLAorICAgICAgICB0eXBlbmFtZSBJbnB1dENvbnRhaW5lciwgdHlwZW5hbWUgRnVuYz4KK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpwYWlyPE91dHB1dENvbnRhaW5lcjEsIE91dHB1dENvbnRhaW5lcjI+PgorY29udmVydENvbnRhaW5lclNwbGl0KGNvbnN0IElucHV0Q29udGFpbmVyJiBpbnB1dCwgY29uc3QgRnVuYyYgaXRlbUNvbnZlcnNpb24pIHsKKyAgICBPdXRwdXRDb250YWluZXIxIG91dHB1dDE7CisgICAgT3V0cHV0Q29udGFpbmVyMiBvdXRwdXQyOworICAgIGF1dG8gaW5zMSA9IHN0ZDo6aW5zZXJ0ZXIob3V0cHV0MSwgb3V0cHV0MS5iZWdpbigpKTsKKyAgICBhdXRvIGluczIgPSBzdGQ6Omluc2VydGVyKG91dHB1dDIsIG91dHB1dDIuYmVnaW4oKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogaW5wdXQpIHsKKyAgICAgICAgYXV0byBvdXRfcGFpciA9IFZBTFVFX09SX1JFVFVSTihpdGVtQ29udmVyc2lvbihpdGVtKSk7CisgICAgICAgICppbnMxID0gb3V0X3BhaXIuZmlyc3Q7CisgICAgICAgICppbnMyID0gb3V0X3BhaXIuc2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIob3V0cHV0MSwgb3V0cHV0Mik7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFRoZSBjb2RlIGJlbG93IGVzdGFibGlzaGVzOgogLy8gSW50ZWdyYWxUeXBlT2Y8VD4sIHdoaWNoIHdvcmtzIGZvciBlaXRoZXIgaW50ZWdyYWwgdHlwZXMgKGluIHdoaWNoIGNhc2UgaXQgZXZhbHVhdGVzIHRvIFQpLCBvcgpAQCAtMjIzLDYgKzI3MSwyOSBAQAogbmFtZXNwYWNlIGFpZGxfdXRpbHMgewogCiAvKioKKyAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCBmb3IgdGhlIEFJREwgZW51bWVyYXRpb24uCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBpc1ZhbGlkRW51bShUIHZhbHVlKSB7CisgICAgY29uc3RleHByIGFuZHJvaWQ6OmVudW1fcmFuZ2U8VD4gZXJ7fTsKKyAgICByZXR1cm4gc3RkOjpmaW5kKGVyLmJlZ2luKCksIGVyLmVuZCgpLCB2YWx1ZSkgIT0gZXIuZW5kKCk7Cit9CisKKy8vIFQgaXMgYSAiY29udGFpbmVyIiBvZiBlbnVtIGJpbmRlciB0eXBlcyB3aXRoIGEgdG9TdHJpbmcoKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgZW51bXNUb1N0cmluZyhjb25zdCBUJiB0KSB7CisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gaXRlbSA6IHQpIHsKKyAgICAgICAgaWYgKHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcyA9IHRvU3RyaW5nKGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5hcHBlbmQoInwiKS5hcHBlbmQodG9TdHJpbmcoaXRlbSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKioKICAqIFJldHVybiB0aGUgZXF1aXZhbGVudCBBbmRyb2lkIHN0YXR1c190IGZyb20gYSBiaW5kZXIgZXhjZXB0aW9uIGNvZGUuCiAgKgogICogR2VuZXJhbGx5IG9uZSBzaG91bGQgdXNlIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKCkgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKaW5kZXggNWRmZTVmYy4uODYyYTBmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKQEAgLTE3LDkgKzE3LDc1IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvQ2hhbm5lbExheW91dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIHsKKy8vIHNlZSBib29zdDo6aGFzaF9jb21iaW5lCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKKyNlbmRpZgorc3RhdGljIHNpemVfdCBoYXNoX2NvbWJpbmUoc2l6ZV90IHNlZWQsIHNpemVfdCB2KSB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDxzaXplX3Q+e30odikgKyAweDllMzc3OWI5ICsgKHNlZWQgPDwgNikgKyAoc2VlZCA+PiAyKTsKK30KK30KKworbmFtZXNwYWNlIHN0ZCB7CisKKy8vIE5vdGU6IHdoZW4gZXh0ZW5kaW5nIHRoZSB0eXBlcyBoYXNoZWQgYmVsb3cgd2UgbmVlZCB0byBhY2NvdW50IGZvciB0aGUKKy8vIHBvc3NpYmlsaXR5IG9mIHByb2Nlc3NpbmcgdHlwZXMgYmVsb25naW5nIHRvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgdHlwZSwKKy8vIGUuZy4gYSBIQUwgbWF5IGJlIHVzaW5nIGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgQUlETCBpbnRlcmZhY2UuCisKK3RlbXBsYXRlPD4gc3RydWN0IGhhc2g8YW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dD4KK3sKKyAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dCYgYWNsKSBjb25zdCBub2V4Y2VwdCB7CisgICAgICAgIHVzaW5nIFRhZyA9IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNlZWQgPSBzdGQ6Omhhc2g8VGFnPnt9KGFjbC5nZXRUYWcoKSk7CisgICAgICAgIHN3aXRjaCAoYWNsLmdldFRhZygpKSB7CisgICAgICAgICAgICBjYXNlIFRhZzo6bm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKHNlZWQsIHN0ZDo6aGFzaDxpbnQzMl90Pnt9KGFjbC5nZXQ8VGFnOjpub25lPigpKSk7CisgICAgICAgICAgICBjYXNlIFRhZzo6aW52YWxpZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKHNlZWQsIHN0ZDo6aGFzaDxpbnQzMl90Pnt9KGFjbC5nZXQ8VGFnOjppbnZhbGlkPigpKSk7CisgICAgICAgICAgICBjYXNlIFRhZzo6aW5kZXhNYXNrOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoc2VlZCwgc3RkOjpoYXNoPGludDMyX3Q+e30oYWNsLmdldDxUYWc6OmluZGV4TWFzaz4oKSkpOworICAgICAgICAgICAgY2FzZSBUYWc6OmxheW91dE1hc2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZShzZWVkLCBzdGQ6Omhhc2g8aW50MzJfdD57fShhY2wuZ2V0PFRhZzo6bGF5b3V0TWFzaz4oKSkpOworICAgICAgICAgICAgY2FzZSBUYWc6OnZvaWNlTWFzazoKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKHNlZWQsIHN0ZDo6aGFzaDxpbnQzMl90Pnt9KGFjbC5nZXQ8VGFnOjp2b2ljZU1hc2s+KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VlZDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uPgoreworICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgYWRkKSBjb25zdCBub2V4Y2VwdCB7CisgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoCisgICAgICAgICAgICAgICAgc3RkOjpoYXNoPGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZVR5cGU+e30oYWRkLnR5cGUpLAorICAgICAgICAgICAgICAgIHN0ZDo6aGFzaDxzdGQ6OnN0cmluZz57fShhZGQuY29ubmVjdGlvbikpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGhhc2g8YW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+Cit7CisgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKSgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBhZmQpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZSgKKyAgICAgICAgICAgICAgICBzdGQ6Omhhc2g8YW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0VHlwZT57fShhZmQudHlwZSksCisgICAgICAgICAgICAgICAgaGFzaF9jb21iaW5lKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpoYXNoPGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpQY21UeXBlPnt9KGFmZC5wY20pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPnt9KGFmZC5lbmNvZGluZykpKTsKKyAgICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHN0ZAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDggKzEwNyw0MyBAQAogICAgIHJldHVybiAhKGxocz09cmhzKTsKIH0KIAorY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmbGhzLCBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmcmhzKQoreworICAgIHJldHVybiBsaHMudmVyc2lvbiA9PSByaHMudmVyc2lvbiAmJiBsaHMuc2l6ZSA9PSByaHMuc2l6ZSAmJgorICAgICAgICAgICBsaHMuc2FtcGxlX3JhdGUgPT0gcmhzLnNhbXBsZV9yYXRlICYmIGxocy5jaGFubmVsX21hc2sgPT0gcmhzLmNoYW5uZWxfbWFzayAmJgorICAgICAgICAgICBsaHMuZm9ybWF0ID09IHJocy5mb3JtYXQgJiYgbGhzLnN0cmVhbV90eXBlID09IHJocy5zdHJlYW1fdHlwZSAmJgorICAgICAgICAgICBsaHMuYml0X3JhdGUgPT0gcmhzLmJpdF9yYXRlICYmIGxocy5kdXJhdGlvbl91cyA9PSByaHMuZHVyYXRpb25fdXMgJiYKKyAgICAgICAgICAgbGhzLmhhc192aWRlbyA9PSByaHMuaGFzX3ZpZGVvICYmIGxocy5pc19zdHJlYW1pbmcgPT0gcmhzLmlzX3N0cmVhbWluZyAmJgorICAgICAgICAgICBsaHMuYml0X3dpZHRoID09IHJocy5iaXRfd2lkdGggJiYgbGhzLm9mZmxvYWRfYnVmZmVyX3NpemUgPT0gcmhzLm9mZmxvYWRfYnVmZmVyX3NpemUgJiYKKyAgICAgICAgICAgbGhzLnVzYWdlID09IHJocy51c2FnZSAmJiBsaHMuZW5jYXBzdWxhdGlvbl9tb2RlID09IHJocy5lbmNhcHN1bGF0aW9uX21vZGUgJiYKKyAgICAgICAgICAgbGhzLmNvbnRlbnRfaWQgPT0gcmhzLmNvbnRlbnRfaWQgJiYgbGhzLnN5bmNfaWQgPT0gcmhzLnN5bmNfaWQ7Cit9Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZsaHMsIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZyaHMpCit7CisgICAgcmV0dXJuICEobGhzPT1yaHMpOworfQorCitjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGF1ZGlvX2NvbmZpZ190ICZsaHMsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy5zYW1wbGVfcmF0ZSA9PSByaHMuc2FtcGxlX3JhdGUgJiYgbGhzLmNoYW5uZWxfbWFzayA9PSByaHMuY2hhbm5lbF9tYXNrICYmCisgICAgICAgICAgIGxocy5mb3JtYXQgPT0gcmhzLmZvcm1hdCAmJiBsaHMub2ZmbG9hZF9pbmZvID09IHJocy5vZmZsb2FkX2luZm87Cit9Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGF1ZGlvX2NvbmZpZ190ICZsaHMsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICZyaHMpCit7CisgICAgcmV0dXJuICEobGhzPT1yaHMpOworfQorCitjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgJmxocywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAmcmhzKQoreworICAgIHJldHVybiBsaHMuc2FtcGxlX3JhdGUgPT0gcmhzLnNhbXBsZV9yYXRlICYmIGxocy5jaGFubmVsX21hc2sgPT0gcmhzLmNoYW5uZWxfbWFzayAmJgorICAgICAgICAgICBsaHMuZm9ybWF0ID09IHJocy5mb3JtYXQ7Cit9Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgJmxocywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAmcmhzKQoreworICAgIHJldHVybiAhKGxocz09cmhzKTsKK30KKwogZW51bSB2b2x1bWVfZ3JvdXBfdCA6IHVpbnQzMl90Owogc3RhdGljIGNvbnN0IHZvbHVtZV9ncm91cF90IFZPTFVNRV9HUk9VUF9OT05FID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KC0xKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggM2MxOWVjMS4uNTY4ODRhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtNDAsNyArNDAsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvRWZmZWN0IDogcHVibGljIFJlZkJhc2UKK2NsYXNzIEF1ZGlvRWZmZWN0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgogCkBAIC0yNzcsMTMgKzI3Nyw1NSBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKIAogICAgIC8qCi0gICAgICogRXZlbnRzIHVzZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb24gKGVmZmVjdF9jYWxsYmFja190KS4KKyAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAobGVnYWN5X2NhbGxiYWNrX3QpLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CiAgICAgICAgIEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQgPSAwLAogICAgICAgICBFVkVOVF9FTkFCTEVfU1RBVFVTX0NIQU5HRUQgPSAxLAogICAgICAgICBFVkVOVF9QQVJBTUVURVJfQ0hBTkdFRCA9IDIsCi0gICAgICAgIEVWRU5UX0VSUk9SID0gMworICAgICAgICBFVkVOVF9FUlJPUiA9IDMsCisgICAgICAgIEVWRU5UX0ZSQU1FU19QUk9DRVNTRUQgPSA0LAorICAgIH07CisKKyAgICBjbGFzcyBJQXVkaW9FZmZlY3RDYWxsYmFjayA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgICAgICBmcmllbmQgQXVkaW9FZmZlY3Q7CisgICAgIHByb3RlY3RlZDoKKyAgICAgICAgLyogVGhlIGV2ZW50IGlzIHJlY2VpdmVkIHdoZW4gYW4gYXBwbGljYXRpb24gbG9zZXMgb3IKKyAgICAgICAgICogZ2FpbnMgdGhlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuIExvc3Mgb2YgY29udHJvbCBoYXBwZW5zCisgICAgICAgICAqIGlmIGFub3RoZXIgYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIHVzZSBvZiB0aGUgZW5naW5lIGJ5IGNyZWF0aW5nIGFuIEF1ZGlvRWZmZWN0IGZvcgorICAgICAgICAgKiB0aGUgc2FtZSBlZmZlY3QgdHlwZSBidXQgd2l0aCBhIGhpZ2hlciBwcmlvcml0eS4gQ29udHJvbCBpcyByZXR1cm5lZCB3aGVuIHRoZQorICAgICAgICAgKiBhcHBsaWNhdGlvbiBoYXZpbmcgdGhlIGNvbnRyb2wgZGVsZXRlcyBpdHMgQXVkaW9FZmZlY3Qgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gaXNHcmFudGVkOiBUcnVlIGlmIGNvbnRyb2wgaGFzIGJlZW4gZ3JhbnRlZC4gRmFsc2UgaWYgc3RvbGVuLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQ29udHJvbFN0YXR1c0NoYW5nZWQoW1ttYXliZV91bnVzZWRdXSBib29sIGlzR3JhbnRlZCkge30KKworICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgYnkgYWxsIGFwcGxpY2F0aW9ucyBub3QgaGF2aW5nIHRoZQorICAgICAgICAgKiBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lIHdoZW4gdGhlIGVmZmVjdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgKiBAcGFyYW0gaXNFbmFibGVkOiBUcnVlIGlmIGVuYWJsZWQuIEZhbHNlIGlmIGRpc2FibGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRW5hYmxlU3RhdHVzQ2hhbmdlZChbW21heWJlX3VudXNlZF1dIGJvb2wgaXNFbmFibGVkKSB7fQorCisgICAgICAgIC8qIFRoZSBldmVudCBpcyByZWNlaXZlZCBieSBhbGwgYXBwbGljYXRpb25zIG5vdCBoYXZpbmcgdGhlCisgICAgICAgICAqIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hlbiBhbiBlZmZlY3QgcGFyYW1ldGVyIGlzIGNoYW5nZWQuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbTogQSB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmF3IGJ5dGVzIG9mIGEgZWZmZWN0X3BhcmFtX3R5cGUgY29udGFpbmluZworICAgICAgICAgKiAgIHJhdyBkYXRhIHJlcHJlc2VudGluZyBhIHBhcmFtIHR5cGUsIHZhbHVlIHBhaXIuCisgICAgICAgICAqLworICAgICAgICAvLyBUT0RPIHBhc3MgYW4gQUlETCBwYXJjZWwgaW5zdGVhZCBvZiBlZmZlY3RfcGFyYW1fdHlwZQorICAgICAgICB2aXJ0dWFsIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2VkKFtbbWF5YmVfdW51c2VkXV0gc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW0pIHt9CisKKyAgICAgICAgLyogVGhlIGV2ZW50IGlzIHJlY2VpdmVkIHdoZW4gdGhlIGJpbmRlciBjb25uZWN0aW9uIHRvIHRoZSBtZWRpYXNlcnZlcgorICAgICAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQuIFR5cGljYWxseSB0aGUgc2VydmVyIGhhcyBiZWVuIGtpbGxlZC4KKyAgICAgICAgICogQHBhcmFtIGVycm9yQ29kZTogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKFtbbWF5YmVfdW51c2VkXV0gc3RhdHVzX3QgZXJyb3JDb2RlKSB7fQorCisKKyAgICAgICAgLyogVGhlIGV2ZW50IGlzIHJlY2VpdmVkIHdoZW4gdGhlIGF1ZGlvIHNlcnZlciBoYXMgcHJvY2Vzc2VkIGEgYmxvY2sgb2YKKyAgICAgICAgICogZGF0YS4KKyAgICAgICAgICogQHBhcmFtIGZyYW1lc1Byb2Nlc3NlZDogVGhlIG51bWJlciBvZiBmcmFtZXMgdGhlIGF1ZGlvIHNlcnZlciBoYXMKKyAgICAgICAgICogICBwcm9jZXNzZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZXNQcm9jZXNzZWQoW1ttYXliZV91bnVzZWRdXSBpbnQzMl90IGZyYW1lc1Byb2Nlc3NlZCkge30KICAgICB9OwogCiAgICAgLyogQ2FsbGJhY2sgZnVuY3Rpb24gbm90aWZ5aW5nIGNsaWVudCBhcHBsaWNhdGlvbiBvZiBhIGNoYW5nZSBpbiBlZmZlY3QgZW5naW5lIHN0YXRlIG9yCkBAIC0zMTQsNyArMzU2LDcgQEAKICAgICAgKiAgLSBFVkVOVF9FUlJPUjogIHN0YXR1c190IGluZGljYXRpbmcgdGhlIGVycm9yIChERUFEX09CSkVDVCB3aGVuIG1lZGlhIHNlcnZlciBkaWVzKS4KICAgICAgKi8KIAotICAgIHR5cGVkZWYgdm9pZCAoKmVmZmVjdF9jYWxsYmFja190KShpbnQzMl90IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpsZWdhY3lfY2FsbGJhY2tfdCkoaW50MzJfdCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CiAKIAogICAgIC8qIENvbnN0cnVjdG9yLgpAQCAtMzU5LDcgKzQwMSw3IEBACiAgICAgICogcHJpb3JpdHk6ICAgIHJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKICAgICAgKiAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlIHZhbHVlcwogICAgICAqICAgICAgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KLSAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBlZmZlY3RfY2FsbGJhY2tfdCkKKyAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBsZWdhY3lfY2FsbGJhY2tfdCkKICAgICAgKiB1c2VyOiAgICAgICAgcG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgogICAgICAqIHNlc3Npb25JZDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uCiAgICAgICogICAgICBJZiBlcXVhbCB0byBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KQEAgLTM4MiwyNiArNDI0LDQ5IEBACiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gZmxpbmdlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkID0gZmFsc2UpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCA9IGZhbHNlKTsKICAgICAvKgogICAgICAqIFNhbWUgYXMgYWJvdmUgYnV0IHdpdGggdHlwZSBhbmQgdXVpZCBzcGVjaWZpZWQgYnkgY2hhcmFjdGVyIHN0cmluZ3MuCiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgY2hhciAqdHlwZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb0VmZmVjdENhbGxiYWNrPiYgY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCA9IGZhbHNlKTsKKworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCA9IGZhbHNlKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvRWZmZWN0LiBUaGlzIG11c3QgYmUgY2hlY2tlZAogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9FZmZlY3QgQVBJLgpAQCAtNTMyLDE4ICs1OTcsMTkgQEAKIAogcHJvdGVjdGVkOgogICAgICBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZTsgLy8gc291cmNlIGZvciBhcHAgb3AgY2hlY2tzLgotICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIGVuYWJsZSBzdGF0ZQotICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYOyAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IDA7ICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCi0gICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXMgPSBOT19JTklUOyAgLy8gZWZmZWN0IHN0YXR1cwotICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJvYmUgPSBmYWxzZTsgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBubyBvcHMgYmVjYXVzZSBtSUVmZmVjdCBpcyBOVUxMCi0gICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmYgPSBudWxscHRyOyAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgY2hhbmdlcyBub3RpZmljYXRpb25zCi0gICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSA9IG51bGxwdHI7Ly8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yID0ge307ICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkID0gLTE7ICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAotICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgICAgIC8vIE11dGV4IGZvciBtRW5hYmxlZCBhY2Nlc3MKKyAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gZW5hYmxlIHN0YXRlCisgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICBtU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYOyAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkgPSAwOyAgICAgIC8vIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbAorICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7ICAvLyBlZmZlY3Qgc3RhdHVzCisgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBtUHJvYmUgPSBmYWxzZTsgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBubyBvcHMgYmVjYXVzZSBtSUVmZmVjdCBpcyBudWxscHRyCisKKyAgICAgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+IG1DYWxsYmFjayA9IG51bGxwdHI7IC8vIGNhbGxiYWNrIGludGVyZmFjZSBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGNoYW5nZXMgbm90aWZpY2F0aW9ucworICAgICBzcDxJQXVkaW9FZmZlY3RDYWxsYmFjaz4gbUxlZ2FjeVdyYXBwZXIgPSBudWxscHRyOworICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICAgICAgbURlc2NyaXB0b3IgPSB7fTsgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbUlkID0gLTE7ICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAorICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgICAgICAvLyBNdXRleCBmb3IgbUVuYWJsZWQgYWNjZXNzCiAKIAogICAgICAvLyBJRWZmZWN0Q2xpZW50CkBAIC01NTIsNiArNjE4LDcgQEAKICAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZChpbnQzMl90IGNtZENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlcGx5RGF0YSk7CisgICAgIHZpcnR1YWwgdm9pZCBmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMpOwogCiBwcml2YXRlOgogCkBAIC01ODcsNiArNjU0LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZnJhbWVzUHJvY2Vzc2VkKGludDMyX3QgZnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPmZyYW1lc1Byb2Nlc3NlZChmcmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgICAgICB9CisKIAogICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCmluZGV4IDk4MWQzM2EuLjQwNWVjN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKQEAgLTE3LDkgKzE3LDE1IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fSU9fREVTQ1JJUFRPUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fSU9fREVTQ1JJUFRPUl9ICiAKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1lbnVtIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCB7CitlbnVtIGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IHsKICAgICBBVURJT19PVVRQVVRfUkVHSVNURVJFRCwKICAgICBBVURJT19PVVRQVVRfT1BFTkVELAogICAgIEFVRElPX09VVFBVVF9DTE9TRUQsCkBAIC0zMyw0MSArMzksNzAgQEAKIAogLy8gYXVkaW8gaW5wdXQvb3V0cHV0IGRlc2NyaXB0b3IgdXNlZCB0byBjYWNoZSBvdXRwdXQgY29uZmlndXJhdGlvbnMgaW4gY2xpZW50IHByb2Nlc3MgdG8gYXZvaWQKIC8vIGZyZXF1ZW50IGNhbGxzIHRocm91Z2ggSUF1ZGlvRmxpbmdlcgotY2xhc3MgQXVkaW9Jb0Rlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZSB7CitjbGFzcyBBdWRpb0lvRGVzY3JpcHRvciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogcHVibGljOgotICAgIEF1ZGlvSW9EZXNjcmlwdG9yKCkgOgotICAgICAgICBtSW9IYW5kbGUoQVVESU9fSU9fSEFORExFX05PTkUpLAotICAgICAgICBtU2FtcGxpbmdSYXRlKDApLCBtRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgbUNoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfTk9ORSksCi0gICAgICAgIG1GcmFtZUNvdW50KDApLCBtRnJhbWVDb3VudEhBTCgwKSwgbUxhdGVuY3koMCksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKLSAgICB7Ci0gICAgICAgIG1lbXNldCgmbVBhdGNoLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgfQorICAgIEF1ZGlvSW9EZXNjcmlwdG9yKCkgPSBkZWZhdWx0OworICAgIC8vIEZvciBBVURJT197SU5QVVR8T1VUUFVUfV9DTE9TRUQgZXZlbnRzLgorICAgIEF1ZGlvSW9EZXNjcmlwdG9yKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSA6IG1Jb0hhbmRsZShpb0hhbmRsZSkge30KKyAgICAvLyBGb3IgQVVESU9fQ0xJRU5UX1NUQVJURUQgZXZlbnRzLgorICAgIEF1ZGlvSW9EZXNjcmlwdG9yKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IGF1ZGlvX3BhdGNoJiBwYXRjaCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIDoKKyAgICAgICAgICAgIG1Jb0hhbmRsZShpb0hhbmRsZSksIG1QYXRjaChwYXRjaCksIG1Qb3J0SWQocG9ydElkKSB7fQorICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UuCisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgYXVkaW9fcGF0Y2gmIHBhdGNoLCBib29sIGlzSW5wdXQsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGZyYW1lQ291bnRIYWwsIHVpbnQzMl90IGxhdGVuY3kgPSAwLAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSA6CisgICAgICAgICAgICBtSW9IYW5kbGUoaW9IYW5kbGUpLCBtUGF0Y2gocGF0Y2gpLCBtSXNJbnB1dChpc0lucHV0KSwKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSwgbUZvcm1hdChmb3JtYXQpLCBtQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgbUZyYW1lQ291bnQoZnJhbWVDb3VudCksIG1GcmFtZUNvdW50SEFMKGZyYW1lQ291bnRIYWwpLCBtTGF0ZW5jeShsYXRlbmN5KSwKKyAgICAgICAgICAgIG1Qb3J0SWQocG9ydElkKSB7fQogCi0gICAgdmlydHVhbCB+QXVkaW9Jb0Rlc2NyaXB0b3IoKSB7fQotCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZCgpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRJb0hhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1Jb0hhbmRsZTsgfQorICAgIGNvbnN0IGF1ZGlvX3BhdGNoJiBnZXRQYXRjaCgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaDsgfQorICAgIGJvb2wgZ2V0SXNJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0lucHV0OyB9CisgICAgdWludDMyX3QgZ2V0U2FtcGxpbmdSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZTsgfQorICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQorICAgIHNpemVfdCBnZXRGcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICBzaXplX3QgZ2V0RnJhbWVDb3VudEhBTCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50SEFMOyB9CisgICAgdWludDMyX3QgZ2V0TGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIG1MYXRlbmN5OyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZCgpIGNvbnN0IHsKICAgICAgICAgaWYgKG1QYXRjaC5udW1fc291cmNlcyAhPSAwICYmIG1QYXRjaC5udW1fc2lua3MgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1QYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gb3V0cHV0IG1peAotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGUgQVBJIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgZGV2aWNlIGluIGNhc2Ugb2YgbXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIHJldHVybiBtUGF0Y2guc2lua3NbMF0uaWQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gaW5wdXQgbWl4Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QYXRjaC5zb3VyY2VzWzBdLmlkOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUU6IHRoZSBBUEkgb25seSByZXR1cm5zIHRoZSBmaXJzdCBkZXZpY2UgaW4gY2FzZSBvZiBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCisgICAgICAgICAgICByZXR1cm4gbUlzSW5wdXQgPyBtUGF0Y2guc291cmNlc1swXS5pZCA6IG1QYXRjaC5zaW5rc1swXS5pZDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICB9CisgICAgdm9pZCBzZXRQYXRjaChjb25zdCBhdWRpb19wYXRjaCYgcGF0Y2gpIHsgbVBhdGNoID0gcGF0Y2g7IH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1Jb0hhbmRsZTsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZTsKLSAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudEhBTDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTGF0ZW5jeTsgICAvLyBvbmx5IHZhbGlkIGZvciBvdXRwdXQKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAvLyB2YWxpZCBmb3IgZXZlbnQgQVVESU9fQ0xJRU5UX1NUQVJURUQKKyAgICBzdGQ6OnN0cmluZyB0b0RlYnVnU3RyaW5nKCkgY29uc3QgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIHNzIDw8IG1Jb0hhbmRsZSA8PCAiLCBzYW1wbGluZ1JhdGUgIiA8PCBtU2FtcGxpbmdSYXRlIDw8ICIsICIKKyAgICAgICAgICAgPDwgYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhtRm9ybWF0KSA8PCAiLCAiCisgICAgICAgICAgIDw8IChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG1DaGFubmVsTWFzaykgPT0KKyAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYID8KKyAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luZGV4X21hc2tfdG9fc3RyaW5nKG1DaGFubmVsTWFzaykgOgorICAgICAgICAgICAgICAgICAgIChtSXNJbnB1dCA/IGF1ZGlvX2NoYW5uZWxfaW5fbWFza190b19zdHJpbmcobUNoYW5uZWxNYXNrKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX3RvX3N0cmluZyhtQ2hhbm5lbE1hc2spKSkKKyAgICAgICAgICAgPDwgIiwgZnJhbWVDb3VudCAiIDw8IG1GcmFtZUNvdW50IDw8ICIsIGZyYW1lQ291bnRIQUwgIiA8PCBtRnJhbWVDb3VudEhBTAorICAgICAgICAgICA8PCAiLCBkZXZpY2VJZCAiIDw8IGdldERldmljZUlkKCk7CisgICAgICAgIHJldHVybiBzcy5zdHIoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCAgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICBtUGF0Y2ggPSB7fTsKKyAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICBtSXNJbnB1dCA9IGZhbHNlOworICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUgPSAwOworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgPSAwOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgICAgICAgIG1GcmFtZUNvdW50SEFMID0gMDsKKyAgICBjb25zdCB1aW50MzJfdCAgICAgICAgICAgICBtTGF0ZW5jeSA9IDA7CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCAgbVBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCAzMjY5MTlhLi5jYjA1ZGQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC00MCwxNCArNDAsMTMgQEAKIAogc3RydWN0IGF1ZGlvX3RyYWNrX2NibGtfdDsKIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50UHJveHk7Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9SZWNvcmQgOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sKIHsKIHB1YmxpYzoKIAotICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvUmVjb3JkIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsYmFja190KS4KKyAgICAvKiBFdmVudHMgdXNlZCBieSBBdWRpb1JlY29yZCBjYWxsYmFjayBmdW5jdGlvbiAobGVnYWN5X2NhbGxiYWNrX3QpLgogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YSBOQVRJVkVfRVZFTlRfKi4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewpAQCAtNjUsMjAgKzY0LDI2IEBACiAgICAgfTsKIAogICAgIC8qIENsaWVudCBzaG91bGQgZGVjbGFyZSBhIEJ1ZmZlciBhbmQgcGFzcyBhZGRyZXNzIHRvIG9idGFpbkJ1ZmZlcigpCi0gICAgICogYW5kIHJlbGVhc2VCdWZmZXIoKS4gIFNlZSBhbHNvIGNhbGxiYWNrX3QgZm9yIEVWRU5UX01PUkVfREFUQS4KKyAgICAgKiBhbmQgcmVsZWFzZUJ1ZmZlcigpLiAgU2VlIGFsc28gbGVnYWN5X2NhbGxiYWNrX3QgZm9yIEVWRU5UX01PUkVfREFUQS4KICAgICAgKi8KIAogICAgIGNsYXNzIEJ1ZmZlcgogICAgIHsKKyAgICAgIGZyaWVuZCBBdWRpb1JlY29yZDsKICAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEZJWE1FIHVzZSBtIHByZWZpeAorICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgICAgIHNpemVfdCBnZXRGcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gZnJhbWVDb3VudDsgfQorICAgICAgICB1aW50OF90KiBkYXRhKCkgY29uc3QgeyByZXR1cm4gdWk4OyB9CisgICAgICAgIC8vIExlYXZpbmcgcHVibGljIGZvciBub3cgdG8gYXNzaXN0IHJlZmFjdG9yaW5nLiBUaGlzIGNsYXNzIHdpbGwKKyAgICAgICAgLy8gYmUgcmVwbGFjZWQuCiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7ICAgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgZnJvbSBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZnJhbWVzIHRvIGJlIHJlYWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIHJlbGVhc2VCdWZmZXIoKSBpdCBpcyBjdXJyZW50bHkgaWdub3JlZAogCi0gICAgICAgIHNpemVfdCAgICAgIHNpemU7ICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgIHByaXZhdGU6CisgICAgICAgIHNpemVfdCAgICAgIG1TaXplOyAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCkgaXQgaXMgaWdub3JlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGZyb20gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJ5dGVzIHRvIGJlIHJlYWQsIHdoaWNoIGlzIGZyYW1lQ291bnQgKiBmcmFtZVNpemUKQEAgLTkwLDcgKzk1LDcgQEAKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwogICAgICAgICAgICAgaW50MTZfdCogICAgaTE2OyAgICAgICAgLy8gc2lnbmVkIDE2LWJpdAotICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCisgICAgICAgICAgICB1aW50OF90KiAgICB1aTg7ICAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpOiB1bnVzZWQsIG91dHB1dDogcG9pbnRlciB0byBidWZmZXIKICAgICAgICAgfTsKIApAQCAtMTE3LDcgKzEyMiwyOCBAQAogICAgICAqICAgICAgICAgIC0gRVZFTlRfTkVXX0lBVURJT1JFQ09SRDogdW51c2VkLgogICAgICAqLwogCi0gICAgdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpsZWdhY3lfY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKworICAgIGNsYXNzIElBdWRpb1JlY29yZENhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgICAgIGZyaWVuZCBBdWRpb1JlY29yZDsKKyAgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBSZXF1ZXN0IGZvciBjbGllbnQgdG8gcmVhZCBuZXdseSBhdmFpbGFibGUgZGF0YS4KKyAgICAgICAgLy8gVXNlZCBmb3IgVFJBTlNGRVJfQ0FMTEJBQ0sgbW9kZS4KKyAgICAgICAgLy8gUGFyYW1ldGVyczoKKyAgICAgICAgLy8gIC0gYnVmZmVyIDogQnVmZmVyIHRvIHJlYWQgZnJvbQorICAgICAgICAvLyBSZXR1cm5zOgorICAgICAgICAvLyAgLSBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgY29uc3VtZWQuCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IG9uTW9yZURhdGEoW1ttYXliZV91bnVzZWRdXSBjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBidWZmZXIpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgLy8gQSBidWZmZXIgb3ZlcnJ1biBvY2N1cnJlZC4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uT3ZlcnJ1bigpIHt9CisgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIChzZWUgc2V0TWFya2VyUG9zaXRpb24oKSkuCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk1hcmtlcihbW21heWJlX3VudXNlZF1dIHVpbnQzMl90IG1hcmtlclBvc2l0aW9uKSB7fQorICAgICAgICAvLyBSZWNvcmQgaGVhZCBpcyBhdCBhIG5ldyBwb3NpdGlvbiAoc2VlIHNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKCkpLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25OZXdQb3MoW1ttYXliZV91bnVzZWRdXSB1aW50MzJfdCBuZXdQb3MpIHt9CisgICAgICAgIC8vIElBdWRpb1JlY29yZCB3YXMgcmVjcmVhdGVkIGR1ZSB0byByZS1yb3V0aW5nLCBzZXJ2ZXIgaW52YWxpZGF0aW9uIG9yCisgICAgICAgIC8vIHNlcnZlciBjcmFzaC4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTmV3SUF1ZGlvUmVjb3JkKCkge30KKyAgICB9OwogCiAgICAgLyogUmV0dXJucyB0aGUgbWluaW11bSBmcmFtZSBjb3VudCByZXF1aXJlZCBmb3IgdGhlIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YKICAgICAgKiBhbiBBdWRpb1JlY29yZCBvYmplY3QuCkBAIC0xODIsMjAgKzIwOCwzNyBAQAogICAgICAqIHBBdHRyaWJ1dGVzOiAgICAgICAgSWYgbm90IE5VTEwsIHN1cGVyc2VkZXMgaW5wdXRTb3VyY2UgZm9yIHVzZSBjYXNlIHNlbGVjdGlvbi4KICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIE5vdCBwcmVzZW50IGluIHBhcmFtZXRlciBsaXN0LCBhbmQgc28gaXMgZml4ZWQgYXQgZmFsc2UuCiAgICAgICovCi0KICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9SZWNvcmRDYWxsYmFjaz4gJmNhbGxiYWNrID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCkBAIC0yMjMsMTMgKzI2NiwxMiBAQAogICAgICAqCiAgICAgICogdGhyZWFkQ2FuQ2FsbEphdmE6ICBXaGV0aGVyIGNhbGxiYWNrcyBhcmUgbWFkZSBmcm9tIGFuIGF0dGFjaGVkIHRocmVhZCBhbmQgdGh1cyBjYW4gY2FsbCBKTkkuCiAgICAgICovCi0gICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiAmY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLApAQCAtMjM3LDcgKzI3OSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSAwKTsKKworICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELApAQCAtMjY0LDYgKzMyNyw3IEBACiAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgIHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZVNpemUoKSBjb25zdCAgIHsgcmV0dXJuIG1GcmFtZVNpemU7IH0KICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCkgY29uc3QgIHsgcmV0dXJuIG1BdHRyaWJ1dGVzLnNvdXJjZTsgfQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KIAogICAgIC8qCiAgICAgICogUmV0dXJuIHRoZSBwZXJpb2Qgb2YgdGhlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayBpbiBmcmFtZXMuCkBAIC02NzIsOSArNzM2LDExIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZTsKIAogICAgIC8vIGZvciBjbGllbnQgY2FsbGJhY2sgaGFuZGxlcgotICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsKIAorICAgIHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+IG1MZWdhY3lDYWxsYmFja1dyYXBwZXI7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsgICAvLyBQcm90ZWN0IGFnYWluc3QgZG91YmxlIHNldAogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjawpAQCAtNzU5LDYgKzgyNSwxMyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZCA9IGZhbHNlOyAvLyByZWR1Y2UgbG9nIHNwYW0KICAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wUmV0cm9ncmFkZVRpbWVSZXBvcnRlZCA9IGZhbHNlOyAgICAgLy8gcmVkdWNlIGxvZyBzcGFtCiAKKyAgICAvLyBGb3JtYXQgY29udmVyc2lvbi4gTWF5YmUgbmVlZGVkIGZvciBhZGRpbmcgZmFzdCB0cmFja3Mgd2hvc2UgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHNlcnZlci4KKyAgICBhdWRpb19jb25maWdfYmFzZV90ICAgICBtU2VydmVyQ29uZmlnOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1TZXJ2ZXJGcmFtZVNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVNlcnZlclNhbXBsZVNpemU7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUZvcm1hdENvbnZlcnNpb25CdWZSYXc7CisgICAgQnVmZmVyICAgICAgICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXI7CisKIHByaXZhdGU6CiAgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgpAQCAtODIzLDYgKzg5Niw4IEBACiAgICAgTWVkaWFNZXRyaWNzIG1NZWRpYU1ldHJpY3M7CiAgICAgc3RkOjpzdHJpbmcgbU1ldHJpY3NJZDsgIC8vIEdVQVJERURfQlkobUxvY2spLCBjb3VsZCBjaGFuZ2UgaW4gY3JlYXRlUmVjb3JkX2woKS4KICAgICBzdGQ6OnN0cmluZyBtQ2FsbGVyTmFtZTsgLy8gZm9yIGV4YW1wbGUgImFhdWRpbyIKKworICAgIHZvaWQgcmVwb3J0RXJyb3Ioc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyICpldmVudCwgY29uc3QgY2hhciAqbWVzc2FnZSkgY29uc3Q7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDhiYTIzYWQuLjM2MGI4M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE5LDI0ICsxOSwzMSBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVmlicmF0b3JJbmZvLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgotI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCkBAIC03MCw2ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiB0eXBlZGVmIHZvaWQgKCpyb3V0aW5nX2NhbGxiYWNrKSgpOwordHlwZWRlZiB2b2lkICgqdm9sX3JhbmdlX2luaXRfcmVxX2NhbGxiYWNrKSgpOwogCiBjbGFzcyBJQXVkaW9GbGluZ2VyOwogY2xhc3MgU3RyaW5nODsKQEAgLTE0Nyw2ICsxNTUsNyBAQAogICAgIHN0YXRpYyB2b2lkIHNldER5blBvbGljeUNhbGxiYWNrKGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGNiKTsKICAgICBzdGF0aWMgdm9pZCBzZXRSZWNvcmRDb25maWdDYWxsYmFjayhyZWNvcmRfY29uZmlnX2NhbGxiYWNrKTsKICAgICBzdGF0aWMgdm9pZCBzZXRSb3V0aW5nQ2FsbGJhY2socm91dGluZ19jYWxsYmFjayBjYik7CisgICAgc3RhdGljIHZvaWQgc2V0Vm9sSW5pdFJlcUNhbGxiYWNrKHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBjYik7CiAKICAgICAvLyBTZXRzIHRoZSBiaW5kZXIgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIEF1ZGlvRmxpbmdlciBzZXJ2aWNlLiBUaGlzIGVuYWJsZXMgdGhlIHN5c3RlbSBzZXJ2ZXIKICAgICAvLyB0byBncmFudCBzcGVjaWZpYyBpc29sYXRlZCBwcm9jZXNzZXMgYWNjZXNzIHRvIHRoZSBhdWRpbyBzeXN0ZW0uIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZQpAQCAtMjI1LDYgKzIzNCw5IEBACiAgICAgLy8gSW5kaWNhdGUgSkFWQSBzZXJ2aWNlcyBhcmUgcmVhZHkgKHNjaGVkdWxpbmcsIHBvd2VyIG1hbmFnZW1lbnQgLi4uKQogICAgIHN0YXRpYyBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpOwogCisgICAgLy8gSW5kaWNhdGUgYXVkaW8gcG9saWN5IHNlcnZpY2UgaXMgcmVhZHkKKyAgICBzdGF0aWMgc3RhdHVzX3QgYXVkaW9Qb2xpY3lSZWFkeSgpOworCiAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgYXVkaW8gSEFMIGJ1ZmZlci4KICAgICAvLyBDb3JyZXNwb25kcyB0byBhdWRpb19zdHJlYW0tPmdldF9idWZmZXJfc2l6ZSgpL2F1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKCkgZm9yIGlucHV0LgogICAgIC8vIFNlZSBhbHNvIGdldEZyYW1lQ291bnQoKS4KQEAgLTI1NCw4ICsyNjYsOCBAQAogICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCiAgICAgLy8KICAgICBzdGF0aWMgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwpAQCAtMjc2LDcgKzI4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CkBAIC0zMTgsOSArMzMxLDkgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCk7CiAKICAgICBzdGF0aWMgcHJvZHVjdF9zdHJhdGVneV90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JWb2x1bWUpOwogCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKQEAgLTMzNyw2ICszNTAsNyBAQAogICAgIHN0YXRpYyB2b2lkIGNsZWFyQXVkaW9Db25maWdDYWNoZSgpOwogCiAgICAgc3RhdGljIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBzdGF0aWMgdm9pZCBjbGVhckF1ZGlvUG9saWN5U2VydmljZSgpOwogCiAgICAgLy8gaGVscGVycyBmb3IgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuZ2V0UHJvcGVydHkoKSwgc2VlIGRlc2NyaXB0aW9uIHRoZXJlIGZvciBtZWFuaW5nCiAgICAgc3RhdGljIHVpbnQzMl90IGdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKTsKQEAgLTM2NCw3ICszNzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CiAKLSAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4gT24gaW5wdXQsIHRoZSBwb3J0CisgICAgICogb25seSBuZWVkcyB0aGUgJ2lkJyBmaWVsZCB0byBiZSBmaWxsZWQgaW4uICovCiAgICAgc3RhdGljIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCk7CiAKICAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwpAQCAtNDE1LDggKzQzMCw4IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCiAgICAgLy8gbnVtU3Vycm91bmRGb3JtYXRzIGhvbGRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmb3JtYXRzIGFuZCBib29sIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGFycmF5LgogICAgIC8vIFdoZW4gbnVtU3Vycm91bmRGb3JtYXRzIGlzIDAsIHN1cnJvdW5kRm9ybWF0cyBhbmQgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCB3aWxsIG5vdCBiZQpAQCAtNDI4LDEzICs0NDMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cyk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkX3QgdWlkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisgICAgc3RhdGljIHN0YXR1c190IHNldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIGFjdGl2ZVVpZHMpOworCiAgICAgc3RhdGljIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Q3VycmVudEltZVVpZCh1aWRfdCB1aWQpOwogCiAgICAgc3RhdGljIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKIAorICAgIHN0YXRpYyBib29sICAgICBpc1VsdHJhc291bmRTdXBwb3J0ZWQoKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoCiAgICAgICAgICAgICBjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLCBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSwKQEAgLTQ4NSw4ICs1MDMsNzQgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKIAorCisgICAgLyoqCisgICAgICogSWYgYSBzcGF0aWFsaXplciBzdGFnZSBlZmZlY3QgaXMgcHJlc2VudCBvbiB0aGUgcGxhdGZvcm0sIHRoaXMgd2lsbCByZXR1cm4gYW4KKyAgICAgKiBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlIHRvIGNvbnRyb2wgdGhpcyBmZWF0dXJlLgorICAgICAqIElmIG5vIHNwYXRpYWxpemVyIHN0YWdlIGlzIHByZXNlbnQsIGEgbnVsbCBpbnRlcmZhY2UgaXMgcmV0dXJuZWQuCisgICAgICogVGhlIElOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrIHBhc3NlZCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqIE9ubHkgb25lIElTcGF0aWFsaXplciBpbnRlcmZhY2UgY2FuIGV4aXN0IGF0IGEgZ2l2ZW4gdGltZS4gVGhlIG5hdGl2ZSBhdWRpbyBwb2xpY3kKKyAgICAgKiBzZXJ2aWNlIHdpbGwgcmVqZWN0IHRoZSByZXF1ZXN0IGlmIGFuIGludGVyZmFjZSB3YXMgYWxyZWFkeSBhY3F1aXJlZCBhbmQgcHJldmlvdXMgb3duZXIKKyAgICAgKiBkaWQgbm90IGRpZSBvciBjYWxsIElTcGF0aWFsaXplci5yZWxlYXNlKCkuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIGluOiB0aGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSBzdGF0ZSB1cGRhdGVzIGlmIHRoZSBJU3BhdGlhbGl6ZXIKKyAgICAgKiAgICAgICAgaW50ZXJmYWNlIGlzIGFjcXVpcmVkLgorICAgICAqIEBwYXJhbSBzcGF0aWFsaXplciBvdXQ6IHRoZSBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlIG1hZGUgYXZhaWxhYmxlIHRvIGNvbnRyb2wgdGhlCisgICAgICogICAgICAgIHBsYXRmb3JtIHNwYXRpYWxpemVyCisgICAgICogQHJldHVybiBOT19FUlJPUiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIERFQURfT0JKRUNULCBOT19JTklULCBQRVJNSVNTSU9OX0RFTklFRCwgQkFEX1ZBTFVFCisgICAgICogICAgICAgICBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTcGF0aWFsaXplcihjb25zdCBzcDxtZWRpYTo6SU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxtZWRpYTo6SVNwYXRpYWxpemVyPiogc3BhdGlhbGl6ZXIpOworCisgICAgLyoqCisgICAgICogUXVlcmllcyBpZiBzb21lIGtpbmQgb2Ygc3BhdGlhbGl6YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgaWYgdGhlIGF1ZGlvIHBsYXliYWNrIGNvbnRleHQKKyAgICAgKiBkZXNjcmliZWQgYnkgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBpcyBwcmVzZW50LgorICAgICAqIFRoZSBjb250ZXh0IGlzIG1hZGUgb2Y6CisgICAgICogLSBUaGUgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZS4KKyAgICAgKiAtIFRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsaW5nIHJhdGUgLi4uCisgICAgICogLSBUaGUgZGV2aWNlcyBkZXNjcmliaW5nIHRoZSBzaW5rIGF1ZGlvIGRldmljZSBzZWxlY3RlZCBmb3IgcGxheWJhY2suCisgICAgICogQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwgYW5kIG9ubHkgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIHN1cHBvcnRlZCBjcml0ZXJpYS4gRm9yIGluc3RhbmNlLCBzdXBwbHlpbmcgbm8gYXJndW1lbnQgd2lsbCB0ZWxsIGlmIHNwYXRpYWxpemF0aW9uIGlzCisgICAgICogc3VwcG9ydGVkIG9yIG5vdCBpbiBnZW5lcmFsLgorICAgICAqIEBwYXJhbSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgcGxheWJhY2sgdXNlIGNhc2UKKyAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxpbmcgcmF0ZS4uLgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBzaW5rIGF1ZGlvIGRldmljZSBzZWxlY3RlZCBmb3IgcGxheWJhY2sKKyAgICAgKiBAcGFyYW0gY2FuQmVTcGF0aWFsaXplZCBvdXQ6IHRydWUgaWYgc3BhdGlhbGl6YXRpb24gaXMgZW5hYmxlZCBmb3IgdGhpcyBjb250ZXh0LAorICAgICAqICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGluIGNhc2Ugb2Ygc3VjY2VzcywgREVBRF9PQkpFQ1QsIE5PX0lOSVQsIEJBRF9WQUxVRQorICAgICAqICAgICAgICAgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgY2FuQmVTcGF0aWFsaXplZChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmNhbkJlU3BhdGlhbGl6ZWQpOworCisgICAgLyoqCisgICAgICogUXVlcnkgaG93IHRoZSBkaXJlY3QgcGxheWJhY2sgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgcGxheWJhY2sgdXNlIGNhc2UKKyAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwbGF5YmFjaworICAgICAqIEBwYXJhbSBkaXJlY3RNb2RlIG91dDogYSBzZXQgb2YgZmxhZ3MgZGVzY3JpYmluZyBob3cgdGhlIGRpcmVjdCBwbGF5YmFjayBpcyBjdXJyZW50bHkKKyAgICAgKiAgICAgICAgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGluIGNhc2Ugb2Ygc3VjY2VzcywgREVBRF9PQkpFQ1QsIE5PX0lOSVQsIEJBRF9WQUxVRSwgUEVSTUlTU0lPTl9ERU5JRUQKKyAgICAgKiAgICAgICAgIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGdldERpcmVjdFBsYXliYWNrU3VwcG9ydChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGlyZWN0X21vZGVfdCAqZGlyZWN0TW9kZSk7CisKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHdoaWNoIGRpcmVjdCBhdWRpbyBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQorICAgICAqIEBwYXJhbSBhdWRpb1Byb2ZpbGVzIG91dDogYSB2ZWN0b3Igb2YgYXVkaW8gcHJvZmlsZXMKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGluIGNhc2Ugb2Ygc3VjY2VzcywgREVBRF9PQkpFQ1QsIE5PX0lOSVQsIEJBRF9WQUxVRSwgUEVSTUlTU0lPTl9ERU5JRUQKKyAgICAgKiAgICAgICAgIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3Byb2ZpbGU+KiBhdWRpb1Byb2ZpbGVzKTsKKwogICAgIC8vIEEgbGlzdGVuZXIgZm9yIGNhcHR1cmUgc3RhdGUgY2hhbmdlcy4KLSAgICBjbGFzcyBDYXB0dXJlU3RhdGVMaXN0ZW5lciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBDYXB0dXJlU3RhdGVMaXN0ZW5lciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGNhcHR1cmUgc3RhdGUgY2hhbmdlcy4KICAgICAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2VkKGJvb2wgYWN0aXZlKSA9IDA7CkBAIC00OTcsMTEgKzU4MSwxMSBAQAogICAgICAgICB2aXJ0dWFsIH5DYXB0dXJlU3RhdGVMaXN0ZW5lcigpID0gZGVmYXVsdDsKICAgICB9OwogCi0gICAgLy8gUmVnaXNldGVycyBhIGxpc3RlbmVyIGZvciBzb3VuZCB0cmlnZ2VyIGNhcHR1cmUgc3RhdGUgY2hhbmdlcy4KKyAgICAvLyBSZWdpc3RlcnMgYSBsaXN0ZW5lciBmb3Igc291bmQgdHJpZ2dlciBjYXB0dXJlIHN0YXRlIGNoYW5nZXMuCiAgICAgLy8gVGhlcmUgbWF5IG9ubHkgYmUgb25lIHN1Y2ggbGlzdGVuZXIgcmVnaXN0ZXJlZCBhdCBhbnkgcG9pbnQuCi0gICAgLy8gVGhlIGxpc3RlbmVyIG9uU3RhdGVDaGFuZ2VkKCkgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBzeWNocm9ub3VzbHkgZnJvbQorICAgIC8vIFRoZSBsaXN0ZW5lciBvblN0YXRlQ2hhbmdlZCgpIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgc3luY2hyb25vdXNseSBmcm9tCiAgICAgLy8gdGhpcyBjYWxsIHdpdGggdGhlIGluaXRpYWwgdmFsdWUuCi0gICAgLy8gVGhlIGxpc3RlbmVyIG9uU2VydmljZURpZWQoKSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHN5Y2hyb25vdXNseSBmcm9tCisgICAgLy8gVGhlIGxpc3RlbmVyIG9uU2VydmljZURpZWQoKSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgZnJvbQogICAgIC8vIHRoaXMgY2FsbCBpZiBpbml0aWFsIGF0dGVtcHQgdG8gcmVnaXN0ZXIgZmFpbGVkLgogICAgIC8vIElmIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSBjYW5ub3QgYmUgcmVhY2hlZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KICAgICAvLyBQRVJNSVNTSU9OX0RFTklFRCBhbmQgd2lsbCBub3QgaW52b2tlIHRoZSBjYWxsYmFjaywgb3RoZXJ3aXNlLCBpdCB3aWxsCkBAIC01MTEsNyArNTk1LDcgQEAKIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIGNsYXNzIEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgY2xhc3MgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogICAgIHsKICAgICBwdWJsaWM6CiAKQEAgLTUyNiw3ICs2MTAsNyBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOwogCi0gICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQorICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogICAgIHsKICAgICBwdWJsaWM6CiAKQEAgLTU0Miw3ICs2MjYsNyBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKLSAgICBjbGFzcyBBdWRpb0RldmljZUNhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICBjbGFzcyBBdWRpb0RldmljZUNhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogICAgIHsKICAgICBwdWJsaWM6CiAKQEAgLTU2NCw2ICs2NDgsMTQgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWaWJyYXRvckluZm9zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4mIHZpYnJhdG9ySW5mb3MpOwogCisgICAgc3RhdGljIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvKAorICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpOworCisgICAgc3RhdGljIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7CisKKyAgICBzdGF0aWMgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworCiBwcml2YXRlOgogCiAgICAgY2xhc3MgQXVkaW9GbGluZ2VyQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsIHB1YmxpYyBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJDbGllbnQKQEAgLTY0MCwxMyArNzMyLDE0IEBACiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKICAgICAgICAgICAgICAgICBpbnQzMl90IGV2ZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpSZWNvcmRDbGllbnRJbmZvJiBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlJiBjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+JiBjbGllbnRFZmZlY3RzLAotICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlJiBkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+JiBlZmZlY3RzLAogICAgICAgICAgICAgICAgIGludDMyX3QgcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2UpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZSBzb3VyY2UpIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJvdXRpbmdVcGRhdGVkKCk7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CkBAIC02NzQsNiArNzY3LDcgQEAKICAgICBzdGF0aWMgZHluYW1pY19wb2xpY3lfY2FsbGJhY2sgZ0R5blBvbGljeUNhbGxiYWNrOwogICAgIHN0YXRpYyByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGdSZWNvcmRDb25maWdDYWxsYmFjazsKICAgICBzdGF0aWMgcm91dGluZ19jYWxsYmFjayBnUm91dGluZ0NhbGxiYWNrOworICAgIHN0YXRpYyB2b2xfcmFuZ2VfaW5pdF9yZXFfY2FsbGJhY2sgZ1ZvbFJhbmdlSW5pdFJlcUNhbGxiYWNrOwogCiAgICAgc3RhdGljIHNpemVfdCBnSW5CdWZmU2l6ZTsKICAgICAvLyBwcmV2aW91cyBwYXJhbWV0ZXJzIGZvciByZWNvcmRpbmcgYnVmZmVyIHNpemUgcXVlcmllcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCBjYjAwOTkwLi45ZjU0MGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogCisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQm5BdWRpb1RyYWNrQ2FsbGJhY2suaCIKQEAgLTk0LDM0ICs5NSwzNiBAQAogCiAgICAgY2xhc3MgQnVmZmVyCiAgICAgeworICAgIGZyaWVuZCBBdWRpb1RyYWNrOwogICAgIHB1YmxpYzoKLSAgICAgICAgLy8gRklYTUUgdXNlIG0gcHJlZml4CisgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgICAgIHNpemVfdCBnZXRGcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gZnJhbWVDb3VudDsgfQorICAgICAgIHVpbnQ4X3QgKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gdWk4OyB9CisgICAgICAgLy8gTGVhdmluZyBwdWJsaWMgZm9yIG5vdyB0byBlYXNlIHJlZmFjdG9yaW5nLiBUaGlzIGNsYXNzIHdpbGwgYmUKKyAgICAgICAvLyByZXBsYWNlZAogICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50OyAgIC8vIG51bWJlciBvZiBzYW1wbGUgZnJhbWVzIGNvcnJlc3BvbmRpbmcgdG8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBkZXNpcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBmcm9tIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgW2VtcHR5IHNsb3RzIGZvcl0gZnJhbWVzIHRvIGJlIGZpbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIHJlbGVhc2VCdWZmZXIoKSBpdCBpcyBjdXJyZW50bHkgaWdub3JlZAotCi0gICAgICAgIHNpemVfdCAgICAgIHNpemU7ICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKKyAgICBwcml2YXRlOgorICAgICAgICBzaXplX3QgICAgICBtU2l6ZTsgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCkgaXQgaXMgaWdub3JlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBmcm9tIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgW2VtcHR5IHNsb3RzIGZvcl0gYnl0ZXMgdG8gYmUgZmlsbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdoaWNoIGlzIGZyYW1lQ291bnQgKiBmcmFtZVNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byByZWxlYXNlQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIHJlc3BlY3QgdG8gZnJhbWVDb3VudC4gIENvbnNpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVtb3Zpbmcgc2l6ZSBhbmQgbWFraW5nIGZyYW1lQ291bnQgdGhlIHByaW1hcnkgZmllbGQuCiAKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwogICAgICAgICAgICAgaW50MTZfdCogICAgaTE2OyAgICAgIC8vIHNpZ25lZCAxNi1iaXQKLSAgICAgICAgICAgIGludDhfdCogICAgIGk4OyAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKKyAgICAgICAgICAgIHVpbnQ4X3QqICAgIHVpODsgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKTogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAKICAgICAgICAgdWludDMyX3QgICAgc2VxdWVuY2U7ICAgICAgIC8vIElBdWRpb1RyYWNrIGluc3RhbmNlIHNlcXVlbmNlIG51bWJlciwgYXMgb2Ygb2J0YWluQnVmZmVyKCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBzZXQgYnkgb2J0YWluQnVmZmVyKCkgYW5kIGNvbmZpcm1lZCBieSByZWxlYXNlQnVmZmVyKCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgInVzZXItc2VydmljZWFibGUiLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBDb25zaWRlciBzcDxJTWVtb3J5PiBpbnN0ZWFkLCBvciBpbiBhZGRpdGlvbiB0byB0aGlzLgogICAgIH07CiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCkBAIC0xNDUsNyArMTQ4LDc5IEBACiAgICAgICogICAgICAgICAgLSBFVkVOVF9ORVdfVElNRVNUQU1QOiBwb2ludGVyIHRvIGNvbnN0IEF1ZGlvVGltZXN0YW1wLgogICAgICAqLwogCi0gICAgdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpsZWdhY3lfY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkKiBpbmZvKTsKKyAgICBjbGFzcyBJQXVkaW9UcmFja0NhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgICBmcmllbmQgQXVkaW9UcmFjazsKKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAvKiBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgICogVGhpcyBldmVudCBvbmx5IG9jY3VycyBmb3IgVFJBTlNGRVJfQ0FMTEJBQ0suCisgICAgICAgICogSWYgdGhpcyBldmVudCBpcyBkZWxpdmVyZWQgYnV0IHRoZSBjYWxsYmFjayBoYW5kbGVyIGRvZXMgbm90IHdhbnQgdG8gd3JpdGUgbW9yZSBkYXRhLAorICAgICAgICAqIHRoZSBoYW5kbGVyIG11c3QgaWdub3JlIHRoZSBldmVudCBieSByZXR1cm5pbmcgemVyby4KKyAgICAgICAgKiBUaGlzIG1pZ2h0IG9jY3VyLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHdhaXRpbmcgZm9yIHNvdXJjZSBkYXRhIG9yIGlzIGF0CisgICAgICAgICogdGhlIGVuZCBvZiBzdHJlYW0uCisgICAgICAgICogRm9yIGRhdGEgZmlsbGluZywgaXQgaXMgcHJlZmVycmVkIHRoYXQgdGhlIGNhbGxiYWNrIGRvZXMgbm90IGJsb2NrIGFuZCBpbnN0ZWFkIHJldHVybnMKKyAgICAgICAgKiBhIHNob3J0IGNvdW50IG9mIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSBkZWxpdmVyZWQuCisgICAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICAgKiAgLSBidWZmZXI6IEJ1ZmZlciB0byBmaWxsCisgICAgICAgICogUmV0dXJuczoKKyAgICAgICAgKiBBbW91bnQgb2YgZGF0YSBhY3R1YWxseSB3cml0dGVuIGluIGJ5dGVzLgorICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBvbk1vcmVEYXRhKFtbbWF5YmVfdW51c2VkXV0gY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyJiBidWZmZXIpIHsgcmV0dXJuIDA7IH0KKworICAgICAgICAvLyBCdWZmZXIgdW5kZXJydW4gb2NjdXJyZWQuIFRoaXMgd2lsbCBub3Qgb2NjdXIgZm9yIHN0YXRpYyB0cmFja3MuCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblVuZGVycnVuKCkge30KKworICAgICAgIC8qIFNhbXBsZSBsb29wIGVuZCB3YXMgcmVhY2hlZDsgcGxheWJhY2sgcmVzdGFydGVkIGZyb20gbG9vcCBzdGFydCBpZiBsb29wIGNvdW50IHdhcyBub3QgMAorICAgICAgICAqIGZvciBhIHN0YXRpYyB0cmFjay4KKyAgICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgICAqICAtIGxvb3BzUmVtYWluaW5nOiBOdW1iZXIgb2YgbG9vcHMgcmVtYWluaW5nIHRvIGJlIHBsYXllZC4gLTEgaWYgaW5maW5pdGUgbG9vcGluZy4KKyAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTG9vcEVuZChbW21heWJlX3VudXNlZF1dIGludDMyX3QgbG9vcHNSZW1haW5pbmcpIHt9CisKKyAgICAgICAvKiBQbGF5YmFjayBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIChTZWUgc2V0TWFya2VyUG9zaXRpb24oKSkuCisgICAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICAgKiAgLSBvbk1hcmtlcjogTWFya2VyIHBvc2l0aW9uIGluIGZyYW1lcworICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25NYXJrZXIoW1ttYXliZV91bnVzZWRdXSB1aW50MzJfdCBtYXJrZXJQb3NpdGlvbikge30KKworICAgICAgIC8qIFBsYXliYWNrIGhlYWQgaXMgYXQgYSBuZXcgcG9zaXRpb24gKFNlZSBzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCgpKS4KKyAgICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgICAqICAtIG5ld1BvczogTmV3IHBvc2l0aW9uIGluIGZyYW1lcworICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25OZXdQb3MoW1ttYXliZV91bnVzZWRdXSB1aW50MzJfdCBuZXdQb3MpIHt9CisKKyAgICAgICAgLy8gUGxheWJhY2sgaGFzIGNvbXBsZXRlZCBmb3IgYSBzdGF0aWMgdHJhY2suCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckVuZCgpIHt9CisKKyAgICAgICAgLy8gSUF1ZGlvVHJhY2sgd2FzIHJlLWNyZWF0ZWQsIGVpdGhlciBkdWUgdG8gcmUtcm91dGluZyBhbmQgdm9sdW50YXJ5IGludmFsaWRhdGlvbgorICAgICAgICAvLyBieSBtZWRpYXNlcnZlciwgb3IgbWVkaWFzZXJ2ZXIgY3Jhc2guCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld0lBdWRpb1RyYWNrKCkge30KKworICAgICAgICAvLyBTZW50IGFmdGVyIGFsbCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gQUYgYW5kIEhXIGFyZSBwbGF5ZWQgYmFjayAoYWZ0ZXIgc3RvcCBpcyBjYWxsZWQpCisgICAgICAgIC8vIGZvciBhbiBvZmZsb2FkZWQgdHJhY2suCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblN0cmVhbUVuZCgpIHt9CisKKyAgICAgICAvKiBEZWxpdmVyZWQgcGVyaW9kaWNhbGx5IGFuZCB3aGVuIHRoZXJlJ3MgYSBzaWduaWZpY2FudCBjaGFuZ2UKKyAgICAgICAgKiBpbiB0aGUgbWFwcGluZyBmcm9tIGZyYW1lIHBvc2l0aW9uIHRvIHByZXNlbnRhdGlvbiB0aW1lLgorICAgICAgICAqIFNlZSBBdWRpb1RpbWVzdGFtcCBmb3IgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIHdpdGggZXZlbnQuCisgICAgICAgICogVE9ETyBub3QgeWV0IGltcGxlbWVudGVkLgorICAgICAgICAqIFBhcmFtZXRlcnM6CisgICAgICAgICogIC0gdGltZXN0YW1wOiBOZXcgZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lIG1hcHBpbmcuCisgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld1RpbWVzdGFtcChbW21heWJlX3VudXNlZF1dIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcCkge30KKworICAgICAgIC8qIE5vdGlmaWNhdGlvbiB0aGF0IG1vcmUgZGF0YSBjYW4gYmUgZ2l2ZW4gYnkgd3JpdGUoKQorICAgICAgICAqIFRoaXMgZXZlbnQgb25seSBvY2N1cnMgZm9yIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0suCisgICAgICAgICogU2ltaWxhciB0byBvbk1vcmVEYXRhKCksIHJldHVybiB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSB3cml0dGVuCisgICAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICAgKiAgLSBidWZmZXI6IEJ1ZmZlciB0byBmaWxsCisgICAgICAgICogUmV0dXJuczoKKyAgICAgICAgKiBBbW91bnQgb2YgZGF0YSBhY3R1YWxseSB3cml0dGVuIGluIGJ5dGVzLgorICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBvbkNhbldyaXRlTW9yZURhdGEoW1ttYXliZV91bnVzZWRdXSBjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OwogCiAgICAgLyogUmV0dXJucyB0aGUgbWluaW11bSBmcmFtZSBjb3VudCByZXF1aXJlZCBmb3IgdGhlIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YKICAgICAgKiBhbiBBdWRpb1RyYWNrIG9iamVjdC4KQEAgLTI1NiwxNSArMzMxLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKQEAgLTI4MCwyMiArMzc0LDM5IEBACiAgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gcGFzcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIG5vdGlmaWVkIG9mIHBsYXliYWNrIGVuZCBieSBhbgogICAgICAqIEVWRU5UX1VOREVSUlVOIGV2ZW50LgogICAgICAqLwotCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOwogCkBAIC0zMzMsMjAgKzQ0NCw3MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworCisgICAgICAgICAgICBzdHJ1Y3QgU2V0UGFyYW1zIHsKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CisgICAgICAgICAgICAgICAgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyOworICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmE7CisgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGRvbid0IHRha2UgcG9pbnRlcnMgaGVyZQorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdDsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkOworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgICAgIH07CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvLyBOb3RlOiBDb25zdW1lcyBwYXJhbWV0ZXJzCisgICAgICAgICAgICB2b2lkICAgICAgICBzZXQoU2V0UGFyYW1zJiBzKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpc2V0KHMuc3RyZWFtVHlwZSwgcy5zYW1wbGVSYXRlLCBzLmZvcm1hdCwgcy5jaGFubmVsTWFzaywgcy5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsYWdzLCBzdGQ6Om1vdmUocy5jYWxsYmFjayksIHMubm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocy5zaGFyZWRCdWZmZXIpLCBzLnRocmVhZENhbkNhbGxKYXZhLCBzLnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy50cmFuc2ZlclR5cGUsIHMub2ZmbG9hZEluZm8sIHN0ZDo6bW92ZShzLmF0dHJpYnV0aW9uU291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wQXR0cmlidXRlcywgcy5kb05vdFJlY29ubmVjdCwgcy5tYXhSZXF1aXJlZFNwZWVkLCBzLnNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCAgICAgICBvbkZpcnN0UmVmKCkgb3ZlcnJpZGU7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKwogICAgIC8vIEZJWE1FKGIvMTY5ODg5NzE0KTogVmVuZG9yIGNvZGUgZGVwZW5kcyBvbiB0aGUgb2xkIG1ldGhvZCBzaWduYXR1cmUgYXQgbGluayB0aW1lCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCkBAIC0zNTQsMTcgKzUxOCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwpAQCAtNDAxLDYgKzU2NSw3IEBACiAKICAgICAgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CiAKICAgICAvKgogICAgICAqIFJldHVybiB0aGUgcGVyaW9kIG9mIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sgaW4gZnJhbWVzLgpAQCAtNDI3LDggKzU5Miw3IEBACiAgICAgICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkuCiAgICAgICogSXQgbWF5IGFsc28gYmUgYWRqdXN0ZWQgc2xpZ2h0bHkgZm9yIGludGVybmFsIHJlYXNvbnMuCiAgICAgICoKLSAgICAgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb3IgYSBuZWdhdGl2ZSBlcnJvciBpZiB0aGUgdHJhY2sgaXMgdW5pdGlhbGl6ZWQKLSAgICAgKiBvciBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhYmxlIHNpemVzLgorICAgICAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvciBhIG5lZ2F0aXZlIHZhbHVlIChOT19JTklUKSBpZiB0aGUgdHJhY2sgaXMgdW5pbml0aWFsaXplZC4KICAgICAgKi8KICAgICAgICAgICAgIHNzaXplX3QgICAgIHNldEJ1ZmZlclNpemVJbkZyYW1lcyhzaXplX3Qgc2l6ZSk7CiAKQEAgLTUxMCw2ICs2NzQsMTQgQEAKICAgICAgKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHBhdXNlKCk7CiAKKyAgICAvKiBQYXVzZSBhbmQgd2FpdCAod2l0aCB0aW1lb3V0KSBmb3IgdGhlIGF1ZGlvIHRyYWNrIHRvIHJhbXAgdG8gc2lsZW5jZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0aW1lb3V0IGlzIHRoZSB0aW1lIGxpbWl0IHRvIHdhaXQgYmVmb3JlIHJldHVybmluZy4KKyAgICAgKiAgICAgICAgICAgICAgICBBIG5lZ2F0aXZlIG51bWJlciBpcyB0cmVhdGVkIGFzIDAuCisgICAgICogXHJldHVybiB0cnVlIGlmIHRoZSB0cmFjayBpcyByYW1wZWQgdG8gc2lsZW5jZSwgZmFsc2UgaWYgdGhlIHRpbWVvdXQgb2NjdXJyZWQuCisgICAgICovCisgICAgICAgICAgICBib29sICAgICAgICBwYXVzZUFuZFdhaXQoY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyYgdGltZW91dCk7CisKICAgICAvKiBTZXQgdm9sdW1lIGZvciB0aGlzIHRyYWNrLCBtb3N0bHkgdXNlZCBmb3IgZ2FtZXMnIHNvdW5kIGVmZmVjdHMKICAgICAgKiBsZWZ0IGFuZCByaWdodCB2b2x1bWVzLiBMZXZlbHMgbXVzdCBiZSA+PSAwLjAgYW5kIDw9IDEuMC4KICAgICAgKiBUaGlzIGlzIHRoZSBvbGRlciBBUEkuICBOZXcgYXBwbGljYXRpb25zIHNob3VsZCB1c2Ugc2V0Vm9sdW1lKGZsb2F0KSB3aGVuIHBvc3NpYmxlLgpAQCAtMTE3Miw3ICsxMzQ0LDYgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCAgICBtT2ZmbG9hZEluZm9Db3B5OwotICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CiAgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHJpYnV0ZXM7CiAKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOyAgICAgICAgICAgICAvLyBmcmFtZSBzaXplIGluIGJ5dGVzCkBAIC0xMjA2LDExICsxMzc3LDEzIEBACiAgICAgfQogCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCi0gICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGFuZGxlciBmb3IgZXZlbnRzLCBvciBOVUxMCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwotCisgICAgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4gbUNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKKyAgICBzcDxJQXVkaW9UcmFja0NhbGxiYWNrPiBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyOyAgICAgIC8vIHdyYXBwZXIgZm9yIGxlZ2FjeSBjYWxsYmFjayBpbnRlcmZhY2UKICAgICAvLyBmb3Igbm90aWZpY2F0aW9uIEFQSXMKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2V0UGFyYW1zPiBtU2V0UGFyYW1zOyAgICAgICAgICAvLyBUZW1wb3JhcnkgY29weSBvZiBjdG9yIHBhcmFtcyB0byBhbGxvdyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlcnJlZCBzZXQgYWZ0ZXIgZmlyc3QgcmVmZXJlbmNlLgogCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7ICAgLy8gU2V0IGFmdGVyIHRyYWNrIGlzIGluaXRpYWxpemVkCiAgICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgY29uc3QgYWZ0ZXIgY29uc3RydWN0b3Igb3Igc2V0KCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOyAvLyByZXF1ZXN0ZWQgbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gY2FsbGJhY2ssCkBAIC0xMzgwLDYgKzE1NTMsOSBAQAogICAgIHN0ZDo6c3RyaW5nIG1NZXRyaWNzSWQ7ICAvLyBHVUFSREVEX0JZKG1Mb2NrKSwgY291bGQgY2hhbmdlIGluIGNyZWF0ZVRyYWNrX2woKS4KICAgICBzdGQ6OnN0cmluZyBtQ2FsbGVyTmFtZTsgLy8gZm9yIGV4YW1wbGUgImFhdWRpbyIKIAorICAgIC8vIHJlcG9ydCBlcnJvciB0byBtZWRpYW1ldHJpY3MuCisgICAgdm9pZCByZXBvcnRFcnJvcihzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV2ZW50LCBjb25zdCBjaGFyICptZXNzYWdlKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBBdWRpb1RyYWNrQ2FsbGJhY2sgOiBwdWJsaWMgbWVkaWE6OkJuQXVkaW9UcmFja0NhbGxiYWNrIHsKICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IDBlMDU5ZjcuLjNjMzcxNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0zNywxMCArMzcsMTIgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVmlicmF0b3JJbmZvLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkF1ZGlvRmxpbmdlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JwQXVkaW9GbGluZ2VyU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeVR5cGUuaD4KICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuaCIKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmgiCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmgiCkBAIC02Myw3ICs2NSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgSUF1ZGlvRmxpbmdlciA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIElBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9TRVJWSUNFX05BTUVbXSA9ICJtZWRpYS5hdWRpb19mbGluZ2VyIjsKIApAQCAtMTY2LDYgKzE2OCw3IEBACiAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgICAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZDsKKyAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXJ2ZXJDb25maWc7CiAKICAgICAgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2U+IHRvQWlkbCgpIGNvbnN0OwogICAgICAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxDcmVhdGVSZWNvcmRPdXRwdXQ+CkBAIC0zMjksNiArMzMyLDkgQEAKICAgICAvKiBJbmRpY2F0ZSBKQVZBIHNlcnZpY2VzIGFyZSByZWFkeSAoc2NoZWR1bGluZywgcG93ZXIgbWFuYWdlbWVudCAuLi4pICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpID0gMDsKIAorICAgIC8vIEluZGljYXRlIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGlzIHJlYWR5CisgICAgdmlydHVhbCBzdGF0dXNfdCBhdWRpb1BvbGljeVJlYWR5KCkgPSAwOworCiAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgYXVkaW8gSEFMIGJ1ZmZlci4KICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50SEFMKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCA9IDA7CiAKQEAgLTM0NCw2ICszNTAsMTYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgPSAwOworCisgICAgdmlydHVhbCBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpID0gMDsKIH07CiAKIC8qKgpAQCAtNDMyLDEyICs0NDgsMjAgQEAKICAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiBjb25maWcpIG92ZXJyaWRlOwogICAgIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBhdWRpb1BvbGljeVJlYWR5KCkgb3ZlcnJpZGU7CisKICAgICBzaXplX3QgZnJhbWVDb3VudEhBTChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogbWljcm9waG9uZXMpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IHNldFZpYnJhdG9ySW5mb3MoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcykgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlclNlcnZpY2U+IG1EZWxlZ2F0ZTsKQEAgLTQ1OCw5ICs0ODIsOSBAQAogICAgICAqIExlZ2FjeSBzZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBiZSB3cmFwcGVkLgogICAgICAqLwogICAgIGNsYXNzIERlbGVnYXRlIDogcHVibGljIElBdWRpb0ZsaW5nZXIgewotICAgIHByb3RlY3RlZDoKICAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI7Ci0KKyAgICBwdWJsaWM6CisgICAgICAgIC8vIGV4cG9zZSB0aGUgVHJhbnNhY3Rpb25Db2RlIGVudW0gZm9yIFRpbWVDaGVjayBwdXJwb3Nlcy4KICAgICAgICAgZW51bSBjbGFzcyBUcmFuc2FjdGlvbkNvZGUgewogICAgICAgICAgICAgQ1JFQVRFX1RSQUNLID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlVHJhY2ssCiAgICAgICAgICAgICBDUkVBVEVfUkVDT1JEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlUmVjb3JkLApAQCAtNTE0LDYgKzUzOCw3IEBACiAgICAgICAgICAgICBTRVRfQVVESU9fUE9SVF9DT05GSUcgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRBdWRpb1BvcnRDb25maWcsCiAgICAgICAgICAgICBHRVRfQVVESU9fSFdfU1lOQ19GT1JfU0VTU0lPTiA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbiwKICAgICAgICAgICAgIFNZU1RFTV9SRUFEWSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3N5c3RlbVJlYWR5LAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX1JFQURZID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fYXVkaW9Qb2xpY3lSZWFkeSwKICAgICAgICAgICAgIEZSQU1FX0NPVU5UX0hBTCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2ZyYW1lQ291bnRIQUwsCiAgICAgICAgICAgICBHRVRfTUlDUk9QSE9ORVMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRNaWNyb3Bob25lcywKICAgICAgICAgICAgIFNFVF9NQVNURVJfQkFMQU5DRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1hc3RlckJhbGFuY2UsCkBAIC01MjIsOCArNTQ3LDEzIEBACiAgICAgICAgICAgICBTRVRfQVVESU9fSEFMX1BJRFMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRBdWRpb0hhbFBpZHMsCiAgICAgICAgICAgICBTRVRfVklCUkFUT1JfSU5GT1MgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRWaWJyYXRvckluZm9zLAogICAgICAgICAgICAgVVBEQVRFX1NFQ09OREFSWV9PVVRQVVRTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgIEdFVF9NTUFQX1BPTElDWV9JTkZPUyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldE1tYXBQb2xpY3lJbmZvcywKKyAgICAgICAgICAgIEdFVF9BQVVESU9fTUlYRVJfQlVSU1RfQ09VTlQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQsCisgICAgICAgICAgICBHRVRfQUFVRElPX0hBUkRXQVJFX0JVUlNUX01JTl9VU0VDID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMsCisgICAgICAgICAgICBTRVRfREVWSUNFX0NPTk5FQ1RFRF9TVEFURSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldERldmljZUNvbm5lY3RlZFN0YXRlLAogICAgICAgICB9OwogCisgICAgcHJvdGVjdGVkOgogICAgICAgICAvKioKICAgICAgICAgICogQW5kIG9wdGlvbmFsIGhvb2ssIGNhbGxlZCBvbiBldmVyeSB0cmFuc2FjdGlvbiwgYWxsb3dpbmcgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRvIGJlCiAgICAgICAgICAqIHBlcmZvcm1lZCBiZWZvcmUvYWZ0ZXIgdGhlIHVucGFyY2VsaW5nICBvZnRoZSBkYXRhIGFuZCBkaXNwYXRjaGluZyB0byB0aGUgcmVzcGVjdGl2ZQpAQCAtNTYzLDcgKzU5Myw4IEBACiAgICAgU3RhdHVzIGNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2FtcGxlUmF0ZShpbnQzMl90IGlvSGFuZGxlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBmb3JtYXQoaW50MzJfdCBvdXRwdXQsIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZm9ybWF0KGludDMyX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGZyYW1lQ291bnQoaW50MzJfdCBpb0hhbmRsZSwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgbGF0ZW5jeShpbnQzMl90IG91dHB1dCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKSBvdmVycmlkZTsKQEAgLTU3MiwxMiArNjAzLDEzIEBACiAgICAgU3RhdHVzIG1hc3Rlck11dGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKICAgICBTdGF0dXMgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwgaW50MzJfdCBvdXRwdXQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRTdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSBvdmVycmlkZTsKLSAgICBTdGF0dXMKLSAgICBzdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3Qgb3V0cHV0LCBmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RyZWFtTXV0ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TW9kZShtZWRpYTo6QXVkaW9Nb2RlIG1vZGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRTdHJlYW1Wb2x1bWUobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSwgaW50MzJfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRTdHJlYW1NdXRlKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc3RyZWFtVm9sdW1lKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXQsIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzdHJlYW1NdXRlKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRNb2RlKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGUgbW9kZSkgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHNldE1pY011dGUoYm9vbCBzdGF0ZSkgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGdldE1pY011dGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0UmVjb3JkU2lsZW5jZWQoaW50MzJfdCBwb3J0SWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOwpAQCAtNTg1LDggKzYxNywxMCBAQAogICAgIFN0YXR1cwogICAgIGdldFBhcmFtZXRlcnMoaW50MzJfdCBpb0hhbmRsZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleXMsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyByZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldElucHV0QnVmZmVyU2l6ZShpbnQzMl90IHNhbXBsZVJhdGUsIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRJbnB1dEJ1ZmZlclNpemUoaW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQmIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgb3Blbk91dHB1dChjb25zdCBtZWRpYTo6T3Blbk91dHB1dFJlcXVlc3QmIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgb3BlbkR1cGxpY2F0ZU91dHB1dChpbnQzMl90IG91dHB1dDEsIGludDMyX3Qgb3V0cHV0MiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKQEAgLTU5Niw3ICs2MzAsNyBAQAogICAgIFN0YXR1cyBvcGVuSW5wdXQoY29uc3QgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QmIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGNsb3NlSW5wdXQoaW50MzJfdCBpbnB1dCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGludmFsaWRhdGVTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIG92ZXJyaWRlOworICAgIFN0YXR1cyBpbnZhbGlkYXRlU3RyZWFtKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSBvdmVycmlkZTsKICAgICBTdGF0dXMgZ2V0UmVuZGVyUG9zaXRpb24oaW50MzJfdCBvdXRwdXQsIG1lZGlhOjpSZW5kZXJQb3NpdGlvbiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgZ2V0SW5wdXRGcmFtZXNMb3N0KGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CkBAIC02MDUsNyArNjM5LDggQEAKICAgICBTdGF0dXMgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludDMyX3QgYXVkaW9TZXNzaW9uLCBpbnQzMl90IHBpZCkgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHF1ZXJ5TnVtYmVyRWZmZWN0cyhpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBxdWVyeUVmZmVjdChpbnQzMl90IGluZGV4LCBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBlZmZlY3RVVUlELCBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlVVVJRCwKKyAgICBTdGF0dXMgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkJiBlZmZlY3RVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQmIHR5cGVVVUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGNyZWF0ZUVmZmVjdChjb25zdCBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVxdWVzdCYgcmVxdWVzdCwKQEAgLTYyNCwxMiArNjU5LDE5IEBACiAgICAgU3RhdHVzIHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBjb25maWcpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHN5c3RlbVJlYWR5KCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGF1ZGlvUG9saWN5UmVhZHkoKSBvdmVycmlkZTsKICAgICBTdGF0dXMgZnJhbWVDb3VudEhBTChpbnQzMl90IGlvSGFuZGxlLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm9EYXRhPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBwaWRzKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0VmlicmF0b3JJbmZvcyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+JiB2aWJyYXRvckluZm9zKSBvdmVycmlkZTsKICAgICBTdGF0dXMgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpUcmFja1NlY29uZGFyeU91dHB1dEluZm8+JiB0cmFja1NlY29uZGFyeU91dHB1dEluZm9zKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvPiAqX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldERldmljZUNvbm5lY3RlZFN0YXRlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnQsIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpEZWxlZ2F0ZT4gbURlbGVnYXRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oCmluZGV4IDg3M2YyN2EuLjU0ZTc3OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmgKQEAgLTIzLDEwICsyMyw4IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peENhbGxiYWNrRmxhZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4Um91dGVGbGFnLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peFR5cGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkTW9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lGb3JjZVVzZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lGb3JjZWRDb25maWcuaD4KQEAgLTM5LDExICszNyw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQ29udmVyc2lvblJlc3VsdDx2b2x1bWVfZ3JvdXBfdD4KLWFpZGwybGVnYWN5X2ludDMyX3Rfdm9sdW1lX2dyb3VwX3QoaW50MzJfdCBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KLWxlZ2FjeTJhaWRsX3ZvbHVtZV9ncm91cF90X2ludDMyX3Qodm9sdW1lX2dyb3VwX3QgbGVnYWN5KTsKLQogQ29udmVyc2lvblJlc3VsdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+CiBhaWRsMmxlZ2FjeV9pbnQzMl90X3Byb2R1Y3Rfc3RyYXRlZ3lfdChpbnQzMl90IGFpZGwpOwogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaAppbmRleCBhNTc1NjE2Li5kMDBkZmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaApAQCAtMjgsNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIFRvbmVHZW5lcmF0b3IgeworY2xhc3MgVG9uZUdlbmVyYXRvciA6IHB1YmxpYyBBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrIHsKIHB1YmxpYzoKIAogICAgIC8vIExpc3Qgb2YgYWxsIGF2YWlsYWJsZSB0b25lcwpAQCAtMTU2LDYgKzE1Niw5IEBACiAKICAgICBUb25lR2VuZXJhdG9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgZmxvYXQgdm9sdW1lLCBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lID0ge30pOworCisgICAgdm9pZCBvbkZpcnN0UmVmKCkgb3ZlcnJpZGU7CisKICAgICB+VG9uZUdlbmVyYXRvcigpOwogCiAgICAgYm9vbCBzdGFydFRvbmUodG9uZV90eXBlIHRvbmVUeXBlLCBpbnQgZHVyYXRpb25NcyA9IC0xKTsKQEAgLTI4NCwxMSArMjg3LDEwIEBACiAgICAgc3RhdGljIGNvbnN0IFRvbmVEZXNjcmlwdG9yIHNUb25lRGVzY3JpcHRvcnNbXTsKIAogICAgIGJvb2wgbVRocmVhZENhbkNhbGxKYXZhOwotICAgIHVuc2lnbmVkIGludCBtVG90YWxTbXA7ICAvLyBUb3RhbCBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwbGF5ZWQgKGdpdmVzIGN1cnJlbnQgdGltZSkKKyAgICB1aW50NjRfdCBtVG90YWxTbXA7ICAvLyBUb3RhbCBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwbGF5ZWQgKGdpdmVzIGN1cnJlbnQgdGltZSkKKyAgICAvLyBTaW5jZSB0aGVzZSB0eXBlcyBhcmUgMzIgYml0LCB3ZSBtYXkgaGF2ZSBpc3N1ZXMgd2l0aCBhYm9ydGluZyBvbgorICAgIC8vIG92ZXJmbG93IG5vdyB0aGF0IHdlIGhhdmUgaW50ZWdlciBvdmVyZmxvdyBzYW5pdGl6YXRpb24gZW5hYmxlZCBnbG9iYWxseS4KICAgICB1bnNpZ25lZCBpbnQgbU5leHRTZWdTbXA7ICAvLyBQb3NpdGlvbiBvZiBuZXh0IHNlZ21lbnQgdHJhbnNpdGlvbiBleHByZXNzZWQgaW4gc2FtcGxlcwotICAgIC8vIE5PVEU6IGJlY2F1c2UgbVRvdGFsU21wLCBtTmV4dFNlZ1NtcCBhcmUgc3RvcmVkIG9uIDMyIGJpdCwgY3VycmVudCBkZXNpZ24gd2lsbCBvcGVyYXRlIHByb3Blcmx5Ci0gICAgLy8gb25seSBpZiB0b25lIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBhYm91dCAyNyBIb3VycyhANDQxMDBIeiBzYW1wbGluZyByYXRlKS4gSWYgdGhpcyB0aW1lIGlzIGV4Y2VlZGVkLAotICAgIC8vIG5vIGNyYXNoIHdpbGwgb2NjdXIgYnV0IHRvbmUgc2VxdWVuY2Ugd2lsbCBzaG93IGEgZ2xpdGNoLgogICAgIHVuc2lnbmVkIGludCBtTWF4U21wOyAgLy8gTWF4aW11bSBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwbGF5ZWQgKG1heGltdW4gdG9uZSBkdXJhdGlvbikKICAgICBpbnQgbUR1cmF0aW9uTXM7ICAvLyBNYXhpbXVtIHRvbmUgZHVyYXRpb24gaW4gbXMKIApAQCAtMzExLDYgKzMxMyw3IEBACiAgICAgdW5zaWduZWQgaW50IG1Qcm9jZXNzU2l6ZTsgIC8vIFNpemUgb2YgYXVkaW8gYmxvY2tzIGdlbmVyYXRlZCBhdCBhIHRpbWUgYnkgYXVkaW9DYWxsYmFjaygpIChpbiBQQ00gZnJhbWVzKS4KICAgICBzdHJ1Y3QgdGltZXNwZWMgbVN0YXJ0VGltZTsgLy8gdG9uZSBzdGFydCB0aW1lOiBuZWVkZWQgdG8gZ3VhcmFudHkgYWN0dWFsIHRvbmUgZHVyYXRpb24KIAorICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZTsKICAgICBib29sIGluaXRBdWRpb1RyYWNrKCk7CiAgICAgc3RhdGljIHZvaWQgYXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOwogICAgIGJvb2wgcHJlcGFyZVdhdmUoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCmluZGV4IDgwMTI0YjguLmZlODgxMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaApAQCAtMjgsOCArMjgsOCBAQAogICAgIGV4cGxpY2l0IFRyYWNrUGxheWVyQmFzZSgpOwogICAgIHZpcnR1YWwgflRyYWNrUGxheWVyQmFzZSgpOwogCi0gICAgICAgICAgICB2b2lkIGluaXQoQXVkaW9UcmFjayogcGF0LCBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOworICAgIHZvaWQgaW5pdChjb25zdCBzcDxBdWRpb1RyYWNrPiYgcGF0LCBjb25zdCBzcDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgIHBsYXllcl90eXBlX3QgcGxheWVyVHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKIAogICAgIC8vSVBsYXllciBpbXBsZW1lbnRhdGlvbgpAQCAtNjYsOCArNjYsOCBAQAogCiAgICAgLy8gdm9sdW1lIGNvbWluZyBmcm9tIHRoZSBwbGF5ZXIgdm9sdW1lIEFQSQogICAgIGZsb2F0IG1QbGF5ZXJWb2x1bWVMLCBtUGxheWVyVm9sdW1lUjsKLQotICAgc3A8U2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1TZWxmQXVkaW9EZXZpY2VDYWxsYmFjazsKKyAgICBzcDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPiBtQ2FsbGJhY2tIYW5kbGU7CisgICAgc3A8U2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1TZWxmQXVkaW9EZXZpY2VDYWxsYmFjazsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGRlZjdjYTYuLjg5MTI5M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icApAQCAtOSwxMCArOSwzNSBAQAogCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImF1ZGlvX2FpZGxfY29udmVyc2lvbl90ZXN0cyIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbImF1ZGlvX2FpZGxfbGVnYWN5X2NvbnZlcnNpb25fdGVzdHMuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCiB9CiAKIGNjX3Rlc3QgewpAQCAtMzAsOCArNTUsMTAgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAiLAotICAgICAgICAgICAidGVzdF9jcmVhdGVfdXRpbHMuY3BwIl0sCisgICAgc3JjczogWworICAgICAgICAidGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAiLAorICAgICAgICAidGVzdF9jcmVhdGVfdXRpbHMuY3BwIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKQEAgLTQ5LDggKzc2LDEwIEBACiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQiLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAiLAotICAgICAgICAgICAidGVzdF9jcmVhdGVfdXRpbHMuY3BwIl0sCisgICAgc3JjczogWworICAgICAgICAidGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIiwKKyAgICAgICAgInRlc3RfY3JlYXRlX3V0aWxzLmNwcCIsCisgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9hdWRpb19haWRsX2xlZ2FjeV9jb252ZXJzaW9uX3Rlc3RzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL2F1ZGlvX2FpZGxfbGVnYWN5X2NvbnZlcnNpb25fdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2Y2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9hdWRpb19haWRsX2xlZ2FjeV9jb252ZXJzaW9uX3Rlc3RzLmNwcApAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFpZGxfdXRpbHM7CisKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdFR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6UGNtVHlwZTsKKworbmFtZXNwYWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc2l6ZV90IGhhc2goY29uc3QgVCYgdCkgeworICAgIHJldHVybiBzdGQ6Omhhc2g8VD57fSh0KTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX05vbmUoKSB7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dHt9OworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfSW52YWxpZCgpIHsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjppbnZhbGlkPigwKTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX1N0ZXJlbygpIHsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjpsYXlvdXRNYXNrPigKKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6TEFZT1VUX1NURVJFTyk7Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9MYXlvdXRBcmJpdHJhcnkoKSB7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6bGF5b3V0TWFzaz4oCisgICAgICAgICAgICAvLyBVc2UgY2hhbm5lbHMgdGhhdCBleGlzdCBib3RoIGZvciBpbnB1dCBhbmQgb3V0cHV0LAorICAgICAgICAgICAgLy8gYnV0IGRvZXNuJ3QgZm9ybSBhIGtub3duIGxheW91dCBtYXNrLgorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9UT1BfU0lERV9MRUZUIHwKKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9UT1BfU0lERV9SSUdIVCk7Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9DaGFubmVsSW5kZXgyKCkgeworICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmluZGV4TWFzaz4oCisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OklOREVYX01BU0tfMik7Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9DaGFubmVsSW5kZXhBcmJpdHJhcnkoKSB7CisgICAgLy8gVXNlIGNoYW5uZWxzIDEgYW5kIDMuCisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6aW5kZXhNYXNrPig1KTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX1ZvaWNlQ2FsbCgpIHsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjp2b2ljZU1hc2s+KAorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpWT0lDRV9DQUxMX01PTk8pOworfQorCitBdWRpb0RldmljZURlc2NyaXB0aW9uIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihBdWRpb0RldmljZVR5cGUgdHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbm5lY3Rpb24gPSAiIikgeworICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICByZXN1bHQuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0FERF9Ob25lKCkgeworICAgIHJldHVybiBBdWRpb0RldmljZURlc2NyaXB0aW9ue307Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BRERfRGVmYXVsdEluKCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oQXVkaW9EZXZpY2VUeXBlOjpJTl9ERUZBVUxUKTsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0FERF9EZWZhdWx0T3V0KCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVGQVVMVCk7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BRERfV2lyZWRIZWFkc2V0KCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBRFNFVCwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQU5BTE9HKCkpOworfQorCitBdWRpb0RldmljZURlc2NyaXB0aW9uIG1ha2VfQUREX0J0U2NvSGVhZHNldCgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX1NDTygpKTsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oQXVkaW9Gb3JtYXRUeXBlIHR5cGUpIHsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIHJlc3VsdDsKKyAgICByZXN1bHQudHlwZSA9IHR5cGU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZSBwY20pIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihBdWRpb0Zvcm1hdFR5cGU6OlBDTSk7CisgICAgcmVzdWx0LnBjbSA9IHBjbTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcpIHsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIHJlc3VsdDsKKyAgICByZXN1bHQuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlIHRyYW5zcG9ydCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKSB7CisgICAgYXV0byByZXN1bHQgPSBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oZW5jb2RpbmcpOworICAgIHJlc3VsdC5wY20gPSB0cmFuc3BvcnQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0FGRF9EZWZhdWx0KCkgeworICAgIHJldHVybiBBdWRpb0Zvcm1hdERlc2NyaXB0aW9ue307Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BRkRfSW52YWxpZCgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQpOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQUZEX1BjbTE2Qml0KCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6SU5UXzE2X0JJVCk7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BRkRfQml0c3RyZWFtKCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImV4YW1wbGUiKTsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0FGRF9FbmNhcCgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8xNl9CSVQsICJleGFtcGxlLmVuY2FwIik7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BRkRfRW5jYXBfd2l0aF9FbmMoKSB7CisgICAgYXV0byBhZmQgPSBtYWtlX0FGRF9FbmNhcCgpOworICAgIGFmZC5lbmNvZGluZyArPSAiK2V4YW1wbGUiOworICAgIHJldHVybiBhZmQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBWZXJpZnkgdGhhdCB0d28gaW5kZXBlbmRlbnRseSBjb25zdHJ1Y3RlZCBBRERzL0FGRHMgaGF2ZSB0aGUgc2FtZSBoYXNoLgorLy8gVGhpcyBlbnN1cmVzIHRoYXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBBREQvQUZEIGluc3RhbmNlIG9yaWdpbmF0ZXMKKy8vIGZyb20sIGl0IGNhbiBiZSBjb3JyZWN0bHkgY29tcGFyZWQgdG8gb3RoZXIgQUREL0FGRCBpbnN0YW5jZS4gVGh1cywKKy8vIGZvciBleGFtcGxlLCBhIDE2LWJpdCBpbnRlZ2VyIGZvcm1hdCBkZXNjcmlwdGlvbiBwcm92aWRlZCBieSBIQUwKKy8vIGlzIGlkZW50aWNhbCB0byB0aGUgc2FtZSBmb3JtYXQgZGVzY3JpcHRpb24gY29uc3RydWN0ZWQgYnkgdGhlIGZyYW1ld29yay4KK2NsYXNzIEhhc2hJZGVudGl0eVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdmVyaWZ5SGFzaElkZW50aXR5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248VCgpPj4mIHZhbHVlR2VucykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlR2Vucy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB2YWx1ZUdlbnMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUShoYXNoKHZhbHVlR2Vuc1tpXSgpKSwgaGFzaCh2YWx1ZUdlbnNbaV0oKSkpIDw8IGk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX05FKGhhc2godmFsdWVHZW5zW2ldKCkpLCBoYXNoKHZhbHVlR2Vuc1tqXSgpKSkgPDwgaSA8PCAiLCAiIDw8IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworVEVTVF9GKEhhc2hJZGVudGl0eVRlc3QsIEF1ZGlvQ2hhbm5lbExheW91dEhhc2hJZGVudGl0eSkgeworICAgIHZlcmlmeUhhc2hJZGVudGl0eTxBdWRpb0NoYW5uZWxMYXlvdXQ+KHsKKyAgICAgICAgICAgIG1ha2VfQUNMX05vbmUsIG1ha2VfQUNMX0ludmFsaWQsIG1ha2VfQUNMX1N0ZXJlbywKKyAgICAgICAgICAgIG1ha2VfQUNMX0xheW91dEFyYml0cmFyeSwgbWFrZV9BQ0xfQ2hhbm5lbEluZGV4MiwKKyAgICAgICAgICAgIG1ha2VfQUNMX0NoYW5uZWxJbmRleEFyYml0cmFyeSwgbWFrZV9BQ0xfVm9pY2VDYWxsfSk7Cit9CisKK1RFU1RfRihIYXNoSWRlbnRpdHlUZXN0LCBBdWRpb0RldmljZURlc2NyaXB0aW9uSGFzaElkZW50aXR5KSB7CisgICAgdmVyaWZ5SGFzaElkZW50aXR5PEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24+KHsKKyAgICAgICAgICAgIG1ha2VfQUREX05vbmUsIG1ha2VfQUREX0RlZmF1bHRJbiwgbWFrZV9BRERfRGVmYXVsdE91dCwgbWFrZV9BRERfV2lyZWRIZWFkc2V0LAorICAgICAgICAgICAgbWFrZV9BRERfQnRTY29IZWFkc2V0fSk7Cit9CisKK1RFU1RfRihIYXNoSWRlbnRpdHlUZXN0LCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uSGFzaElkZW50aXR5KSB7CisgICAgdmVyaWZ5SGFzaElkZW50aXR5PEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KHsKKyAgICAgICAgICAgIG1ha2VfQUZEX0RlZmF1bHQsIG1ha2VfQUZEX0ludmFsaWQsIG1ha2VfQUZEX1BjbTE2Qml0LCBtYWtlX0FGRF9CaXRzdHJlYW0sCisgICAgICAgICAgICBtYWtlX0FGRF9FbmNhcCwgbWFrZV9BRkRfRW5jYXBfd2l0aF9FbmN9KTsKK30KKwordXNpbmcgQ2hhbm5lbExheW91dFBhcmFtID0gc3RkOjp0dXBsZTxBdWRpb0NoYW5uZWxMYXlvdXQsIGJvb2wgLyppc0lucHV0Ki8+OworY2xhc3MgQXVkaW9DaGFubmVsTGF5b3V0Um91bmRUcmlwVGVzdCA6CisgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPENoYW5uZWxMYXlvdXRQYXJhbT4ge307CitURVNUX1AoQXVkaW9DaGFubmVsTGF5b3V0Um91bmRUcmlwVGVzdCwgQWlkbDJMZWdhY3kyQWlkbCkgeworICAgIGNvbnN0IGF1dG8gaW5pdGlhbCA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgIGF1dG8gY29udiA9IGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdChpbml0aWFsLCBpc0lucHV0KTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQoY29udi52YWx1ZSgpLCBpc0lucHV0KTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBFWFBFQ1RfRVEoaW5pdGlhbCwgY29udkJhY2sudmFsdWUoKSk7Cit9CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQXVkaW9DaGFubmVsTGF5b3V0Um91bmRUcmlwLAorICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXRSb3VuZFRyaXBUZXN0LAorICAgICAgICB0ZXN0aW5nOjpDb21iaW5lKAorICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhBdWRpb0NoYW5uZWxMYXlvdXR7fSwgbWFrZV9BQ0xfSW52YWxpZCgpLCBtYWtlX0FDTF9TdGVyZW8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfQUNMX0xheW91dEFyYml0cmFyeSgpLCBtYWtlX0FDTF9DaGFubmVsSW5kZXgyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX0FDTF9DaGFubmVsSW5kZXhBcmJpdHJhcnkoKSksCisgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKGZhbHNlLCB0cnVlKSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEF1ZGlvQ2hhbm5lbFZvaWNlUm91bmRUcmlwLAorICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXRSb3VuZFRyaXBUZXN0LAorICAgICAgICAvLyBJbiBsZWdhY3kgY29uc3RhbnRzIHRoZSB2b2ljZSBjYWxsIGlzIG9ubHkgZGVmaW5lZCBmb3IgaW5wdXQuCisgICAgICAgIHRlc3Rpbmc6OkNvbWJpbmUodGVzdGluZzo6VmFsdWVzKG1ha2VfQUNMX1ZvaWNlQ2FsbCgpKSwgdGVzdGluZzo6VmFsdWVzKHRydWUpKSk7CisKK3VzaW5nIENoYW5uZWxMYXlvdXRFZGdlQ2FzZVBhcmFtID0gc3RkOjp0dXBsZTxpbnQgLypsZWdhY3kqLywgYm9vbCAvKmlzSW5wdXQqLywgYm9vbCAvKmlzVmFsaWQqLz47CitjbGFzcyBBdWRpb0NoYW5uZWxMYXlvdXRFZGdlQ2FzZVRlc3QgOgorICAgICAgICBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxDaGFubmVsTGF5b3V0RWRnZUNhc2VQYXJhbT4ge307CitURVNUX1AoQXVkaW9DaGFubmVsTGF5b3V0RWRnZUNhc2VUZXN0LCBMZWdhY3kyQWlkbCkgeworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihzdGQ6OmdldDwwPihHZXRQYXJhbSgpKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgY29uc3QgYm9vbCBpc1ZhbGlkID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgYXV0byBjb252ID0gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KGxlZ2FjeSwgaXNJbnB1dCk7CisgICAgRVhQRUNUX0VRKGlzVmFsaWQsIGNvbnYub2soKSk7Cit9CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQXVkaW9DaGFubmVsTGF5b3V0RWRnZUNhc2UsCisgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dEVkZ2VDYXNlVGVzdCwKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIFZhbGlkIGxlZ2FjeSBpbnB1dCBtYXNrcy4KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LX01PTk8sIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTywgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgLy8gVmFsaWQgbGVnYWN5IG91dHB1dCBtYXNrcy4KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcyB0aGUgc2FtZSBudW1lcmljYWwgcmVwcmVzZW50YXRpb24gYXMgTWFzayAnQScgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hULCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXMgdGhlIHNhbWUgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIGFzIE1hc2sgJ0InIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfCBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGxlZ2FjeSBpbnB1dCBtYXNrcy4KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQVVESU9fQ0hBTk5FTF9JTl82LCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl82IHwgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFIHwgQVVESU9fQ0hBTk5FTF9JTl9YX0FYSVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMgfCBBVURJT19DSEFOTkVMX0lOX1pfQVhJUywgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSggIC8vIE1hc2sgJ0EnCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1NURVJFTyB8IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKCAgLy8gTWFzayAnQicKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkssIHRydWUsIGZhbHNlKSkpOworCitjbGFzcyBBdWRpb0RldmljZURlc2NyaXB0aW9uUm91bmRUcmlwVGVzdCA6CisgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24+IHt9OworVEVTVF9QKEF1ZGlvRGV2aWNlRGVzY3JpcHRpb25Sb3VuZFRyaXBUZXN0LCBBaWRsMkxlZ2FjeTJBaWRsKSB7CisgICAgY29uc3QgYXV0byBpbml0aWFsID0gR2V0UGFyYW0oKTsKKyAgICBhdXRvIGNvbnYgPSBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChpbml0aWFsKTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihjb252LnZhbHVlKCkpOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEVYUEVDVF9FUShpbml0aWFsLCBjb252QmFjay52YWx1ZSgpKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBdWRpb0RldmljZURlc2NyaXB0aW9uUm91bmRUcmlwLAorICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uUm91bmRUcmlwVGVzdCwKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKEF1ZGlvRGV2aWNlRGVzY3JpcHRpb257fSwgbWFrZV9BRERfRGVmYXVsdEluKCksCisgICAgICAgICAgICAgICAgbWFrZV9BRERfRGVmYXVsdE91dCgpLCBtYWtlX0FERF9XaXJlZEhlYWRzZXQoKSwgbWFrZV9BRERfQnRTY29IZWFkc2V0KCkpKTsKKworY2xhc3MgQXVkaW9Gb3JtYXREZXNjcmlwdGlvblJvdW5kVHJpcFRlc3QgOgorICAgICAgICBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiB7fTsKK1RFU1RfUChBdWRpb0Zvcm1hdERlc2NyaXB0aW9uUm91bmRUcmlwVGVzdCwgQWlkbDJMZWdhY3kyQWlkbCkgeworICAgIGNvbnN0IGF1dG8gaW5pdGlhbCA9IEdldFBhcmFtKCk7CisgICAgYXV0byBjb252ID0gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChpbml0aWFsKTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGNvbnYudmFsdWUoKSk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgRVhQRUNUX0VRKGluaXRpYWwsIGNvbnZCYWNrLnZhbHVlKCkpOworfQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25Sb3VuZFRyaXAsCisgICAgICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25Sb3VuZFRyaXBUZXN0LAorICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMobWFrZV9BRkRfSW52YWxpZCgpLCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9ue30sIG1ha2VfQUZEX1BjbTE2Qml0KCkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcAppbmRleCAxY2JjYjcxLi4yZTA4ODNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwCkBAIC05OCwxNCArOTgsMTQgQEAKICAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBpbnB1dFNvdXJjZTsKIAogICAgICAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgY29uc3QgYXV0byBlbXB0eUNhbGxiYWNrID0gc3A8QXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrPjo6bWFrZSgpOwogCiAgICAgICAgIHJlY29yZC0+c2V0KEFVRElPX1NPVVJDRV9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgZmFzdCA/IGNhbGxiYWNrIDogbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIGZhc3QgPyBlbXB0eUNhbGxiYWNrIDogbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcAppbmRleCBjZjliOTI1Li5lNzIzMWQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KQEAgLTEwOCwxNyArMTA5LDE1IEBACiAgICAgICAgIG1lbXNldCgmYXR0cmlidXRlcywgMCwgc2l6ZW9mKGF0dHJpYnV0ZXMpKTsKICAgICAgICAgYXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZTsKICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9IHVzYWdlOwotCiAgICAgICAgIHNwPEF1ZGlvVHJhY2s+IHRyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKLQorICAgICAgICBjb25zdCBhdXRvIGVtcHR5Q2FsbGJhY2sgPSBzcDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPjo6bWFrZSgpOwogICAgICAgICB0cmFjay0+c2V0KEFVRElPX1NUUkVBTV9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgKGZhc3QgfHwgb2ZmbG9hZCkgPyBjYWxsYmFjayA6IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAoZmFzdCB8fCBvZmZsb2FkKSA/IGVtcHR5Q2FsbGJhY2sgOiBudWxscHRyLAogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsCkBAIC0xMjYsOCArMTI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAoKGZhc3QgJiYgc2hhcmVkQnVmZmVyID09IDApIHx8IG9mZmxvYWQpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLIDogQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICBvZmZsb2FkID8gJm9mZmxvYWRJbmZvIDogbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICBnZXR1aWQoKSwKLSAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwKKyAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCiAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgMS4wZiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcAppbmRleCA4YWExZjEzLi5jYWY1MjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwCkBAIC02OCwxMCArNjgsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIGNhbGxiYWNrKGludCBldmVudCBfX3VudXNlZCwgdm9pZCogdXNlciBfX3VudXNlZCwgdm9pZCAqaW5mbyBfX3VudXNlZCkKLXsKLX0KLQogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB0ZXN0X2Z1bmNfdCB0ZXN0RnVuYykKIHsKICAgICBGSUxFICppbnB1dEZpbGUgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmgKaW5kZXggMmFkNjQ2ZS4uOWE2ZjlmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oCkBAIC0zMSw3ICszMSw2IEBACiAKIGJvb2wgY2hlY2tWZXJzaW9uKEZJTEUgKmlucHV0RmlsZSwgY29uc3QgY2hhciAqdmVyc2lvbik7CiAKLXZvaWQgY2FsbGJhY2soaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKIAogdHlwZWRlZiBpbnQgKCp0ZXN0X2Z1bmNfdCkoRklMRSAqaW5wdXRGaWxlLCBpbnQgb3V0cHV0RmlsZUZkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCAzYmVmNTViLi4xNTlmODk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMTEsNiArMTEsMTAgQEAKICAgICBuYW1lOiAibGliYXVkaW9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTI0LDkgKzI4LDExIEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXJfaGVhZGVycyIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKQEAgLTUyLDYgKzU4LDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC02Myw2ICs3MCw3IEBACiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0NvbnRhaW5lcnMuY3BwCmluZGV4IDMxMjU3ZDUuLjBhODE4OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0NvbnRhaW5lcnMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0NvbnRhaW5lcnMuY3BwCkBAIC02Myw0OCArNjMsNTMgQEAKICAgICByZXR1cm4gYXVkaW9EZXZpY2VJbkFsbFVzYlNldDsKIH0KIAotYm9vbCBkZXZpY2VUeXBlc1RvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQgJmRldmljZVR5cGVzLCBzdGQ6OnN0cmluZyAmc3RyKSB7Citjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbEJsZVNldCgpIHsKKyAgICBzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCBhdWRpb0RldmljZU91dEFsbEJsZVNldCA9IERldmljZVR5cGVTZXQoCisgICAgICAgICAgICBzdGQ6OmJlZ2luKEFVRElPX0RFVklDRV9PVVRfQUxMX0JMRV9BUlJBWSksCisgICAgICAgICAgICBzdGQ6OmVuZChBVURJT19ERVZJQ0VfT1VUX0FMTF9CTEVfQVJSQVkpKTsKKyAgICByZXR1cm4gYXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQ7Cit9CisKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0TGVBdWRpb1VuaWNhc3RTZXQoKSB7CisgICAgc3RhdGljIGNvbnN0IERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldCA9IERldmljZVR5cGVTZXQoCisgICAgICAgICAgICBzdGQ6OmJlZ2luKEFVRElPX0RFVklDRV9PVVRfQkxFX1VOSUNBU1RfQVJSQVkpLAorICAgICAgICAgICAgc3RkOjplbmQoQVVESU9fREVWSUNFX09VVF9CTEVfVU5JQ0FTVF9BUlJBWSkpOworICAgIHJldHVybiBhdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0OworfQorCitzdGQ6OnN0cmluZyBkZXZpY2VUeXBlc1RvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQgJmRldmljZVR5cGVzKSB7CiAgICAgaWYgKGRldmljZVR5cGVzLmVtcHR5KCkpIHsKLSAgICAgICAgc3RyID0gIkVtcHR5IGRldmljZSB0eXBlcyI7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gIkVtcHR5IGRldmljZSB0eXBlcyI7CiAgICAgfQotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLSAgICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VUeXBlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VUeXBlcy5lbmQoKTspIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlVHlwZVN0cjsKLSAgICAgICAgcmV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSgqaXQpID8KLSAgICAgICAgICAgICAgT3V0cHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZygqaXQsIGRldmljZVR5cGVTdHIpIDoKLSAgICAgICAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKCppdCwgZGV2aWNlVHlwZVN0cik7Ci0gICAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VUeXBlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VUeXBlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQgIT0gZGV2aWNlVHlwZXMuYmVnaW4oKSkgeworICAgICAgICAgICAgc3MgPDwgIiwgIjsKICAgICAgICAgfQotICAgICAgICBzdHIuYXBwZW5kKGRldmljZVR5cGVTdHIpOwotICAgICAgICBpZiAoKytpdCAhPSBkZXZpY2VUeXBlcy5lbmQoKSkgewotICAgICAgICAgICAgc3RyLmFwcGVuZCgiICwgIik7CisgICAgICAgIGNvbnN0IGNoYXIqIHN0clR5cGUgPSBhdWRpb19kZXZpY2VfdG9fc3RyaW5nKCppdCk7CisgICAgICAgIGlmIChzdHJsZW4oc3RyVHlwZSkgIT0gMCkgeworICAgICAgICAgICAgc3MgPDwgc3RyVHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNzIDw8ICJ1bmtub3duIHR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8ICppdDsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBzdHIgPSAiVW5rbm93biB2YWx1ZXMiOwotICAgIH0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworYm9vbCBkZXZpY2VUeXBlc1RvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQgJmRldmljZVR5cGVzLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gZGV2aWNlVHlwZXNUb1N0cmluZyhkZXZpY2VUeXBlcyk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0ZDo6c3RyaW5nIGR1bXBEZXZpY2VUeXBlcyhjb25zdCBEZXZpY2VUeXBlU2V0ICZkZXZpY2VUeXBlcykgewotICAgIHN0ZDo6c3RyaW5nIHJldDsKLSAgICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VUeXBlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VUeXBlcy5lbmQoKTspIHsKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgIHNzIDw8ICIweCIgPDwgc3RkOjpoZXggPDwgKCppdCk7Ci0gICAgICAgIHJldC5hcHBlbmQoc3Muc3RyKCkpOwotICAgICAgICBpZiAoKytpdCAhPSBkZXZpY2VUeXBlcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0LmFwcGVuZCgiICwgIik7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlVHlwZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlVHlwZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0ICE9IGRldmljZVR5cGVzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIHNzIDw8ICIsICI7CiAgICAgICAgIH0KKyAgICAgICAgc3MgPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCAoKml0KTsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIHsKLSAgICBzdGQ6OnN0cmluZyByZXQ7Ci0gICAgZGV2aWNlVHlwZXNUb1N0cmluZyhkZXZpY2VUeXBlcywgcmV0KTsKLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBzcy5zdHIoKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCmluZGV4IGM1ZDdkYTguLjRhN2U5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VBZGRyZXNzOworCiBuYW1lc3BhY2UgewogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgU1VQUFJFU1NFRCA9ICJTVVBQUkVTU0VEIjsKQEAgLTk3LDEwICsxMDAsMTMgQEAKIAogc3RkOjpzdHJpbmcgQXVkaW9EZXZpY2VUeXBlQWRkcjo6dG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbykgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07Ci0gICAgc3N0cmVhbSA8PCAidHlwZToweCIgPDwgc3RkOjpoZXggPDwgbVR5cGU7CisgICAgc3N0cmVhbSA8PCBhdWRpb19kZXZpY2VfdG9fc3RyaW5nKG1UeXBlKTsKKyAgICBpZiAoc3N0cmVhbS5zdHIoKS5lbXB0eSgpKSB7CisgICAgICAgIHNzdHJlYW0gPDwgInVua25vd24gdHlwZToweCIgPDwgc3RkOjpoZXggPDwgbVR5cGU7CisgICAgfQogICAgIC8vIElQIGFuZCBNQUMgYWRkcmVzcyBhcmUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBUaGUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdpbGwgYmUgc3VwcHJlc3NlZAogICAgIC8vIGlzIGBpbmNsdWRlU2Vuc2l0aXZlSW5mb2AgaXMgZmFsc2UuCi0gICAgc3N0cmVhbSA8PCAiLEA6IgorICAgIHNzdHJlYW0gPDwgIiwgQDoiCiAgICAgICAgICAgICA8PCAoIWluY2x1ZGVTZW5zaXRpdmVJbmZvICYmIG1Jc0FkZHJlc3NTZW5zaXRpdmUgPyBTVVBQUkVTU0VEIDogbUFkZHJlc3MpOwogICAgIHJldHVybiBzc3RyZWFtLnN0cigpOwogfQpAQCAtMTU3LDE3ICsxNjMsMTYgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxBdWRpb0RldmljZVR5cGVBZGRyPgotYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGFpZGwpIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKLSAgICByZXR1cm4gQXVkaW9EZXZpY2VUeXBlQWRkcih0eXBlLCBhaWRsLmFkZHJlc3MpOworYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBBdWRpb0RldmljZSYgYWlkbCkgeworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3M7CisgICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZShhaWRsLCAmdHlwZSwgJmFkZHJlc3MpKTsKKyAgICByZXR1cm4gQXVkaW9EZXZpY2VUeXBlQWRkcih0eXBlLCBhZGRyZXNzKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EZXZpY2U+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlPgogbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9EZXZpY2UgYWlkbDsKLSAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5Lm1UeXBlKSk7Ci0gICAgYWlkbC5hZGRyZXNzID0gbGVnYWN5LmdldEFkZHJlc3MoKTsKLSAgICByZXR1cm4gYWlkbDsKKyAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKGxlZ2FjeS5tVHlwZSwgbGVnYWN5LmdldEFkZHJlc3MoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvR2Fpbi5jcHAKaW5kZXggMWRlZTkzOC4uNDdlMGVkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvR2Fpbi5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvR2Fpbi5jcHAKQEAgLTI0LDIyICsyNCwxOCBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAorI2luY2x1ZGUgPG1hdGguaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0dhaW4uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1hdGguaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1BdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKLXsKLSAgICBtSW5kZXggPSBpbmRleDsKLSAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Ci19CitBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgaXNJbnB1dCkKKyAgICAgICAgOiBtSW5kZXgoaW5kZXgpLCBtSXNJbnB1dChpc0lucHV0KSB7fQogCiB2b2lkIEF1ZGlvR2Fpbjo6Z2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKIHsKQEAgLTQ5LDEyICs0NSw5IEBACiAgICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKICAgICAgICAgY29uZmlnLT52YWx1ZXNbMF0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKLSAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0KKyAgICAgICAgY29uc3QgdWludDMyX3QgbnVtVmFsdWVzID0gbUlzSW5wdXQgPworICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1HYWluLmNoYW5uZWxfbWFzaykgOgorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CiAgICAgICAgICAgICBjb25maWctPnZhbHVlc1tpXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CiAgICAgICAgIH0KQEAgLTc4LDEyICs3MSw5IEBACiAgICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+bUdhaW4uY2hhbm5lbF9tYXNrKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKLSAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICB9CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bVZhbHVlcyA9IG1Jc0lucHV0ID8KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgOgorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKICAgICAgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbaV0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1tpXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKQEAgLTExNiw3ICsxMDYsNyBAQAogYm9vbCBBdWRpb0dhaW46OmVxdWFscyhjb25zdCBzcDxBdWRpb0dhaW4+JiBvdGhlcikgY29uc3QKIHsKICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgotICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzayA9PSBvdGhlci0+bVVzZUluQ2hhbm5lbE1hc2sgJiYKKyAgICAgICAgICAgbUlzSW5wdXQgPT0gb3RoZXItPm1Jc0lucHV0ICYmCiAgICAgICAgICAgIG1Vc2VGb3JWb2x1bWUgPT0gb3RoZXItPm1Vc2VGb3JWb2x1bWUgJiYKICAgICAgICAgICAgLy8gQ29tcGFyZSBhdWRpbyBnYWluCiAgICAgICAgICAgIG1HYWluLm1vZGUgPT0gb3RoZXItPm1HYWluLm1vZGUgJiYKQEAgLTEyOSw1MSArMTE5LDI0IEBACiAgICAgICAgICAgIG1HYWluLm1heF9yYW1wX21zID09IG90aGVyLT5tR2Fpbi5tYXhfcmFtcF9tczsKIH0KIAotc3RhdHVzX3QgQXVkaW9HYWluOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSBjb25zdCB7Ci0gICAgbWVkaWE6OkF1ZGlvR2FpbiBwYXJjZWxhYmxlOwotICAgIHJldHVybiB3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkKLSAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2Fpbjo6QWlkbD4gQXVkaW9HYWluOjp0b1BhcmNlbGFibGUoKSBjb25zdCB7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbiBhaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4obUdhaW4sIG1Jc0lucHV0KSk7CisgICAgYWlkbC51c2VGb3JWb2x1bWUgPSBtVXNlRm9yVm9sdW1lOworICAgIG1lZGlhOjpBdWRpb0dhaW5TeXMgYWlkbFN5czsKKyAgICBhaWRsU3lzLmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtSW5kZXgpKTsKKyAgICBhaWRsU3lzLmlzSW5wdXQgPSBtSXNJbnB1dDsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoYWlkbCwgYWlkbFN5cyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvR2Fpbjo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvR2FpbiogcGFyY2VsYWJsZSkgY29uc3QgewotICAgIHBhcmNlbGFibGUtPmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUluZGV4KSk7Ci0gICAgcGFyY2VsYWJsZS0+dXNlSW5DaGFubmVsTWFzayA9IG1Vc2VJbkNoYW5uZWxNYXNrOwotICAgIHBhcmNlbGFibGUtPnVzZUZvclZvbHVtZSA9IG1Vc2VGb3JWb2x1bWU7Ci0gICAgcGFyY2VsYWJsZS0+bW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobUdhaW4ubW9kZSkpOwotICAgIHBhcmNlbGFibGUtPmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobUdhaW4uY2hhbm5lbF9tYXNrKSk7Ci0gICAgcGFyY2VsYWJsZS0+bWluVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5taW5fdmFsdWUpKTsKLSAgICBwYXJjZWxhYmxlLT5tYXhWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1heF92YWx1ZSkpOwotICAgIHBhcmNlbGFibGUtPmRlZmF1bHRWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4uZGVmYXVsdF92YWx1ZSkpOwotICAgIHBhcmNlbGFibGUtPnN0ZXBWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLnN0ZXBfdmFsdWUpKTsKLSAgICBwYXJjZWxhYmxlLT5taW5SYW1wTXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5taW5fcmFtcF9tcykpOwotICAgIHBhcmNlbGFibGUtPm1heFJhbXBNcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1heF9yYW1wX21zKSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBdWRpb0dhaW46OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSB7Ci0gICAgbWVkaWE6OkF1ZGlvR2FpbiBwYXJjZWxhYmxlOwotICAgIHJldHVybiBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKLSAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpOwotfQotCi1zdGF0dXNfdCBBdWRpb0dhaW46OnJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBwYXJjZWxhYmxlKSB7Ci0gICAgbUluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLmluZGV4KSk7Ci0gICAgbVVzZUluQ2hhbm5lbE1hc2sgPSBwYXJjZWxhYmxlLnVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgbVVzZUZvclZvbHVtZSA9IHBhcmNlbGFibGUudXNlRm9yVm9sdW1lOwotICAgIG1HYWluLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKHBhcmNlbGFibGUubW9kZSkpOwotICAgIG1HYWluLmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KHBhcmNlbGFibGUuY2hhbm5lbE1hc2spKTsKLSAgICBtR2Fpbi5taW5fdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUubWluVmFsdWUpKTsKLSAgICBtR2Fpbi5tYXhfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUubWF4VmFsdWUpKTsKLSAgICBtR2Fpbi5kZWZhdWx0X3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLmRlZmF1bHRWYWx1ZSkpOwotICAgIG1HYWluLnN0ZXBfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuc3RlcFZhbHVlKSk7Ci0gICAgbUdhaW4ubWluX3JhbXBfbXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUubWluUmFtcE1zKSk7Ci0gICAgbUdhaW4ubWF4X3JhbXBfbXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUubWF4UmFtcE1zKSk7Ci0gICAgcmV0dXJuIE9LOworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0dhaW4+PiBBdWRpb0dhaW46OmZyb21QYXJjZWxhYmxlKGNvbnN0IEF1ZGlvR2Fpbjo6QWlkbCYgYWlkbCkgeworICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4mIGhhbCA9IGFpZGwuZmlyc3Q7CisgICAgY29uc3QgbWVkaWE6OkF1ZGlvR2FpblN5cyYgc3lzID0gYWlkbC5zZWNvbmQ7CisgICAgYXV0byBpbmRleCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihzeXMuaW5kZXgpKTsKKyAgICBzcDxBdWRpb0dhaW4+IGxlZ2FjeSA9IHNwPEF1ZGlvR2Fpbj46Om1ha2UoaW5kZXgsIHN5cy5pc0lucHV0KTsKKyAgICBsZWdhY3ktPm1HYWluID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGhhbCwgc3lzLmlzSW5wdXQpKTsKKyAgICBsZWdhY3ktPm1Vc2VGb3JWb2x1bWUgPSBoYWwudXNlRm9yVm9sdW1lOworICAgIHJldHVybiBsZWdhY3k7CiB9CiAKIGJvb2wgQXVkaW9HYWluczo6ZXF1YWxzKGNvbnN0IEF1ZGlvR2FpbnMgJm90aGVyKSBjb25zdApAQCAtMTg0LDU5ICsxNDcsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICB9KTsKIH0KIAotc3RhdHVzX3QgQXVkaW9HYWluczo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVZlY3RvclNpemUoKnRoaXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmF1ZGlvR2FpbiA6ICp0aGlzKSB7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoKmF1ZGlvR2FpbikpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb0dhaW5zOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHRoaXMtPmNsZWFyKCk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlc2l6ZU91dFZlY3Rvcih0aGlzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgewotICAgICAgICB0aGlzLT5hdChpKSA9IG5ldyBBdWRpb0dhaW4oMCwgZmFsc2UpOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUodGhpcy0+YXQoaSkuZ2V0KCkpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgdGhpcy0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9HYWluPj4KLWFpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBhaWRsKSB7Ci0gICAgc3A8QXVkaW9HYWluPiBsZWdhY3kgPSBuZXcgQXVkaW9HYWluKDAsIGZhbHNlKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBsZWdhY3ktPnJlYWRGcm9tUGFyY2VsYWJsZShhaWRsKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBsZWdhY3k7CithaWRsMmxlZ2FjeV9BdWRpb0dhaW4oY29uc3QgQXVkaW9HYWluOjpBaWRsJiBhaWRsKSB7CisgICAgcmV0dXJuIEF1ZGlvR2Fpbjo6ZnJvbVBhcmNlbGFibGUoYWlkbCk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbj4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluOjpBaWRsPgogbGVnYWN5MmFpZGxfQXVkaW9HYWluKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb0dhaW4gYWlkbDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBsZWdhY3ktPndyaXRlVG9QYXJjZWxhYmxlKCZhaWRsKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBhaWRsOworICAgIHJldHVybiBsZWdhY3ktPnRvUGFyY2VsYWJsZSgpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2FpbnM+Ci1haWRsMmxlZ2FjeV9BdWRpb0dhaW5zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+JiBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXI8QXVkaW9HYWlucz4oYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9HYWluKTsKK2FpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29uc3QgQXVkaW9HYWluczo6QWlkbCYgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyczxBdWRpb0dhaW5zPihhaWRsLmZpcnN0LCBhaWRsLnNlY29uZCwKKyAgICAgICAgICAgIFtdKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4mIGcsCisgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9HYWluU3lzJiBncykgeworICAgICAgICAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW4oc3RkOjptYWtlX3BhaXIoZywgZ3MpKTsKKyAgICAgICAgICAgIH0pOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+PgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5zOjpBaWRsPgogbGVnYWN5MmFpZGxfQXVkaW9HYWlucyhjb25zdCBBdWRpb0dhaW5zJiBsZWdhY3kpIHsKLSAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPj4obGVnYWN5LCBsZWdhY3kyYWlkbF9BdWRpb0dhaW4pOworICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyU3BsaXQ8CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluPiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW5TeXM+PihsZWdhY3ksIGxlZ2FjeTJhaWRsX0F1ZGlvR2Fpbik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKaW5kZXggZmFmYWJkOS4uNDUxMzMyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKQEAgLTE4LDEzICsxOCwyOCBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvcnQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit2b2lkIEF1ZGlvUG9ydDo6c2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCit7CisgICAgLy8gZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgJiYKKyAgICAgICAgICAgIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOworICAgIH0KKyAgICBpZiAodXNlSW5wdXRDaGFubmVsTWFzaygpKSB7CisgICAgICAgIG1GbGFncy5pbnB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSBfX3VudXNlZCkKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGVUb0ltcG9ydCA6IHBvcnQtPm1Qcm9maWxlcykgewpAQCAtMTQ3LDkgKzE2MiwxNiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvcnQ6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdCB7Cit2b2lkIEF1ZGlvUG9ydDo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8sIGJvb2wgdmVyYm9zZSkgY29uc3QgewogICAgIGlmICghbU5hbWUuZW1wdHkoKSkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLmNfc3RyKCkpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCJcIiVzXCIlcyIsIG1OYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUluZm8gIT0gbnVsbHB0ciA/ICI7ICIgOiAiIikpOworICAgIH0KKyAgICBpZiAoZXh0cmFJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlcyIsIGV4dHJhSW5mbykpOworICAgIH0KKyAgICBpZiAoIW1OYW1lLmVtcHR5KCkgfHwgZXh0cmFJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQogICAgIGlmICh2ZXJib3NlKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHByb2ZpbGVzU3RyOwpAQCAtMTk2LDM5ICsyMTgsNTkgQEAKICAgICAgICAgICAgbVR5cGUgPT0gb3RoZXItPmdldFR5cGUoKSAmJgogICAgICAgICAgICBtUm9sZSA9PSBvdGhlci0+Z2V0Um9sZSgpICYmCiAgICAgICAgICAgIG1Qcm9maWxlcy5lcXVhbHMob3RoZXItPmdldEF1ZGlvUHJvZmlsZXMoKSkgJiYKKyAgICAgICAgICAgZ2V0RmxhZ3MoKSA9PSBvdGhlci0+Z2V0RmxhZ3MoKSAmJgogICAgICAgICAgICBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzID09IG90aGVyLT5nZXRFeHRyYUF1ZGlvRGVzY3JpcHRvcnMoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAotewotICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gd3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpCi0gICAgICAgID86IHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnQqIHBhcmNlbGFibGUpIGNvbnN0IHsKLSAgICBwYXJjZWxhYmxlLT5uYW1lID0gbU5hbWU7Ci0gICAgcGFyY2VsYWJsZS0+dHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShtVHlwZSkpOwotICAgIHBhcmNlbGFibGUtPnJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobVJvbGUpKTsKLSAgICBwYXJjZWxhYmxlLT5wcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKG1Qcm9maWxlcykpOwotICAgIHBhcmNlbGFibGUtPmV4dHJhQXVkaW9EZXNjcmlwdG9ycyA9IG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnM7Ci0gICAgcGFyY2VsYWJsZS0+Z2FpbnMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvR2FpbnMobUdhaW5zKSk7CisgICAgcGFyY2VsYWJsZS0+aGFsLm5hbWUgPSBtTmFtZTsKKyAgICBwYXJjZWxhYmxlLT5zeXMudHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKG1UeXBlKSk7CisgICAgcGFyY2VsYWJsZS0+c3lzLnJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShtUm9sZSkpOworICAgIGF1dG8gYWlkbFByb2ZpbGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3RvcihtUHJvZmlsZXMsIHVzZUlucHV0Q2hhbm5lbE1hc2soKSkpOworICAgIHBhcmNlbGFibGUtPmhhbC5wcm9maWxlcyA9IGFpZGxQcm9maWxlcy5maXJzdDsKKyAgICBwYXJjZWxhYmxlLT5zeXMucHJvZmlsZXMgPSBhaWRsUHJvZmlsZXMuc2Vjb25kOworICAgIHBhcmNlbGFibGUtPmhhbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MobUZsYWdzLCB1c2VJbnB1dENoYW5uZWxNYXNrKCkpKTsKKyAgICBwYXJjZWxhYmxlLT5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzID0gbUV4dHJhQXVkaW9EZXNjcmlwdG9yczsKKyAgICBhdXRvIGFpZGxHYWlucyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9HYWlucyhtR2FpbnMpKTsKKyAgICBwYXJjZWxhYmxlLT5oYWwuZ2FpbnMgPSBhaWRsR2FpbnMuZmlyc3Q7CisgICAgcGFyY2VsYWJsZS0+c3lzLmdhaW5zID0gYWlkbEdhaW5zLnNlY29uZDsKKyAgICBpZiAobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0IG1peEV4dHt9OworICAgICAgICBtaXhFeHQubWF4T3BlblN0cmVhbUNvdW50ID0gbWF4T3BlbkNvdW50OworICAgICAgICBtaXhFeHQubWF4QWN0aXZlU3RyZWFtQ291bnQgPSBtYXhBY3RpdmVDb3VudDsKKyAgICAgICAgbWl4RXh0LnJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMgPSByZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zOworICAgICAgICBwYXJjZWxhYmxlLT5oYWwuZXh0ID0gbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydEV4dDo6bWFrZTwKKyAgICAgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RXh0OjptaXg+KG1peEV4dCk7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgewotICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCi0gICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSkgewotICAgIG1OYW1lID0gcGFyY2VsYWJsZS5uYW1lOwotICAgIG1UeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KHBhcmNlbGFibGUudHlwZSkpOwotICAgIG1Sb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KHBhcmNlbGFibGUucm9sZSkpOwotICAgIG1Qcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKHBhcmNlbGFibGUucHJvZmlsZXMpKTsKLSAgICBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzID0gcGFyY2VsYWJsZS5leHRyYUF1ZGlvRGVzY3JpcHRvcnM7Ci0gICAgbUdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0dhaW5zKHBhcmNlbGFibGUuZ2FpbnMpKTsKKyAgICBtTmFtZSA9IHBhcmNlbGFibGUuaGFsLm5hbWU7CisgICAgbVR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdChwYXJjZWxhYmxlLnN5cy50eXBlKSk7CisgICAgbVJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChwYXJjZWxhYmxlLnN5cy5yb2xlKSk7CisgICAgbVByb2ZpbGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3RvcigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIocGFyY2VsYWJsZS5oYWwucHJvZmlsZXMsIHBhcmNlbGFibGUuc3lzLnByb2ZpbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgdXNlSW5wdXRDaGFubmVsTWFzaygpKSk7CisgICAgbUZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncyhwYXJjZWxhYmxlLmhhbC5mbGFncywgdXNlSW5wdXRDaGFubmVsTWFzaygpKSk7CisgICAgbUV4dHJhQXVkaW9EZXNjcmlwdG9ycyA9IHBhcmNlbGFibGUuaGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9yczsKKyAgICBtR2FpbnMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhzdGQ6Om1ha2VfcGFpcihwYXJjZWxhYmxlLmhhbC5nYWlucywgcGFyY2VsYWJsZS5zeXMuZ2FpbnMpKSk7CisgICAgaWYgKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dCYgbWl4RXh0ID0KKyAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLmhhbC5leHQuZ2V0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRFeHQ6Om1peD4oKTsKKyAgICAgICAgbWF4T3BlbkNvdW50ID0gbWl4RXh0Lm1heE9wZW5TdHJlYW1Db3VudDsKKyAgICAgICAgbWF4QWN0aXZlQ291bnQgPSBtaXhFeHQubWF4QWN0aXZlU3RyZWFtQ291bnQ7CisgICAgICAgIHJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMgPSBtaXhFeHQucmVjb21tZW5kZWRNdXRlRHVyYXRpb25NczsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNTAsNiArMjkyLDkgQEAKICAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKICAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CiAgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgbUZsYWdzID0gY29uZmlnLT5mbGFnczsKKyAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zMDMsNiArMzQ4LDkgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOwogICAgIH0KKworICAgIHVwZGF0ZUZpZWxkKG1GbGFncywgJmF1ZGlvX3BvcnRfY29uZmlnOjpmbGFncywKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19GTEFHUywgeyBBVURJT19JTlBVVF9GTEFHX05PTkUgfSk7CiB9CiAKIGJvb2wgQXVkaW9Qb3J0Q29uZmlnOjpoYXNHYWluQ29udHJvbGxlcihib29sIGNhblVzZUZvclZvbHVtZSkgY29uc3QKQEAgLTMxNSwxMiArMzYzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvcG9ydC0+Z2V0R2FpbnMoKS5zaXplKCkgPiAwOwogfQogCi1ib29sIEF1ZGlvUG9ydENvbmZpZzo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4gJm90aGVyKSBjb25zdAorYm9vbCBBdWRpb1BvcnRDb25maWc6OmVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+ICZvdGhlciwgYm9vbCBpc0lucHV0KSBjb25zdAogewogICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmCiAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUgPT0gb3RoZXItPmdldFNhbXBsaW5nUmF0ZSgpICYmCiAgICAgICAgICAgIG1Gb3JtYXQgPT0gb3RoZXItPmdldEZvcm1hdCgpICYmCiAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBvdGhlci0+Z2V0Q2hhbm5lbE1hc2soKSAmJgorICAgICAgICAgICAoaXNJbnB1dCA/IG1GbGFncy5pbnB1dCA9PSBvdGhlci0+Z2V0RmxhZ3MoKS5pbnB1dCA6CisgICAgICAgICAgICAgICAgICAgbUZsYWdzLm91dHB1dCA9PSBvdGhlci0+Z2V0RmxhZ3MoKS5vdXRwdXQgKSYmCiAgICAgICAgICAgIC8vIENvbXBhcmUgYXVkaW8gZ2FpbiBjb25maWcKICAgICAgICAgICAgbUdhaW4uaW5kZXggPT0gb3RoZXItPm1HYWluLmluZGV4ICYmCiAgICAgICAgICAgIG1HYWluLm1vZGUgPT0gb3RoZXItPm1HYWluLm1vZGUgJiYKQEAgLTMzMCw1NCArMzgwLDQ3IEBACiAgICAgICAgICAgIG1HYWluLnJhbXBfZHVyYXRpb25fbXMgPT0gb3RoZXItPm1HYWluLnJhbXBfZHVyYXRpb25fbXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgewotICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWcgcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gd3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpCi0gICAgICAgID86IHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnRDb25maWcqIHBhcmNlbGFibGUpIGNvbnN0IHsKLSAgICBwYXJjZWxhYmxlLT5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obVNhbXBsaW5nUmF0ZSkpOwotICAgIHBhcmNlbGFibGUtPmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobUZvcm1hdCkpOworc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsYWJsZSgKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydENvbmZpZyogcGFyY2VsYWJsZSwgYm9vbCBpc0lucHV0KSBjb25zdCB7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludCBhaWRsX3NhbXBsZVJhdGU7CisgICAgYWlkbF9zYW1wbGVSYXRlLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obVNhbXBsaW5nUmF0ZSkpOworICAgIHBhcmNlbGFibGUtPnNhbXBsZVJhdGUgPSBhaWRsX3NhbXBsZVJhdGU7CisgICAgcGFyY2VsYWJsZS0+Zm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24obUZvcm1hdCkpOwogICAgIHBhcmNlbGFibGUtPmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobUNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobUNoYW5uZWxNYXNrLCBpc0lucHV0KSk7CiAgICAgcGFyY2VsYWJsZS0+aWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChtSWQpKTsKLSAgICBwYXJjZWxhYmxlLT5nYWluLmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4uaW5kZXgpKTsKLSAgICBwYXJjZWxhYmxlLT5nYWluLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfaW50MzJfdF9tYXNrKG1HYWluLm1vZGUpKTsKLSAgICBwYXJjZWxhYmxlLT5nYWluLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobUdhaW4uY2hhbm5lbF9tYXNrKSk7Ci0gICAgcGFyY2VsYWJsZS0+Z2Fpbi5yYW1wRHVyYXRpb25NcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ucmFtcF9kdXJhdGlvbl9tcykpOwotICAgIHBhcmNlbGFibGUtPmdhaW4udmFsdWVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PigKLSAgICAgICAgICAgIG1HYWluLnZhbHVlcywgY29udmVydEludGVncmFsPGludDMyX3QsIGludD4pKTsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluQ29uZmlnIGFpZGxfZ2FpbiA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcobUdhaW4sIGlzSW5wdXQpKTsKKyAgICBwYXJjZWxhYmxlLT5nYWluID0gYWlkbF9nYWluOworICAgIHBhcmNlbGFibGUtPmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncyhtRmxhZ3MsIGlzSW5wdXQpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQotICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIHBhcmNlbGFibGUpIHsKLSAgICBtU2FtcGxpbmdSYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLnNhbXBsZVJhdGUpKTsKLSAgICBtRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChwYXJjZWxhYmxlLmZvcm1hdCkpOwotICAgIG1DaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KHBhcmNlbGFibGUuY2hhbm5lbE1hc2spKTsKLSAgICBtSWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwYXJjZWxhYmxlLmlkKSk7Ci0gICAgbUdhaW4uaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuZ2Fpbi5pbmRleCkpOwotICAgIG1HYWluLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKHBhcmNlbGFibGUuZ2Fpbi5tb2RlKSk7Ci0gICAgbUdhaW4uY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QocGFyY2VsYWJsZS5nYWluLmNoYW5uZWxNYXNrKSk7Ci0gICAgbUdhaW4ucmFtcF9kdXJhdGlvbl9tcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLmdhaW4ucmFtcER1cmF0aW9uTXMpKTsKLSAgICBpZiAocGFyY2VsYWJsZS5nYWluLnZhbHVlcy5zaXplKCkgPiBzdGQ6OnNpemUobUdhaW4udmFsdWVzKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbGFibGUoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRDb25maWcmIHBhcmNlbGFibGUsIGJvb2wgaXNJbnB1dCkgeworICAgIGlmIChwYXJjZWxhYmxlLnNhbXBsZVJhdGUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5zYW1wbGVSYXRlLnZhbHVlKCkudmFsdWUpKTsKICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJjZWxhYmxlLmdhaW4udmFsdWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1HYWluLnZhbHVlc1tpXSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5nYWluLnZhbHVlc1tpXSkpOworICAgIGlmIChwYXJjZWxhYmxlLmZvcm1hdC5oYXNfdmFsdWUoKSkgeworICAgICAgICBtRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KHBhcmNlbGFibGUuZm9ybWF0LnZhbHVlKCkpKTsKKyAgICB9CisgICAgaWYgKHBhcmNlbGFibGUuY2hhbm5lbE1hc2suaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLmNoYW5uZWxNYXNrLnZhbHVlKCksIGlzSW5wdXQpKTsKKyAgICB9CisgICAgbUlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocGFyY2VsYWJsZS5pZCkpOworICAgIGlmIChwYXJjZWxhYmxlLmdhaW4uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbUdhaW4gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZyhwYXJjZWxhYmxlLmdhaW4udmFsdWUoKSwgaXNJbnB1dCkpOworICAgIH0KKyAgICBpZiAocGFyY2VsYWJsZS5mbGFncy5oYXNfdmFsdWUoKSkgeworICAgICAgICBtRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncyhwYXJjZWxhYmxlLmZsYWdzLnZhbHVlKCksIGlzSW5wdXQpKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcAppbmRleCA4YWMzZjczLi4yMTcwY2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcApAQCAtMjcsNiArMjcsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQ7CisKIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZyaWdodCkKIHsKICAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gcmlnaHQuZ2V0Rm9ybWF0KCkpICYmCkBAIC05NywxOCArOTksMTQgQEAKIAogdm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAorICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiXCIlc1wiOyAiLCBtTmFtZS5jX3N0cigpKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlcyVzJXMlcyIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKICAgICAgICAgICAgICBtSXNEeW5hbWljQ2hhbm5lbHMgPyAiW2R5bmFtaWMgY2hhbm5lbHNdIiA6ICIiLAotICAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID8gIltkeW5hbWljIHJhdGVzXSIgOiAiIikpOwotICAgIGlmIChtTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSkpOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsOwotICAgIGlmIChGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKG1Gb3JtYXQsIGZvcm1hdExpdGVyYWwpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpKTsKLSAgICB9CisgICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiLCBpc0R5bmFtaWMoKSA/ICI7ICIgOiAiIikpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJXMgKDB4JXgpXG4iLCBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKG1Gb3JtYXQpLCBtRm9ybWF0KSk7CisKICAgICBpZiAoIW1TYW1wbGluZ1JhdGVzLmVtcHR5KCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnNzYW1wbGluZyByYXRlczogIiwgc3BhY2VzLCAiIikpOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU2FtcGxpbmdSYXRlcy5iZWdpbigpOyBpdCAhPSBtU2FtcGxpbmdSYXRlcy5lbmQoKTspIHsKICAgICAgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJWQiLCAqaXQpKTsKICAgICAgICAgICAgIGRzdC0+YXBwZW5kKCsraXQgPT0gbVNhbXBsaW5nUmF0ZXMuZW5kKCkgPyAiIiA6ICIsICIpOwpAQCAtMTE3LDcgKzExNSw3IEBACiAgICAgfQogCiAgICAgaWYgKCFtQ2hhbm5lbE1hc2tzLmVtcHR5KCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIikpOworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqc2NoYW5uZWwgbWFza3M6ICIsIHNwYWNlcywgIiIpKTsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNoYW5uZWxNYXNrcy5iZWdpbigpOyBpdCAhPSBtQ2hhbm5lbE1hc2tzLmVuZCgpOykgewogICAgICAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIweCUwNHgiLCAqaXQpKTsKICAgICAgICAgICAgIGRzdC0+YXBwZW5kKCsraXQgPT0gbUNoYW5uZWxNYXNrcy5lbmQoKSA/ICIiIDogIiwgIik7CkBAIC0xMjYsMTkgKzEyNCwyMCBAQAogICAgIH0KIAogICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICIlKnMtIGVuY2Fwc3VsYXRpb24gdHlwZTogJSN4XG4iLCBzcGFjZXMsICIiLCBtRW5jYXBzdWxhdGlvblR5cGUpKTsKKyAgICAgICAgICAgICAiJSpzJXNcbiIsIHNwYWNlcywgIiIsIGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90b19zdHJpbmcobUVuY2Fwc3VsYXRpb25UeXBlKSkpOwogfQogCi1ib29sIEF1ZGlvUHJvZmlsZTo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIG90aGVyKSBjb25zdAorYm9vbCBBdWRpb1Byb2ZpbGU6OmVxdWFscyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBvdGhlciwgYm9vbCBpZ25vcmVEeW5hbWljRmxhZ3MpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG90aGVyICE9IG51bGxwdHIgJiYKICAgICAgICAgICAgbU5hbWUuY29tcGFyZShvdGhlci0+bU5hbWUpID09IDAgJiYKICAgICAgICAgICAgbUZvcm1hdCA9PSBvdGhlci0+Z2V0Rm9ybWF0KCkgJiYKICAgICAgICAgICAgbUNoYW5uZWxNYXNrcyA9PSBvdGhlci0+Z2V0Q2hhbm5lbHMoKSAmJgogICAgICAgICAgICBtU2FtcGxpbmdSYXRlcyA9PSBvdGhlci0+Z2V0U2FtcGxlUmF0ZXMoKSAmJgotICAgICAgICAgICBtSXNEeW5hbWljRm9ybWF0ID09IG90aGVyLT5pc0R5bmFtaWNGb3JtYXQoKSAmJgotICAgICAgICAgICBtSXNEeW5hbWljQ2hhbm5lbHMgPT0gb3RoZXItPmlzRHluYW1pY0NoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPT0gb3RoZXItPmlzRHluYW1pY1JhdGUoKSAmJgorICAgICAgICAgICAoaWdub3JlRHluYW1pY0ZsYWdzIHx8CisgICAgICAgICAgICAgICAobUlzRHluYW1pY0Zvcm1hdCA9PSBvdGhlci0+aXNEeW5hbWljRm9ybWF0KCkgJiYKKyAgICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA9PSBvdGhlci0+aXNEeW5hbWljQ2hhbm5lbHMoKSAmJgorICAgICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPT0gb3RoZXItPmlzRHluYW1pY1JhdGUoKSkpICYmCiAgICAgICAgICAgIG1FbmNhcHN1bGF0aW9uVHlwZSA9PSBvdGhlci0+Z2V0RW5jYXBzdWxhdGlvblR5cGUoKTsKIH0KIApAQCAtMTU0LDY3ICsxNTMsODggQEAKICAgICByZXR1cm4gKnRoaXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUHJvZmlsZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgewotICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVModG9QYXJjZWxhYmxlKCkpOwotICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSB9CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZTo6QWlkbD4KK0F1ZGlvUHJvZmlsZTo6dG9QYXJjZWxhYmxlKGJvb2wgaXNJbnB1dCkgY29uc3QgeworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZSA9IFZBTFVFX09SX1JFVFVSTih0b0NvbW1vblBhcmNlbGFibGUoaXNJbnB1dCkpOworICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGVTeXMgcGFyY2VsYWJsZVN5czsKKyAgICBwYXJjZWxhYmxlU3lzLmlzRHluYW1pY0Zvcm1hdCA9IG1Jc0R5bmFtaWNGb3JtYXQ7CisgICAgcGFyY2VsYWJsZVN5cy5pc0R5bmFtaWNDaGFubmVscyA9IG1Jc0R5bmFtaWNDaGFubmVsczsKKyAgICBwYXJjZWxhYmxlU3lzLmlzRHluYW1pY1JhdGUgPSBtSXNEeW5hbWljUmF0ZTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocGFyY2VsYWJsZSwgcGFyY2VsYWJsZVN5cyk7Cit9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KLUF1ZGlvUHJvZmlsZTo6dG9QYXJjZWxhYmxlKCkgY29uc3QgewotICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZTsKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4gQXVkaW9Qcm9maWxlOjpmcm9tUGFyY2VsYWJsZSgKKyAgICAgICAgY29uc3QgQXVkaW9Qcm9maWxlOjpBaWRsJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTihmcm9tQ29tbW9uUGFyY2VsYWJsZShhaWRsLmZpcnN0LCBpc0lucHV0KSk7CisgICAgY29uc3QgYXV0byYgcGFyY2VsYWJsZVN5cyA9IGFpZGwuc2Vjb25kOworICAgIGxlZ2FjeS0+bUlzRHluYW1pY0Zvcm1hdCA9IHBhcmNlbGFibGVTeXMuaXNEeW5hbWljRm9ybWF0OworICAgIGxlZ2FjeS0+bUlzRHluYW1pY0NoYW5uZWxzID0gcGFyY2VsYWJsZVN5cy5pc0R5bmFtaWNDaGFubmVsczsKKyAgICBsZWdhY3ktPm1Jc0R5bmFtaWNSYXRlID0gcGFyY2VsYWJsZVN5cy5pc0R5bmFtaWNSYXRlOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4KK0F1ZGlvUHJvZmlsZTo6dG9Db21tb25QYXJjZWxhYmxlKGJvb2wgaXNJbnB1dCkgY29uc3QgeworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZTsKICAgICBwYXJjZWxhYmxlLm5hbWUgPSBtTmFtZTsKLSAgICBwYXJjZWxhYmxlLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChtRm9ybWF0KSk7CisgICAgcGFyY2VsYWJsZS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKG1Gb3JtYXQpKTsKKyAgICAvLyBOb3RlOiBsZWdhY3kgJ2F1ZGlvX3Byb2ZpbGUnIGltcG9zZXMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mCisgICAgLy8gY2hhbm5lbCBtYXNrcyBhbmQgc2FtcGxpbmcgcmF0ZXMuIFRoYXQncyB3aHkgaXQncyBub3QgdXNlZCBoZXJlCisgICAgLy8gYW5kIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGhlIGZpZWxkcyBpbnN0ZWFkCisgICAgLy8gb2YgdXNpbmcgJ2xlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlJyBmcm9tIEFpZGxDb252ZXJzaW9uLgogICAgIHBhcmNlbGFibGUuY2hhbm5lbE1hc2tzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4obUNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QpKTsKLSAgICBwYXJjZWxhYmxlLnNhbXBsaW5nUmF0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvQ2hhbm5lbExheW91dD4+KAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgIFtpc0lucHV0XShhdWRpb19jaGFubmVsX21hc2tfdCBtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChtLCBpc0lucHV0KTsKKyAgICAgICAgICAgIH0pKTsKKyAgICBwYXJjZWxhYmxlLnNhbXBsZVJhdGVzID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4obVNhbXBsaW5nUmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdCwgdWludDMyX3Q+KSk7Ci0gICAgcGFyY2VsYWJsZS5pc0R5bmFtaWNGb3JtYXQgPSBtSXNEeW5hbWljRm9ybWF0OwotICAgIHBhcmNlbGFibGUuaXNEeW5hbWljQ2hhbm5lbHMgPSBtSXNEeW5hbWljQ2hhbm5lbHM7Ci0gICAgcGFyY2VsYWJsZS5pc0R5bmFtaWNSYXRlID0gbUlzRHluYW1pY1JhdGU7CiAgICAgcGFyY2VsYWJsZS5lbmNhcHN1bGF0aW9uVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUobUVuY2Fwc3VsYXRpb25UeXBlKSk7CiAgICAgcmV0dXJuIHBhcmNlbGFibGU7CiB9CiAKLXN0YXR1c190IEF1ZGlvUHJvZmlsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIHsKLSAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGU7Ci0gICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsgc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgICp0aGlzID0gKlZBTFVFX09SX1JFVFVSTl9TVEFUVVMoZnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSkpOwotICAgIHJldHVybiBPSzsKLX0KLQotQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgotQXVkaW9Qcm9maWxlOjpmcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBwYXJjZWxhYmxlKSB7CitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+IEF1ZGlvUHJvZmlsZTo6ZnJvbUNvbW1vblBhcmNlbGFibGUoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUmIGFpZGwsIGJvb2wgaXNJbnB1dCkgewogICAgIHNwPEF1ZGlvUHJvZmlsZT4gbGVnYWN5ID0gbmV3IEF1ZGlvUHJvZmlsZSgpOwotICAgIGxlZ2FjeS0+bU5hbWUgPSBwYXJjZWxhYmxlLm5hbWU7Ci0gICAgbGVnYWN5LT5tRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KHBhcmNlbGFibGUuZm9ybWF0KSk7CisgICAgbGVnYWN5LT5tTmFtZSA9IGFpZGwubmFtZTsKKyAgICBsZWdhY3ktPm1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CiAgICAgbGVnYWN5LT5tQ2hhbm5lbE1hc2tzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxDaGFubmVsTWFza1NldD4ocGFyY2VsYWJsZS5jaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KSk7CisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPENoYW5uZWxNYXNrU2V0PihhaWRsLmNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgIFtpc0lucHV0XShjb25zdCBBdWRpb0NoYW5uZWxMYXlvdXQmIGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGwsIGlzSW5wdXQpOworICAgICAgICAgICAgfSkpOwogICAgIGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPFNhbXBsZVJhdGVTZXQ+KHBhcmNlbGFibGUuc2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8U2FtcGxlUmF0ZVNldD4oYWlkbC5zYW1wbGVSYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPHVpbnQzMl90LCBpbnQzMl90PikpOwotICAgIGxlZ2FjeS0+bUlzRHluYW1pY0Zvcm1hdCA9IHBhcmNlbGFibGUuaXNEeW5hbWljRm9ybWF0OwotICAgIGxlZ2FjeS0+bUlzRHluYW1pY0NoYW5uZWxzID0gcGFyY2VsYWJsZS5pc0R5bmFtaWNDaGFubmVsczsKLSAgICBsZWdhY3ktPm1Jc0R5bmFtaWNSYXRlID0gcGFyY2VsYWJsZS5pc0R5bmFtaWNSYXRlOwogICAgIGxlZ2FjeS0+bUVuY2Fwc3VsYXRpb25UeXBlID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCgKLSAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5lbmNhcHN1bGF0aW9uVHlwZSkpOworICAgICAgICAgICAgICAgICAgICBhaWRsLmVuY2Fwc3VsYXRpb25UeXBlKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpIHsKLSAgICByZXR1cm4gQXVkaW9Qcm9maWxlOjpmcm9tUGFyY2VsYWJsZShhaWRsKTsKK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb25zdCBBdWRpb1Byb2ZpbGU6OkFpZGwmIGFpZGwsIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBBdWRpb1Byb2ZpbGU6OmZyb21QYXJjZWxhYmxlKGFpZGwsIGlzSW5wdXQpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+Ci1sZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGxlZ2FjeS0+dG9QYXJjZWxhYmxlKCk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZTo6QWlkbD4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBsZWdhY3ktPnRvUGFyY2VsYWJsZShpc0lucHV0KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgorYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2NvbW1vbihjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gQXVkaW9Qcm9maWxlOjpmcm9tQ29tbW9uUGFyY2VsYWJsZShhaWRsLCBpc0lucHV0KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlX2NvbW1vbihjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBsZWdhY3ktPnRvQ29tbW9uUGFyY2VsYWJsZShpc0lucHV0KTsKIH0KIAogc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQpAQCAtMzA3LDEwICszMjcsMTAgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpjb250YWlucyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBwcm9maWxlKSBjb25zdAorYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNvbnRhaW5zKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHByb2ZpbGUsIGJvb2wgaWdub3JlRHluYW1pY0ZsYWdzKSBjb25zdAogewogICAgIGZvciAoY29uc3QgYXV0byYgYXVkaW9Qcm9maWxlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGF1ZGlvUHJvZmlsZS0+ZXF1YWxzKHByb2ZpbGUpKSB7CisgICAgICAgIGlmIChhdWRpb1Byb2ZpbGUtPmVxdWFscyhwcm9maWxlLCBpZ25vcmVEeW5hbWljRmxhZ3MpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTMxOSw0MiArMzM5LDE2IEBACiAKIHZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIFByb2ZpbGVzOlxuIiwgc3BhY2VzLCAiIikpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBQcm9maWxlcyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLCBzaXplKCkpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgIGRzdC0+YXBwZW5kKHByZWZpeCk7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHByb2ZpbGVTdHI7Ci0gICAgICAgIGF0KGkpLT5kdW1wKCZwcm9maWxlU3RyLCBzcGFjZXMgKyA4KTsKKyAgICAgICAgYXQoaSktPmR1bXAoJnByb2ZpbGVTdHIsIHByZWZpeC5zaXplKCkpOwogICAgICAgICBkc3QtPmFwcGVuZChwcm9maWxlU3RyKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVWZWN0b3JTaXplKCp0aGlzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZhdWRpb1Byb2ZpbGUgOiAqdGhpcykgewotICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKCphdWRpb1Byb2ZpbGUpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICB0aGlzLT5jbGVhcigpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZXNpemVPdXRWZWN0b3IodGhpcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgdGhpcy0+YXQoaSkgPSBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9ERUZBVUxULCBBVURJT19DSEFOTkVMX05PTkUsIDAgLypzYW1wbGVSYXRlKi8pOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUodGhpcy0+YXQoaSkuZ2V0KCkpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgdGhpcy0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGJvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjplcXVhbHMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdGhlcikgY29uc3QKIHsKICAgICByZXR1cm4gc3RkOjplcXVhbChiZWdpbigpLCBlbmQoKSwgb3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCksCkBAIC0zNjMsMTQgKzM1NywzMSBAQAogICAgICAgICAgICAgICAgICAgICAgIH0pOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZVZlY3Rvcj4KLWFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPiYgYWlkbCkgewotICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvUHJvZmlsZVZlY3Rvcj4oYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKTsKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGRBbGxWYWxpZFByb2ZpbGVzKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlcykgeworICAgIGZvciAoY29uc3QgYXV0byYgYXVkaW9Qcm9maWxlIDogYXVkaW9Qcm9maWxlcykgeworICAgICAgICBpZiAoYXVkaW9Qcm9maWxlLT5pc1ZhbGlkKCkgJiYgIWNvbnRhaW5zKGF1ZGlvUHJvZmlsZSwgdHJ1ZSAvKmlnbm9yZUR5bmFtaWNGbGFncyovKSkgeworICAgICAgICAgICAgYWRkKGF1ZGlvUHJvZmlsZSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4+Ci1sZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBsZWdhY3kpIHsKLSAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPj4obGVnYWN5LCBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpBaWRsJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lcnM8QXVkaW9Qcm9maWxlVmVjdG9yPihhaWRsLmZpcnN0LCBhaWRsLnNlY29uZCwKKyAgICAgICAgICAgIFtpc0lucHV0XShjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlJiBwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGVTeXMmIHBzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShzdGQ6Om1ha2VfcGFpcihwLCBwcyksIGlzSW5wdXQpOworICAgICAgICAgICAgfSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlVmVjdG9yOjpBaWRsPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgbGVnYWN5LCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lclNwbGl0PAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlU3lzPj4obGVnYWN5LAorICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKHAsIGlzSW5wdXQpOworICAgICAgICAgICAgfSk7CiB9CiAKIEF1ZGlvUHJvZmlsZVZlY3RvciBpbnRlcnNlY3RBdWRpb1Byb2ZpbGVzKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgcHJvZmlsZXMxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKaW5kZXggNWNmZWE4MS4uNWZmYmZmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCkBAIC0zMCwxNiArMzAsMjAgQEAKIHsKIH0KIAotRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcykgOgotICAgICAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZShBdWRpb0RldmljZVR5cGVBZGRyKHR5cGUsIGFkZHJlc3MpKQorRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMpIDoKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoQXVkaW9EZXZpY2VUeXBlQWRkcih0eXBlLCBhZGRyZXNzKSwgZW5jb2RlZEZvcm1hdHMpCiB7CiB9CiAKLURldmljZURlc2NyaXB0b3JCYXNlOjpEZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2VUeXBlQWRkcikgOgorRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2VUeXBlQWRkciwgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cykgOgogICAgICAgICBBdWRpb1BvcnQoIiIsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGVBZGRyLm1UeXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSksCi0gICAgICAgIG1EZXZpY2VUeXBlQWRkcihkZXZpY2VUeXBlQWRkcikKKyAgICAgICAgbURldmljZVR5cGVBZGRyKGRldmljZVR5cGVBZGRyKSwKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKQogewogICAgIGlmIChtRGV2aWNlVHlwZUFkZHIuYWRkcmVzcygpLmVtcHR5KCkgJiYgYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobURldmljZVR5cGVBZGRyLm1UeXBlKSkgewogICAgICAgICBtRGV2aWNlVHlwZUFkZHIuc2V0QWRkcmVzcygiMCIpOwpAQCAtMTA2LDMyICsxMTAsMjMgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LAordm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRyYUluZm8sIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSkpOwogICAgIGlmIChtSWQgIT0gMCkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiUG9ydCBJRDogJWQ7ICIsIG1JZCkpOwogICAgIH0KLQogICAgIGlmIChleHRyYUluZm8gIT0gbnVsbHB0cikgewotICAgICAgICBkc3QtPmFwcGVuZChleHRyYUluZm8pOworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVzOyAiLCBleHRyYUluZm8pKTsKICAgICB9Ci0KLSAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gdHlwZTogJS00OHNcbiIsCi0gICAgICAgICAgICBzcGFjZXMsICIiLCA6OmFuZHJvaWQ6OnRvU3RyaW5nKG1EZXZpY2VUeXBlQWRkci5tVHlwZSkuY19zdHIoKSkpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigieyVzfVxuIiwKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGVBZGRyLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKSk7CiAKICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAiJSpzLSBzdXBwb3J0ZWQgZW5jYXBzdWxhdGlvbiBtb2RlczogJXVcbiIsIHNwYWNlcywgIiIsIG1FbmNhcHN1bGF0aW9uTW9kZXMpKTsKLSAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAiJSpzLSBzdXBwb3J0ZWQgZW5jYXBzdWxhdGlvbiBtZXRhZGF0YSB0eXBlczogJXVcbiIsCi0gICAgICAgICAgICBzcGFjZXMsICIiLCBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgIiUqc0VuY2Fwc3VsYXRpb24gbW9kZXM6ICV1LCBtZXRhZGF0YSB0eXBlczogJXVcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgICAgICAgIG1FbmNhcHN1bGF0aW9uTW9kZXMsIG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOwogCi0gICAgaWYgKG1EZXZpY2VUeXBlQWRkci5hZGRyZXNzKCkuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtRGV2aWNlVHlwZUFkZHIuZ2V0QWRkcmVzcygpKSk7Ci0gICAgfQotICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIHNwYWNlcywgdmVyYm9zZSk7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCBudWxscHRyLCB2ZXJib3NlKTsKIH0KIAogc3RkOjpzdHJpbmcgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIGNvbnN0CkBAIC0xNDgsNjAgKzE0Myw4MyBAQAogICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOwogfQogCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjaGVja0VxdWFsKGNvbnN0IFQmIGYxLCBjb25zdCBUJiBmMikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzMShmMS5iZWdpbigpLCBmMS5lbmQoKSk7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczIoZjIuYmVnaW4oKSwgZjIuZW5kKCkpOworICAgIHJldHVybiBzMSA9PSBzMjsKK30KKwogYm9vbCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6ZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiAmb3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG90aGVyICE9IG51bGxwdHIgJiYKICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXVkaW9Qb3J0Kj4odGhpcyktPmVxdWFscyhvdGhlcikgJiYKLSAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXVkaW9Qb3J0Q29uZmlnKj4odGhpcyktPmVxdWFscyhvdGhlcikgJiYKLSAgICAgICAgICAgbURldmljZVR5cGVBZGRyLmVxdWFscyhvdGhlci0+bURldmljZVR5cGVBZGRyKTsKKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXVkaW9Qb3J0Q29uZmlnKj4odGhpcyktPmVxdWFscyhvdGhlciwgdXNlSW5wdXRDaGFubmVsTWFzaygpKSAmJgorICAgICAgICAgICBtRGV2aWNlVHlwZUFkZHIuZXF1YWxzKG90aGVyLT5tRGV2aWNlVHlwZUFkZHIpICYmCisgICAgICAgICAgIGNoZWNrRXF1YWwobUVuY29kZWRGb3JtYXRzLCBvdGhlci0+bUVuY29kZWRGb3JtYXRzKTsKIH0KIAotCi1zdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnN1cHBvcnRzRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQotICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAobUVuY29kZWRGb3JtYXRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZGb3JtYXQgOiBtRW5jb2RlZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGRldkZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnQqIHBhcmNlbGFibGUpIGNvbnN0IHsKICAgICBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWxhYmxlKHBhcmNlbGFibGUpOwotICAgIEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUtPmFjdGl2ZUNvbmZpZyk7Ci0gICAgcGFyY2VsYWJsZS0+aWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChtSWQpKTsKKyAgICBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlLT5zeXMuYWN0aXZlQ29uZmlnLmhhbCwgdXNlSW5wdXRDaGFubmVsTWFzaygpKTsKKyAgICBwYXJjZWxhYmxlLT5oYWwuaWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChtSWQpKTsKKyAgICBwYXJjZWxhYmxlLT5zeXMuYWN0aXZlQ29uZmlnLmhhbC5wb3J0SWQgPSBwYXJjZWxhYmxlLT5oYWwuaWQ7CiAKLSAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0IGV4dDsKLSAgICBleHQuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKG1EZXZpY2VUeXBlQWRkcikpOwotICAgIGV4dC5lbmNhcHN1bGF0aW9uTW9kZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlRXh0OworICAgIGRldmljZUV4dC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhtRGV2aWNlVHlwZUFkZHIpKTsKKyAgICBkZXZpY2VFeHQuZW5jb2RlZEZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4+KAorICAgICAgICAgICAgICAgICAgICBtRW5jb2RlZEZvcm1hdHMsIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24pKTsKKyAgICBVTklPTl9TRVQocGFyY2VsYWJsZS0+aGFsLmV4dCwgZGV2aWNlLCBkZXZpY2VFeHQpOworICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMgZGV2aWNlU3lzOworICAgIGRldmljZVN5cy5lbmNhcHN1bGF0aW9uTW9kZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKG1FbmNhcHN1bGF0aW9uTW9kZXMpKTsKLSAgICBleHQuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIGRldmljZVN5cy5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKLSAgICBVTklPTl9TRVQocGFyY2VsYWJsZS0+ZXh0LCBkZXZpY2UsIHN0ZDo6bW92ZShleHQpKTsKKyAgICBVTklPTl9TRVQocGFyY2VsYWJsZS0+c3lzLmV4dCwgZGV2aWNlLCBkZXZpY2VTeXMpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOwotICAgIHJldHVybiBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKLSAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpOwotfQotCiBzdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpIHsKLSAgICBpZiAocGFyY2VsYWJsZS50eXBlICE9IG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpERVZJQ0UpIHsKKyAgICBpZiAocGFyY2VsYWJsZS5zeXMudHlwZSAhPSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvUG9ydDo6cmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpCi0gICAgICAgICAgICAgICAgICAgICAgPzogQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZS5hY3RpdmVDb25maWcpOworICAgICAgICAgICAgPzogQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbGFibGUoCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUuc3lzLmFjdGl2ZUNvbmZpZy5oYWwsIHVzZUlucHV0Q2hhbm5lbE1hc2soKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQgZXh0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhVTklPTl9HRVQocGFyY2VsYWJsZS5leHQsIGRldmljZSkpOworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlRXh0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIFVOSU9OX0dFVChwYXJjZWxhYmxlLmhhbC5leHQsIGRldmljZSkpOwogICAgIG1EZXZpY2VUeXBlQWRkciA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGV4dC5kZXZpY2UpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoZGV2aWNlRXh0LmRldmljZSkpOworICAgIG1FbmNvZGVkRm9ybWF0cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEZvcm1hdFZlY3Rvcj4oZGV2aWNlRXh0LmVuY29kZWRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KSk7CisgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2VTeXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgVU5JT05fR0VUKHBhcmNlbGFibGUuc3lzLmV4dCwgZGV2aWNlKSk7CiAgICAgbUVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2soZXh0LmVuY2Fwc3VsYXRpb25Nb2RlcykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGRldmljZVN5cy5lbmNhcHN1bGF0aW9uTW9kZXMpKTsKICAgICBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soZXh0LmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhkZXZpY2VTeXMuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HCmluZGV4IGY2ZDI0OWEuLmVmZTg0MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwpAQCAtMSw3ICsxLDE1IEBACiB7CiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewotICAgICAgICJuYW1lIjogImF1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QiCisgICAgICAibmFtZSI6ICJhdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0IgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKaW5kZXggMjA0YjM2NS4uYjZlNmM4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKQEAgLTQwLDYgKzQwLDggQEAKIGNvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsVXNiU2V0KCk7CiBjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZUluQWxsU2V0KCk7CiBjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZUluQWxsVXNiU2V0KCk7Citjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbEJsZVNldCgpOworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldCgpOwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3RhdGljIHN0ZDo6dmVjdG9yPFQ+IEludGVyc2VjdGlvbihjb25zdCBzdGQ6OnNldDxUPiYgYSwgY29uc3Qgc3RkOjpzZXQ8VD4mIGIpIHsKQEAgLTExMCwyNSArMTEyLDcgQEAKICAgICByZXR1cm4gdHlwZXM7CiB9CiAKLS8vIEZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeSBoZWxwZXIgZnVuY3Rpb24uIFJlbW92ZSB0aGlzIHdoZW4gZ2V0dGluZyByaWQgb2YgYWxsCi0vLyAgYml0IG1hc2sgdXNhZ2VzIG9mIGF1ZGlvIGRldmljZSB0eXBlcy4KLXN0YXRpYyBpbmxpbmUgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlc0Zyb21CaXRNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgewotICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXM7Ci0gICAgaWYgKCh0eXBlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pID09IDApIHsKLSAgICAgICAgZm9yIChhdXRvIGRldmljZVR5cGUgOiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BUlJBWSkgewotICAgICAgICAgICAgaWYgKCh0eXBlcyAmIGRldmljZVR5cGUpID09IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VUeXBlcy5pbnNlcnQoZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8gZGV2aWNlVHlwZSA6IEFVRElPX0RFVklDRV9JTl9BTExfQVJSQVkpIHsKLSAgICAgICAgICAgIGlmICgodHlwZXMgJiBkZXZpY2VUeXBlKSA9PSBkZXZpY2VUeXBlKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlVHlwZXMuaW5zZXJ0KGRldmljZVR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VUeXBlczsKLX0KK3N0ZDo6c3RyaW5nIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOwogCiBib29sIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsIHN0ZDo6c3RyaW5nICZzdHIpOwogCkBAIC0xMzcsNyArMTIxLDkgQEAKIC8qKgogICogUmV0dXJuIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBmb3IgZGV2aWNlIHR5cGVzLgogICovCi1zdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcyk7CitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIHsKKyAgICByZXR1cm4gZGV2aWNlVHlwZXNUb1N0cmluZyhkZXZpY2VUeXBlcyk7Cit9CiAKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oCmluZGV4IDhlZGNjNTguLjExYWEyMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRGV2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CkBAIC0zMiw2ICszMiw3IEBACiBjbGFzcyBBdWRpb0RldmljZVR5cGVBZGRyIDogcHVibGljIFBhcmNlbGFibGUgewogcHVibGljOgogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoKSA9IGRlZmF1bHQ7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcihjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJikgPSBkZWZhdWx0OwogCiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpOwogCkBAIC04OCw4ICs4OSw4IEBACiAKIC8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgogQ29udmVyc2lvblJlc3VsdDxBdWRpb0RldmljZVR5cGVBZGRyPgotYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EZXZpY2U+CithaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZSYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZT4KIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgbGVnYWN5KTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaAppbmRleCBhMDZiNjg2Li4xMDA4OGYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaApAQCAtMTYsMjMgKzE2LDIzIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2FpblN5cy5oPgogI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQXVkaW9HYWluOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIFBhcmNlbGFibGUKK2NsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spOwotICAgIHZpcnR1YWwgfkF1ZGlvR2FpbigpIHt9CisgICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCBpc0lucHV0KTsKKyAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSA9IGRlZmF1bHQ7CiAKICAgICB2b2lkIHNldE1vZGUoYXVkaW9fZ2Fpbl9tb2RlX3QgbW9kZSkgeyBtR2Fpbi5tb2RlID0gbW9kZTsgfQogICAgIGNvbnN0IGF1ZGlvX2dhaW5fbW9kZV90ICZnZXRNb2RlKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubW9kZTsgfQpAQCAtNzEsMjYgKzcxLDI0IEBACiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb0dhaW4+JiBvdGhlcikgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9HYWluKiBwYXJjZWxhYmxlKSBjb25zdDsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgcGFyY2VsYWJsZSk7CisgICAgdXNpbmcgQWlkbCA9IHN0ZDo6cGFpcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluLCBtZWRpYTo6QXVkaW9HYWluU3lzPjsKKyAgICBDb252ZXJzaW9uUmVzdWx0PEFpZGw+IHRvUGFyY2VsYWJsZSgpIGNvbnN0OworICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvR2Fpbj4+IGZyb21QYXJjZWxhYmxlKGNvbnN0IEFpZGwmIGFpZGwpOwogCiBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKLSAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKLSAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKKyAgICBib29sICAgICAgICAgICAgICBtSXNJbnB1dDsKKyAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbiA9IHt9OwogICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VGb3JWb2x1bWUgPSBmYWxzZTsKIH07CiAKIC8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0dhaW4+PgotYWlkbDJsZWdhY3lfQXVkaW9HYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgorYWlkbDJsZWdhY3lfQXVkaW9HYWluKGNvbnN0IEF1ZGlvR2Fpbjo6QWlkbCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2Fpbjo6QWlkbD4KIGxlZ2FjeTJhaWRsX0F1ZGlvR2Fpbihjb25zdCBzcDxBdWRpb0dhaW4+JiBsZWdhY3kpOwogCi1jbGFzcyBBdWRpb0dhaW5zIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPiwgcHVibGljIFBhcmNlbGFibGUKK2NsYXNzIEF1ZGlvR2FpbnMgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8c3A8QXVkaW9HYWluPj4KIHsKIHB1YmxpYzoKICAgICBib29sIGNhblVzZUZvclZvbHVtZSgpIGNvbnN0CkBAIC0xMDMsNyArMTAxLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGludDMyX3QgYWRkKGNvbnN0IHNwPEF1ZGlvR2Fpbj4gZ2FpbikKKyAgICBpbnQzMl90IGFkZChjb25zdCBzcDxBdWRpb0dhaW4+JiBnYWluKQogICAgIHsKICAgICAgICAgcHVzaF9iYWNrKGdhaW4pOwogICAgICAgICByZXR1cm4gMDsKQEAgLTExMSwxNCArMTA5LDE1IEBACiAKICAgICBib29sIGVxdWFscyhjb25zdCBBdWRpb0dhaW5zJiBvdGhlcikgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgdXNpbmcgQWlkbCA9IHN0ZDo6cGFpcjwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4+LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2FpblN5cz4+OwogfTsKIAogLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCiBDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2FpbnM+Ci1haWRsMmxlZ2FjeV9BdWRpb0dhaW5zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4+CithaWRsMmxlZ2FjeV9BdWRpb0dhaW5zKGNvbnN0IEF1ZGlvR2FpbnM6OkFpZGwmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5zOjpBaWRsPgogbGVnYWN5MmFpZGxfQXVkaW9HYWlucyhjb25zdCBBdWRpb0dhaW5zJiBsZWdhY3kpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oCmluZGV4IDFjZWUxYzkuLmQ2YTA5OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9HYWluLmg+CkBAIC0zMyw3ICszMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHVibGljIHZpcnR1YWwgUGFyY2VsYWJsZQorY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgogICAgIEF1ZGlvUG9ydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIDoKQEAgLTQ3LDYgKzQ3LDkgQEAKICAgICBhdWRpb19wb3J0X3R5cGVfdCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KICAgICBhdWRpb19wb3J0X3JvbGVfdCBnZXRSb2xlKCkgY29uc3QgeyByZXR1cm4gbVJvbGU7IH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncyk7CisgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiB1c2VJbnB1dENoYW5uZWxNYXNrKCkgPyBtRmxhZ3MuaW5wdXQgOiBtRmxhZ3Mub3V0cHV0OyB9CisKICAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbnMgJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9CiAgICAgY29uc3QgQXVkaW9HYWlucyAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KIApAQCAtNjksMTAgKzcyLDEwIEBACiAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZnZXRBdWRpb1Byb2ZpbGVzKCkgeyByZXR1cm4gbVByb2ZpbGVzOyB9CiAKICAgICB2b2lkIHNldEV4dHJhQXVkaW9EZXNjcmlwdG9ycygKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+IGV4dHJhQXVkaW9EZXNjcmlwdG9ycykgewogICAgICAgICBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzID0gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzOwogICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+ICZnZXRFeHRyYUF1ZGlvRGVzY3JpcHRvcnMoKSB7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiAmZ2V0RXh0cmFBdWRpb0Rlc2NyaXB0b3JzKCkgewogICAgICAgICByZXR1cm4gbUV4dHJhQXVkaW9EZXNjcmlwdG9yczsKICAgICB9CiAKQEAgLTkzLDE5ICs5Niw0NyBAQAogICAgICAgICAgICAgICAgICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSk7CiAgICAgfQogCi0gICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIGJvb2wgaXNEaXJlY3RPdXRwdXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgICAgICAoKG1GbGFncy5vdXRwdXQgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApOworICAgIH0KKworICAgIGJvb2wgaXNNbWFwKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkKKyAgICAgICAgICAgICAgICAmJiAoKChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChtRmxhZ3Mub3V0cHV0ICYgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICgobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKG1GbGFncy5pbnB1dCAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkpKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywKKyAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvID0gbnVsbHB0ciwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKICAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpIGNvbnN0OwogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgb3RoZXIpIGNvbnN0OwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpOwogCiAgICAgQXVkaW9HYWlucyBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKKyAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBpbnB1dCBvciBvdXRwdXQgc3RyZWFtcyB0aGF0IGNhbiBiZSBzaW11bHRhbmVvdXNseQorICAgIC8vIG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlLiBCeSBjb252ZW50aW9uIDAgbWVhbnMgbm8gbGltaXQuIFRvIHJlc3BlY3QKKyAgICAvLyBsZWdhY3kgYmVoYXZpb3IsIGluaXRpYWxpemVkIHRvIDEgZm9yIG91dHB1dCBwcm9maWxlcyBhbmQgMCBmb3IgaW5wdXQKKyAgICAvLyBwcm9maWxlcworICAgIC8vIEZJWE1FOiBJT1Byb2ZpbGUgY29kZSB1c2VkIHRoZSBzYW1lIHZhbHVlIGZvciBib3RoIGNhc2VzLgorICAgIHVpbnQzMl90IG1heE9wZW5Db3VudCA9IDE7CisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkKKyAgICAvLyBhY3RpdmUgZm9yIHRoaXMgcHJvZmlsZS4gQnkgY29udmVudGlvbiAwIG1lYW5zIG5vIGxpbWl0LiBUbyByZXNwZWN0CisgICAgLy8gbGVnYWN5IGJlaGF2aW9yLCBpbml0aWFsaXplZCB0byAwIGZvciBvdXRwdXQgcHJvZmlsZXMgYW5kIDEgZm9yIGlucHV0CisgICAgLy8gcHJvZmlsZXMKKyAgICAvLyBGSVhNRTogSU9Qcm9maWxlIGNvZGUgdXNlZCB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBjYXNlcy4KKyAgICB1aW50MzJfdCBtYXhBY3RpdmVDb3VudCA9IDE7CisgICAgLy8gTXV0ZSBkdXJhdGlvbiB3aGlsZSBjaGFuZ2luZyBkZXZpY2Ugb24gdGhpcyBvdXRwdXQgcHJvZmlsZS4KKyAgICB1aW50MzJfdCByZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zID0gMDsKKwogcHJvdGVjdGVkOgogICAgIHN0ZDo6c3RyaW5nICBtTmFtZTsKICAgICBhdWRpb19wb3J0X3R5cGVfdCBtVHlwZTsKQEAgLTExNCw3ICsxNDUsOCBAQAogCiAgICAgLy8gQXVkaW8gY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGRlZmluZWQgYnkgaGFyZHdhcmUgZGVzY3JpcHRvcnMgd2hlbiB0aGUgZm9ybWF0IGlzIHVucmVjb2duaXplZAogICAgIC8vIGJ5IHRoZSBwbGF0Zm9ybSwgZS5nLiBzaG9ydCBhdWRpbyBkZXNjcmlwdG9yIGluIEVESUQgZm9yIEhETUkuCi0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gbUV4dHJhQXVkaW9EZXNjcmlwdG9yczsKKyAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IC5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19OT05FIH07CiBwcml2YXRlOgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydD46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0X3Y3Pjo6dmFsdWUsIGludD4gPSAwPgpAQCAtMTMwLDcgKzE2Miw3IEBACiB9OwogCiAKLWNsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHB1YmxpYyB2aXJ0dWFsIFBhcmNlbGFibGUKK2NsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSA9IGRlZmF1bHQ7CkBAIC0xNDcsMTUgKzE3OSwxNiBAQAogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICBhdWRpb19pb19mbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCiAgICAgYm9vbCBoYXNHYWluQ29udHJvbGxlcihib29sIGNhblVzZUZvclZvbHVtZSA9IGZhbHNlKSBjb25zdDsKIAotICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdDsKKyAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+JiBvdGhlciwgYm9vbCBpc0lucHV0KSBjb25zdDsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnKiBwYXJjZWxhYmxlKSBjb25zdDsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgcGFyY2VsYWJsZSk7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0Q29uZmlnKiBwYXJjZWxhYmxlLCBib29sIGlzSW5wdXQpIGNvbnN0OworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZSgKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRDb25maWcmIHBhcmNlbGFibGUsIGJvb2wgaXNJbnB1dCk7CiAKIHByb3RlY3RlZDoKICAgICB1bnNpZ25lZCBpbnQgbVNhbXBsaW5nUmF0ZSA9IDB1OwpAQCAtMTYzLDYgKzE5Niw3IEBACiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW4gPSB7IC5pbmRleCA9IC0xIH07CisgICAgdW5pb24gYXVkaW9faW9fZmxhZ3MgbUZsYWdzID0geyBBVURJT19JTlBVVF9GTEFHX05PTkUgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKaW5kZXggNmEzNmU3OC4uNzlkZmQxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKQEAgLTE3LDExICsxNywxMCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTI5LDcgKzI4LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb1Byb2ZpbGUgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIFBhcmNlbGFibGUKK2NsYXNzIEF1ZGlvUHJvZmlsZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6CiAgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gY3JlYXRlRnVsbER5bmFtaWMoYXVkaW9fZm9ybWF0X3QgZHluYW1pY0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKQEAgLTcwLDcgKzY5LDcgQEAKICAgICB2b2lkIHNldER5bmFtaWNGb3JtYXQoYm9vbCBkeW5hbWljKSB7IG1Jc0R5bmFtaWNGb3JtYXQgPSBkeW5hbWljOyB9CiAgICAgYm9vbCBpc0R5bmFtaWNGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0OyB9CiAKLSAgICBib29sIGlzRHluYW1pYygpIHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CisgICAgYm9vbCBpc0R5bmFtaWMoKSBjb25zdCB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQogCiAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgZ2V0RW5jYXBzdWxhdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBtRW5jYXBzdWxhdGlvblR5cGU7IH0KICAgICB2b2lkIHNldEVuY2Fwc3VsYXRpb25UeXBlKGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90IGVuY2Fwc3VsYXRpb25UeXBlKSB7CkBAIC03OSwxMyArNzgsMTcgQEAKIAogICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAotICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIG90aGVyKSBjb25zdDsKKyAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBvdGhlciwgYm9vbCBpZ25vcmVEeW5hbWljRmxhZ3MgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgdXNpbmcgQWlkbCA9IHN0ZDo6cGFpcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlLCBtZWRpYTo6QXVkaW9Qcm9maWxlU3lzPjsKKyAgICBDb252ZXJzaW9uUmVzdWx0PEFpZGw+IHRvUGFyY2VsYWJsZShib29sIGlzSW5wdXQpIGNvbnN0OworICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+IGZyb21QYXJjZWxhYmxlKAorICAgICAgICAgICAgY29uc3QgQWlkbCYgYWlkbCwgYm9vbCBpc0lucHV0KTsKIAotICAgIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4gdG9QYXJjZWxhYmxlKCkgY29uc3Q7Ci0gICAgc3RhdGljIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4gZnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgcGFyY2VsYWJsZSk7CisgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPgorICAgICAgICAgICAgdG9Db21tb25QYXJjZWxhYmxlKGJvb2wgaXNJbnB1dCkgY29uc3Q7CisgICAgc3RhdGljIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4gZnJvbUNvbW1vblBhcmNlbGFibGUoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CiAKIHByaXZhdGU6CiAKQEAgLTEwNiwxMSArMTA5LDE2IEBACiAKIC8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgotbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUoY29uc3QgQXVkaW9Qcm9maWxlOjpBaWRsJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGU6OkFpZGw+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCi1jbGFzcyBBdWRpb1Byb2ZpbGVWZWN0b3IgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8c3A8QXVkaW9Qcm9maWxlPj4sIHB1YmxpYyBQYXJjZWxhYmxlCitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfY29tbW9uKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVfY29tbW9uKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKKworY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvUHJvZmlsZT4+CiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+QXVkaW9Qcm9maWxlVmVjdG9yKCkgPSBkZWZhdWx0OwpAQCAtMTMxLDIzICsxMzksMjUgQEAKICAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwogCi0gICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBwcm9maWxlKSBjb25zdDsKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHByb2ZpbGUsIGJvb2wgaWdub3JlRHluYW1pY0ZsYWdzID0gZmFsc2UpIGNvbnN0OwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKICAgICBib29sIGVxdWFscyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG90aGVyKSBjb25zdDsKKyAgICB2b2lkIGFkZEFsbFZhbGlkUHJvZmlsZXMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBhdWRpb1Byb2ZpbGVzKTsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB1c2luZyBBaWRsID0gc3RkOjpwYWlyPAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlU3lzPj47CiB9OwogCiBib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmcmlnaHQpOwogCiAvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KIENvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlVmVjdG9yPgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4+Ci1sZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6QWlkbCYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlVmVjdG9yOjpBaWRsPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCiBBdWRpb1Byb2ZpbGVWZWN0b3IgaW50ZXJzZWN0QXVkaW9Qcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIHByb2ZpbGVzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgcHJvZmlsZXMyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCmluZGV4IDE0MGNlMzYuLjFmMGM3NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaApAQCAtMzYsMTYgKzM2LDIxIEBACiBwdWJsaWM6CiAgICAgIC8vIE5vdGUgdGhhdCBlbXB0eSBuYW1lIHJlZmVycyBieSBjb252ZW50aW9uIHRvIGEgZ2VuZXJpYyBkZXZpY2UuCiAgICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvckJhc2UoYXVkaW9fZGV2aWNlc190IHR5cGUpOwotICAgIERldmljZURlc2NyaXB0b3JCYXNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcyk7Ci0gICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlVHlwZUFkZHIpOworICAgIERldmljZURlc2NyaXB0b3JCYXNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMgPSBGb3JtYXRWZWN0b3J7fSk7CisgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlVHlwZUFkZHIsCisgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzID0gRm9ybWF0VmVjdG9ye30pOwogCi0gICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvckJhc2UoKSB7fQorICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3JCYXNlKCkgPSBkZWZhdWx0OwogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHIubVR5cGU7IH0KICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5hZGRyZXNzKCk7IH0KICAgICB2b2lkIHNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpOwogICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGdldERldmljZVR5cGVBZGRyKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyOyB9CiAKKyAgICBjb25zdCBGb3JtYXRWZWN0b3ImIGVuY29kZWRGb3JtYXRzKCkgY29uc3QgeyByZXR1cm4gbUVuY29kZWRGb3JtYXRzOyB9CisgICAgYm9vbCBzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF1ZGlvUG9ydCo+KGNvbnN0X2Nhc3Q8RGV2aWNlRGVzY3JpcHRvckJhc2UqPih0aGlzKSk7CkBAIC02MCw3ICs2NSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0RW5jYXBzdWxhdGlvbk1vZGVzKHVpbnQzMl90IGVuY2Fwc3VsYXRpb25Nb2Rlcyk7CiAgICAgc3RhdHVzX3Qgc2V0RW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXModWludDMyX3QgZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpOwogCi0gICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwKKyAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywKICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvID0gbnVsbHB0ciwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAgICAgdm9pZCBsb2coKSBjb25zdDsKIApAQCAtNzQsMTQgKzc5LDEyIEBACiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIG90aGVyKSBjb25zdDsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnQqIHBhcmNlbGFibGUpIGNvbnN0OwogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwYXJjZWxhYmxlKTsKIAogcHJvdGVjdGVkOgogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgbURldmljZVR5cGVBZGRyOworICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOwogICAgIHVpbnQzMl90IG1FbmNhcHN1bGF0aW9uTW9kZXMgPSAwOwogICAgIHVpbnQzMl90IG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IDA7CiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icAppbmRleCBiYjlhNWYyLi4zZjFmYmVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icApAQCAtMTEsMTIgKzExLDIwIEBACiAgICAgbmFtZTogImF1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QiLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKwogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9hdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9hdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0LmNwcAppbmRleCAwNjhiNWQ4Li41MGQ4ZGM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL2F1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QuY3BwCkBAIC01Myw3ICs1Myw3IEBACiAKIEF1ZGlvR2FpbnMgZ2V0QXVkaW9HYWluc0ZvclRlc3QoKSB7CiAgICAgQXVkaW9HYWlucyBhdWRpb0dhaW5zOwotICAgIHNwPEF1ZGlvR2Fpbj4gYXVkaW9HYWluID0gbmV3IEF1ZGlvR2FpbigwIC8qaW5kZXgqLywgZmFsc2UgLyp1c2VJbkNoYW5uZWxNYXNrKi8pOworICAgIHNwPEF1ZGlvR2Fpbj4gYXVkaW9HYWluID0gbmV3IEF1ZGlvR2FpbigwIC8qaW5kZXgqLywgZmFsc2UgLyppc0lucHV0Ki8pOwogICAgIGF1ZGlvR2Fpbi0+c2V0TW9kZShBVURJT19HQUlOX01PREVfSk9JTlQpOwogICAgIGF1ZGlvR2Fpbi0+c2V0Q2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKICAgICBhdWRpb0dhaW4tPnNldE1pblZhbHVlSW5NYigtMzIwMCk7CkBAIC03NSw1NyArNzUsNzQgQEAKICAgICByZXR1cm4gYXVkaW9Qcm9maWxlczsKIH0KIAotVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9HYWluKSB7Ci0gICAgUGFyY2VsIGRhdGE7Ci0gICAgQXVkaW9HYWlucyBhdWRpb0dhaW5zID0gZ2V0QXVkaW9HYWluc0ZvclRlc3QoKTsKLQotICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZShhdWRpb0dhaW5zKSwgTk9fRVJST1IpOwotICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOwotICAgIEF1ZGlvR2FpbnMgYXVkaW9HYWluc0Zyb21QYXJjZWw7Ci0gICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoJmF1ZGlvR2FpbnNGcm9tUGFyY2VsKSwgTk9fRVJST1IpOwotICAgIEFTU0VSVF9UUlVFKGF1ZGlvR2FpbnNGcm9tUGFyY2VsLmVxdWFscyhhdWRpb0dhaW5zKSk7CitURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb1Byb2ZpbGUpIHsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KClbMF07CisgICAgYXV0byBjb252ID0gbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKHByb2ZpbGUsIGZhbHNlIC8qaXNJbnB1dCovKTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUoY29udi52YWx1ZSgpLCBmYWxzZSAvKmlzSW5wdXQqLyk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgQVNTRVJUX1RSVUUocHJvZmlsZS0+ZXF1YWxzKGNvbnZCYWNrLnZhbHVlKCkpKTsKIH0KIAogVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9Qcm9maWxlVmVjdG9yKSB7Ci0gICAgUGFyY2VsIGRhdGE7Ci0gICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXMgPSBnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KCk7CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIHByb2ZpbGVzID0gZ2V0QXVkaW9Qcm9maWxlVmVjdG9yRm9yVGVzdCgpOworICAgIGF1dG8gY29udiA9IGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3Rvcihwcm9maWxlcywgZmFsc2UgLyppc0lucHV0Ki8pOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3Rvcihjb252LnZhbHVlKCksIGZhbHNlIC8qaXNJbnB1dCovKTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBBU1NFUlRfVFJVRShwcm9maWxlcy5lcXVhbHMoY29udkJhY2sudmFsdWUoKSkpOworfQogCi0gICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKGF1ZGlvUHJvZmlsZXMpLCBOT19FUlJPUik7Ci0gICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7Ci0gICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXNGcm9tUGFyY2VsOwotICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKCZhdWRpb1Byb2ZpbGVzRnJvbVBhcmNlbCksIE5PX0VSUk9SKTsKLSAgICBBU1NFUlRfVFJVRShhdWRpb1Byb2ZpbGVzRnJvbVBhcmNlbC5lcXVhbHMoYXVkaW9Qcm9maWxlcykpOworVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9HYWluKSB7CisgICAgc3A8QXVkaW9HYWluPiBhdWRpb0dhaW4gPSBnZXRBdWRpb0dhaW5zRm9yVGVzdCgpWzBdOworICAgIGF1dG8gY29udiA9IGxlZ2FjeTJhaWRsX0F1ZGlvR2FpbihhdWRpb0dhaW4pOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGFpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb252LnZhbHVlKCkpOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvR2Fpbi0+ZXF1YWxzKGNvbnZCYWNrLnZhbHVlKCkpKTsKK30KKworVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9HYWlucykgeworICAgIEF1ZGlvR2FpbnMgYXVkaW9HYWlucyA9IGdldEF1ZGlvR2FpbnNGb3JUZXN0KCk7CisgICAgYXV0byBjb252ID0gbGVnYWN5MmFpZGxfQXVkaW9HYWlucyhhdWRpb0dhaW5zKTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5zKGNvbnYudmFsdWUoKSk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9HYWlucy5lcXVhbHMoY29udkJhY2sudmFsdWUoKSkpOwogfQogCiBURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb1BvcnQpIHsKLSAgICBQYXJjZWwgZGF0YTsKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvUG9ydCA9IG5ldyBBdWRpb1BvcnQoCiAgICAgICAgICAgICAiQXVkaW9Qb3J0TmFtZSIsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKICAgICBhdWRpb1BvcnQtPnNldEdhaW5zKGdldEF1ZGlvR2FpbnNGb3JUZXN0KCkpOwogICAgIGF1ZGlvUG9ydC0+c2V0QXVkaW9Qcm9maWxlcyhnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KCkpOwogCi0gICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKCphdWRpb1BvcnQpLCBOT19FUlJPUik7Ci0gICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYXVkaW9Qb3J0LT53cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkpOwogICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9Qb3J0RnJvbVBhcmNlbCA9IG5ldyBBdWRpb1BvcnQoCiAgICAgICAgICAgICAiIiwgQVVESU9fUE9SVF9UWVBFX05PTkUsIEFVRElPX1BPUlRfUk9MRV9OT05FKTsKLSAgICBBU1NFUlRfRVEoZGF0YS5yZWFkUGFyY2VsYWJsZShhdWRpb1BvcnRGcm9tUGFyY2VsLmdldCgpKSwgTk9fRVJST1IpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYXVkaW9Qb3J0RnJvbVBhcmNlbC0+cmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpKTsKICAgICBBU1NFUlRfVFJVRShhdWRpb1BvcnRGcm9tUGFyY2VsLT5lcXVhbHMoYXVkaW9Qb3J0KSk7CiB9CiAKIFRFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvUG9ydENvbmZpZykgeworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IGZhbHNlOwogICAgIFBhcmNlbCBkYXRhOwogICAgIHNwPEF1ZGlvUG9ydENvbmZpZz4gYXVkaW9Qb3J0Q29uZmlnID0gbmV3IEF1ZGlvUG9ydENvbmZpZ1Rlc3RTdHViKCk7CiAgICAgYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZygmVEVTVF9BVURJT19QT1JUX0NPTkZJRyk7Ci0KLSAgICBBU1NFUlRfRVEoZGF0YS53cml0ZVBhcmNlbGFibGUoKmF1ZGlvUG9ydENvbmZpZyksIE5PX0VSUk9SKTsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0Q29uZmlnIHBhcmNlbGFibGV7fTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvUG9ydENvbmZpZy0+d3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUsIGlzSW5wdXQpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRhdGEud3JpdGVQYXJjZWxhYmxlKHBhcmNlbGFibGUpKTsKICAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0Q29uZmlnIHBhcmNlbGFibGVGcm9tUGFyY2Vse307CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkYXRhLnJlYWRQYXJjZWxhYmxlKCZwYXJjZWxhYmxlRnJvbVBhcmNlbCkpOwogICAgIHNwPEF1ZGlvUG9ydENvbmZpZz4gYXVkaW9Qb3J0Q29uZmlnRnJvbVBhcmNlbCA9IG5ldyBBdWRpb1BvcnRDb25maWdUZXN0U3R1YigpOwotICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKGF1ZGlvUG9ydENvbmZpZ0Zyb21QYXJjZWwuZ2V0KCkpLCBOT19FUlJPUik7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9Qb3J0Q29uZmlnRnJvbVBhcmNlbC0+ZXF1YWxzKGF1ZGlvUG9ydENvbmZpZykpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYXVkaW9Qb3J0Q29uZmlnRnJvbVBhcmNlbC0+cmVhZEZyb21QYXJjZWxhYmxlKAorICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlRnJvbVBhcmNlbCwgaXNJbnB1dCkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvUG9ydENvbmZpZ0Zyb21QYXJjZWwtPmVxdWFscyhhdWRpb1BvcnRDb25maWcsIGlzSW5wdXQpKTsKIH0KIAogVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nRGV2aWNlRGVzY3JpcHRvckJhc2UpIHsKLSAgICBQYXJjZWwgZGF0YTsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gZGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwogICAgIGRlc2MtPnNldEdhaW5zKGdldEF1ZGlvR2FpbnNGb3JUZXN0KCkpOwogICAgIGRlc2MtPnNldEF1ZGlvUHJvZmlsZXMoZ2V0QXVkaW9Qcm9maWxlVmVjdG9yRm9yVGVzdCgpKTsKQEAgLTEzNSwxMCArMTUyLDEwIEBACiAgICAgQVNTRVJUX0VRKGRlc2MtPnNldEVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKAogICAgICAgICAgICAgQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX0FMTF9QT1NJVElPTl9CSVRTKSwgTk9fRVJST1IpOwogCi0gICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKCpkZXNjKSwgTk9fRVJST1IpOwotICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlc2MtPndyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKSk7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRlc2NGcm9tUGFyY2VsID0gbmV3IERldmljZURlc2NyaXB0b3JCYXNlKEFVRElPX0RFVklDRV9OT05FKTsKLSAgICBBU1NFUlRfRVEoZGF0YS5yZWFkUGFyY2VsYWJsZShkZXNjRnJvbVBhcmNlbC5nZXQoKSksIE5PX0VSUk9SKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlc2NGcm9tUGFyY2VsLT5yZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSkpOwogICAgIEFTU0VSVF9UUlVFKGRlc2NGcm9tUGFyY2VsLT5lcXVhbHMoZGVzYykpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAppbmRleCBiZDI0Yzg0Li41ZjYzZThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKQEAgLTI3LDkgKzI3LDExIEBACiAgICAgICAgICJsaWJhdWRpb2hhbEA1LjAiLAogICAgICAgICAibGliYXVkaW9oYWxANi4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDcuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA3LjEiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCAzMjVhNTQ3Li41YWQyNmZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCkBAIC0yMSw4ICsyMywxMCBAQAogCiAvLyBzdGF0aWMKIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKICAgICByZXR1cm4gY3JlYXRlUHJlZmVycmVkSW1wbDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4oCi0gICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpbyIsICJJRGV2aWNlc0ZhY3RvcnkiKTsKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvInMsICJJRGV2aWNlc0ZhY3RvcnkicyksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3QicywgIklFZmZlY3RzRmFjdG9yeSJzKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCBiYzNiNGMxLi44YTI4ZjY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCkBAIC0yMSw4ICsyMywxMCBAQAogCiAvLyBzdGF0aWMKIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKICAgICByZXR1cm4gY3JlYXRlUHJlZmVycmVkSW1wbDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4oCi0gICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3QiLCAiSUVmZmVjdHNGYWN0b3J5Iik7CisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3QicywgIklFZmZlY3RzRmFjdG9yeSJzKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvInMsICJJRGV2aWNlc0ZhY3RvcnkicykpOwogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcAppbmRleCBlNDIwZDA3Li41OTBmZWM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0xNiw2ICsxNiwxMCBAQAogCiAjZGVmaW5lIExPR19UQUcgIkZhY3RvcnlIYWxIaWRsIgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTI4LDE0ICszMiwxNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQ6OmRldGFpbCB7CiAKIG5hbWVzcGFjZSB7Ci0vKiogU3VwcG9ydGVkIEhBTCB2ZXJzaW9ucywgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KKy8qKiBTdXBwb3J0ZWQgSEFMIHZlcnNpb25zLCBmcm9tIG1vc3QgcmVjZW50IHRvIGxlYXN0IHJlY2VudC4KICAqLwotY29uc3QgY2hhciogc0F1ZGlvSEFMVmVyc2lvbnNbXSA9IHsKLSAgICAiNy4wIiwKLSAgICAiNi4wIiwKLSAgICAiNS4wIiwKLSAgICAiNC4wIiwKLSAgICBudWxscHRyCisjZGVmaW5lIENPTkNfVkVSU0lPTihtYWosIG1pbikgI21haiAiLiIgI21pbgorI2RlZmluZSBERUNMQVJFX1ZFUlNJT04obWFqLCBtaW4pIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bWFrZV9wYWlyKG1haiwgbWluKSwgQ09OQ19WRVJTSU9OKG1haiwgbWluKSkKK3N0YXRpYyBjb25zdGV4cHIgc3RkOjphcnJheTxzdGQ6OnBhaXI8c3RkOjpwYWlyPGludCwgaW50PiwgY29uc3QgY2hhcio+LCA1PiBzQXVkaW9IQUxWZXJzaW9ucyA9IHsKKyAgICBERUNMQVJFX1ZFUlNJT04oNywgMSksCisgICAgREVDTEFSRV9WRVJTSU9OKDcsIDApLAorICAgIERFQ0xBUkVfVkVSU0lPTig2LCAwKSwKKyAgICBERUNMQVJFX1ZFUlNJT04oNSwgMCksCisgICAgREVDTEFSRV9WRVJTSU9OKDQsIDApCiB9OwogCiBib29sIGNyZWF0ZUhhbFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZlcnNpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2UsCkBAIC05MywxMSArOTksMjIgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLXZvaWQqIGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2UpIHsKLSAgICBmb3IgKGF1dG8gdmVyc2lvbiA9IGRldGFpbDo6c0F1ZGlvSEFMVmVyc2lvbnM7IHZlcnNpb24gIT0gbnVsbHB0cjsgKyt2ZXJzaW9uKSB7Ci0gICAgICAgIHZvaWQqIHJhd0ludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChoYXNIYWxTZXJ2aWNlKHBhY2thZ2UsICp2ZXJzaW9uLCBpbnRlcmZhY2UpCi0gICAgICAgICAgICAgICAgJiYgY3JlYXRlSGFsU2VydmljZSgqdmVyc2lvbiwgaW50ZXJmYWNlLCAmcmF3SW50ZXJmYWNlKSkgewordm9pZCogY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBJbnRlcmZhY2VOYW1lJiBpZmFjZSwgY29uc3QgSW50ZXJmYWNlTmFtZSYgc2libGluZ0lmYWNlKSB7CisgICAgYXV0byBmaW5kTW9zdFJlY2VudFZlcnNpb24gPSBbXShjb25zdCBJbnRlcmZhY2VOYW1lJiBpZmFjZSkgeworICAgICAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGRldGFpbDo6c0F1ZGlvSEFMVmVyc2lvbnMuYmVnaW4oKSwgZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgYXV0byYgdikgeyByZXR1cm4gaGFzSGFsU2VydmljZShpZmFjZS5maXJzdCwgdi5zZWNvbmQsIGlmYWNlLnNlY29uZCk7IH0pOworICAgIH07CisgICAgYXV0byBpZmFjZVZlcnNpb25JdCA9IGZpbmRNb3N0UmVjZW50VmVyc2lvbihpZmFjZSk7CisgICAgYXV0byBzaWJsaW5nVmVyc2lvbkl0ID0gZmluZE1vc3RSZWNlbnRWZXJzaW9uKHNpYmxpbmdJZmFjZSk7CisgICAgaWYgKGlmYWNlVmVyc2lvbkl0ICE9IGRldGFpbDo6c0F1ZGlvSEFMVmVyc2lvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIHNpYmxpbmdWZXJzaW9uSXQgIT0gZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgLy8gc2FtZSBtYWpvciB2ZXJzaW9uCisgICAgICAgICAgICBpZmFjZVZlcnNpb25JdC0+Zmlyc3QuZmlyc3QgPT0gc2libGluZ1ZlcnNpb25JdC0+Zmlyc3QuZmlyc3QpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGlicmFyeVZlcnNpb24gPQorICAgICAgICAgICAgICAgIGlmYWNlVmVyc2lvbkl0LT5maXJzdCA+PSBzaWJsaW5nVmVyc2lvbkl0LT5maXJzdCA/CisgICAgICAgICAgICAgICAgaWZhY2VWZXJzaW9uSXQtPnNlY29uZCA6IHNpYmxpbmdWZXJzaW9uSXQtPnNlY29uZDsKKyAgICAgICAgdm9pZCogcmF3SW50ZXJmYWNlOworICAgICAgICBpZiAoY3JlYXRlSGFsU2VydmljZShsaWJyYXJ5VmVyc2lvbiwgaWZhY2Uuc2Vjb25kLCAmcmF3SW50ZXJmYWNlKSkgewogICAgICAgICAgICAgcmV0dXJuIHJhd0ludGVyZmFjZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmF1ZGlvaGFsL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU1YTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNOYXRpdmVNZWRpYUFBdWRpb1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8uQUF1ZGlvVGVzdHMjQUF1ZGlvQmFzaWMuKiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCmluZGV4IGEyYzZlOGEuLmQzMDg4M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKQEAgLTcsMjMgKzcsMjggQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxfZGVmYXVsdCIsCi0KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX2NvcmVfaGFsX2NsaWVudF9zb3VyY2VzIiwKICAgICBzcmNzOiBbCi0gICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCi0KLSAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKICAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKICAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCiAgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCiAgICAgXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fZWZmZWN0X2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgc3JjczogWworICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxfZGVmYXVsdCIsCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKQEAgLTUwLDYgKzU1LDcgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCkBAIC02NSw2ICs3MSwxMSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA0LjAiLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fY29yZV9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiOmF1ZGlvX2VmZmVjdF9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwIiwKKyAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLApAQCAtODMsNiArOTQsMTEgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWxANS4wIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX2NvcmVfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIjphdWRpb19lZmZlY3RfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcCIsCisgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMC11dGlsIiwKQEAgLTEwMSw2ICsxMTcsMTEgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWxANi4wIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX2NvcmVfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIjphdWRpb19lZmZlY3RfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcCIsCisgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDYuMC11dGlsIiwKQEAgLTExNiwxNiArMTM3LDQxIEBACiAgICAgXQogfQogCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsLmVmZmVjdEA3LjAiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fZWZmZWN0X2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMC11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAtdXRpbCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj03IiwKKyAgICAgICAgIi1ETUlOT1JfVkVSU0lPTj0wIiwKKyAgICAgICAgIi1pbmNsdWRlIGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvbk1hY3JvLmgiLAorICAgIF0KK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA3LjAiLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKLSAgICBzaGFyZWRfbGliczogWworICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19jb3JlX2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtZW51bXMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMC11dGlsIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANy4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANy4wLXV0aWwiLAorICAgICAgICAibGliYXVkaW9oYWwuZWZmZWN0QDcuMCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj03IiwKQEAgLTEzMywzICsxNzksMzEgQEAKICAgICAgICAgIi1pbmNsdWRlIGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvbk1hY3JvLmgiLAogICAgIF0KIH0KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA3LjEiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fY29yZV9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4xLWVudW1zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMS11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMS11dGlsIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsLmVmZmVjdEA3LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NyIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MSIsCisgICAgICAgICItRENPTU1PTl9UWVBFU19NSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLURDT1JFX1RZUEVTX01JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKaW5kZXggNTkxMjJjNy4uNmUyYzgzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMTcsMzEgKzE3LDI1IEBACiAjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCiAjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAordGVtcGxhdGU8dHlwZW5hbWUgSGFsUmVzdWx0PgogY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewogICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7CisgICAgdXNpbmcgSGFsUmVzdWx0Q29udmVydGVyID0gc3RkOjpmdW5jdGlvbjxzdGF0dXNfdChjb25zdCBIYWxSZXN1bHQmKT47CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUNsYXNzTmFtZTsKIAotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7CisgICAgQ29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIEhhbFJlc3VsdENvbnZlcnRlciByZXN1bHRDb252KQorICAgICAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSksIG1SZXN1bHRDb252ZXJ0ZXIocmVzdWx0Q29udikge30KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgeworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CiAgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KICAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKQEAgLTUxLDM4ICs0NSw0MiBAQAogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48VD4mIHJldCkgewogICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Q29yZVJlc3VsdD4mIHJldCkgeworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48SGFsUmVzdWx0PiYgcmV0KSB7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBtUmVzdWx0Q29udmVydGVyKHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBDb3JlUmVzdWx0IHJldHZhbCkgeworICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjxUPiYgcmV0LCBIYWxSZXN1bHQgcmV0dmFsKSB7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBtUmVzdWx0Q29udmVydGVyKHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGFzc05hbWU7CiAgICAgfQogCiAgIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKKyAgICBIYWxSZXN1bHRDb252ZXJ0ZXIgbVJlc3VsdENvbnZlcnRlcjsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgICAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLmNfc3RyKCksIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7CisgICAgfQogfTsKIAotfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5jcHAKaW5kZXggMzJlYWEzMS4uMmFjOGE0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCkBAIC0yMSwxNiArMjEsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT047CiAKIC8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKK3N0YXR1c190IENvcmVDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKICAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwogICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwpAQCAtNzUsNyArNzUsNyBAQAogfQogCiAvLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKK3N0YXR1c190IENvcmVDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKICAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTEsNyArOTEsNyBAQAogfQogCiAvLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKK3ZvaWQgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewpAQCAtMTAwLDI1ICsxMDAsMjggQEAKICAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKIH0KIAotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgeworQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGw8Q29yZVJlc3VsdD4oY2xhc3NOYW1lLCBhbmFseXplUmVzdWx0KSB7fQorCisvLyBzdGF0aWMKK3ZvaWQgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjphcmdzRnJvbUhhbCgKKyAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsQXJncykgeworICAgIGhpZGxBcmdzLT5yZXNpemUoYXJncy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7ICsraSkgeworICAgICAgICAoKmhpZGxBcmdzKVtpXSA9IFN0cmluZzgoYXJnc1tpXSkuY19zdHIoKTsKKyAgICB9CiB9CiAKIC8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKK3N0YXR1c190IENvcmVDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBDb3JlUmVzdWx0JiByZXN1bHQpIHsKICAgICBzd2l0Y2ggKHJlc3VsdCkgewogICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKICAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDc2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09SRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT1JFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0NPUkVfVFlQRVNfRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6UmVzdWx0OworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENvcmVDb252ZXJzaW9uSGVscGVySGlkbCA6IHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbDxDb3JlUmVzdWx0PiB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7CisgICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7CisgICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKKyAgICBzdGF0aWMgdm9pZCBhcmdzRnJvbUhhbChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxBcmdzKTsKKworICAgIENvcmVDb252ZXJzaW9uSGVscGVySGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBDb3JlUmVzdWx0JiByZXN1bHQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09SRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCmluZGV4IDAyZDY2YWUuLjBjZGY2MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKQEAgLTMwLDI3ICszMiw0MyBAQAogI2luY2x1ZGUgPHV0aWwvQ29yZVV0aWxzLmg+CiAKICNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgogI2luY2x1ZGUgIlBhcmFtZXRlclV0aWxzLmgiCiAjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpDb3JlVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkNvcmVVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOwogCi11c2luZyBFZmZlY3RIYWxIaWRsID0gOjphbmRyb2lkOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RIYWxIaWRsOworI2RlZmluZSBUSU1FX0NIRUNLKCkgYXV0byB0aW1lQ2hlY2sgPSBcCisgICAgICAgIG1lZGlhdXRpbHM6Om1ha2VUaW1lQ2hlY2tTdGF0c0ZvckNsYXNzTWV0aG9kKGdldENsYXNzTmFtZSgpLCBfX2Z1bmNfXykKIAotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7CitEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZUhhbEhpZGwiKSwgbURldmljZShkZXZpY2UpIHsKK30KKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZUhhbEhpZGwiKSwKKyNpZiBNQUpPUl9WRVJTSU9OIDw9IDYgfHwgKE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDApCisgICAgICAgICAgbURldmljZShkZXZpY2UpLAorI2VuZGlmCisgICAgICAgICAgbVByaW1hcnlEZXZpY2UoZGV2aWNlKSB7CisjaWYgTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMQorICAgIGF1dG8gZ2V0RGV2aWNlUmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldERldmljZSgpOworICAgIGlmIChnZXREZXZpY2VSZXQuaXNPaygpKSB7CisgICAgICAgIG1EZXZpY2UgPSBnZXREZXZpY2VSZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbGwgdG8gSVByaW1hcnlEZXZpY2UuZ2V0RGV2aWNlIGhhcyBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICBnZXREZXZpY2VSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisjZW5kaWYKIH0KIAogRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7CkBAIC03MCwyMiArODgsMjYgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1EZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKApAQCAtOTksMTcgKzEyMSwyMCBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCkBAIC0xMjMsMTEgKzE0OCwxMyBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKQEAgLTE0MSw2ICsxNjgsNyBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwpAQCAtMTUxLDYgKzE3OSw3IEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIHZhbHVlcy0+Y2xlYXIoKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7CkBAIC0xNzEsNiArMjAwLDcgQEAKIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAogICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwogICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKQEAgLTE5Myw2ICsyMjMsNyBAQAogICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCiAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCiAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6ZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlVHlwZSwgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwpAQCAtMjA0LDE3ICsyMzUsMzIgQEAKICAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KKworI2lmICEoTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMSkKKyAgICAvL1RPRE86IGIvMTkzNDk2MTgwIHVzZSBzcGF0aWFsaXplciBmbGFnIGF0IGF1ZGlvIEhBTCB3aGVuIGF2YWlsYWJsZQorICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpOworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgICAgICAgICAoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOworICAgIH0KKyNlbmRpZgorCiAgICAgQ29yZVV0aWxzOjpBdWRpb091dHB1dEZsYWdzIGhpZGxGbGFnczsKICAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjphdWRpb091dHB1dEZsYWdzRnJvbUhhbChmbGFncywgJmhpZGxGbGFncyk7IHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisjaWYgTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMQorICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtXzdfMSgKKyNlbHNlCiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCisjZW5kaWYKICAgICAgICAgICAgIGhhbmRsZSwgaGlkbERldmljZSwgaGlkbENvbmZpZywgaGlkbEZsYWdzLAogI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAogICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCiAjZW5kaWYKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ+JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewogICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKQEAgLTIzNCw2ICsyODAsNyBAQAogICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAogICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAogICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKICAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CkBAIC0yODQsNyArMzMxLDkgQEAKICNlbmRpZgogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICBoYW5kbGUsIGhpZGxEZXZpY2UsIGhpZGxDb25maWcsIGhpZGxGbGFncywgc2lua01ldGFkYXRhLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluPiYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOwpAQCAtMjk1LDYgKzM0NCw3IEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwogfQpAQCAtMzA1LDYgKzM1NSw3IEBACiAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCiAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAocGF0Y2ggPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKIApAQCAtMzUwLDYgKzQwMSw3IEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7CiB9CkBAIC0zNzIsMTAgKzQyNCwxMiBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgcmV0dXJuIGdldEF1ZGlvUG9ydEltcGwocG9ydCk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICNpZiBNQUpPUl9WRVJTSU9OID49IDcKICAgICByZXR1cm4gZ2V0QXVkaW9Qb3J0SW1wbChwb3J0KTsKICNlbHNlCkBAIC0zOTYsNiArNDUwLDcgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwogICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CkBAIC00MTAsNiArNDY1LDcgQEAKIH0KICNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY3JvcGhvbmVzKApAQCAtNDMwLDEwICs0ODYsMTAgQEAKICNpZiBNQUpPUl9WRVJTSU9OID49IDYKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmFkZERldmljZUVmZmVjdCgKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGREZXZpY2VFZmZlY3QiLCBtRGV2aWNlLT5hZGREZXZpY2VFZmZlY3QoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1BvcnRIYW5kbGU+KGRldmljZSksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0SGFuZGxlPihkZXZpY2UpLCBlZmZlY3QtPmVmZmVjdElkKCkpKTsKIH0KICNlbHNlCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjphZGREZXZpY2VFZmZlY3QoCkBAIC00NDUsMTAgKzUwMSwxMCBAQAogI2lmIE1BSk9SX1ZFUlNJT04gPj0gNgogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVtb3ZlRGV2aWNlRWZmZWN0KAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZURldmljZUVmZmVjdCIsIG1EZXZpY2UtPnJlbW92ZURldmljZUVmZmVjdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvUG9ydEhhbmRsZT4oZGV2aWNlKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1BvcnRIYW5kbGU+KGRldmljZSksIGVmZmVjdC0+ZWZmZWN0SWQoKSkpOwogfQogI2Vsc2UKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbW92ZURldmljZUVmZmVjdCgKQEAgLTQ1NywxMSArNTEzLDU0IEBACiB9CiAjZW5kaWYKIAotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldENvbm5lY3RlZFN0YXRlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0LCBib29sIGNvbm5lY3RlZCkgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAxCisgICAgaWYgKHN1cHBvcnRzU2V0Q29ubmVjdGVkU3RhdGU3XzEpIHsKKyAgICAgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgICAgICBpZiAoc3RhdHVzX3QgcmVzdWx0ID0gSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOyByZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbURldmljZS0+c2V0Q29ubmVjdGVkU3RhdGVfN18xKGhpZGxQb3J0LCBjb25uZWN0ZWQpOworICAgICAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0ICE9IFJlc3VsdDo6Tk9UX1NVUFBPUlRFRCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldENvbm5lY3RlZFN0YXRlXzdfMSIsIHJldCk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0c1NldENvbm5lY3RlZFN0YXRlN18xID0gZmFsc2U7CisgICAgfQorI2VuZGlmCisgICAgRGV2aWNlQWRkcmVzcyBoaWRsQWRkcmVzczsKKyAgICBpZiAoc3RhdHVzX3QgcmVzdWx0ID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgICAgICAgICAgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlLCBwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsICZoaWRsQWRkcmVzcyk7CisgICAgICAgICAgICByZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldENvbm5lY3RlZFN0YXRlIiwgbURldmljZS0+c2V0Q29ubmVjdGVkU3RhdGUoaGlkbEFkZHJlc3MsIGNvbm5lY3RlZCkpOworfQorCitlcnJvcjo6UmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4gRGV2aWNlSGFsSGlkbDo6Z2V0SHdBdlN5bmMoKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGF1ZGlvX2h3X3N5bmNfdCB2YWx1ZTsKKyAgICBSZXN1bHQgcmVzdWx0OworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRId0F2U3luYyhbJnZhbHVlLCAmcmVzdWx0XShSZXN1bHQgciwgYXVkaW9faHdfc3luY190IHYpIHsKKyAgICAgICAgdmFsdWUgPSB2OworICAgICAgICByZXN1bHQgPSByOworICAgIH0pOworICAgIFJFVFVSTl9JRl9FUlJPUihwcm9jZXNzUmV0dXJuKCJnZXRId0F2U3luYyIsIHJldCwgcmVzdWx0KSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKICAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsQXJnczsKKyAgICBhcmdzRnJvbUhhbChhcmdzLCAmaGlkbEFyZ3MpOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCBoaWRsQXJncyk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CiAKICAgICAvLyBUT0RPKGIvMTExOTk3ODY3LCBiLzE3NzI3MTk1OCkgIFdvcmthcm91bmQgLSByZW1vdmUgd2hlbiBmaXhlZC4KQEAgLTQ3OCw1ICs1NzcsNCBAQAogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKaW5kZXggMmM4NDdjZi4uZjY1MTliNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTIwLDE3ICsyMCwxMyBAQAogI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworI2luY2x1ZGUgIkNvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCi1jbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCitjbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvcmVDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6CiAgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KQEAgLTExOSwxNSArMTE1LDQwIEBACiAgICAgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcyBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIEhBTCBxdWVyeSB3aGVuIG1vdmluZyB0byBBSURMIEhBTC4KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIEhBTCBxdWVyeSB3aGVuIG1vdmluZyB0byBBSURMIEhBTC4KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgSEFMIHF1ZXJ5IHdoZW4gbW92aW5nIHRvIEFJREwgSEFMLgorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0Q29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKKworICAgIGVycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiBnZXRId0F2U3luYygpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U+IG1EZXZpY2U7CisgICAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOworICAgIGJvb2wgc3VwcG9ydHNTZXRDb25uZWN0ZWRTdGF0ZTdfMSA9IHRydWU7CiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKyAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZT4mIGRldmljZSk7CisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbCgKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U+JiBkZXZpY2UpOwogCiAgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KICAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7CkBAIC0xMzUsNyArMTU2LDYgQEAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsUG9ydD4gc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0SW1wbChIYWxQb3J0ICpwb3J0KTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdkYzFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VUeXBlLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZVR5cGUsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCAvKm91dHB1dERldmljZSovLAotICAgICAgICBjb25zdCBjaGFyICovKm91dHB1dERldmljZUFkZHJlc3MqLywKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIHsKLSNpZiBNQUpPUl9WRVJTSU9OID49IDcKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgLy8gZ2V0X2F1ZGlvX3BvcnRfdjcgaXMgbWFuZGF0b3J5IGlmIGxlZ2FjeSBIQUwgc3VwcG9ydCB0aGlzIEFQSSB2ZXJzaW9uLgotICAgICAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnRfdjcobURldiwgcG9ydCk7Ci0gICAgfQotI2VuZGlmCi0gICAgc3RydWN0IGF1ZGlvX3BvcnQgYXVkaW9Qb3J0ID0ge307Ci0gICAgYXVkaW9fcG9wdWxhdGVfYXVkaW9fcG9ydChwb3J0LCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvcnQoJmF1ZGlvUG9ydCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0X3Y3KCZhdWRpb1BvcnQsIHBvcnQpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLSNpZiBNQUpPUl9WRVJTSU9OID09IDIKLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0jZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYKLQotLy8gTG9jYWwgSEFMIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0cwotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmFkZERldmljZUVmZmVjdCgKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UgX191bnVzZWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0IF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVtb3ZlRGV2aWNlRWZmZWN0KAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSBfX3VudXNlZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmI1MTBiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKaW5kZXggMWMwZWFjYi4uNDA2OWE2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMjYsMTkgKzI2LDE3IEBACiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgogI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpSZXN1bHQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU1hbmFnZXI7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiBjbGFzcyBTZXJ2aWNlTm90aWZpY2F0aW9uTGlzdGVuZXIgOiBwdWJsaWMgSVNlcnZpY2VOb3RpZmljYXRpb24gewogICBwdWJsaWM6CkBAIC0xMTUsMTQgKzExMywzNyBAQAogICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CiAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwogICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IGZhY3RvcmllcykgewotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gZmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgICAgICBoaWRsSWQsCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldDsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkgPT0gMCkgeworICAgICAgICAgICAgLy8gSW4gVjcuMSBpdCdzIG5vdCBwb3NzaWJsZSB0byBjYXN0IElEZXZpY2UgYmFjayB0byBJUHJpbWFyeURldmljZSwKKyAgICAgICAgICAgIC8vIHRodXMgb3BlblByaW1hcnlEZXZpY2UgbXVzdCBiZSB1c2VkLgorI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKKyAgICAgICAgICAgIHJldCA9IGZhY3RvcnktPm9wZW5QcmltYXJ5RGV2aWNlXzdfMSgKKyNlbHNlCisgICAgICAgICAgICByZXQgPSBmYWN0b3J5LT5vcGVuUHJpbWFyeURldmljZSgKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklQcmltYXJ5RGV2aWNlPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKKyAgICAgICAgICAgIHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2VfN18xKAorI2Vsc2UKKyAgICAgICAgICAgIHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2UoCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaGlkbElkLAorICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgICAgICBzd2l0Y2ggKHJldHZhbCkgewogICAgICAgICAgICAgLy8gRGV2aWNlIHdhcyBmb3VuZCBhbmQgd2FzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4KQEAgLTE3OCw3ICsxOTksOCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OmFkZERldmljZUZhY3Rvcnkoc3A8SURldmljZXNGYWN0b3J5PiBmYWN0b3J5LCBib29sIG5lZWRUb05vdGlmeSkgewordm9pZCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OmFkZERldmljZUZhY3RvcnkoCisgICAgICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5PiBmYWN0b3J5LCBib29sIG5lZWRUb05vdGlmeSkgewogICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UgaW5zdGFuY2UgaXMgb3duZWQKICAgICAvLyBieSBBdWRpb0ZsaW5nZXIgYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KICAgICBmYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CkBAIC0xOTgsMTAgKzIyMCwxNiBAQAogICAgIH0KIH0KIAotc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpjb3B5RGV2aWNlRmFjdG9yaWVzKCkgeworc3RkOjp2ZWN0b3I8c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk+PgorICAgICAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OmNvcHlEZXZpY2VGYWN0b3JpZXMoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIHJldHVybiBtRGV2aWNlRmFjdG9yaWVzOwogfQogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorLy8gTWFpbiBlbnRyeS1wb2ludCB0byB0aGUgc2hhcmVkIGxpYnJhcnkuCitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIHZvaWQqIGNyZWF0ZUlEZXZpY2VzRmFjdG9yeSgpIHsKKyAgICBhdXRvIHNlcnZpY2UgPSBoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICByZXR1cm4gc2VydmljZSA/IG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoc2VydmljZSkgOiBudWxscHRyOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaAppbmRleCA2Zjg0ZWZlLi5mZmQyMjlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTMwLDcgKzMwLDYgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKIHsKQEAgLTQ2LDYgKzQ1LDggQEAKIAogICAgIHN0YXR1c190IHNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgb3ZlcnJpZGU7CiAKKyAgICBmbG9hdCBnZXRIYWxWZXJzaW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gTUFKT1JfVkVSU0lPTiArIChmbG9hdClNSU5PUl9WRVJTSU9OIC8gMTA7IH0KKwogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlTm90aWZpY2F0aW9uTGlzdGVuZXI7CiAgICAgdm9pZCBhZGREZXZpY2VGYWN0b3J5KHNwPElEZXZpY2VzRmFjdG9yeT4gZmFjdG9yeSwgYm9vbCBuZWVkVG9Ob3RpZnkpOwpAQCAtNTksNyArNjAsNiBAQAogICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpID0gZGVmYXVsdDsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4ZDg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKHNwPElEZXZpY2VzRmFjdG9yeT4gaGlkbEZhY3RvcnkpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbChoaWRsRmFjdG9yeSkpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OmdldEhhbFBpZHMoc3RkOjp2ZWN0b3I8cGlkX3Q+ICpwaWRzKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPmdldEhhbFBpZHMocGlkcyk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OnNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtSGlkbEZhY3RvcnkpIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+c2V0Q2FsbGJhY2tPbmNlKGNhbGxiYWNrKTsKLSAgICB9Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotCi1leHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIHZvaWQqIGNyZWF0ZUlEZXZpY2VzRmFjdG9yeSgpIHsKLSAgICBhdXRvIHNlcnZpY2UgPSBoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICByZXR1cm4gc2VydmljZSA/IG5ldyBDUFBfVkVSU0lPTjo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoc2VydmljZSkgOiBudWxscHRyOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGExZmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2VzRmFjdG9yeS5oKQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKHNwPElEZXZpY2VzRmFjdG9yeT4gaGlkbEZhY3RvcnkpOwotCi0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcykgb3ZlcnJpZGU7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjdmZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmYzNjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldEhhbFBpZHMoc3RkOjp2ZWN0b3I8cGlkX3Q+ICpwaWRzIF9fdW51c2VkKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRDYWxsYmFja09uY2Uoc3A8RGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjaz4gY2FsbGJhY2sgX191bnVzZWQpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKaW5kZXggNTM2Nzk3Mi4uOWQ1ZjcyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwpAQCAtMzEsNyArMzAsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZWZmZWN0IHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIC8vIHN0YXRpYwogdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewpAQCAtMTQ0LDUgKzE0Miw0IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGVmZmVjdAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKaW5kZXggNDgyNjgxMy4uYTlkZjY4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKQEAgLTI4LDcgKzI4LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CiAKQEAgLTc0LDcgKzczLDYgQEAKICAgICBzdGF0dXNfdCBpbml0KCk7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgZWZmZWN0CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0Zjc5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkhhbEhpZGwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsOjpFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbDxFZmZlY3RSZXN1bHQ+KGNsYXNzTmFtZSwgYW5hbHl6ZVJlc3VsdCkgeworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IEVmZmVjdFJlc3VsdCYgcmVzdWx0KSB7CisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBFZmZlY3RSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgRWZmZWN0UmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFZmZlY3RSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIGNhc2UgRWZmZWN0UmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOworICAgICAgICBjYXNlIEVmZmVjdFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIEVmZmVjdFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzFkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKwordXNpbmcgRWZmZWN0UmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbCA6IHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbDxFZmZlY3RSZXN1bHQ+IHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IEVmZmVjdFJlc3VsdCYgcmVzdWx0KTsKKworICAgIEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsKHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCmluZGV4IDUxYWQxNDYuLmZkZmUyMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDx1dGlsL0VmZmVjdFV0aWxzLmg+CkBAIC0zNiwxMyArMzcsMTYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047CiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CiAKKyNkZWZpbmUgVElNRV9DSEVDSygpIGF1dG8gdGltZUNoZWNrID0gXAorICAgICAgICBtZWRpYXV0aWxzOjptYWtlVGltZUNoZWNrU3RhdHNGb3JDbGFzc01ldGhvZChnZXRDbGFzc05hbWUoKSwgX19mdW5jX18pCisKIEVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKKyAgICAgICAgOiBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0SGFsSGlkbCIpLAorICAgICAgICAgIG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7CiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBoYWxEZXNjcmlwdG9ye307CiAgICAgaWYgKEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoJmhhbERlc2NyaXB0b3IpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1Jc0lucHV0ID0gKGhhbERlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DOwpAQCAtNjAsMjAgKzY0LDkgQEAKICAgICB9CiB9CiAKLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CiAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKQEAgLTg2LDYgKzc5LDggQEAKIH0KIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CiAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOwpAQCAtOTgsMTAgKzkzLDE0IEBACiB9CiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7CiB9CiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7CiB9CiAKQEAgLTE4NCw2ICsxODMsOCBAQAogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAogICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICAvLyBTcGVjaWFsIGNhc2VzLgpAQCAtMjE1LDYgKzIxNiw4IEBACiB9CiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCkBAIC0yMjgsMTIgKzIzMSwxNiBAQAogfQogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwogICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwogfQogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwogICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKQEAgLTMxMCw2ICszMTcsNSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBlZmZlY3QKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKaW5kZXggOGU0NjYzOC4uZTEzOTc2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKQEAgLTIzLDE2ICsyMywxNyBAQAogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAKKyNpbmNsdWRlICJFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBlZmZlY3QgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOwogCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQorY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UsIHB1YmxpYyBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6CiAgICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCkBAIC02Myw3ICs2NCw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKIAotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CisgICAgdmlydHVhbCB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQogCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKQEAgLTc4LDggKzc5LDYgQEAKICAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwogICAgIGJvb2wgbUlzSW5wdXQgPSBmYWxzZTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KTsKLQogICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKIApAQCAtOTYsNyArOTUsNiBAQAogICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgZWZmZWN0CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAppbmRleCBmMDQyYjkyLi5kNzIxN2ZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0yMSw4ICsyMSw5IEBACiAKICNpbmNsdWRlIDxVdWlkVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlsL0VmZmVjdFV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKQEAgLTMzLDEzICszNCwxMiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZWZmZWN0IHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKIAogRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoc3A8SUVmZmVjdHNGYWN0b3J5PiBlZmZlY3RzRmFjdG9yeSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgICAgIDogRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewogICAgIEFMT0dfQVNTRVJUKGVmZmVjdHNGYWN0b3J5ICE9IG51bGxwdHIsICJQcm92aWRlZCBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSBpcyBOVUxMIik7CiAgICAgbUVmZmVjdHNGYWN0b3J5ID0gZWZmZWN0c0ZhY3Rvcnk7CiB9CkBAIC03Myw3ICs3Myw5IEBACiAgICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewogICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKICAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewogICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKICAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7CkBAIC04NSw3ICs4Nyw5IEBACiAKIHN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gbnVsbHB0ciB8fCBwRWZmZWN0VXVpZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgVXVpZCBoaWRsVXVpZDsKICAgICBVdWlkVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKQEAgLTEwNSw2ICsxMDksMzMgQEAKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7CiB9CiAKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcnMoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+ICpkZXNjcmlwdG9ycykgeworICAgIGlmIChwRWZmZWN0VHlwZSA9PSBudWxscHRyIHx8IGRlc2NyaXB0b3JzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBxdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBxdWVyeU51bWJlckVmZmVjdHMiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvcjsKKyAgICAgICAgc3RhdHVzID0gZ2V0RGVzY3JpcHRvcihpLCAmZGVzY3JpcHRvcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgZ2V0RGVzY3JpcHRvciIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lbWNtcCgmZGVzY3JpcHRvci50eXBlLCBwRWZmZWN0VHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBkZXNjcmlwdG9ycy0+cHVzaF9iYWNrKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXNjcmlwdG9ycy0+ZW1wdHkoKSA/IE5BTUVfTk9UX0ZPVU5EIDogTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAogICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKICAgICAgICAgaW50MzJfdCBkZXZpY2VJZCBfX3VudXNlZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7CkBAIC0xNzMsMTIgKzIwNCwxNCBAQAogICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBlZmZlY3QKIAotZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSB2b2lkKiBjcmVhdGVJRWZmZWN0c0ZhY3RvcnkoKSB7CisvLyBXaGVuIGEgc2hhcmVkIGxpYnJhcnkgaXMgYnVpbHQgZnJvbSBhIHN0YXRpYyBsaWJyYXJ5LCBldmVuIGV4cGxpY2l0CisvLyBleHBvcnRzIGZyb20gYSBzdGF0aWMgbGlicmFyeSBhcmUgb3B0aW1pemVkIG91dCB1bmxlc3MgYWN0dWFsbHkgdXNlZCBieQorLy8gdGhlIHNoYXJlZCBsaWJyYXJ5LiBTZWUgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwLgorZXh0ZXJuICJDIiB2b2lkKiBjcmVhdGVJRWZmZWN0c0ZhY3RvcnlJbXBsKCkgewogICAgIGF1dG8gc2VydmljZSA9IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgcmV0dXJuIHNlcnZpY2UgPyBuZXcgZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKHNlcnZpY2UpIDogbnVsbHB0cjsKKyAgICByZXR1cm4gc2VydmljZSA/IG5ldyBlZmZlY3Q6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbChzZXJ2aWNlKSA6IG51bGxwdHI7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmluZGV4IDVmYTg1ZTcuLmUxODgyZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMjAsMTcgKzIwLDE1IEBACiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi9JRWZmZWN0c0ZhY3RvcnkuaCkKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZWZmZWN0IHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpDUFBfVkVSU0lPTjo6Q29udmVyc2lvbkhlbHBlckhpZGw7CiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CiAKLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCitjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6CiAgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKHNwPElFZmZlY3RzRmFjdG9yeT4gZWZmZWN0c0ZhY3RvcnkpOwpAQCAtNDUsNiArNDMsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcnMoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiAqZGVzY3JpcHRvcnMpOworCiAgICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCiAgICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCkBAIC02Nyw3ICs2OCw2IEBACiAgICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGVmZmVjdAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAKc2ltaWxhcml0eSBpbmRleCA3MSUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKY29weSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcAppbmRleCA5ZTA0ZTgyLi4yYzZmMmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsMTQgKzEzLDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIHsKLSAgICAgTk9ORSA9IDAsCi0gICAgIEVMRU1FTlRBUllfU1RSRUFNID0gMSwKLSAgICAgSEFORExFID0gMiwKK2V4dGVybiAiQyIgdm9pZCogY3JlYXRlSUVmZmVjdHNGYWN0b3J5SW1wbCgpOworCitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIHZvaWQqIGNyZWF0ZUlFZmZlY3RzRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gY3JlYXRlSUVmZmVjdHNGYWN0b3J5SW1wbCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oCmluZGV4IDljYWI3MmUuLmI1ZGNiOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvUGFyYW1ldGVyVXRpbHMuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1BhcmFtZXRlclV0aWxzLmgKQEAgLTE2LDE3ICsxNiwxNiBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0NPUkVfVFlQRVNfRklMRV9WRVJTSU9OL3R5cGVzLmgpCiAjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6UmVzdWx0OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIG5hbWVzcGFjZSB1dGlscyB7CiAKICNpZiBNQUpPUl9WRVJTSU9OID09IDIKQEAgLTU2LDUgKzU1LDQgQEAKICNlbmRpZgogCiB9IC8vIG5hbWVzcGFjZSB1dGlscwotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCmluZGV4IDEyOWIxYzEuLjAyMWVjNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMjAsMzUgKzIwLDM3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL21lbW9yeS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1PdXRDYWxsYmFjay5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0NPUkVfVFlQRVNfRklMRV9WRVJTSU9OL0lTdHJlYW1PdXRDYWxsYmFjay5oKQogI2luY2x1ZGUgPEhpZGxVdGlscy5oPgogI2luY2x1ZGUgPHV0aWwvQ29yZVV0aWxzLmg+CiAKICNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgogI2luY2x1ZGUgIlBhcmFtZXRlclV0aWxzLmgiCiAjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkNvcmVVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6Q29yZVV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKLXVzaW5nIEVmZmVjdEhhbEhpZGwgPSA6OmFuZHJvaWQ6OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEhhbEhpZGw7Ci11c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKK3VzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7CiAKLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOwogCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisjZGVmaW5lIFRJTUVfQ0hFQ0soKSBhdXRvIFRpbWVDaGVjayA9IFwKKyAgICAgICBtZWRpYXV0aWxzOjptYWtlVGltZUNoZWNrU3RhdHNGb3JDbGFzc01ldGhvZChnZXRDbGFzc05hbWUoKSwgX19mdW5jX18pCisKK1N0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwoY2xhc3NOYW1lKSwKICAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCiAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCiAgICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7CkBAIC02OSw2ICs3MSw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewpAQCAtNzgsNiArODEsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnQmFzZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICAqY29uZmlnQmFzZSA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAjaWYgTUFKT1JfVkVSU0lPTiA8PSA2CkBAIC0xMDcsNiArMTExLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwpAQCAtMTE2LDYgKzEyMSw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIHZhbHVlcy0+Y2xlYXIoKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKQEAgLTEzNiwyNyArMTQyLDMxIEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdChlZmZlY3QtPmVmZmVjdElkKCkpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KGVmZmVjdC0+ZWZmZWN0SWQoKSkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKIH0KIAotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEFyZ3M7CisgICAgYXJnc0Zyb21IYWwoYXJncywgJmhpZGxBcmdzKTsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWcoaGlkbEhhbmRsZSwgaGlkbEFyZ3MpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwogCiAgICAgLy8gVE9ETyhiLzExMTk5Nzg2NywgYi8xNzcyNzE5NTgpICBXb3JrYXJvdW5kIC0gcmVtb3ZlIHdoZW4gZml4ZWQuCkBAIC0xNzUsMTcgKzE4NSwyMCBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCiAgICAgICAgICAgICBtaW5TaXplRnJhbWVzLApAQCAtMjE4LDYgKzIzMSw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewpAQCAtMjQ2LDcgKzI2MCw3IEBACiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRIYWxQaWQocGlkX3QgKnBpZCkgewogICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6RGVidWdJbmZvOwogICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VNYW5hZ2VyOwotCisgICAgVElNRV9DSEVDSygpOwogICAgIERlYnVnSW5mbyBkZWJ1Z0luZm87CiAgICAgYXV0byByZXQgPSBtU3RyZWFtLT5nZXREZWJ1Z0luZm8oWyZdIChjb25zdCBhdXRvICZpbmZvKSB7CiAgICAgICAgIGRlYnVnSW5mbyA9IGluZm87CkBAIC0yNzQsNiArMjg4LDM0IEBACiAgICAgcmV0dXJuIGVyciA9PSAwOwogfQogCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpsZWdhY3lDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxhdWRpb19zb3VyY2VfdD4gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHBvcnQudHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFLCAicG9ydCB0eXBlIG11c3QgYmUgZGV2aWNlIik7CisgICAgdW5pcXVlX21hbGxvY2VkX3B0cjxjaGFyPiBhZGRyZXNzOworICAgIGlmIChzdHJjbXAocG9ydC5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7CisgICAgICAgIC8vIEZJWE1FOiB3ZSBvbmx5IHN1cHBvcnQgYWRkcmVzcyBvbiBmaXJzdCBzaW5rIHdpdGggSEFMIHZlcnNpb24gPCAzLjAKKyAgICAgICAgYWRkcmVzcy5yZXNldCgKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIocG9ydC5leHQuZGV2aWNlLnR5cGUsIHBvcnQuZXh0LmRldmljZS5hZGRyZXNzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWRkcmVzcy5yZXNldCgoY2hhciopY2FsbG9jKDEsIDEpKTsKKyAgICB9CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MuZ2V0KCkpKTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpdHlwZSk7CisgICAgaWYgKHNvdXJjZS5oYXNfdmFsdWUoKSkgeworICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCAoaW50KXNvdXJjZS52YWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIDApOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworfQorCiBuYW1lc3BhY2UgewogCiAvKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCkBAIC0zMjYsOCArMzY4LDEwIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKCJTdHJlYW1PdXRIYWxIaWRsIiwgc3RyZWFtLmdldCgpKQorICAgICAgICAsIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewogfQogCiBTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKQEAgLTM1MSwxMSArMzk1LDEzIEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CiAgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKApAQCAtMzY5LDEyICs0MTUsMTQgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKIH0KIAogI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJWYWx1ZT4gcGFyYW1ldGVyczsKICAgICBTdHJpbmc4IGhhbFBhcmFtZXRlcnM7CkBAIC0zODUsNiArNDMzLDcgQEAKIH0KICNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2VsZWN0UHJlc2VudGF0aW9uIiwKICAgICAgICAgICAgIG1TdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKSk7CkBAIC0zOTIsNiArNDQxLDcgQEAKICNlbmRpZgogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgICp3cml0dGVuID0gMDsKIApAQCAtNTM3LDYgKzU4Nyw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCkBAIC01NTAsNiArNjAxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCkBAIC01NjMsNiArNjE1LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCiAgICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKQEAgLTU3Myw2ICs2MjYsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAogICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7CkBAIC01ODMsMzIgKzYzNywzOCBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAogICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CiAgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKApAQCAtNjQyLDcgKzcwMiwxMiBAQAogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKICAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBDUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIFRJTUVfQ0hFQ0soKTsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworI2Vsc2UKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT046OlNvdXJjZU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyNlbmRpZgogICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OnNvdXJjZU1ldGFkYXRhRnJvbUhhbFY3KAogICAgICAgICAgICAgICAgICAgICBzb3VyY2VNZXRhZGF0YS50cmFja3MsIHRydWUgLyppZ25vcmVOb25WZW5kb3JUYWdzKi8sICZoaWRsTWV0YWRhdGEpOwogICAgICAgICAgICAgc3RhdHVzICE9IE9LKSB7CkBAIC02ODQsOSArNzQ5LDExIEBACiAgICAgLy8gQ29kZWMgZm9ybWF0IGNhbGxiYWNrIGlzIHN1cHBvcnRlZCBzdGFydGluZyBmcm9tIGF1ZGlvIEhBTCBWNi4wCiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQorCiAjZWxzZQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXREdWFsTW9ub01vZGUoCkBAIC03MDAsMTIgKzc2NywxNCBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAogICAgICAgICAgICAgInNldER1YWxNb25vTW9kZSIsIG1TdHJlYW0tPnNldER1YWxNb25vTW9kZShzdGF0aWNfY2FzdDxEdWFsTW9ub01vZGU+KG1vZGUpKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoCkBAIC03MTksMTIgKzc4OCwxNCBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKICAgICAgICAgICAgICJzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwiLCBtU3RyZWFtLT5zZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQikpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCkBAIC03NDUsNiArODE2LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKICAgICAgICAgICAgICJzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzIiwgbVN0cmVhbS0+c2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKQEAgLTc1Myw3ICs4MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUaW1lc3RyZXRjaEZhbGxiYWNrTW9kZT4ocGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpfSkpOwogfQogCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1PdXRFdmVudENhbGxiYWNrLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vSVN0cmVhbU91dEV2ZW50Q2FsbGJhY2suaCkKIAogbmFtZXNwYWNlIHsKIApAQCAtNzc5LDYgKzg1MSw3IEBACiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldEV2ZW50Q2FsbGJhY2soCiAgICAgICAgIGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gTk9fSU5JVDsKICAgICBtRXZlbnRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCkBAIC03ODksNiArODYyLDg3IEBACiB9CiAjZW5kaWYKIAorI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKK3VzaW5nIGhhcmR3YXJlOjphdWRpbzo6VjdfMTo6TGF0ZW5jeU1vZGU7CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldExhdGVuY3lNb2RlKGF1ZGlvX2xhdGVuY3lfbW9kZV90IG1vZGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0TGF0ZW5jeU1vZGUiLCBtU3RyZWFtLT5zZXRMYXRlbmN5TW9kZShzdGF0aWNfY2FzdDxMYXRlbmN5TW9kZT4obW9kZSkpKTsKK307CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlY29tbWVuZGVkTGF0ZW5jeU1vZGVzKHN0ZDo6dmVjdG9yPGF1ZGlvX2xhdGVuY3lfbW9kZV90PiAqbW9kZXMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TGF0ZW5jeU1vZGU+IGhpZGxNb2RlcykgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhpZGxNb2Rlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbW9kZXMtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxhdWRpb19sYXRlbmN5X21vZGVfdD4oaGlkbE1vZGVzW2ldKSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMiLCByZXQsIHJldHZhbCk7Cit9OworCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrLmgpCisKK3VzaW5nIGhhcmR3YXJlOjphdWRpbzo6VjdfMTo6SVN0cmVhbU91dExhdGVuY3lNb2RlQ2FsbGJhY2s7CisKK25hbWVzcGFjZSB7CitzdHJ1Y3QgU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjayB7CisgICAgU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dExhdGVuY3lNb2RlQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgICBSZXR1cm48dm9pZD4gb25SZWNvbW1lbmRlZExhdGVuY3lNb2RlQ2hhbmdlZChjb25zdCBoaWRsX3ZlYzxMYXRlbmN5TW9kZT4mIGhpZGxNb2Rlcykgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4gbW9kZXM7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhpZGxNb2Rlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1vZGVzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxhdWRpb19sYXRlbmN5X21vZGVfdD4oaGlkbE1vZGVzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0tPm9uUmVjb21tZW5kZWRMYXRlbmN5TW9kZUNoYW5nZWQobW9kZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKK307Cit9ICAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0TGF0ZW5jeU1vZGVDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgVElNRV9DSEVDSygpOworCisgICAgaWYgKG1TdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIE5PX0lOSVQ7CisgICAgbUxhdGVuY3lNb2RlQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgInNldExhdGVuY3lNb2RlQ2FsbGJhY2siLAorICAgICAgICAgICAgbVN0cmVhbS0+c2V0TGF0ZW5jeU1vZGVDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZ2V0KCkgPT0gbnVsbHB0ciA/IG51bGxwdHIgOiBuZXcgU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjayh0aGlzKSkpOworICAgIHJldHVybiBzdGF0dXM7Cit9OworCisjZWxzZQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRMYXRlbmN5TW9kZShhdWRpb19sYXRlbmN5X21vZGVfdCBtb2RlIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfTsKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2xhdGVuY3lfbW9kZV90PiAqbW9kZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9OworCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9OworCisjZW5kaWYKKwogdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7CiAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvYWQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKQEAgLTgxNyw5ICs5NzEsMjMgQEAKICAgICBjYWxsYmFjay0+b25Db2RlY0Zvcm1hdENoYW5nZWQobWV0YWRhdGFCcyk7CiB9CiAKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25SZWNvbW1lbmRlZExhdGVuY3lNb2RlQ2hhbmdlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+JiBtb2RlcykgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUxhdGVuY3lNb2RlQ2FsbGJhY2subG9hZCgpLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIGNhbGxiYWNrLT5vblJlY29tbWVuZGVkTGF0ZW5jeU1vZGVDaGFuZ2VkKG1vZGVzKTsKK30KIAotU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpleGl0KCkgeworICAgIC8vIEZJWE1FIHRoaXMgaXMgdXNpbmcgaGFyZC1jb2RlZCBzdHJpbmdzIGJ1dCBpbiB0aGUgZnV0dXJlLCB0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZQorICAgIC8vICAgICAgIGNvbnZlcnRlZCB0byB1c2UgYXVkaW8gSEFMIGV4dGVuc2lvbnMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0dW5uZWxpbmcKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhTdHJpbmc4KCJleGl0aW5nPTEiKSk7Cit9CisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluPiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoIlN0cmVhbUluSGFsSGlkbCIsIHN0cmVhbS5nZXQoKSkKKyAgICAgICAgLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKIH0KIAogU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewpAQCAtODMyLDE2ICsxMDAwLDE5IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICAqcmVhZCA9IDA7CiAKQEAgLTk2OSwxMSArMTE0MCwxMyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewogICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CkBAIC0xMDEzLDYgKzExODYsNyBAQAogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKQEAgLTEwMzEsNyArMTIwNSwxMiBAQAogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdAogICAgICAgICBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyAgICBUSU1FX0NIRUNLKCk7CisjaWYgTUFKT1JfVkVSU0lPTiA9PSA0CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisjZWxzZQorICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyNlbmRpZgogICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OnNpbmtNZXRhZGF0YUZyb21IYWxWNygKICAgICAgICAgICAgICAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrcywgdHJ1ZSAvKmlnbm9yZU5vblZlbmRvclRhZ3MqLywgJmhpZGxNZXRhZGF0YSk7CiAgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKQEAgLTEwNTQsMTcgKzEyMzMsMTggQEAKIH0KICNlbHNlCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiIsCiAgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oc3RhdGljX2Nhc3Q8TWljcm9waG9uZURpcmVjdGlvbj4oZGlyZWN0aW9uKSkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiIsCiAgICAgICAgICAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pKTsKIH0KICNlbmRpZgogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaAppbmRleCA5NzA5MDNiLi41NGZiZWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaApAQCAtMTksMzQgKzE5LDMzIEBACiAKICNpbmNsdWRlIDxhdG9taWM+CiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbS5oKQotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9DT1JFX1RZUEVTX0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vSVN0cmVhbUluLmgpCiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1PdXQuaCkKICNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU3luY2hyb25pemF0aW9uLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkNvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oIgogI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKLXVzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFJlYWRQYXJhbWV0ZXJzID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKIHVzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwogdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiBjbGFzcyBEZXZpY2VIYWxIaWRsOwogCi1jbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK2NsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwKIHsKICAgcHVibGljOgogICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCkBAIC03MSw3ICs3MCw3IEBACiAgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpAQCAtOTAsOSArODksMTUgQEAKICAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwogCisgICAgc3RhdHVzX3QgbGVnYWN5Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcmIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8YXVkaW9fc291cmNlX3Q+IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGVnYWN5UmVsZWFzZUF1ZGlvUGF0Y2goKSBvdmVycmlkZTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworICAgIFN0cmVhbUhhbEhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB+U3RyZWFtSGFsSGlkbCgpIG92ZXJyaWRlOwogCkBAIC0xOTEsNiArMTk2LDE1IEBACiAgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbUNvZGVjRm9ybWF0Q2FsbGJhY2sgKEhJREwpLgogICAgIHZvaWQgb25Db2RlY0Zvcm1hdENoYW5nZWQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4mIG1ldGFkYXRhQnMpOwogCisgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeU1vZGUoYXVkaW9fbGF0ZW5jeV9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2Rlcykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeU1vZGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uUmVjb21tZW5kZWRMYXRlbmN5TW9kZUNoYW5nZWQoY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+JiBtb2Rlcyk7CisKKyAgICBzdGF0dXNfdCBleGl0KCkgb3ZlcnJpZGU7CisKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKICAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CkBAIC0xOTksNyArMjEzLDkgQEAKIAogICAgIG1lZGlhdXRpbHM6OmF0b21pY193cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwogICAgIG1lZGlhdXRpbHM6OmF0b21pY193cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiBtRXZlbnRDYWxsYmFjazsKLSAgICBjb25zdCBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIG1lZGlhdXRpbHM6OmF0b21pY193cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrPiBtTGF0ZW5jeU1vZGVDYWxsYmFjazsKKworICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dD4gbVN0cmVhbTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwogICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CkBAIC0yMDcsNyArMjIzLDcgQEAKICAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwogCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisgICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ+JiBzdHJlYW0pOwogCiAgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOwogCkBAIC0yNTUsNyArMjcxLDcgQEAKICAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwogICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKIAotICAgIGNvbnN0IHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKKyAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluPiBtU3RyZWFtOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CiAgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKQEAgLTI2Myw3ICsyNzksOCBAQAogICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7CisgICAgU3RyZWFtSW5IYWxIaWRsKAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW1Jbj4mIHN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKIApAQCAtMjczLDcgKzI5MCw2IEBACiAgICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YmQ1ZGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9NZXRhZGF0YS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAvKiAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgKi8pIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnQmFzZSkgewotICAgIGNvbmZpZ0Jhc2UtPnNhbXBsZV9yYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIGNvbmZpZ0Jhc2UtPmNoYW5uZWxfbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICBjb25maWdCYXNlLT5mb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwotICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqd3JpdHRlbiA9IDA7Ci0gICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOwotICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwotfQotCi12b2lkIFN0cmVhbU91dEhhbExvY2FsOjpkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIHN0ZDo6dmVjdG9yPHBsYXliYWNrX3RyYWNrX21ldGFkYXRhPiBoYWxUcmFja3M7Ci0gICAgaGFsVHJhY2tzLnJlc2VydmUoc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvJiBtZXRhZGF0YSA6IHNvdXJjZU1ldGFkYXRhLnRyYWNrcykgewotICAgICAgICBwbGF5YmFja190cmFja19tZXRhZGF0YSBoYWxUcmFja01ldGFkYXRhOwotICAgICAgICBwbGF5YmFja190cmFja19tZXRhZGF0YV9mcm9tX3Y3KCZoYWxUcmFja01ldGFkYXRhLCAmbWV0YWRhdGEpOwotICAgICAgICBoYWxUcmFja3MucHVzaF9iYWNrKGhhbFRyYWNrTWV0YWRhdGEpOwotICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gaGFsVHJhY2tzLnNpemUoKSwKLSAgICAgICAgLnRyYWNrcyA9IGhhbFRyYWNrcy5kYXRhKCksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZoYWxNZXRhZGF0YSk7Ci19Ci0KLSNpZiBNQUpPUl9WRVJTSU9OID49IDcKLXZvaWQgU3RyZWFtT3V0SGFsTG9jYWw6OmRvVXBkYXRlU291cmNlTWV0YWRhdGFWNyhjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdjdfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YV92Nyo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YV92NyhtU3RyZWFtLCAmbWV0YWRhdGEpOwotfQotI2VuZGlmCi0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSNpZiBNQUpPUl9WRVJTSU9OIDwgNwotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKHNvdXJjZU1ldGFkYXRhKTsKLSNlbHNlCi0gICAgaWYgKG1EZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGRvVXBkYXRlU291cmNlTWV0YWRhdGEoc291cmNlTWV0YWRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhX3Y3ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhVjcoc291cmNlTWV0YWRhdGEpOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfZHVhbF9tb25vX21vZGUgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfZHVhbF9tb25vX21vZGUobVN0cmVhbSwgbW9kZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9kdWFsX21vbm9fbW9kZSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9kdWFsX21vbm9fbW9kZShtU3RyZWFtLCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbChtU3RyZWFtLCBsZXZlbGRCKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9hdWRpb19kZXNjcmlwdGlvbl9taXhfbGV2ZWwgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsKG1TdHJlYW0sIGxldmVsZEIpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcGxheWJhY2tfcmF0ZV9wYXJhbWV0ZXJzID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyhtU3RyZWFtLCBwbGF5YmFja1JhdGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfcGxheWJhY2tfcmF0ZV9wYXJhbWV0ZXJzID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyhtU3RyZWFtLCAmcGxheWJhY2tSYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldEV2ZW50Q2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfZXZlbnRfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHN0cmVhbV9ldmVudF9jYWxsYmFja190IGFzeW5jQ2FsbGJhY2sgPQotICAgICAgICAgICAgY2FsbGJhY2sgPT0gbnVsbHB0ciA/IG51bGxwdHIgOiBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNFdmVudENhbGxiYWNrOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9ldmVudF9jYWxsYmFjayhtU3RyZWFtLCBhc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0V2ZW50Q2FsbGJhY2soCi0gICAgICAgIHN0cmVhbV9ldmVudF9jYWxsYmFja190eXBlX3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IG51bGxwdHIpIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUV2ZW50Q2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0VWRU5UX0NCS19UWVBFX0NPREVDX0ZPUk1BVF9DSEFOR0VEOgotICAgICAgICAgICAgLy8gdm9pZCogcGFyYW0gaXMgdGhlIGJ5dGUgc3RyaW5nIGJ1ZmZlciBmcm9tIGJ5dGVfc3RyaW5nX2Zyb21fYXVkaW9fbWV0YWRhdGEoKS4KLSAgICAgICAgICAgIC8vIEFzIHRoZSBieXRlIHN0cmluZyBidWZmZXIgbWF5IGhhdmUgZW1iZWRkZWQgemVyb2VzLCB3ZSBjYW5ub3QgdXNlIHN0cmxlbigpCi0gICAgICAgICAgICBjYWxsYmFjay0+b25Db2RlY0Zvcm1hdENoYW5nZWQoc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6Om1ldGFkYXRhOjpkYXRhQnl0ZVN0cmluZ0xlbigoY29uc3QgdWludDhfdCopcGFyYW0pKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCIlcyB1bmtub3duIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotdm9pZCBTdHJlYW1JbkhhbExvY2FsOjpkb1VwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIHN0ZDo6dmVjdG9yPHJlY29yZF90cmFja19tZXRhZGF0YT4gaGFsVHJhY2tzOwotICAgIGhhbFRyYWNrcy5yZXNlcnZlKHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8mIG1ldGFkYXRhIDogc2lua01ldGFkYXRhLnRyYWNrcykgewotICAgICAgICByZWNvcmRfdHJhY2tfbWV0YWRhdGEgaGFsVHJhY2tNZXRhZGF0YTsKLSAgICAgICAgcmVjb3JkX3RyYWNrX21ldGFkYXRhX2Zyb21fdjcoJmhhbFRyYWNrTWV0YWRhdGEsICZtZXRhZGF0YSk7Ci0gICAgICAgIGhhbFRyYWNrcy5wdXNoX2JhY2soaGFsVHJhY2tNZXRhZGF0YSk7Ci0gICAgfQotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gaGFsVHJhY2tzLnNpemUoKSwKLSAgICAgICAgLnRyYWNrcyA9IGhhbFRyYWNrcy5kYXRhKCksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmaGFsTWV0YWRhdGEpOwotfQotCi0jaWYgTUFKT1JfVkVSU0lPTiA+PSA3Ci12b2lkIFN0cmVhbUluSGFsTG9jYWw6OmRvVXBkYXRlU2lua01ldGFkYXRhVjcoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3Y3X3QgaGFsTWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YV92Nyo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhX3Y3KG1TdHJlYW0sICZoYWxNZXRhZGF0YSk7Ci19Ci0jZW5kaWYKLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0jaWYgTUFKT1JfVkVSU0lPTiA8IDcKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047ICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICB9Ci0gICAgZG9VcGRhdGVTaW5rTWV0YWRhdGEoc2lua01ldGFkYXRhKTsKLSNlbHNlCi0gICAgaWYgKG1EZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEhBTAotICAgICAgICB9Ci0gICAgICAgIGRvVXBkYXRlU2lua01ldGFkYXRhKHNpbmtNZXRhZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhX3Y3ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEhBTAotICAgICAgICB9Ci0gICAgICAgIGRvVXBkYXRlU2lua01ldGFkYXRhVjcoc2lua01ldGFkYXRhKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi0jaWYgTUFKT1JfVkVSU0lPTiA9PSAyCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0jZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMobVN0cmVhbSwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKLSAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7Ci0gICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotI2VuZGlmCi0KLSNpZiBNQUpPUl9WRVJTSU9OIDwgNQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLSNlbHNlCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2RpcmVjdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2RpcmVjdGlvbihtU3RyZWFtLCBkaXJlY3Rpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9maWVsZF9kaW1lbnNpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9maWVsZF9kaW1lbnNpb24obVN0cmVhbSwgem9vbSk7Ci0KLX0KLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2MDQ5NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzdHJlYW06Ci0gICAgLy8gICAtIGNoYW5uZWwgbWFzazsKLSAgICAvLyAgIC0gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICAvLyAgIC0gc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICAgIC8vIFJldHVybnMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBzZXR0aW5nLgotICAgIHN0YXR1c190IGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSBvdmVycmlkZTsKLQotICAgIC8vIFNldHMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBvbiB0aGUgb3V0cHV0IGRldmljZS4KLSAgICBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKLQotICAgIC8vIFJldHVybnMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4KLSAgICBzdGF0dXNfdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIG92ZXJyaWRlOwotCi0gICAgLy8gU2V0cyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgotICAgIHN0YXR1c190IHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSBvdmVycmlkZTsKLQotICAgIC8vIFJldHJpZXZlcyBjdXJyZW50IHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycy4KLSAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKLQotICAgIC8vIFNldHMgdGhlIHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgcGxheWJhY2sgYmVoYXZpb3IuCi0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCBzZXRFdmVudENhbGxiYWNrKGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiBtRXZlbnRDYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLQotICAgIHN0YXRpYyBpbnQgYXN5bmNFdmVudENhbGxiYWNrKHN0cmVhbV9ldmVudF9jYWxsYmFja190eXBlX3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotCi0gICAgdm9pZCBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhVjcoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKTsKLSAgICB2b2lkIGRvVXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gU2V0cyBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKLQotICAgIC8vIFNldHMgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOwotCi0gICAgdm9pZCBkb1VwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSk7Ci0gICAgdm9pZCBkb1VwZGF0ZVNpbmtNZXRhZGF0YVY3KGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCmluZGV4IGY2YTU1NGIuLmMwOGVlNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogY2xhc3MgU3RyZWFtUG93ZXJMb2cgewogcHVibGljOgpAQCAtOTksNyArOTgsNiBAQAogICAgIHNpemVfdCBtRnJhbWVTaXplOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAppbmRleCAyOWVmMDExLi5kMjdhZDRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKQEAgLTE3LDYgKzE3LDkgQEAKICNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0lOVEVSRkFDRV9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9JTlRFUkZBQ0VfSAogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeVR5cGUuaD4KKyNpbmNsdWRlIDxlcnJvci9SZXN1bHQuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMTIwLDcgKzEyMywxOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgID0gMDsKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgPSAwOworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpID0gMDsKKworICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBzdGF0dXMgb2YgYW4gZXh0ZXJuYWwgZGV2aWNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGVycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiBnZXRId0F2U3luYygpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKaW5kZXggNTA5MTU1OC4uMTcwMTBlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApAQCAtNDMsNiArNDMsOCBAQAogICAgIC8vIFRoZSBjYWxsYmFjayBjYW4gYmUgb25seSBzZXQgb25jZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgPSAwOwogCisgICAgdmlydHVhbCBmbG9hdCBnZXRIYWxWZXJzaW9uKCkgY29uc3QgPSAwOworCiAgICAgc3RhdGljIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGUoKTsKIAogICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaAppbmRleCAwMzE2NWJkLi4yOTY5YzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKQEAgLTU3LDYgKzU3LDkgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKIAorICAgIC8vIFVuaXF1ZSBlZmZlY3QgSUQgdG8gdXNlIHdpdGggdGhlIGNvcmUgSEFMLgorICAgIHZpcnR1YWwgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCA9IDA7CisKICAgcHJvdGVjdGVkOgogICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIEVmZmVjdEhhbEludGVyZmFjZSgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKaW5kZXggOWZiNTZhZS4uM2U1MDViZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApAQCAtMzcsNiArMzcsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3JzKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gKmRlc2NyaXB0b3JzKSA9IDA7CisKICAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgogICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKICAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaAppbmRleCBkMzUzZWQwLi44NjZkZDNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCkBAIC0xOCwyMSArMTgsNDIgQEAKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKIAogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIFRoZSBwYWlyIG9mIHRoZSBpbnRlcmZhY2UncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSBpbnRlcmZhY2UgbmFtZSwKKy8vIGUuZy4gPCJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvIiwgIklEZXZpY2VzRmFjdG9yeSI+LgorLy8gU3BsaXR0aW5nIGlzIHVzZWQgZm9yIGVhc2llciBjb25zdHJ1Y3Rpb24gb2YgdmVyc2lvbmVkIG5hbWVzIChGUU5zKS4KK3VzaW5nIEludGVyZmFjZU5hbWUgPSBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKKwogbmFtZXNwYWNlIGRldGFpbCB7CiAKLXZvaWQqIGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2UpOwordm9pZCogY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBJbnRlcmZhY2VOYW1lJiBpZmFjZSwgY29uc3QgSW50ZXJmYWNlTmFtZSYgc2libGluZ0lmYWNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGRldGFpbAogCi0vKiogQFJldHVybiB0aGUgcHJlZmVycmVkIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbiBvciBudWxscHRyIGlmIG5vbmUgYXJlIGF2YWlsYWJsZS4gKi8KKy8qKgorICogQ3JlYXRlIGEgY2xpZW50IGZvciB0aGUgInByZWZlcnJlZCIgKG1vc3QgcmVjZW50KSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbnRlcmZhY2UuCisgKiBieSBsb2FkaW5nIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBjb250YWluaW5nIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBJbiB0aGUgYXVkaW8gSEFMLCB0aGVyZSBhcmUgdHdvIGZhbWlsaWVzIG9mIGludGVyZmFjZXM6IGNvcmUgYW5kIGVmZmVjdHMuIEJvdGggYXJlCisgKiBwYWNrZWQgaW50byB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeSBmb3IgbWVtb3J5IGVmZmljaWVuY3kuIFNpbmNlIHRoZSBjb3JlIGFuZCB0aGUgZWZmZWN0cworICogaW50ZXJmYWNlIGNhbiBoYXZlIGRpZmZlcmVudCBtaW5vciB2ZXJzaW9ucyBvbiB0aGUgZGV2aWNlLCBpbiBvcmRlciB0byBhdm9pZCBsb2FkaW5nIG11bHRpcGxlCisgKiBzaGFyZWQgbGlicmFyaWVzIHRoZSBsb2FkZXIgZnVuY3Rpb24gY29uc2lkZXJzIHdoaWNoIGludGVyZmFjZSBhbW9uZyB0d28gaGFzIHRoZSBtb3N0CisgKiByZWNlbnQgdmVyc2lvbi4gVGh1cywgYSBwYWlyIG9mIGludGVyZmFjZSBuYW1lcyBtdXN0IGJlIHBhc3NlZCBpbi4KKyAqCisgKiBAcGFyYW0gaWZhY2UgdGhlIGludGVyZmFjZSB0aGF0IG5lZWRzIHRvIGJlIGNyZWF0ZWQuCisgKiBAcGFyYW0gc2libGluZ0lmYWNlIHRoZSBpbnRlcmZhY2Ugd2hpY2ggb2NjdXBpZXMgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuCisgKiBAcmV0dXJuIHRoZSBwcmVmZXJyZWQgYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uIG9yIG51bGxwdHIgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLgorICovCiB0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgotc3RhdGljIHNwPEludGVyZmFjZT4gY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSkgewotICAgIHJldHVybiBzcDxJbnRlcmZhY2U+e3N0YXRpY19jYXN0PEludGVyZmFjZSo+KGRldGFpbDo6Y3JlYXRlUHJlZmVycmVkSW1wbChwYWNrYWdlLCBpbnRlcmZhY2UpKX07CitzdGF0aWMgc3A8SW50ZXJmYWNlPiBjcmVhdGVQcmVmZXJyZWRJbXBsKAorICAgICAgICBjb25zdCBJbnRlcmZhY2VOYW1lJiBpZmFjZSwgY29uc3QgSW50ZXJmYWNlTmFtZSYgc2libGluZ0lmYWNlKSB7CisgICAgcmV0dXJuIHNwPEludGVyZmFjZT57CisgICAgICAgIHN0YXRpY19jYXN0PEludGVyZmFjZSo+KGRldGFpbDo6Y3JlYXRlUHJlZmVycmVkSW1wbChpZmFjZSwgc2libGluZ0lmYWNlKSl9OwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAppbmRleCAyYmUxMmZiLi4xZDUyYjdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY5LDcgKzcwLDcgQEAKICAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyA9IHt9KSA9IDA7CiAKICAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CkBAIC04OCw2ICs4OSwxMiBAQAogICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBsZWdhY3lDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxhdWRpb19zb3VyY2VfdD4gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsZWdhY3lSZWxlYXNlQXVkaW9QYXRjaCgpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgU3RyZWFtSGFsSW50ZXJmYWNlKCkge30KQEAgLTExNiw2ICsxMjMsMTggQEAKICAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrKCkge30KIH07CiAKK2NsYXNzIFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2l0aCB0aGUgbmV3IGxpc3Qgb2Ygc3VwcG9ydGVkIGxhdGVuY3kgbW9kZXMgd2hlbiBhIGNoYW5nZSBvY2N1cnMuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb21tZW5kZWRMYXRlbmN5TW9kZUNoYW5nZWQoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+IG1vZGVzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrKCkge30KKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrKCkge30KK307CisKIGNsYXNzIFN0cmVhbU91dEhhbEludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSB7CiAgIHB1YmxpYzoKICAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCkBAIC0xOTMsNiArMjEyLDQ3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEV2ZW50Q2FsbGJhY2soY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIHJlcXVlc3RlZCBsYXRlbmN5IG1vZGUgZm9yIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIFRoZSByZXF1ZXN0ZWQgbW9kZSBjYW4gYmUgb25lIG9mIHRoZSBtb2RlcyByZXR1cm5lZCBieQorICAgICAqIGdldFJlY29tbWVuZGVkTGF0ZW5jeU1vZGVzKCkgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUgdGhlIHJlcXVlc3RlZCBsYXRlbmN5IG1vZGUuCisgICAgICogQHJldHVybiBvcGVyYXRpb24gY29tcGxldGlvbiBzdGF0dXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMYXRlbmN5TW9kZShhdWRpb19sYXRlbmN5X21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggbGF0ZW5jeSBtb2RlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICogSWYgdGhlIHRyYW5zcG9ydCBwcm90b2NvbCAoZS5nIEJsdWV0b290aCBBMkRQKSB1c2VkIGJ5IHRoaXMgb3V0cHV0IHN0cmVhbSB0byByZWFjaAorICAgICAqIHRoZSBvdXRwdXQgZGV2aWNlIHN1cHBvcnRzIHZhcmlhYmxlIGxhdGVuY3kgbW9kZXMsIHRoZSBIQUwgaW5kaWNhdGVzIHdoaWNoCisgICAgICogbW9kZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgICAgICogVGhlIGZyYW1ld29yayBjYW4gdGhlbiBjYWxsIHNldExhdGVuY3lNb2RlKCkgd2l0aCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBtb2RlcyB0byBzZWxlY3QKKyAgICAgKiB0aGUgZGVzaXJlZCBvcGVyYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlcyBjdXJycmVudGx5IHN1cHBvcnRlZCBsYXRlbmN5IG1vZGVzLgorICAgICAqIEByZXR1cm4gb3BlcmF0aW9uIGNvbXBsZXRpb24gc3RhdHVzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2RlcykgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIG5vdGlmeWluZyBjaGFuZ2VzIGluIHN1cHBvcnRlZCBsYXRlbmN5IG1vZGVzLgorICAgICAqCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIGEgbnVsbCBwb2ludGVyIHdpbGwgcmVzdWx0IGluIHJlbGVhc2luZworICAgICAqIHRoZSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBvciBudWxsIHRvIHVucmVnaXN0ZXIuCisgICAgICogQHJldHVybiBvcGVyYXRpb24gY29tcGxldGlvbiBzdGF0dXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4mIGNhbGxiYWNrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWwgdGhlIGVuZCBvZiBhdWRpbyBvdXRwdXQsIGludGVycnVwdGluZyBhbiBvbmdvaW5nICd3cml0ZScgb3BlcmF0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZXhpdCgpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKaW5kZXggZDg1ZTJlOS4uZTZmZGIxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcApAQCAtMTA4LDE1ICsxMDgsMTEgQEAKIAogICAgIGlmICh0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKICAgICAgICAgdHJhY2stPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudDsKLSAgICAgICAgdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50ICsgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKLSAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQ7Ci0gICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CiAgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSAwOwogICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IDA7Ci0gICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IDA7Ci0gICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSAwOwogICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKICAgICB9CiAKQEAgLTEzMSw4ICsxMjcsNyBAQAogICAgIC8vIGRvIGl0IGFmdGVyIGRvd25taXggc2luY2UgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCiAgICAgdHJhY2stPnByZXBhcmVGb3JSZWZvcm1hdCgpOwogCi0gICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKLSAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyhtRnJhbWVDb3VudCk7CiAKICAgICAvLyBSZXNhbXBsZXIgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KICAgICB0cmFjay0+cmVjcmVhdGVSZXNhbXBsZXIobVNhbXBsZVJhdGUpOwpAQCAtMTkzLDYgKzE4OCwyNCBAQAogICAgICAgICAvLyBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgcmVzZXQgYmVsb3cuCiAgICAgfQogCisgICAgLy8gU2VlIGlmIHdlIHNob3VsZCB1c2Ugb3VyIGJ1aWx0LWluIG5vbi1lZmZlY3QgZG93bm1peGVyLgorICAgIGlmIChtTWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgICAgICAgICAmJiBtTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICYmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spCisgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04pIHsKKyAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBDaGFubmVsTWl4QnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssIG1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PENoYW5uZWxNaXhCdWZmZXJQcm92aWRlciAqPihtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkpCisgICAgICAgICAgICAgICAgLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBtTWl4ZXJJbkZvcm1hdDsKKyAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgICAgICAgICBBTE9HRCgiJXM6IEZhbGxiYWNrIHVzaW5nIENoYW5uZWxNaXgiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiJXM6IENoYW5uZWxNaXggbm90IHN1cHBvcnRlZCBmb3IgY2hhbm5lbCBtYXNrICUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBFZmZlY3QgZG93bm1peGVyIGRvZXMgbm90IGFjY2VwdCB0aGUgY2hhbm5lbCBjb252ZXJzaW9uLiAgTGV0J3MgdXNlIG91ciByZW1peGVyLgogICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgUmVtaXhCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrLCBtTWl4ZXJJbkZvcm1hdCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CkBAIC0yNjUsNDggKzI3OCwyMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKHNpemVfdCBmcmFtZXMpCiB7CiAgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsIG91dENoYW5uZWxDb3VudDogJXUiLAogICAgICAgICAgICAgdGhpcywgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KTsKICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOwogICAgIGlmIChtQWRqdXN0SW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE91dENoYW5uZWxDb3VudCkgewotICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwotICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKQotewotICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlIik7Ci0gICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKLSAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKQotewotICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsICIKLSAgICAgICAgICAib3V0Q2hhbm5lbENvdW50OiAldSwga2VlcENvbnRyYWN0ZWRDaGFubmVsczogJWQiLAotICAgICAgICAgICAgdGhpcywgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzKTsKLSAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7Ci0gICAgaWYgKG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ICE9IG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCkgewogICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtS2VlcENvbnRyYWN0ZWRDaGFubmVscwogICAgICAgICAgICAgICAgID8gKHVpbnQ4X3QqKW1haW5CdWZmZXIgKyBmcmFtZXMgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQsIG1NaXhlckZvcm1hdCkKLSAgICAgICAgICAgICAgICA6IE5VTEw7Ci0gICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldCgKLSAgICAgICAgICAgICAgICBuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzID8gbU1peGVyRm9ybWF0IDogQVVESU9fRk9STUFUX0lOVkFMSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCwgZnJhbWVzLAorICAgICAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzID8gbU1peGVyRm9ybWF0IDogQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgYnVmZmVyLCBtTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQpKTsKICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMzE0LDkgKzI5OSw5IEBACiAKIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OmNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpCiB7Ci0gICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgc3RhdGljX2Nhc3Q8QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcio+KAotICAgICAgICAgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSktPmNsZWFyQ29udHJhY3RlZEZyYW1lcygpOworICAgICAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpKS0+Y2xlYXJDb250cmFjdGVkRnJhbWVzKCk7CiAgICAgfQogfQogCkBAIC0zMjgsMTAgKzMxMyw2IEBACiAgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CiAgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCk7CiAgICAgfQotICAgIGlmIChtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCk7Ci0gICAgfQogICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CiAgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCk7CkBAIC0zNzcsNyArMzU4LDcgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bWFpbkJ1ZmZlciA9IHZhbHVlQnVmOwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1BSU5fQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKG1GcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtNDA1LDcgKzM4Niw3IEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyhtRnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKQEAgLTQyNCw4ICs0MDUsNyBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOwogICAgICAgICAgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKLSAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKG1GcmFtZUNvdW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgSEFQVElDX0lOVEVOU0lUWTogewpAQCAtNDM0LDYgKzQxNCwxMiBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBIQVBUSUNfTUFYX0FNUExJVFVERTogeworICAgICAgICAgICAgY29uc3QgZmxvYXQgaGFwdGljTWF4QW1wbGl0dWRlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSk7CisgICAgICAgICAgICBpZiAodHJhY2stPm1IYXB0aWNNYXhBbXBsaXR1ZGUgIT0gaGFwdGljTWF4QW1wbGl0dWRlKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPm1IYXB0aWNNYXhBbXBsaXR1ZGUgPSBoYXB0aWNNYXhBbXBsaXR1ZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHRyYWNrOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgIH0KQEAgLTUxMiw4ICs0OTgsNiBAQAogICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0gZWxzZSBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAodHJhY2stPm1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfSBlbHNlIGlmICh0cmFjay0+bUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICB0cmFjay0+bUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfQpAQCAtNTUzLDEyICs1MzcsMTEgQEAKICAgICAvLyBoYXB0aWMKICAgICB0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7CiAgICAgdC0+bUhhcHRpY0ludGVuc2l0eSA9IG9zOjpIYXB0aWNTY2FsZTo6Tk9ORTsKKyAgICB0LT5tSGFwdGljTWF4QW1wbGl0dWRlID0gTkFOOwogICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CiAgICAgdC0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bUhhcHRpY0NoYW5uZWxDb3VudDsKLSAgICB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OwotICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdC0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKLSAgICB0LT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQ7CisgICAgdC0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudDsKICAgICB0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOwogICAgIC8vIENoZWNrIHRoZSBkb3dubWl4aW5nIChvciB1cG1peGluZykgcmVxdWlyZW1lbnRzLgogICAgIHN0YXR1c190IHN0YXR1cyA9IHQtPnByZXBhcmVGb3JEb3dubWl4KCk7CkBAIC01NjksOCArNTUyLDcgQEAKICAgICAvLyBwcmVwYXJlRm9yRG93bm1peCgpIG1heSBjaGFuZ2UgbURvd25taXhSZXF1aXJlc0Zvcm1hdAogICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKICAgICB0LT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKLSAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7Ci0gICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKG1GcmFtZUNvdW50KTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTYwMiw3ICs1ODQsOCBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgLy8gTWl4ZXIgZm9ybWF0IHNob3VsZCBiZSBBVURJT19GT1JNQVRfUENNX0ZMT0FULgogICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDogewotICAgICAgICAgICAgICAgICAgICBvczo6c2NhbGVIYXB0aWNEYXRhKChmbG9hdCopIGJ1ZmZlciwgc2FtcGxlQ291bnQsIHQtPm1IYXB0aWNJbnRlbnNpdHkpOworICAgICAgICAgICAgICAgICAgICBvczo6c2NhbGVIYXB0aWNEYXRhKChmbG9hdCopIGJ1ZmZlciwgc2FtcGxlQ291bnQsIHQtPm1IYXB0aWNJbnRlbnNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUhhcHRpY01heEFtcGxpdHVkZSk7CiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbU1peGVyRm9ybWF0OiAlI3giLCB0LT5tTWl4ZXJGb3JtYXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyT3BzLmgKaW5kZXggY2Q0N2RjNi4uYWI2YThiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTIyOSwxNSArMjMxLDI2IEBACiAgKiBjb21wbGV4aXR5IG9mIHdvcmtpbmcgb24gaW50ZXJsZWF2ZWQgc3RyZWFtcyBpcyBub3cgZ2V0dGluZwogICogdG9vIGhpZ2gsIGFuZCBsaWtlbHkgbGltaXRzIGNvbXBpbGVyIG9wdGltaXphdGlvbi4KICAqLwotdGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4sCisKKy8vIGNvbXBpbGUtdGltZSBmdW5jdGlvbi4KK2NvbnN0ZXhwciBpbmxpbmUgYm9vbCB1c2VzQ2VudGVyQ2hhbm5lbChhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGF1ZGlvX3V0aWxzOjpjaGFubmVsczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ZDo6c2l6ZShrU2lkZUZyb21DaGFubmVsSWR4KTsgKytpKSB7CisgICAgICAgIGlmICgobWFzayAmICgxIDw8IGkpKSAhPSAwICYmIGtTaWRlRnJvbUNoYW5uZWxJZHhbaV0gPT0gQVVESU9fR0VPTUVUUllfU0lERV9DRU5URVIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEFwcGxpZXMgc3RlcmVvIHZvbHVtZSB0byB0aGUgYXVkaW8gZGF0YSBiYXNlZCBvbiBwcm9wZXIgbGVmdCByaWdodCBjaGFubmVsIGFmZmluaXR5CisgKiAodGVtcGxhdGVkIGNoYW5uZWwgTUFTSyBwYXJhbWV0ZXIpLgorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGF1ZGlvX2NoYW5uZWxfbWFza190IE1BU0ssCiAgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsCiAgICAgICAgIHR5cGVuYW1lIEY+Ci12b2lkIHN0ZXJlb1ZvbHVtZUhlbHBlcihUTyomIG91dCwgY29uc3QgVEkqJiBpbiwgY29uc3QgVFYgKnZvbCwgRiBmKSB7Ci0gICAgc3RhdGljX2Fzc2VydChOQ0hBTiA+IDAgJiYgTkNIQU4gPD0gRkNDX0xJTUlUKTsKLSAgICBzdGF0aWNfYXNzZXJ0KE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wKLSAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wKLSAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQKLSAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKTsKK3ZvaWQgc3RlcmVvVm9sdW1lSGVscGVyV2l0aENoYW5uZWxNYXNrKFRPKiYgb3V0LCBjb25zdCBUSSomIGluLCBjb25zdCBUViAqdm9sLCBGIGYpIHsKICAgICBhdXRvIHByb2MgPSBbXShhdXRvJiBhLCBjb25zdCBhdXRvJiBiKSB7CiAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTAogICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQKQEAgLTI1MCw1OSArMjYzLDExMyBAQAogICAgIGF1dG8gaW5wID0gWyZpbl0oKSAtPiBjb25zdCBUSSYgewogICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQKICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgewotICAgICAgICAgICAgcmV0dXJuICppbjsKKyAgICAgICAgICAgIHJldHVybiAqaW47IC8vIG5vdGUgU1RFUkVPRVhQQU5EIGFzc3VtZXMgcmVwbGljYXRlZCBML1IgY2hhbm5lbHMgKHNlZSBkb2MgYmVsb3cpLgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuICppbisrOwogICAgICAgICB9CiAgICAgfTsKIAotICAgIC8vIEhBTHMgc2hvdWxkIG9ubHkgZXhwb3NlIHRoZSBjYW5vbmljYWwgY2hhbm5lbCBtYXNrcy4KLSAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzBdKSk7IC8vIGZyb250IGxlZnQKLSAgICBpZiBjb25zdGV4cHIgKE5DSEFOID09IDEpIHJldHVybjsKLSAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzFdKSk7IC8vIGZyb250IHJpZ2h0Ci0gICAgaWYgY29uc3RleHByIChOQ0hBTiA9PSAyKSAgcmV0dXJuOwotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPT0gNCkgewotICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzBdKSk7IC8vIGJhY2sgbGVmdAotICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzFdKSk7IC8vIGJhY2sgcmlnaHQKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRPRE86IFByZWNvbXB1dGUgY2VudGVyIHZvbHVtZSBpZiBub3QgcmFtcGluZy4KICAgICBzdGQ6OmRlY2F5X3Q8VFY+IGNlbnRlcjsKLSAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnRfdjxUVj4pIHsKLSAgICAgICAgY2VudGVyID0gKHZvbFswXSArIHZvbFsxXSkgKiAwLjU7ICAgICAgIC8vIGRvIG5vdCB1c2UgZGl2aWRlCi0gICAgfSBlbHNlIHsKLSAgICAgICAgY2VudGVyID0gKHZvbFswXSA+PiAxKSArICh2b2xbMV0gPj4gMSk7IC8vIHJvdW5kcyB0byAwLgotICAgIH0KLSAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgY2VudGVyKSk7IC8vIGNlbnRlciAob3IgMi4xIExGRSkKLSAgICBpZiBjb25zdGV4cHIgKE5DSEFOID09IDMpIHJldHVybjsKLSAgICBpZiBjb25zdGV4cHIgKE5DSEFOID09IDUpIHsKLSAgICAgICAgcHJvYygqb3V0KyssIGYoaW5wKCksIHZvbFswXSkpOyAgLy8gYmFjayBsZWZ0Ci0gICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMV0pKTsgIC8vIGJhY2sgcmlnaHQKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCBjZW50ZXIpKTsgLy8gbGZlCi0gICAgcHJvYygqb3V0KyssIGYoaW5wKCksIHZvbFswXSkpOyAvLyBiYWNrIGxlZnQKLSAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzFdKSk7IC8vIGJhY2sgcmlnaHQKLSAgICBpZiBjb25zdGV4cHIgKE5DSEFOID09IDYpIHJldHVybjsKLSAgICBpZiBjb25zdGV4cHIgKE5DSEFOID09IDcpIHsKLSAgICAgICAgcHJvYygqb3V0KyssIGYoaW5wKCksIGNlbnRlcikpOyAvLyBiYWNrIGNlbnRlcgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIE5DSEFOID09IDgKLSAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzBdKSk7IC8vIHNpZGUgbGVmdAotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMV0pKTsgLy8gc2lkZSByaWdodAotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPiBGQ0NfOCkgewotICAgICAgICAvLyBNdXRlcyB0byB6ZXJvIGV4dGVuZGVkIHN1cnJvdW5kIGNoYW5uZWxzLgotICAgICAgICAvLyA3LjEuNCBoYXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IuCi0gICAgICAgIC8vIDIyLjIgaGFzIHRoZSBiZWhhdmlvciB0aGF0IEZMQyBhbmQgRlJDIHdpbGwgYmUgbWl4ZWQgaW5zdGVhZAotICAgICAgICAvLyBvZiBTTCBhbmQgU1IgYW5kIExGRSB3aWxsIGJlIGNlbnRlciwgbm90IGxlZnQuCi0gICAgICAgIGZvciAoaW50IGkgPSA4OyBpIDwgTkNIQU47ICsraSkgewotICAgICAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgdXNpbmcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmNoYW5uZWxzOjprU2lkZUZyb21DaGFubmVsSWR4Ci0gICAgICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgMC5mKSk7CisgICAgY29uc3RleHByIGJvb2wgVVNFU19DRU5URVJfQ0hBTk5FTCA9IHVzZXNDZW50ZXJDaGFubmVsKE1BU0spOworICAgIGlmIGNvbnN0ZXhwciAoVVNFU19DRU5URVJfQ0hBTk5FTCkgeworICAgICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnRfdjxUVj4pIHsKKyAgICAgICAgICAgIGNlbnRlciA9ICh2b2xbMF0gKyB2b2xbMV0pICogMC41OyAgICAgICAvLyBkbyBub3QgdXNlIGRpdmlkZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2VudGVyID0gKHZvbFswXSA+PiAxKSArICh2b2xbMV0gPj4gMSk7IC8vIHJvdW5kcyB0byAwLgogICAgICAgICB9CiAgICAgfQorCisgICAgdXNpbmcgbmFtZXNwYWNlIGF1ZGlvX3V0aWxzOjpjaGFubmVsczsKKworICAgIC8vIGlmIExGRSBhbmQgTEZFMiBhcmUgYm90aCBwcmVzZW50LCB0aGV5IHRha2UgbGVmdCBhbmQgcmlnaHQgdm9sdW1lIHJlc3BlY3RpdmVseS4KKyAgICBjb25zdGV4cHIgdW5zaWduZWQgTEZFX0xGRTIgPSBcCisgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMjsKKyAgICBjb25zdGV4cHIgYm9vbCBoYXNfTEZFX0xGRTIgPSAoTUFTSyAmIExGRV9MRkUyKSA9PSBMRkVfTEZFMjsKKworI3ByYWdtYSBwdXNoX21hY3JvKCJET19DSEFOTkVMX1BPU0lUSU9OIikKKyN1bmRlZiBET19DSEFOTkVMX1BPU0lUSU9OCisjZGVmaW5lIERPX0NIQU5ORUxfUE9TSVRJT04oQklUX0lOREVYKSBcCisgICAgaWYgY29uc3RleHByICgoTUFTSyAmICgxIDw8IEJJVF9JTkRFWCkpICE9IDApIHsgXAorICAgICAgICBjb25zdGV4cHIgYXV0byBzaWRlID0ga1NpZGVGcm9tQ2hhbm5lbElkeFtCSVRfSU5ERVhdOyBcCisgICAgICAgIGlmIGNvbnN0ZXhwciAoc2lkZSA9PSBBVURJT19HRU9NRVRSWV9TSURFX0xFRlQgfHwgXAorICAgICAgICAgICAgICAgaGFzX0xGRV9MRkUyICYmICgxIDw8IEJJVF9JTkRFWCkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgeyBcCisgICAgICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzBdKSk7IFwKKyAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoc2lkZSA9PSBBVURJT19HRU9NRVRSWV9TSURFX1JJR0hUIHx8IFwKKyAgICAgICAgICAgICAgIGhhc19MRkVfTEZFMiAmJiAoMSA8PCBCSVRfSU5ERVgpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMikgeyBcCisgICAgICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzFdKSk7IFwKKyAgICAgICAgfSBlbHNlIC8qIGNvbnN0ZXhwciAqLyB7IFwKKyAgICAgICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCBjZW50ZXIpKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDApOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMSk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigyKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDMpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oNCk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTig1KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDYpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oNyk7CisKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDgpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oOSk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxMCk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxMSk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxMik7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxMyk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxNCk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxNSk7CisKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDE2KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDE3KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDE4KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDE5KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDIwKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDIxKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDIyKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDIzKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDI0KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDI1KTsKKyAgICBzdGF0aWNfYXNzZXJ0KEZDQ19MSU1JVCA8PSBGQ0NfMjYpOyAvLyBOb3RlOiB0aGlzIG1heSBuZWVkIHRvIGNoYW5nZS4KKyNwcmFnbWEgcG9wX21hY3JvKCJET19DSEFOTkVMX1BPU0lUSU9OIikKK30KKworLy8gVGhlc2UgYXJlIHRoZSBjaGFubmVsIHBvc2l0aW9uIG1hc2tzIHdlIGV4cGVjdCBmcm9tIHRoZSBIQUwuCisvLyBTZWUgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KCkgYnV0IHRoaXMgaXMgY29uc3RleHByCitjb25zdGV4cHIgaW5saW5lIGF1ZGlvX2NoYW5uZWxfbWFza190IGNhbm9uaWNhbENoYW5uZWxNYXNrRnJvbUNvdW50KHNpemVfdCBjaGFubmVsQ291bnQpIHsKKyAgICBjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2Fub25pY2FsW10gPSB7CisgICAgICAgIFswXSA9IEFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgWzFdID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgWzJdID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICBbM10gPSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgICAgICBbNF0gPSBBVURJT19DSEFOTkVMX09VVF9RVUFELAorICAgICAgICBbNV0gPSBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKKyAgICAgICAgWzZdID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICAgICAgWzddID0gQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSwKKyAgICAgICAgWzhdID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICAgICAgWzEyXSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQsCisgICAgICAgIFsxNF0gPSBBVURJT19DSEFOTkVMX09VVF85UE9JTlQxUE9JTlQ0LAorICAgICAgICBbMTZdID0gQVVESU9fQ0hBTk5FTF9PVVRfOVBPSU5UMVBPSU5UNiwKKyAgICAgICAgWzI0XSA9IEFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyLAorICAgIH07CisgICAgcmV0dXJuIGNoYW5uZWxDb3VudCA8IHN0ZDo6c2l6ZShjYW5vbmljYWwpID8gY2Fub25pY2FsW2NoYW5uZWxDb3VudF0gOiBBVURJT19DSEFOTkVMX05PTkU7Cit9CisKK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgaW50IE5DSEFOLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLAorICAgICAgICB0eXBlbmFtZSBGPgordm9pZCBzdGVyZW9Wb2x1bWVIZWxwZXIoVE8qJiBvdXQsIGNvbnN0IFRJKiYgaW4sIGNvbnN0IFRWICp2b2wsIEYgZikgeworICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPiAwICYmIE5DSEFOIDw9IEZDQ19MSU1JVCk7CisgICAgc3RhdGljX2Fzc2VydChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCisgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MCisgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5ECisgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCk7CisgICAgY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IE1BU0t7Y2Fub25pY2FsQ2hhbm5lbE1hc2tGcm9tQ291bnQoTkNIQU4pfTsKKyAgICBpZiBjb25zdGV4cHIgKE1BU0sgPT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwb3NpdGlvbiBjb3VudCAlZCIsIF9fZnVuY19fLCBOQ0hBTik7CisgICAgICAgIHJldHVybjsgLy8gbm90IGEgdmFsaWQgc3lzdGVtIG1hc2ssIGlnbm9yZS4KKyAgICB9CisgICAgc3RlcmVvVm9sdW1lSGVscGVyV2l0aENoYW5uZWxNYXNrPE1JWFRZUEUsIE1BU0ssIFRPLCBUSSwgVFYsIEY+KG91dCwgaW4sIHZvbCwgZik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCmluZGV4IDZkMzFjMTIuLjQ2NThkYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCkBAIC0zNjQsNiArMzY0LDI5IEBACiAgICAgICAgICAgICBzcmMsIG1JbnB1dENoYW5uZWxzLCBtSWR4QXJ5LCBtU2FtcGxlU2l6ZSwgZnJhbWVzKTsKIH0KIAorQ2hhbm5lbE1peEJ1ZmZlclByb3ZpZGVyOjpDaGFubmVsTWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpCit7CisgICAgQUxPR1YoIkNoYW5uZWxNaXhCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCkiLAorICAgICAgICAgICAgdGhpcywgZm9ybWF0LCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzayk7CisgICAgaWYgKG91dHB1dENoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAmJiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtSXNWYWxpZCA9IG1DaGFubmVsTWl4LnNldElucHV0Q2hhbm5lbE1hc2soaW5wdXRDaGFubmVsTWFzayk7CisgICAgfQorfQorCit2b2lkIENoYW5uZWxNaXhCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtQ2hhbm5lbE1peC5wcm9jZXNzKHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHNyYyksIHN0YXRpY19jYXN0PGZsb2F0ICo+KGRzdCksCisgICAgICAgICAgICBmcmFtZXMsIGZhbHNlIC8qIGFjY3VtdWxhdGUgKi8pOworfQorCiBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAogICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAogICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgpAQCAtNjMwLDcgKzY1Myw4IEBACiAKIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LCBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCwgdm9pZCogY29udHJhY3RlZEJ1ZmZlcikgOgorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCwgdm9pZCogY29udHJhY3RlZEJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IGNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQpIDoKICAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAogICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShpbkNoYW5uZWxDb3VudCwgZm9ybWF0KSwKICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoc3RkOjptYXgoaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCksIGZvcm1hdCksCkBAIC02NDAsMTUgKzY2NCwyMiBAQAogICAgICAgICBtT3V0Q2hhbm5lbENvdW50KG91dENoYW5uZWxDb3VudCksCiAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcyhhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAogICAgICAgICBtRnJhbWVDb3VudChmcmFtZUNvdW50KSwKLSAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQgLSBvdXRDaGFubmVsQ291bnQpLAotICAgICAgICBtQ29udHJhY3RlZEZvcm1hdChjb250cmFjdGVkRm9ybWF0KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQoaW5DaGFubmVsQ291bnQgPiBvdXRDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICA/IGNvbnRyYWN0ZWRGb3JtYXQgOiBBVURJT19GT1JNQVRfSU5WQUxJRCksCisgICAgICAgIG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQgPiBvdXRDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICA/IGluQ2hhbm5lbENvdW50IC0gb3V0Q2hhbm5lbENvdW50IDogMCksCisgICAgICAgIG1Db250cmFjdGVkT3V0Q2hhbm5lbENvdW50KGNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQpLAorICAgICAgICBtQ29udHJhY3RlZFNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoY29udHJhY3RlZEZvcm1hdCkpLAorICAgICAgICBtQ29udHJhY3RlZElucHV0RnJhbWVTaXplKG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQgKiBtQ29udHJhY3RlZFNhbXBsZVNpemVJbkJ5dGVzKSwKICAgICAgICAgbUNvbnRyYWN0ZWRCdWZmZXIoY29udHJhY3RlZEJ1ZmZlciksCiAgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcygwKQogewotICAgIEFMT0dWKCJBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlenUsICUjeCwgJXApIiwgdGhpcywgZm9ybWF0LAotICAgICAgICAgICAgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgY29udHJhY3RlZEZvcm1hdCwgY29udHJhY3RlZEJ1ZmZlcik7CisgICAgQUxPR1YoIkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICV6dSwgJSN4LCAlcCwgJXp1KSIsCisgICAgICAgICAgdGhpcywgZm9ybWF0LCBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBjb250cmFjdGVkRm9ybWF0LAorICAgICAgICAgIGNvbnRyYWN0ZWRCdWZmZXIsIGNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQpOwogICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7Ci0gICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1Db250cmFjdGVkQ2hhbm5lbENvdW50LCBtQ29udHJhY3RlZEZvcm1hdCk7CisgICAgICAgIG1Db250cmFjdGVkT3V0cHV0RnJhbWVTaXplID0KKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQsIG1Db250cmFjdGVkRm9ybWF0KTsKICAgICB9CiB9CiAKQEAgLTY2NywyNSArNjk4LDM5IEBACiAKIHZvaWQgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKIHsKLSAgICBpZiAobUluQ2hhbm5lbENvdW50ID4gbU91dENoYW5uZWxDb3VudCkgewotICAgICAgICAvLyBGb3IgY2FzZSBtdWx0aSB0byBtb25vLCBhZGp1c3RfY2hhbm5lbHMgaGFzIHNwZWNpYWwgbG9naWMgdGhhdCB3aWxsIG1peCBmaXJzdCB0d28gaW5wdXQKLSAgICAgICAgLy8gY2hhbm5lbHMgaW50byBhIHNpbmdsZSBvdXRwdXQgY2hhbm5lbC4gSW4gdGhhdCBjYXNlLCB1c2UgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZQotICAgICAgICAvLyB0byBrZWVwIG9ubHkgb25lIGNoYW5uZWwgZGF0YSBldmVuIHdoZW4gY29udHJhY3RpbmcgdG8gbW9uby4KLSAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShzcmMsIG1JbkNoYW5uZWxDb3VudCwgZHN0LCBtT3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcywgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKLSAgICAgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECi0gICAgICAgICAgICAmJiBtQ29udHJhY3RlZEJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3QgY29udHJhY3RlZElkeCA9IGZyYW1lcyAqIG1PdXRDaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXM7CisgICAgLy8gRm9yIGNhc2UgbXVsdGkgdG8gbW9ubywgYWRqdXN0X2NoYW5uZWxzIGhhcyBzcGVjaWFsIGxvZ2ljIHRoYXQgd2lsbCBtaXggZmlyc3QgdHdvIGlucHV0CisgICAgLy8gY2hhbm5lbHMgaW50byBhIHNpbmdsZSBvdXRwdXQgY2hhbm5lbC4gSW4gdGhhdCBjYXNlLCB1c2UgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZQorICAgIC8vIHRvIGtlZXAgb25seSBvbmUgY2hhbm5lbCBkYXRhIGV2ZW4gd2hlbiBjb250cmFjdGluZyB0byBtb25vLgorICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcywgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKKyAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQKKyAgICAgICAgJiYgbUNvbnRyYWN0ZWRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBzaXplX3QgY29udHJhY3RlZElkeCA9IGZyYW1lcyAqIG1PdXRDaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXM7CisgICAgICAgIHVpbnQ4X3QqIG9yaUJ1ZiA9ICh1aW50OF90KikgZHN0ICsgY29udHJhY3RlZElkeDsKKyAgICAgICAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKSBtQ29udHJhY3RlZEJ1ZmZlcgorICAgICAgICAgICAgICAgICsgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICogbUNvbnRyYWN0ZWRPdXRwdXRGcmFtZVNpemU7CisgICAgICAgIGlmIChtQ29udHJhY3RlZEluQ2hhbm5lbENvdW50ID4gbUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgY2hhbm5lbHMgZmlyc3QgYXMgdGhlIGNvbnRyYWN0ZWQgYnVmZmVyIG1heSBub3QgaGF2ZSBlbm91Z2gKKyAgICAgICAgICAgIC8vIHNwYWNlIGZvciB0aGUgZGF0YS4KKyAgICAgICAgICAgIC8vIFVzZSBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlIHRvIGF2b2lkIG1peCBmaXJzdCB0d28gY2hhbm5lbHMgaW50byBvbmUgc2luZ2xlCisgICAgICAgICAgICAvLyBvdXRwdXQgY2hhbm5lbCB3aGVuIGl0IGlzIG11bHRpIHRvIG1vbm8uCisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKAorICAgICAgICAgICAgICAgICAgICBvcmlCdWYsIG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQsIG9yaUJ1ZiwgbUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcywgZnJhbWVzICogbUNvbnRyYWN0ZWRJbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCopIG1Db250cmFjdGVkQnVmZmVyICsgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICogbUNvbnRyYWN0ZWRGcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgIG1Db250cmFjdGVkRm9ybWF0LCAodWludDhfdCopIGRzdCArIGNvbnRyYWN0ZWRJZHgsIG1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50ICogZnJhbWVzKTsKLSAgICAgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyArPSBmcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiwgbUNvbnRyYWN0ZWRGb3JtYXQsIG9yaUJ1ZiwgbUZvcm1hdCwgbUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQgKiBmcmFtZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29weSB0aGUgZGF0YSBmaXJzdCBhcyB0aGUgZHN0IGJ1ZmZlciBtYXkgbm90IGhhdmUgZW5vdWdoIHNwYWNlIGZvciBleHRyYSBjaGFubmVsLgorICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICBidWYsIG1Db250cmFjdGVkRm9ybWF0LCBvcmlCdWYsIG1Gb3JtYXQsIG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQgKiBmcmFtZXMpOworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoZSBjb250cmFjdGVkIGRhdGEgaXMgZnJvbSBNT05PIHRvIE1VTFRJQ0hBTk5FTCwgdGhlIGZpcnN0IDIgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIHdpbGwgYmUgZHVwbGljYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBzaW5nbGUgaW5wdXQgY2hhbm5lbCBhbmQgYWxsIHRoZSBvdGhlciBjaGFubmVscworICAgICAgICAgICAgLy8gd2lsbCBiZSAwLWZpbGxlZC4KKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVscygKKyAgICAgICAgICAgICAgICAgICAgYnVmLCBtQ29udHJhY3RlZEluQ2hhbm5lbENvdW50LCBidWYsIG1Db250cmFjdGVkT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZFNhbXBsZVNpemVJbkJ5dGVzLCBtQ29udHJhY3RlZElucHV0RnJhbWVTaXplICogZnJhbWVzKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFByZWZlciBleHBhbmRpbmcgZGF0YSBmcm9tIHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KLSAgICAgICAgYWRqdXN0X2NoYW5uZWxzKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzLCBmcmFtZXMgKiBtSW5DaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXMpOworICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKz0gZnJhbWVzOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpby5BQXVkaW9UZXN0cyNBQXVkaW9CYXNpYy4qIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKaW5kZXggNzBlYWZlMy4uMjk5M2E2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApAQCAtNTAsNiArNTAsNyBAQAogICAgICAgICAvLyBmb3IgaGFwdGljCiAgICAgICAgIEhBUFRJQ19FTkFCTEVEICA9IDB4NDAwNywgLy8gU2V0IGhhcHRpYyBkYXRhIGZyb20gdGhpcyB0cmFjayBzaG91bGQgYmUgcGxheWVkIG9yIG5vdC4KICAgICAgICAgSEFQVElDX0lOVEVOU0lUWSA9IDB4NDAwOCwgLy8gU2V0IHRoZSBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YS4KKyAgICAgICAgSEFQVElDX01BWF9BTVBMSVRVREUgPSAweDQwMDksIC8vIFNldCB0aGUgbWF4IGFtcGxpdHVkZSBhbGxvd2VkIGZvciBoYXB0aWMgZGF0YS4KICAgICAgICAgLy8gZm9yIHRhcmdldCBUSU1FU1RSRVRDSAogICAgICAgICBQTEFZQkFDS19SQVRFICAgPSAweDQzMDAsIC8vIENvbmZpZ3VyZSB0aW1lc3RyZXRjaCBvbiB0aGlzIHRyYWNrIG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KQEAgLTc5LDcgKzgwLDYgQEAKICAgICAgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKLSAgICAgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICB9CiAKQEAgLTk0LDEwICs5NCw4IEBACiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvclJlZm9ybWF0KCk7CiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7Ci0gICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoc2l6ZV90IGZyYW1lcyk7CiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7Ci0gICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKHNpemVfdCBmcmFtZXMpOwotICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7CiAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpOwogICAgICAgICBib29sICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CiAgICAgICAgIHZvaWQgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CkBAIC0xMTMsMjQgKzExMSwxOCBAQAogICAgICAgICAgKiAyKSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjogRXhwYW5kcyBvciBjb250cmFjdHMgc2FtcGxlIGRhdGEgZnJvbSBvbmUgaW50ZXJsZWF2ZWQKICAgICAgICAgICogICAgY2hhbm5lbCBmb3JtYXQgdG8gYW5vdGhlci4gRXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZAogICAgICAgICAgKiAgICBvZiBlYWNoIGF1ZGlvIGZyYW1lLiBDb250cmFjdGVkIGNoYW5uZWxzIGFyZSBjb3BpZWQgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgKiAzKSBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6IE5vbi1kZXN0cnVjdGl2ZWx5IGNvbnRyYWN0IHNhbXBsZSBkYXRhLgotICAgICAgICAgKiAgICBUaGlzIGlzIGN1cnJlbnRseSB1c2luZyBhdCBhdWRpby1oYXB0aWMgY291cGxlZCBwbGF5YmFjayB0byBzZXBhcmF0ZSBhdWRpbyBhbmQgaGFwdGljCi0gICAgICAgICAqICAgIGRhdGEuIENvbnRyYWN0ZWQgY2hhbm5lbHMgY291bGQgYmUgd3JpdHRlbiB0byBnaXZlbiBidWZmZXIuCi0gICAgICAgICAqIDQpIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGF1ZGlvIHJlZm9ybWF0IHRvCisgICAgICAgICAqIDMpIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGF1ZGlvIHJlZm9ybWF0IHRvCiAgICAgICAgICAqICAgIG1hdGNoIGVpdGhlciBtTWl4ZXJJbkZvcm1hdCBvciBtRG93bm1peFJlcXVpcmVzRm9ybWF0LCBpZiB0aGUgZG93bm1peGVyCiAgICAgICAgICAqICAgIHJlcXVpcmVzIHJlZm9ybWF0LiBGb3IgZXhhbXBsZSwgaXQgbWF5IGNvbnZlcnQgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdG8KICAgICAgICAgICogICAgUENNXzE2X2JpdCBpZiB0aGF0J3MgcmVxdWlyZWQgYnkgdGhlIGRvd25taXhlci4KLSAgICAgICAgICogNSkgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGNoYW5uZWwgcmVtaXhpbmcgdG8gbWF0Y2gKKyAgICAgICAgICogNCkgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGNoYW5uZWwgcmVtaXhpbmcgdG8gbWF0Y2gKICAgICAgICAgICogICAgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCBieSB0aGUgbWl4ZXIgc2luay4KLSAgICAgICAgICogNikgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCisgICAgICAgICAqIDUpIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyByZWZvcm1hdHRpbmcgZnJvbQogICAgICAgICAgKiAgICB0aGUgZG93bm1peGVyIHJlcXVpcmVtZW50cyB0byB0aGUgbWl4ZXIgZW5naW5lIGlucHV0IHJlcXVpcmVtZW50cy4KLSAgICAgICAgICogNykgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6IEFkZHMgdGltZXN0cmV0Y2hpbmcgZm9yIHBsYXliYWNrIHJhdGUKKyAgICAgICAgICogNikgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6IEFkZHMgdGltZXN0cmV0Y2hpbmcgZm9yIHBsYXliYWNrIHJhdGUKICAgICAgICAgICovCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KLSAgICAgICAgLy8gVE9ETzogY29tYmluZSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciBhbmQKLSAgICAgICAgLy8gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKQEAgLTE0NSwxNCArMTM3LDEzIEBACiAgICAgICAgIC8vIEhhcHRpYwogICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkOwogICAgICAgICBvczo6SGFwdGljU2NhbGUgICAgICBtSGFwdGljSW50ZW5zaXR5OworICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICBtSGFwdGljTWF4QW1wbGl0dWRlOwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtSGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQ7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckhhcHRpY0NoYW5uZWxNYXNrOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3RJbkNoYW5uZWxDb3VudDsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE91dENoYW5uZWxDb3VudDsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudDsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHM7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAppbmRleCBiMDM4ODU0Li5iM2FiOGE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQ2hhbm5lbE1peC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMTI5LDYgKzEzMCwyMyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCA9IC0yOwogfTsKIAorLy8gQ2hhbm5lbE1peEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gcGVyZm9ybSBhbgorLy8gZG93bm1peCB0byB0aGUgcHJvcGVyIGNoYW5uZWwgY291bnQgYW5kIG1hc2suCitjbGFzcyBDaGFubmVsTWl4QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBDaGFubmVsTWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisKKyAgICB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpIG92ZXJyaWRlOworCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbUlzVmFsaWQ7IH0KKworcHJvdGVjdGVkOgorICAgIGF1ZGlvX3V0aWxzOjpjaGFubmVsczo6Q2hhbm5lbE1peCBtQ2hhbm5lbE1peDsKKyAgICBib29sIG1Jc1ZhbGlkID0gZmFsc2U7Cit9OworCiAvLyBSZW1peEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gcGVyZm9ybSBhbgogLy8gdXBtaXggb3IgZG93bm1peCB0byB0aGUgcHJvcGVyIGNoYW5uZWwgY291bnQgYW5kIG1hc2suCiBjbGFzcyBSZW1peEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CkBAIC0yMjMsMTcgKzI0MSwyMiBAQAogLy8gRXh0cmEgZXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgogLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgY29waWVkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIoc3RvcmFnZSBzaG91bGQgYmUKIC8vIGFsbG9jYXRlZCBhcHByb3ByaWF0ZWx5KS4KLS8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgY291bGQgYmUgd3JpdHRlbiB0byBvdXRwdXQgYnVmZmVyLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIG91dHB1dCBidWZmZXIgYW5kIGdvdCBhZGp1c3RlZC4gV2hlbiB0aGUgY29udHJhY3RlZAorLy8gY2hhbm5lbHMgYXJlIGFkanVzdGVkIGluIHRoZSBjb250cmFjdGVkIGJ1ZmZlciwgdGhlIGlucHV0IGNoYW5uZWwgY291bnQgd2lsbCBiZSBjYWxjdWxhdGVkCisvLyBhcyBgaW5DaGFubmVsQ291bnQgLSBvdXRDaGFubmVsQ291bnRgLiBUaGUgb3V0cHV0IGNoYW5uZWwgY291bnQgaXMgcHJvdmlkZWQgYnkgY2FsbGVyLCB3aGljaAorLy8gaXMgYGNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnRgLiBDdXJyZW50bHksIGFkanVzdGluZyBjb250cmFjdGVkIGNoYW5uZWxzIGlzIHVzZWQgZm9yIGF1ZGlvCisvLyBjb3VwbGVkIGhhcHRpYyBwbGF5YmFjay4gSWYgdGhlIGRldmljZSBzdXBwb3J0cyB0d28gaGFwdGljIGNoYW5uZWxzIHdoaWxlIGFwcHMgb25seSBwcm92aWRlCisvLyBzaW5nbGUgaGFwdGljIGNoYW5uZWwsIHRoZSBzZWNvbmQgaGFwdGljIGNoYW5uZWwgd2lsbCBiZSBkdXBsaWNhdGVkIHdpdGggdGhlIGZpcnN0IGhhcHRpYworLy8gY2hhbm5lbCdzIGRhdGEuIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgc2luZ2xlIGhhcHRpYyBjaGFubmVscyB3aGlsZSBhcHBzIHByb3ZpZGUgdHdvIGhhcHRpYworLy8gY2hhbm5lbHMsIHRoZSBzZWNvbmQgY2hhbm5lbCB3aWxsIGJlIGNvbnRyYWN0ZWQuCiBjbGFzcyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CiBwdWJsaWM6Ci0gICAgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcihhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBpbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50KSA6IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgQVVESU9fRk9STUFUX0lOVkFMSUQsIG51bGxwdHIpIHsgfQogICAgIC8vIENvbnRyYWN0ZWQgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gY29udHJhY3RlZEZvcm1hdCBhbmQgcHV0IGludG8gY29udHJhY3RlZEJ1ZmZlci4KICAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGNvbnRyYWN0ZWRGb3JtYXQsCi0gICAgICAgICAgICB2b2lkKiBjb250cmFjdGVkQnVmZmVyKTsKKyAgICAgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgdm9pZCogY29udHJhY3RlZEJ1ZmZlciA9IG51bGxwdHIsCisgICAgICAgICAgICBzaXplX3QgY29udHJhY3RlZE91dENoYW5uZWxDb3VudCA9IDApOwogICAgIC8vT3ZlcnJpZGVzCiAgICAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIHBCdWZmZXIpIG92ZXJyaWRlOwogICAgIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgb3ZlcnJpZGU7CkBAIC0yNDcsMTEgKzI3MCwxNCBAQAogICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CiAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOwogICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1GcmFtZUNvdW50OwotICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50OwogICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Db250cmFjdGVkRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUNvbnRyYWN0ZWRTYW1wbGVTaXplSW5CeXRlczsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZElucHV0RnJhbWVTaXplOyAvLyBjb250cmFjdGVkIGlucHV0IGZyYW1lIHNpemUKICAgICB2b2lkICAgICAgICAgICAgICAgICptQ29udHJhY3RlZEJ1ZmZlcjsKICAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXM7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZVNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRPdXRwdXRGcmFtZVNpemU7IC8vIGNvbnRyYWN0ZWQgb3V0cHV0IGZyYW1lIHNpemUKIH07CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDM4NTY4MTcuLmFkNDAyZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC03Niw2ICs3Niw3IEBACiAvLwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAibWl4ZXJvcHNfb2JqZHVtcCIsCisgICAgaGVhZGVyX2xpYnM6IFsibGliYXVkaW91dGlsc19oZWFkZXJzIl0sCiAgICAgc3JjczogWyJtaXhlcm9wc19vYmpkdW1wLmNwcCJdLAogfQogCkBAIC04NCw2ICs4NSwxNiBAQAogLy8KIGNjX2JlbmNobWFyayB7CiAgICAgbmFtZTogIm1peGVyb3BzX2JlbmNobWFyayIsCisgICAgaGVhZGVyX2xpYnM6IFsibGliYXVkaW91dGlsc19oZWFkZXJzIl0sCiAgICAgc3JjczogWyJtaXhlcm9wc19iZW5jaG1hcmsuY3BwIl0sCiAgICAgc3RhdGljX2xpYnM6IFsibGliZ29vZ2xlLWJlbmNobWFyayJdLAogfQorCisvLworLy8gbWl4ZXJvcHMgdW5pdCB0ZXN0CisvLworY2NfdGVzdCB7CisgICAgbmFtZTogIm1peGVyb3BzX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3Byb2Nlc3NpbmdfdGVzdF9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsibWl4ZXJvcHNfdGVzdHMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfYmVuY2htYXJrLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwCmluZGV4IDdhNGM1YzcuLmY4NjZiMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwCkBAIC0xNiwxMSArMTYsOSBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9zeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZS9hdWRpb191dGlscy9wcmltaXRpdmVzLmgiCiAjZGVmaW5lIExPR19BTFdBWVNfRkFUQUwoLi4uKQogCiAjaW5jbHVkZSA8Li4vQXVkaW9NaXhlck9wcy5oPgotCiAjaW5jbHVkZSA8YmVuY2htYXJrL2JlbmNobWFyay5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc190ZXN0cy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDBiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJtaXhlcm9wX3Rlc3RzIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDwuLi9BdWRpb01peGVyT3BzLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIE5vdGU6IGd0ZXN0IHRlbXBsYXRlZCB0ZXN0cyByZXF1aXJlIHR5cGVuYW1lcywgbm90IGludGVnZXJzLgordGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4+CitjbGFzcyBNaXhlck9wc0Jhc2ljVGVzdCB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgdGVzdFN0ZXJlb1ZvbHVtZSgpIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpjaGFubmVsczsKKworICAgICAgICBjb25zdGV4cHIgc2l6ZV90IEZSQU1FX0NPVU5UID0gMTAwMDsKKyAgICAgICAgY29uc3RleHByIHNpemVfdCBTQU1QTEVfQ09VTlQgPSBGUkFNRV9DT1VOVCAqIE5DSEFOOworCisgICAgICAgIGNvbnN0IGZsb2F0IGluW1NBTVBMRV9DT1VOVF0gPSB7WzAgLi4uIChTQU1QTEVfQ09VTlQgLSAxKV0gPSAxLmZ9OworCisgICAgICAgIEFVRElPX0dFT01FVFJZX1NJREUgc2lkZXNbTkNIQU5dOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWwgPSBjYW5vbmljYWxDaGFubmVsTWFza0Zyb21Db3VudChOQ0hBTik7CisgICAgICAgIGNvbnN0ZXhwciB1bnNpZ25lZCBMRkVfTEZFMiA9CisgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMjsKKyAgICAgICAgYm9vbCBoYXNfTEZFX0xGRTIgPSAoY2hhbm5lbCAmIExGRV9MRkUyKSA9PSBMRkVfTEZFMjsKKyAgICAgICAgd2hpbGUgKGNoYW5uZWwgIT0gMCkgeworICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gX19idWlsdGluX2N0eihjaGFubmVsKTsKKyAgICAgICAgICAgIGlmIChoYXNfTEZFX0xGRTIgJiYgKDEgPDwgaW5kZXgpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHsKKyAgICAgICAgICAgICAgICBzaWRlc1tpKytdID0gQVVESU9fR0VPTUVUUllfU0lERV9MRUZUOyAvLyBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzX0xGRV9MRkUyICYmICgxIDw8IGluZGV4KSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZXzIpIHsKKyAgICAgICAgICAgICAgICBzaWRlc1tpKytdID0gQVVESU9fR0VPTUVUUllfU0lERV9SSUdIVDsgLy8gc3BlY2lhbCBjYXNlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNpZGVzW2krK10gPSBzaWRlRnJvbUNoYW5uZWxJZHgoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbCAmPSB+KDEgPDwgaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgdm9sYVsyXSA9IHsxLmYsIDAuZn07IC8vIGxlZnQgdm9sdW1lIGF0IG1heC4KKyAgICAgICAgZmxvYXQgb3V0W1NBTVBMRV9DT1VOVF17fTsKKyAgICAgICAgZmxvYXQgYXV4W0ZSQU1FX0NPVU5UXXt9OworICAgICAgICBmbG9hdCB2b2xhdXggPSAwLjU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIE5DSEFOPihvdXQsIEZSQU1FX0NPVU5ULCBpbiwgYXV4LCB2b2xhLCB2b2xhdXgpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKm91dHAgPSBvdXQ7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqYXV4cCA9IGF1eDsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxlZnQgPSB2b2xhWzBdOworICAgICAgICAgICAgY29uc3QgZmxvYXQgY2VudGVyID0gKHZvbGFbMF0gKyB2b2xhWzFdKSAqIDAuNTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJpZ2h0ID0gdm9sYVsxXTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlJBTUVfQ09VTlQ7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgTkNIQU47ICsraikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBhdWRpbyA9ICpvdXRwKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaWRlc1tqXSA9PSBBVURJT19HRU9NRVRSWV9TSURFX0xFRlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUShsZWZ0LCBhdWRpbyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2lkZXNbal0gPT0gQVVESU9fR0VPTUVUUllfU0lERV9DRU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUShjZW50ZXIsIGF1ZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUShyaWdodCwgYXVkaW8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh2b2xhdXgsICphdXhwKyspOyAgLy8gd29ya3MgaWYgYWxsIGNoYW5uZWxzIGNvbnRhaW4gMS5mCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgdm9sYlsyXSA9IHswLmYsIDAuNWZ9OyAvLyByaWdodCB2b2x1bWUgYXQgaGFsZiBtYXguCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgYWNjdW11bGF0ZXMgaW50byBvdXQsIGF1eC4KKyAgICAgICAgICAgIC8vIGZsb2F0IG91dFtTQU1QTEVfQ09VTlRde307CisgICAgICAgICAgICAvLyBmbG9hdCBhdXhbRlJBTUVfQ09VTlRde307CisgICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFLCBOQ0hBTj4ob3V0LCBGUkFNRV9DT1VOVCwgaW4sIGF1eCwgdm9sYiwgdm9sYXV4KTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpvdXRwID0gb3V0OworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmF1eHAgPSBhdXg7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBsZWZ0ID0gdm9sYVswXSArIHZvbGJbMF07CisgICAgICAgICAgICBjb25zdCBmbG9hdCBjZW50ZXIgPSAodm9sYVswXSArIHZvbGFbMV0gKyB2b2xiWzBdICsgdm9sYlsxXSkgKiAwLjU7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaWdodCA9IHZvbGFbMV0gKyB2b2xiWzFdOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGUkFNRV9DT1VOVDsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBOQ0hBTjsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGF1ZGlvID0gKm91dHArKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGVzW2pdID09IEFVRElPX0dFT01FVFJZX1NJREVfTEVGVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGxlZnQsIGF1ZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaWRlc1tqXSA9PSBBVURJT19HRU9NRVRSWV9TSURFX0NFTlRFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGNlbnRlciwgYXVkaW8pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHJpZ2h0LCBhdWRpbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYXV4IGlzIGFjY3VtdWxhdGVkIHNvIDJ4IHRoZSBhbXBsaXR1ZGUKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodm9sYXV4ICogMi5mLCAqYXV4cCsrKTsgIC8vIHdvcmtzIGlmIGFsbCBjaGFubmVscyBjb250YWluIDEuZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeyAvLyB0ZXN0IGF1eCBhcyBkZXJpdmVkIGZyb20gb3V0LgorICAgICAgICAgICAgLy8gQVVYIGNoYW5uZWwgaXMgdGhlIHdlaWdodGVkIHN1bSBvZiBhbGwgb2YgdGhlIG91dHB1dCBjaGFubmVscyBwcmlvciB0byB2b2x1bWUKKyAgICAgICAgICAgIC8vIGFkanVzdG1lbnQuICBXZSBtdXN0IHNldCBMIGFuZCBSIHRvIHRoZSBzYW1lIHZvbHVtZSB0byBhbGxvdyBjb21wdXRhdGlvbgorICAgICAgICAgICAgLy8gb2YgQVVYIGZyb20gdGhlIG91dHB1dCB2YWx1ZXMuCisgICAgICAgICAgICBjb25zdCBmbG9hdCB2b2xtb25vID0gMC4yNWY7CisgICAgICAgICAgICBjb25zdCBmbG9hdCB2b2xsclsyXSA9IHt2b2xtb25vLCB2b2xtb25vfTsgLy8gYWxsIHRoZSBzYW1lLgorICAgICAgICAgICAgZmxvYXQgb3V0W1NBTVBMRV9DT1VOVF17fTsKKyAgICAgICAgICAgIGZsb2F0IGF1eFtGUkFNRV9DT1VOVF17fTsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIE5DSEFOPihvdXQsIEZSQU1FX0NPVU5ULCBpbiwgYXV4LCB2b2xsciwgdm9sYXV4KTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpvdXRwID0gb3V0OworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmF1eHAgPSBhdXg7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZSQU1FX0NPVU5UOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBhY2N1bSA9IDAuZjsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IE5DSEFOOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjdW0gKz0gKm91dHArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGFjY3VtIC8gTkNIQU4gKiB2b2xhdXggLyB2b2xtb25vLCAqYXV4cCsrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK1RFU1QobWl4ZXJvcHMsIHN0ZXJlb3ZvbHVtZV8xKSB7IC8vIE5vdGU6IG1vbm8gbm90IHVzZWQgZm9yIG91dHB1dCBzaW5rcyB5ZXQuCisgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDE+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfMikgeworICAgIE1peGVyT3BzQmFzaWNUZXN0PE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCAyPjo6dGVzdFN0ZXJlb1ZvbHVtZSgpOworfQorVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzMpIHsKKyAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgMz46OnRlc3RTdGVyZW9Wb2x1bWUoKTsKK30KK1RFU1QobWl4ZXJvcHMsIHN0ZXJlb3ZvbHVtZV80KSB7CisgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDQ+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfNSkgeworICAgIE1peGVyT3BzQmFzaWNUZXN0PE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCA1Pjo6dGVzdFN0ZXJlb1ZvbHVtZSgpOworfQorVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzYpIHsKKyAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgNj46OnRlc3RTdGVyZW9Wb2x1bWUoKTsKK30KK1RFU1QobWl4ZXJvcHMsIHN0ZXJlb3ZvbHVtZV83KSB7CisgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDc+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfOCkgeworICAgIE1peGVyT3BzQmFzaWNUZXN0PE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCA4Pjo6dGVzdFN0ZXJlb1ZvbHVtZSgpOworfQorVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzEyKSB7CisgICAgaWYgY29uc3RleHByIChGQ0NfTElNSVQgPj0gMTIpIHsgLy8gTk9URTogRkNDX0xJTUlUIGlzIGFuIGVudW0sIHNvIGNhbid0ICNpZgorICAgICAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgMTI+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7CisgICAgfQorfQorVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzI0KSB7CisgICAgaWYgY29uc3RleHByIChGQ0NfTElNSVQgPj0gMjQpIHsKKyAgICAgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDI0Pjo6dGVzdFN0ZXJlb1ZvbHVtZSgpOworICAgIH0KK30KK1RFU1QobWl4ZXJvcHMsIGNoYW5uZWxfZXF1aXZhbGVuY2UpIHsKKyAgICAvLyB3ZSBtdXN0IG1hdGNoIHRoZSBjb25zdGV4cHIgZnVuY3Rpb24gd2l0aCB0aGUgc3lzdGVtIGRldGVybWluZWQgY2hhbm5lbCBtYXNrIGZyb20gY291bnQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGQ0NfTElNSVQ7ICsraSkgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBhY3R1YWwgPSBjYW5vbmljYWxDaGFubmVsTWFza0Zyb21Db3VudChpKTsKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3lzdGVtID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGkpOworICAgICAgICBpZiAoc3lzdGVtID09IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgY29udGludWU7CisgICAgICAgIEVYUEVDVF9FUShzeXN0ZW0sIGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icAppbmRleCBiMjZkMDI4Li5hYmU2MjJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icApAQCAtMjQsNiArMjQsMTAgQEAKICAgICB2ZW5kb3I6IHRydWUsCiAgICAgc3JjczogWyJFZmZlY3REb3dubWl4LmNwcCJdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiLiIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jcHAKaW5kZXggZjUwMGJjMy4uZDhmNTc4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmNwcApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKLSNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQ2hhbm5lbE1peC5oPgogCiAvLyBEbyBub3Qgc3VibWl0IHdpdGggRE9XTk1JWF9URVNUX0NIQU5ORUxfSU5ERVggZGVmaW5lZCwgc3RyaWN0bHkgZm9yIHRlc3RpbmcKIC8vI2RlZmluZSBET1dOTUlYX1RFU1RfQ0hBTk5FTF9JTkRFWCAwCkBAIC0zNSwxMiArMzUsMTMgQEAKIH0gZG93bm1peF9zdGF0ZV90OwogCiAvKiBwYXJhbWV0ZXJzIGZvciBlYWNoIGRvd25taXhlciAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGRvd25taXhfb2JqZWN0X3QgewogICAgIGRvd25taXhfc3RhdGVfdCBzdGF0ZTsKICAgICBkb3dubWl4X3R5cGVfdCB0eXBlOwogICAgIGJvb2wgYXBwbHlfdm9sdW1lX2NvcnJlY3Rpb247CiAgICAgdWludDhfdCBpbnB1dF9jaGFubmVsX2NvdW50OwotfSBkb3dubWl4X29iamVjdF90OworICAgIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpjaGFubmVsczo6Q2hhbm5lbE1peCBjaGFubmVsTWl4OworfTsKIAogdHlwZWRlZiBzdHJ1Y3QgZG93bm1peF9tb2R1bGVfcyB7CiAgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKQEAgLTc3LDExICs3OCw2IEBACiAgICAgICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSk7CiBzdGF0aWMgaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKAogICAgICAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1zdGF0aWMgdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci1zdGF0aWMgdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci1zdGF0aWMgdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci1zdGF0aWMgYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAotICAgICAgICB1aW50MzJfdCBtYXNrLCBmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGRvd25taXggZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdEb3dubWl4SW50ZXJmYWNlID0gewpAQCAtMTkyLDkgKzE4OCwxMSBAQAogICAgIGlmICghbWFzaykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIC8vIGNoZWNrIGFnYWluc3QgdW5zdXBwb3J0ZWQgY2hhbm5lbHMKLSAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF8yMlBPSU5UMikgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY2hhbm5lbHMgaW4gJXUiLCBtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyKTsKKyAgICAvLyBjaGVjayBhZ2FpbnN0IHVuc3VwcG9ydGVkIGNoYW5uZWxzICh1cCB0byBGQ0NfMjYpCisgICAgY29uc3RleHByIHVpbnQzMl90IE1BWElNVU1fQ0hBTk5FTF9NQVNLID0gQVVESU9fQ0hBTk5FTF9PVVRfMjJQT0lOVDIKKyAgICAgICAgICAgIHwgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfV0lERV9MRUZUIHwgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfV0lERV9SSUdIVDsKKyAgICBpZiAobWFzayAmIH5NQVhJTVVNX0NIQU5ORUxfTUFTSykgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY2hhbm5lbHMgaW4gJSN4IiwgbWFzayAmIH5NQVhJTVVNX0NIQU5ORUxfTUFTSyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC0zMTUsNyArMzEzLDggQEAKICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CiAKICAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyOwotICAgIGZsb2F0ICpwU3JjLCAqcERzdDsKKyAgICBjb25zdCBmbG9hdCAqcFNyYzsKKyAgICBmbG9hdCAqcERzdDsKICAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKilzZWxmOwogCiAgICAgaWYgKHBEd21Nb2R1bGUgPT0gTlVMTCkgewpAQCAtMzQ0LDcgKzM0Myw4IEBACiAKICAgICBjb25zdCBib29sIGFjY3VtdWxhdGUgPQogICAgICAgICAgICAgKHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKLSAgICBjb25zdCB1aW50MzJfdCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayA9CisgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOwogCiAgICAgc3dpdGNoKHBEb3dubWl4ZXItPnR5cGUpIHsKIApAQCAtMzY4LDM4ICszNjgsMTMgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX0ZPTEQ6Ci0jaWZkZWYgRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSCi0gICAgICAgICAgLy8gYnlwYXNzIHRoZSBvcHRpbWl6ZWQgZG93bm1peCByb3V0aW5lcyBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCi0gICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAotICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKLSAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uICUjeCBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgLy8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gZm9ybWF0cwotICAgICAgICBzd2l0Y2ggKGRvd25taXhJbnB1dENoYW5uZWxNYXNrKSB7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLOgotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERToKLSAgICAgICAgICAgIERvd25taXhfZm9sZEZyb21RdWFkKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0s6Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE6Ci0gICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCi0gICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrLCBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpKSB7CisgICAgICBjYXNlIERPV05NSVhfVFlQRV9GT0xEOiB7CisgICAgICAgICAgICBpZiAoIXBEb3dubWl4ZXItPmNoYW5uZWxNaXgucHJvY2VzcygKKyAgICAgICAgICAgICAgICAgICAgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gJSN4IGlzIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC02NzQsNiArNjQ5LDEyIEBACiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQorICAgIC8vIHdoZW4gY29uZmlndXJpbmcgdGhlIGVmZmVjdCwgZG8gbm90IGFsbG93IGEgYmxhbmsgb3IgdW5zdXBwb3J0ZWQgY2hhbm5lbCBtYXNrCisgICAgaWYgKCFEb3dubWl4X3ZhbGlkQ2hhbm5lbE1hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW5wdXQgY2hhbm5lbCBtYXNrKDB4JXgpIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQogCiAgICAgaWYgKCZwRHdtTW9kdWxlLT5jb25maWcgIT0gcENvbmZpZykgewogICAgICAgICBtZW1jcHkoJnBEd21Nb2R1bGUtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwpAQCAtNjg0LDEyICs2NjUsNiBAQAogICAgICAgICBwRG93bm1peGVyLT5hcHBseV92b2x1bWVfY29ycmVjdGlvbiA9IGZhbHNlOwogICAgICAgICBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50ID0gODsgLy8gbWF0Y2hlcyBkZWZhdWx0IGlucHV0IG9mIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEKICAgICB9IGVsc2UgewotICAgICAgICAvLyB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBlZmZlY3QsIGRvIG5vdCBhbGxvdyBhIGJsYW5rIG9yIHVuc3VwcG9ydGVkIGNoYW5uZWwgbWFzawotICAgICAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW5wdXQgY2hhbm5lbCBtYXNrKDB4JXgpIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQogICAgICAgICBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50ID0KICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIH0KQEAgLTc4MCw3ICs3NTUsNiBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRG93bm1peF9zZXRQYXJhbWV0ZXIgKi8KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZ2V0UGFyYW1ldGVyKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODI5LDI5OSArODAzLDMgQEAKICAgICByZXR1cm4gMDsKIH0gLyogZW5kIERvd25taXhfZ2V0UGFyYW1ldGVyICovCiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEb3dubWl4X2ZvbGRGcm9tUXVhZCgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgcXVhZCBzaWduYWwgdG8gc3RlcmVvCi0gKgotICogSW5wdXRzOgotICogIHBTcmMgICAgICAgcXVhZCBhdWRpbyBzYW1wbGVzIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgcXVhZCBmcmFtZXMgdG8gZG93bm1peAotICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAotICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKLSAqCi0gKiBPdXRwdXRzOgotICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoZmxvYXQgKnBTcmMsIGZsb2F0ICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgUkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBSUgotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIEZMICsgUkwKLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKSk7Ci0gICAgICAgICAgICAvLyBGUiArIFJSCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArICgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZikpOwotICAgICAgICAgICAgcFNyYyArPSA0OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBGTCArIFJMCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpOwotICAgICAgICAgICAgLy8gRlIgKyBSUgotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKTsKLSAgICAgICAgICAgIHBTcmMgKz0gNDsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSA1LjEgc2lnbmFsIHRvIHN0ZXJlbwotICoKLSAqIElucHV0czoKLSAqICBwU3JjICAgICAgIDUuMSBhdWRpbyBzYW1wbGVzIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgNS4xIGZyYW1lcyB0byBkb3dubWl4Ci0gKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCi0gKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQotICoKLSAqIE91dHB1dHM6Ci0gKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGZsb2F0IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKLSAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKLSAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCi0gICAgaWYgKGFjY3VtdWxhdGUpIHsKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAotICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOwotICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCi0gICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOwotICAgICAgICAgICAgcFNyYyArPSA2OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwotICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCi0gICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKLSAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKLSAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDY7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MSgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgNy4xIHNpZ25hbCB0byBzdGVyZW8KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcFNyYyAgICAgICA3LjEgYXVkaW8gc2FtcGxlcyB0byBkb3dubWl4Ci0gKiAgbnVtRnJhbWVzICB0aGUgbnVtYmVyIG9mIDcuMSBmcmFtZXMgdG8gZG93bm1peAotICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAotICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKLSAqCi0gKiBPdXRwdXRzOgotICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoZmxvYXQgKnBTcmMsIGZsb2F0ICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKLSAgICBmbG9hdCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDYgaXMgU0wKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNyBpcyBTUgotICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAotICAgIC8vIGZvciBldmVyeSBzYW1wbGUKLSAgICBpZiAoYWNjdW11bGF0ZSkgewotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwotICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKLSAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgotICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKLSAgICAgICAgICAgIC8vYWNjdW11bGF0ZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAobHQgLyAyLjBmKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIChydCAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gODsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCi0gICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOwotICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKLSAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s3XSArIHBTcmNbNV07Ci0gICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcFNyYyArPSA4OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRG93bm1peF9mb2xkR2VuZXJpYygpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IHRvIHN0ZXJlbyBhIG11bHRpY2hhbm5lbCBzaWduYWwgb2YgYXJiaXRyYXJ5IGNoYW5uZWwgcG9zaXRpb24gbWFzay4KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgbWFzayAgICAgICB0aGUgY2hhbm5lbCBtYXNrIG9mIHBTcmMKLSAqICBwU3JjICAgICAgIG11bHRpY2hhbm5lbCBhdWRpbyBidWZmZXIgdG8gZG93bm1peAotICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiBtdWx0aWNoYW5uZWwgZnJhbWVzIHRvIGRvd25taXgKLSAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKLSAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCi0gKgotICogT3V0cHV0czoKLSAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcwotICoKLSAqIFJldHVybnM6IGZhbHNlIGlmIG11bHRpY2hhbm5lbCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZAotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1ib29sIERvd25taXhfZm9sZEdlbmVyaWMoCi0gICAgICAgIHVpbnQzMl90IG1hc2ssIGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0KLSAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhtYXNrKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOwotCi0gICAgLy8gY29tcHV0ZSBhdCB3aGF0IGluZGV4IGVhY2ggY2hhbm5lbCBpczogc2FtcGxlcyB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gICAgLy8gICBGTCAgRlIgIEZDICAgIExGRSAgIEJMICBCUiAgQkMgICAgU0wgIFNSCi0gICAgLy8KLSAgICAvLyAgKHRyYW5zZmVyIG1hdHJpeCkKLSAgICAvLyAgIEZMICBGUiAgRkMgICAgTEZFICAgQkwgIEJSICBCQyAgICBTTCAgU1IKLSAgICAvLyAgIDAuNSAgICAgMC4zNTMgMC4zNTMgMC41ICAgICAwLjM1MyAwLjUKLSAgICAvLyAgICAgICAwLjUgMC4zNTMgMC4zNTMgICAgIDAuNSAwLjM1MyAgICAgMC41Ci0KLSAgICAvLyBkZXJpdmUgdGhlIGluZGljZXMgZm9yIHRoZSB0cmFuc2ZlciBtYXRyaXggY29sdW1ucyB0aGF0IGhhdmUgbm9uLXplcm8gdmFsdWVzLgotICAgIGludCBpbmRleEZMID0gLTE7Ci0gICAgaW50IGluZGV4RlIgPSAtMTsKLSAgICBpbnQgaW5kZXhGQyA9IC0xOwotICAgIGludCBpbmRleExGRSA9IC0xOwotICAgIGludCBpbmRleEJMID0gLTE7Ci0gICAgaW50IGluZGV4QlIgPSAtMTsKLSAgICBpbnQgaW5kZXhCQyA9IC0xOwotICAgIGludCBpbmRleFNMID0gLTE7Ci0gICAgaW50IGluZGV4U1IgPSAtMTsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGZvciAodW5zaWduZWQgdG1wID0gbWFzazsKLSAgICAgICAgICh0bXAgJiAoQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSB8IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSkgIT0gMDsKLSAgICAgICAgICsraW5kZXgpIHsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgbG93ZXN0Qml0ID0gdG1wICYgLShzaWduZWQpdG1wOwotICAgICAgICBzd2l0Y2ggKGxvd2VzdEJpdCkgewotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ6Ci0gICAgICAgICAgICBpbmRleEZMID0gaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVDoKLSAgICAgICAgICAgIGluZGV4RlIgPSBpbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUjoKLSAgICAgICAgICAgIGluZGV4RkMgPSBpbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1k6Ci0gICAgICAgICAgICBpbmRleExGRSA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUOgotICAgICAgICAgICAgaW5kZXhCTCA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVDoKLSAgICAgICAgICAgIGluZGV4QlIgPSBpbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSOgotICAgICAgICAgICAgaW5kZXhCQyA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUOgotICAgICAgICAgICAgaW5kZXhTTCA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVDoKLSAgICAgICAgICAgIGluZGV4U1IgPSBpbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRtcCBePSBsb3dlc3RCaXQ7Ci0gICAgfQotCi0gICAgLy8gV2l0aCBnb29kIGJyYW5jaCBwcmVkaWN0aW9uLCB0aGlzIHNob3VsZCBydW4gcmVhc29uYWJseSBmYXN0LgotICAgIC8vIEFsc28gY29uc2lkZXIgdXNpbmcgYSB0cmFuc2ZlciBtYXRyaXggZm9ybS4KLSAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCi0gICAgICAgIGZsb2F0IGNlbnRlcnNMZmVDb250cmliID0gMDsKLSAgICAgICAgaWYgKGluZGV4RkMgPj0gMCkgY2VudGVyc0xmZUNvbnRyaWIgPSBwU3JjW2luZGV4RkNdOwotICAgICAgICBpZiAoaW5kZXhMRkUgPj0gMCkgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07Ci0gICAgICAgIGlmIChpbmRleEJDID49IDApIGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107Ci0gICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7Ci0KLSAgICAgICAgZmxvYXQgY2hbMl07Ci0gICAgICAgIGNoWzBdID0gY2VudGVyc0xmZUNvbnRyaWI7Ci0gICAgICAgIGNoWzFdID0gY2VudGVyc0xmZUNvbnRyaWI7Ci0KLSAgICAgICAgLy8gbWl4IGluIGxlZnQgLyByaWdodCBjaGFubmVscwotICAgICAgICBpZiAoaW5kZXhGTCA+PSAwKSBjaFswXSArPSBwU3JjW2luZGV4RkxdOwotICAgICAgICBpZiAoaW5kZXhGUiA+PSAwKSBjaFsxXSArPSBwU3JjW2luZGV4RlJdOwotCi0gICAgICAgIGlmIChpbmRleFNMID49IDApIGNoWzBdICs9IHBTcmNbaW5kZXhTTF07Ci0gICAgICAgIGlmIChpbmRleFNSID49IDApIGNoWzFdICs9IHBTcmNbaW5kZXhTUl07IC8vIG5vdGUgcGFpciBjaGVja3MgZW5mb3JjZSB0aGlzIGlmIGluZGV4U0wgIT0gMAotCi0gICAgICAgIGlmIChpbmRleEJMID49IDApIGNoWzBdICs9IHBTcmNbaW5kZXhCTF07Ci0gICAgICAgIGlmIChpbmRleEJSID49IDApIGNoWzFdICs9IHBTcmNbaW5kZXhCUl07IC8vIG5vdGUgcGFpciBjaGVja3MgZW5mb3JjZSB0aGlzIGlmIGluZGV4QkwgIT0gMAotCi0gICAgICAgIC8vIHNjYWxlIHRvIHByZXZlbnQgb3ZlcmZsb3cuCi0gICAgICAgIGNoWzBdICo9IDAuNWY7Ci0gICAgICAgIGNoWzFdICo9IDAuNWY7Ci0KLSAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKLSAgICAgICAgICAgIGNoWzBdICs9IHBEc3RbMF07Ci0gICAgICAgICAgICBjaFsxXSArPSBwRHN0WzFdOwotICAgICAgICB9Ci0KLSAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGNoWzBdKTsKLSAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KGNoWzFdKTsKLSAgICAgICAgcFNyYyArPSBudW1DaGFuOwotICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgIG51bUZyYW1lcy0tOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9iZW5jaG1hcmsvZG93bm1peF9iZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9kb3dubWl4X2JlbmNobWFyay5jcHAKaW5kZXggZWUxNjljMi4uZDlkNDBlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9kb3dubWl4X2JlbmNobWFyay5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9kb3dubWl4X2JlbmNobWFyay5jcHAKQEAgLTM1LDE2ICszNSwxNCBAQAogICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKLSAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAogICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKICAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSwogICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKICAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsCkBAIC02Miw1OCArNjAsMzQgQEAKIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtGcmFtZUNvdW50ID0gMTAwMDsKIAogLyoKLVBpeGVsIDNYTAotZG93bm1peF9iZW5jaG1hcms6Ci0gICNCTV9Eb3dubWl4LzAgICAgIDQ3MjMgbnMgICAgNDcwOCBucyAgICAgICAxNDg2OTQKLSAgI0JNX0Rvd25taXgvMSAgICAgNDcxNyBucyAgICA0NzAyIG5zICAgICAgIDE0ODg3MwotICAjQk1fRG93bm1peC8yICAgICA0ODAzIG5zICAgIDQ3ODggbnMgICAgICAgMTQ1ODkzCi0gICNCTV9Eb3dubWl4LzMgICAgIDUwNTYgbnMgICAgNTA0MSBucyAgICAgICAxMzkxMTAKLSAgI0JNX0Rvd25taXgvNCAgICAgNDcxMCBucyAgICA0Njk2IG5zICAgICAgIDE0OTYyNQotICAjQk1fRG93bm1peC81ICAgICAxNTE0IG5zICAgIDE1MDkgbnMgICAgICAgNDYzNjk0Ci0gICNCTV9Eb3dubWl4LzYgICAgIDE1MTMgbnMgICAgMTUwOSBucyAgICAgICA0NjM0NTEKLSAgI0JNX0Rvd25taXgvNyAgICAgMTUxNiBucyAgICAxNTExIG5zICAgICAgIDQ2Mzg5OQotICAjQk1fRG93bm1peC84ICAgICA0NDQ1IG5zICAgIDQ0MzEgbnMgICAgICAgMTU3ODMxCi0gICNCTV9Eb3dubWl4LzkgICAgIDUwODEgbnMgICAgNTA2NSBucyAgICAgICAxMzg0MTIKLSAgI0JNX0Rvd25taXgvMTAgICAgNDM1NCBucyAgICA0MzQxIG5zICAgICAgIDE2MTI0NwotICAjQk1fRG93bm1peC8xMSAgICA0NDExIG5zICAgIDQzOTcgbnMgICAgICAgMTU4ODkzCi0gICNCTV9Eb3dubWl4LzEyICAgIDQ0MzQgbnMgICAgNDQyMCBucyAgICAgICAxNTc5OTIKLSAgI0JNX0Rvd25taXgvMTMgICAgNDg0NSBucyAgICA0ODMwIG5zICAgICAgIDE0NDg3MwotICAjQk1fRG93bm1peC8xNCAgICA0ODUxIG5zICAgIDQ4MzUgbnMgICAgICAgMTQ0OTU0Ci0gICNCTV9Eb3dubWl4LzE1ICAgIDQ4ODQgbnMgICAgNDg3MCBucyAgICAgICAxNDQyMzMKLSAgI0JNX0Rvd25taXgvMTYgICAgNTgzMiBucyAgICA1ODEzIG5zICAgICAgIDEyMDU2NQotICAjQk1fRG93bm1peC8xNyAgICA1MjQxIG5zICAgIDUyMjQgbnMgICAgICAgMTMzOTI3Ci0gICNCTV9Eb3dubWl4LzE4ICAgIDUwNDQgbnMgICAgNTAyOCBucyAgICAgICAxMzkxMzEKLSAgI0JNX0Rvd25taXgvMTkgICAgNTI0NCBucyAgICA1MjI3IG5zICAgICAgIDEzMjMxNQotICAjQk1fRG93bm1peC8yMCAgICA1OTQzIG5zICAgIDU5MjMgbnMgICAgICAgMTE3NzU5Ci0gICNCTV9Eb3dubWl4LzIxICAgIDU5OTAgbnMgICAgNTk3MSBucyAgICAgICAxMTcyNjMKLSAgI0JNX0Rvd25taXgvMjIgICAgNDQ2OCBucyAgICA0NDU0IG5zICAgICAgIDE1NjY4OQotICAjQk1fRG93bm1peC8yMyAgICA3MzA2IG5zICAgIDcyODYgbnMgICAgICAgIDk1OTExCi0tLQotZG93bm1peF9iZW5jaG1hcms6IChnZW5lcmljIGZvbGQpCi0gICNCTV9Eb3dubWl4LzAgICAgIDQ3MjIgbnMgICAgNDcwNyBucyAgICAgICAxNDk4NDcKLSAgI0JNX0Rvd25taXgvMSAgICAgNDcxNCBucyAgICA0Njk4IG5zICAgICAgIDE0ODc0OAotICAjQk1fRG93bm1peC8yICAgICA0Nzk0IG5zICAgIDQ3NzkgbnMgICAgICAgMTQ1NjYxCi0gICNCTV9Eb3dubWl4LzMgICAgIDUwNTMgbnMgICAgNTAzNSBucyAgICAgICAxMzkxNzIKLSAgI0JNX0Rvd25taXgvNCAgICAgNDY5NSBucyAgICA0Njc4IG5zICAgICAgIDE0OTc2MgotICAjQk1fRG93bm1peC81ICAgICA0MzgxIG5zICAgIDQzNjggbnMgICAgICAgMTU5Njc1Ci0gICNCTV9Eb3dubWl4LzYgICAgIDQzODcgbnMgICAgNDM3MyBucyAgICAgICAxNjAyNjcKLSAgI0JNX0Rvd25taXgvNyAgICAgNDczMiBucyAgICA0NzE3IG5zICAgICAgIDE0ODUxNAotICAjQk1fRG93bm1peC84ICAgICA0NDMwIG5zICAgIDQ0MTUgbnMgICAgICAgMTU4MTMzCi0gICNCTV9Eb3dubWl4LzkgICAgIDUxMDEgbnMgICAgNTA4NCBucyAgICAgICAxMzgzNTMKLSAgI0JNX0Rvd25taXgvMTAgICAgNDM1NiBucyAgICA0MzQzIG5zICAgICAgIDE2MDgyMQotICAjQk1fRG93bm1peC8xMSAgICA0Mzk3IG5zICAgIDQzODMgbnMgICAgICAgMTU5OTk1Ci0gICNCTV9Eb3dubWl4LzEyICAgIDQ0MzggbnMgICAgNDQyNCBucyAgICAgICAxNTgxMTcKLSAgI0JNX0Rvd25taXgvMTMgICAgNTI0MyBucyAgICA1MjI2IG5zICAgICAgIDEzMzg2MwotICAjQk1fRG93bm1peC8xNCAgICA1MjU5IG5zICAgIDUyNDIgbnMgICAgICAgMTMxODU1Ci0gICNCTV9Eb3dubWl4LzE1ICAgIDUyNDUgbnMgICAgNTIyOCBucyAgICAgICAxMzM2ODYKLSAgI0JNX0Rvd25taXgvMTYgICAgNTgyOSBucyAgICA1ODA5IG5zICAgICAgIDEyMDU0MwotICAjQk1fRG93bm1peC8xNyAgICA1MjQ1IG5zICAgIDUyMjggbnMgICAgICAgMTMzNTMzCi0gICNCTV9Eb3dubWl4LzE4ICAgIDU5MzUgbnMgICAgNTkxNiBucyAgICAgICAxMTgyODIKLSAgI0JNX0Rvd25taXgvMTkgICAgNTI2MyBucyAgICA1MjQ1IG5zICAgICAgIDEzMzY1NwotICAjQk1fRG93bm1peC8yMCAgICA1OTk4IG5zICAgIDU5NzggbnMgICAgICAgMTE0NjkzCi0gICNCTV9Eb3dubWl4LzIxICAgIDU5ODkgbnMgICAgNTk2OSBucyAgICAgICAxMTc0NTAKLSAgI0JNX0Rvd25taXgvMjIgICAgNDQ0MiBucyAgICA0NDMxIG5zICAgICAgIDE1NzkxMwotICAjQk1fRG93bm1peC8yMyAgICA3MzA5IG5zICAgIDcyOTAgbnMgICAgICAgIDk1Nzk3CitQaXhlbCA0WEwKKyQgYWRiIHNoZWxsIC9kYXRhL2JlbmNobWFya3Rlc3QvZG93bm1peF9iZW5jaG1hcmsvdmVuZG9yL2Rvd25taXhfYmVuY2htYXJrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCZW5jaG1hcmsgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgQ1BVICAgSXRlcmF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JNX0Rvd25taXgvMCAgICAgICAgMzYzOCBucyAgICAgICAgIDM2MjQgbnMgICAgICAgMTk3NTE3IEFVRElPX0NIQU5ORUxfT1VUX01PTk8KK0JNX0Rvd25taXgvMSAgICAgICAgNDA0MCBucyAgICAgICAgIDQwMjQgbnMgICAgICAgMTc4NzY2CitCTV9Eb3dubWl4LzIgICAgICAgIDQ3NTkgbnMgICAgICAgICA0NzQwIG5zICAgICAgIDEzNDc0MSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KK0JNX0Rvd25taXgvMyAgICAgICAgNjA0MiBucyAgICAgICAgIDYwMTcgbnMgICAgICAgMTI5NTQ2IEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEKK0JNX0Rvd25taXgvNCAgICAgICAgNjg5NyBucyAgICAgICAgIDY4NjggbnMgICAgICAgIDk2MzE2IEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIKK0JNX0Rvd25taXgvNSAgICAgICAgMjExNyBucyAgICAgICAgIDIxMDkgbnMgICAgICAgMzMxNzA1IEFVRElPX0NIQU5ORUxfT1VUX1FVQUQKK0JNX0Rvd25taXgvNiAgICAgICAgMjA5NyBucyAgICAgICAgIDIwODggbnMgICAgICAgMzM1NDIxIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERQorQk1fRG93bm1peC83ICAgICAgICA3MjkxIG5zICAgICAgICAgNzI2MyBucyAgICAgICAgOTYyNTYgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQKK0JNX0Rvd25taXgvOCAgICAgICAgODI0NiBucyAgICAgICAgIDgyMDYgbnMgICAgICAgIDg0MzE4IEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIKK0JNX0Rvd25taXgvOSAgICAgICAgODM0MSBucyAgICAgICAgIDgzMDMgbnMgICAgICAgIDg0Mjk4IEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIKK0JNX0Rvd25taXgvMTAgICAgICAgNzU0OSBucyAgICAgICAgIDc1MTcgbnMgICAgICAgIDg0MjkzIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBCitCTV9Eb3dubWl4LzExICAgICAgIDkzOTUgbnMgICAgICAgICA5MzU0IG5zICAgICAgICA3NTIwOSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyCitCTV9Eb3dubWl4LzEyICAgICAgIDMyNjcgbnMgICAgICAgICAzMjUzIG5zICAgICAgIDIxNTU5NiBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxCitCTV9Eb3dubWl4LzEzICAgICAgIDMxNzggbnMgICAgICAgICAzMTYzIG5zICAgICAgIDIyMDEzMiBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUKK0JNX0Rvd25taXgvMTQgICAgICAxMDI0NSBucyAgICAgICAgMTAxOTkgbnMgICAgICAgIDY3NDg2IEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEKK0JNX0Rvd25taXgvMTUgICAgICAxMDk3NSBucyAgICAgICAgMTA5MjkgbnMgICAgICAgIDYxMzU5IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIKK0JNX0Rvd25taXgvMTYgICAgICAgMzc5NiBucyAgICAgICAgIDM3ODAgbnMgICAgICAgMTg0NzI4IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEKK0JNX0Rvd25taXgvMTcgICAgICAxMzU2MiBucyAgICAgICAgMTM1MDMgbnMgICAgICAgIDUxODIzIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDQKK0JNX0Rvd25taXgvMTggICAgICAxMzU3MyBucyAgICAgICAgMTM1MTYgbnMgICAgICAgIDUxODAwIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIKK0JNX0Rvd25taXgvMTkgICAgICAxNTUwMiBucyAgICAgICAgMTU0MzUgbnMgICAgICAgIDQ3MTQ3IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQKK0JNX0Rvd25taXgvMjAgICAgICAxNjY5MyBucyAgICAgICAgMTY2MjQgbnMgICAgICAgIDQyMTA5IEFVRElPX0NIQU5ORUxfT1VUXzEzUE9JTlRfMzYwUkEKK0JNX0Rvd25taXgvMjEgICAgICAyODI2NyBucyAgICAgICAgMjgxMTYgbnMgICAgICAgIDI0OTgyIEFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyCiAqLwogCiBzdGF0aWMgdm9pZCBCTV9Eb3dubWl4KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CkBAIC0xMjUsNyArOTksNyBAQAogICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKGNoYW5uZWxNYXNrKTsKICAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOwogICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChrRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7Ci0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChrRnJhbWVDb3VudCAqIDIpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRwdXQoa0ZyYW1lQ291bnQgKiBGQ0NfMik7CiAgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CiAgICAgICAgIGluID0gZGlzKGdlbik7CiAgICAgfQpAQCAtMTg3LDcgKzE2MSw4IEBACiAgICAgICAgIGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOwogICAgIH0KIAotICAgIHN0YXRlLlNldENvbXBsZXhpdHlOKHN0YXRlLnJhbmdlKDApKTsKKyAgICBzdGF0ZS5TZXRDb21wbGV4aXR5TihjaGFubmVsQ291bnQpOworICAgIHN0YXRlLlNldExhYmVsKGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfdG9fc3RyaW5nKGNoYW5uZWxNYXNrKSk7CiAKICAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCA0OTQwMTE3Li4zOTJhNmZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icApAQCAtMTgsOSArMTgsNiBAQAogICAgIGd0ZXN0OiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4IiwKLSAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAogICAgIF0sCkBAIC01MSw5ICs0OCw2IEBACiAgICAgbmFtZToiZG93bm1peHRlc3QiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKICAgICBwcm9wcmlldGFyeTogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4IiwKLSAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peF90ZXN0cy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peF90ZXN0cy5jcHAKaW5kZXggZDRiN2EzYS4uMjBlMTlhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXhfdGVzdHMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4X3Rlc3RzLmNwcApAQCAtMzMsMTYgKzMzLDE0IEBACiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELCAvLyBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0sKICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwKICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAogICAgIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiwKQEAgLTUyLDEwICs1MCw3MiBAQAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMTNQT0lOVF8zNjBSQSwKICAgICBBVURJT19DSEFOTkVMX09VVF8yMlBPSU5UMiwKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdChBVURJT19DSEFOTkVMX09VVF8yMlBPSU5UMgorICAgICAgICAgICAgfCBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9XSURFX0xFRlQgfCBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9XSURFX1JJR0hUKSwKIH07CiAKLXN0YXRpYyBjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3Qga0NvbnNpZGVyZWRDaGFubmVscyA9Ci0gICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIHwgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOworY29uc3RleHByIGZsb2F0IENPRUZfMjUgPSAwLjI1MDg5MDk1MzZmOworY29uc3RleHByIGZsb2F0IENPRUZfMzUgPSAwLjM1NDM5Mjg5MTVmOworY29uc3RleHByIGZsb2F0IENPRUZfMzYgPSAwLjM1NTIzNDM4NTlmOworY29uc3RleHByIGZsb2F0IENPRUZfNjEgPSAwLjYwNTcwNDM0MjhmOworCitjb25zdGV4cHIgaW5saW5lIGZsb2F0IGtTY2FsZUZyb21DaGFubmVsSWR4TGVmdFtdID0geworICAgIDEuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCAgICAgICAgICAgID0gMHgxdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUICAgICAgICAgICA9IDB4MnUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgICAgICAgICAgPSAweDR1LAorICAgIDAuNWYsICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSAgICAgICAgID0gMHg4dSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCAgICAgICAgICAgICA9IDB4MTB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCAgICAgICAgICAgID0gMHgyMHUsCisgICAgQ09FRl82MSwgICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiAgPSAweDQwdSwKKyAgICBDT0VGXzI1LCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDB4ODB1LAorICAgIDAuNWYsICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIgICAgICAgICAgID0gMHgxMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUICAgICAgICAgICAgID0gMHgyMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCAgICAgICAgICAgID0gMHg0MDB1LAorICAgIENPRUZfMzYsICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUiAgICAgICAgICAgID0gMHg4MDB1LAorICAgIDEuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQgICAgICAgID0gMHgxMDAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIgICAgICA9IDB4MjAwMHUsCisgICAgMC5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQgICAgICAgPSAweDQwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCAgICAgICAgID0gMHg4MDAwdSwKKyAgICBDT0VGXzM1LCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUiAgICAgICA9IDB4MTAwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQgICAgICAgID0gMHgyMDAwMHUsCisgICAgQ09FRl82MSwgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUICAgICAgICAgPSAweDQwMDAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX1JJR0hUICAgICAgICA9IDB4ODAwMDB1LAorICAgIDEuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX0xFRlQgICAgID0gMHgxMDAwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX0NFTlRFUiAgID0gMHgyMDAwMDB1LAorICAgIDAuZiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX1JJR0hUICAgID0gMHg0MDAwMDB1LAorICAgIDAuZiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yICAgICAgID0gMHg4MDAwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfV0lERV9MRUZUICAgICAgID0gMHgxMDAwMDAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1dJREVfUklHSFQgICAgICA9IDB4MjAwMDAwMHUsCit9OworCitjb25zdGV4cHIgaW5saW5lIGZsb2F0IGtTY2FsZUZyb21DaGFubmVsSWR4UmlnaHRbXSA9IHsKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgICAgICAgICAgICA9IDB4MXUsCisgICAgMS5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDJ1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSICAgICAgICAgID0gMHg0dSwKKyAgICAwLjVmLCAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgICAgICAgICA9IDB4OHUsCisgICAgMC5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgICAgICAgICAgICAgPSAweDEwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQgICAgICAgICAgICA9IDB4MjB1LAorICAgIENPRUZfMjUsICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgID0gMHg0MHUsCisgICAgQ09FRl82MSwgICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwdSwKKyAgICAwLjVmLCAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSICAgICAgICAgICA9IDB4MTAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCAgICAgICAgICAgICA9IDB4MjAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQgICAgICAgICAgICA9IDB4NDAwdSwKKyAgICBDT0VGXzM2LCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIgICAgICAgICAgICA9IDB4ODAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUICAgICAgICA9IDB4MTAwMHUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSICAgICAgPSAweDIwMDB1LAorICAgIDEuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUICAgICAgID0gMHg0MDAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQgICAgICAgICA9IDB4ODAwMHUsCisgICAgQ09FRl8zNSwgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIgICAgICAgPSAweDEwMDAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUICAgICAgICA9IDB4MjAwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCAgICAgICAgID0gMHg0MDAwMHUsCisgICAgQ09FRl82MSwgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCAgICAgICAgPSAweDgwMDAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JPVFRPTV9GUk9OVF9MRUZUICAgICA9IDB4MTAwMDAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JPVFRPTV9GUk9OVF9DRU5URVIgICA9IDB4MjAwMDAwdSwKKyAgICAxLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JPVFRPTV9GUk9OVF9SSUdIVCAgICA9IDB4NDAwMDAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMiAgICAgICA9IDB4ODAwMDAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1dJREVfTEVGVCAgICAgICA9IDB4MTAwMDAwMHUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9XSURFX1JJR0hUICAgICAgPSAweDIwMDAwMDB1LAorfTsKIAogLy8gRG93bm1peCBkb2Vzbid0IGNoYW5nZSB3aXRoIHNhbXBsZSByYXRlCiBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU2FtcGxlUmF0ZXNbXSA9IHsKQEAgLTkzLDggKzE1Myw4IEBACiAgICAgdm9pZCB0ZXN0QmFsYW5jZShpbnQgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6YXVkaW9fdXRpbHM6OmNoYW5uZWxzOwogCi0gICAgICAgIHNpemVfdCBmcmFtZXMgPSAxMDA7Ci0gICAgICAgIHVuc2lnbmVkIG91dENoYW5uZWxzID0gMjsKKyAgICAgICAgc2l6ZV90IGZyYW1lcyA9IDEwMDsgLy8gc2V0IHRvIGFuIGV2ZW4gbnVtYmVyICgyLCA0LCA2IC4uLiApIHN0cmVhbSBhbHRlcm5hdGVzICsxLCAtMS4KKyAgICAgICAgY29uc3RleHByIHVuc2lnbmVkIG91dENoYW5uZWxzID0gMjsKICAgICAgICAgdW5zaWduZWQgaW5DaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChmcmFtZXMgKiBpbkNoYW5uZWxzKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChmcmFtZXMgKiBvdXRDaGFubmVscyk7CkBAIC0xMDIsNyArMTYyLDcgQEAKICAgICAgICAgZG91YmxlIHNhdmVkUG93ZXJbMzJdWzJde307CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGNoYW5uZWwgPSBjaGFubmVsTWFzazsgY2hhbm5lbCAhPSAwOyArK2kpIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IF9fYnVpbHRpbl9jdHooY2hhbm5lbCk7Ci0gICAgICAgICAgICBBU1NFUlRfTFQoaW5kZXgsIEZDQ18yNCk7CisgICAgICAgICAgICBBU1NFUlRfTFQoaW5kZXgsIEZDQ18yNik7CiAgICAgICAgICAgICBjb25zdCBpbnQgcGFpckluZGV4ID0gcGFpcklkeEZyb21DaGFubmVsSWR4KGluZGV4KTsKICAgICAgICAgICAgIGNvbnN0IEFVRElPX0dFT01FVFJZX1NJREUgc2lkZSA9IHNpZGVGcm9tQ2hhbm5lbElkeChpbmRleCk7CiAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbEJpdCA9IDEgPDwgaW5kZXg7CkBAIC0xMTksNyArMTc5LDcgQEAKIAogICAgICAgICAgICAgYXV0byBzdGF0cyA9IGNoYW5uZWxTdGF0aXN0aWNzKG91dHB1dCwgMiAvKiBjaGFubmVscyAqLyk7CiAgICAgICAgICAgICAvLyBwcmludGYoInBvd2VyOiAlcyAlc1xuIiwgc3RhdHNbMF0udG9TdHJpbmcoKS5jX3N0cigpLCBzdGF0c1sxXS50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgZG91YmxlIHBvd2VyWzJdID0geyBzdGF0c1swXS5nZXRWYXJpYW5jZSgpLCBzdGF0c1sxXS5nZXRWYXJpYW5jZSgpIH07CisgICAgICAgICAgICBkb3VibGUgcG93ZXJbMl0gPSB7IHN0YXRzWzBdLmdldFBvcFZhcmlhbmNlKCksIHN0YXRzWzFdLmdldFBvcFZhcmlhbmNlKCkgfTsKIAogICAgICAgICAgICAgLy8gQ2hlY2sgc3ltbWV0cmljIHBvd2VyIGZvciBwYWlyIGNoYW5uZWxzIG9uIGV4Y2hhbmdlIG9mIGxlZnQvcmlnaHQgcG9zaXRpb24uCiAgICAgICAgICAgICAvLyB0byBkbyB0aGlzLCB3ZSBzYXZlIHByZXZpb3VzIHBvd2VyIG1lYXN1cmVtZW50cy4KQEAgLTEzMCwyOCArMTkwLDM5IEBACiAgICAgICAgICAgICBzYXZlZFBvd2VyW2luZGV4XVswXSA9IHBvd2VyWzBdOwogICAgICAgICAgICAgc2F2ZWRQb3dlcltpbmRleF1bMV0gPSBwb3dlclsxXTsKIAotICAgICAgICAgICAgLy8gQ29uZmlybSBleGFjdGx5IHRoZSBtaXggYW1vdW50IHByZXNjcmliZWQgYnkgdGhlIGV4aXN0aW5nIGRvd25taXggZWZmZWN0LgotICAgICAgICAgICAgLy8gRm9yIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBkb3dubWl4IGVmZmVjdCwgdGhlIG5lYXJuZXNzIG5lZWRzIHRvIGJlIHJlbGF4ZWQKLSAgICAgICAgICAgIC8vIHRvIGNvbXBhcmUgYmVoYXZpb3IgUyBvciBlYXJsaWVyLgotICAgICAgICAgICAgaWYgKChjaGFubmVsQml0ICYga0NvbnNpZGVyZWRDaGFubmVscykgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGZvciBjaGFubmVscyBub3QgY29uc2lkZXJlZCwgZXhwZWN0IDAgcG93ZXIgZm9yIGxlZ2FjeSBkb3dubWl4Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMF0pOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgwLmYsIHBvd2VyWzFdKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0ZXhwciBmbG9hdCBQT1dFUl9UT0xFUkFOQ0UgPSAwLjAxOyAgLy8gZm9yIHZhcmlhbmNlIHN1bSBlcnJvci4KKyAgICAgICAgICAgIGNvbnN0ZXhwciBmbG9hdCBQT1dFUl9UT0xFUkFOQ0UgPSAwLjAwMTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkUG93ZXIgPQorICAgICAgICAgICAgICAgICAgICBrU2NhbGVGcm9tQ2hhbm5lbElkeExlZnRbaW5kZXhdICoga1NjYWxlRnJvbUNoYW5uZWxJZHhMZWZ0W2luZGV4XQorICAgICAgICAgICAgICAgICAgICArIGtTY2FsZUZyb21DaGFubmVsSWR4UmlnaHRbaW5kZXhdICoga1NjYWxlRnJvbUNoYW5uZWxJZHhSaWdodFtpbmRleF07CisgICAgICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFBvd2VyLCBwb3dlclswXSArIHBvd2VyWzFdLCBQT1dFUl9UT0xFUkFOQ0UpOwogICAgICAgICAgICAgc3dpdGNoIChzaWRlKSB7CiAgICAgICAgICAgICBjYXNlIEFVRElPX0dFT01FVFJZX1NJREVfTEVGVDoKLSAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUigwLjI1ZiwgcG93ZXJbMF0sIFBPV0VSX1RPTEVSQU5DRSk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxCaXQgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgwLmYsIHBvd2VyWzFdKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVVESU9fR0VPTUVUUllfU0lERV9SSUdIVDoKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbEJpdCA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgwLmYsIHBvd2VyWzBdKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUigwLjI1ZiwgcG93ZXJbMV0sIFBPV0VSX1RPTEVSQU5DRSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFVRElPX0dFT01FVFJZX1NJREVfQ0VOVEVSOgotICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSKDAuMTI1ZiwgcG93ZXJbMF0sIFBPV0VSX1RPTEVSQU5DRSk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX05FQVIoMC4xMjVmLCBwb3dlclsxXSwgUE9XRVJfVE9MRVJBTkNFKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbEJpdCA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMikgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUl9FUFNJTE9OKHBvd2VyWzBdLCBwb3dlclsxXSk7IC8vIGFsd2F5cyB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFBvd2VyLCBwb3dlclswXSArIHBvd2VyWzFdLCBQT1dFUl9UT0xFUkFOQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxCaXQgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgwLmYsIHBvd2VyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRQb3dlciwgcG93ZXJbMV0sIFBPV0VSX1RPTEVSQU5DRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUl9FUFNJTE9OKHBvd2VyWzBdLCBwb3dlclsxXSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNzgsNiArMjQ5LDcgQEAKICAgICAgICAgICAgICAgICBoYW5kbGVfLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICZjb25maWdfLCAmcmVwbHlTaXplLCAmcmVwbHkpOwogICAgICAgICBBU1NFUlRfRVEoMCwgZXJyKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHJlcGx5KTsKICAgICAgICAgZXJyID0gKGRvd25taXhBcGktPmNvbW1hbmQpKAogICAgICAgICAgICAgICAgIGhhbmRsZV8sIEVGRkVDVF9DTURfRU5BQkxFLAogICAgICAgICAgICAgICAgIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CkBAIC0xODgsNiArMjYwLDI3IEBACiAgICAgICAgIEFTU0VSVF9FUSgwLCBlcnIpOwogICAgIH0KIAorICAgIC8vIFRoaXMgdGVzdCBhc3N1bWVzIHRoZSBjaGFubmVsIG1hc2sgaXMgaW52YWxpZC4KKyAgICB2b2lkIHRlc3RJbnZhbGlkQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW52YWxpZENoYW5uZWxNYXNrKSB7CisgICAgICAgIHJlY29uZmlnKDQ4MDAwIC8qIHNhbXBsZVJhdGUgKi8sIGludmFsaWRDaGFubmVsTWFzayk7CisgICAgICAgIGNvbnN0IGludDMyX3Qgc2Vzc2lvbklkID0gMDsKKyAgICAgICAgY29uc3QgaW50MzJfdCBpb0lkID0gMDsKKyAgICAgICAgaW50MzJfdCBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KAorICAgICAgICAgICAgICAgICZkb3dubWl4X3V1aWRfLCBzZXNzaW9uSWQsIGlvSWQsICAmaGFuZGxlXyk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBlcnIpOworCisgICAgICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKiBjb25zdCBkb3dubWl4QXBpID0gKmhhbmRsZV87CisgICAgICAgIGludDMyX3QgcmVwbHkgPSAwOworICAgICAgICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKHJlcGx5KTsKKyAgICAgICAgZXJyID0gKGRvd25taXhBcGktPmNvbW1hbmQpKAorICAgICAgICAgICAgICAgIGhhbmRsZV8sIEVGRkVDVF9DTURfU0VUX0NPTkZJRywKKyAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgJmNvbmZpZ18sICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBlcnIpOworICAgICAgICBBU1NFUlRfTkUoMCwgcmVwbHkpOyAgLy8gZXJyb3IgaGFzIG9jY3VycmVkLgorICAgICAgICBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdChoYW5kbGVfKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIGVycik7CisgICAgfQorCiBwcml2YXRlOgogICAgIHZvaWQgcmVjb25maWcoaW50IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CiAgICAgICAgIGNvbmZpZ18uaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CkBAIC0yMzQsNiArMzI3LDE2IEBACiAgICAgaW50IGlucHV0Q2hhbm5lbENvdW50X3t9OwogfTsKIAorVEVTVChEb3dubWl4VGVzdFNpbXBsZSwgaW52YWxpZENoYW5uZWxNYXNrKSB7CisgICAgLy8gRmlsbCBpbiBhIGR1bW15IHRlc3QgbWV0aG9kIHRvIHVzZSBEb3dubWl4VGVzdCBvdXRzaWRlIG9mIGEgcGFyYW1ldGVyaXplZCB0ZXN0LgorICAgIGNsYXNzIERvd25taXhUZXN0Q29tcGxldGUgOiBwdWJsaWMgRG93bm1peFRlc3QgeworICAgICAgICB2b2lkIFRlc3RCb2R5KCkgb3ZlcnJpZGUge30KKyAgICB9IGRvd25taXh0ZXN0OworCisgICAgY29uc3RleHByIGF1dG8gSU5WQUxJRF9DSEFOTkVMX01BU0sgPSBhdWRpb19jaGFubmVsX21hc2tfdCgxIDw8IDMxKTsKKyAgICBkb3dubWl4dGVzdC50ZXN0SW52YWxpZENoYW5uZWxNYXNrKElOVkFMSURfQ0hBTk5FTF9NQVNLKTsKK30KKwogVEVTVF9QKERvd25taXhUZXN0LCBiYXNpYykgewogICAgIHRlc3RCYWxhbmNlKGtTYW1wbGVSYXRlc1tzdGQ6OmdldDwwPihHZXRQYXJhbSgpKV0sCiAgICAgICAgICAgICBrQ2hhbm5lbFBvc2l0aW9uTWFza3Nbc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSldKTsKQEAgLTI0NCwxMCArMzQ3LDExIEBACiAgICAgICAgIDo6dGVzdGluZzo6Q29tYmluZSgKICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpc3RkOjpzaXplKGtTYW1wbGVSYXRlcykpLAogICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClzdGQ6OnNpemUoa0NoYW5uZWxQb3NpdGlvbk1hc2tzKSkKLSAgICAgICAgICAgICAgICApKTsKLQotaW50IG1haW4oaW50IGFyZ2MsIC8qIGNvbnN0ICovIGNoYXIqKiBhcmd2KSB7Ci0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQorICAgICAgICAgICAgICAgICksCisgICAgICAgIFtdKGNvbnN0IHRlc3Rpbmc6OlRlc3RQYXJhbUluZm88RG93bm1peFRlc3Q6OlBhcmFtVHlwZT4mIGluZm8pIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IHN0ZDo6Z2V0PDE+KGluZm8ucGFyYW0pOworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBrQ2hhbm5lbFBvc2l0aW9uTWFza3NbaW5kZXhdOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6c3RyaW5nKGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfdG9fc3RyaW5nKGNoYW5uZWxNYXNrKSkKKyAgICAgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKHN0ZDo6Z2V0PDA+KGluZm8ucGFyYW0pKSArICJfIiArIHN0ZDo6dG9fc3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9BbmRyb2lkLmJwCmluZGV4IGE2NjA5NTcuLjAzY2UzMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvQW5kcm9pZC5icApAQCAtNDUsNiArNDUsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuY3BwCmluZGV4IDY1YTIwYTcuLjMxMzdlMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmNwcApAQCAtMjIsMTIgKzIyLDE1IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWRvdWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0zNSw2ICszOCw3IEBACiBzdGF0aWMgY29uc3RleHByIGZsb2F0IERFRkFVTFRfUkVTT05BTlRfRlJFUVVFTkNZID0gMTUwLjBmOwogc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBERUZBVUxUX0JTRl9aRVJPX1EgPSA4LjBmOwogc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBERUZBVUxUX0JTRl9QT0xFX1EgPSA0LjBmOworc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBERUZBVUxUX0RJU1RPUlRJT05fT1VUUFVUX0dBSU4gPSAxLjVmOwogCiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCkBAIC04MSw2ICs4NSwxNSBAQAogCiBuYW1lc3BhY2UgewogCitmbG9hdCBnZXRGbG9hdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGZsb2F0IGRlZmF1bHRWYWx1ZSkgeworICAgIGZsb2F0IHJlc3VsdDsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KGtleSwgIiIpOworICAgIGlmICghdmFsdWUuZW1wdHkoKSAmJiBhbmRyb2lkOjpiYXNlOjpQYXJzZUZsb2F0KHZhbHVlLCAmcmVzdWx0KSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworfQorCiBpbnQgSGFwdGljR2VuZXJhdG9yX0luaXQoc3RydWN0IEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQpIHsKICAgICBjb250ZXh0LT5pdGZlID0gJmdIYXB0aWNHZW5lcmF0b3JJbnRlcmZhY2U7CiAKQEAgLTExNCw3ICsxMjcsOSBAQAogICAgIGNvbnRleHQtPnBhcmFtLmRpc3RvcnRpb25Db3JuZXJGcmVxdWVuY3kgPSAzMDAuMGY7CiAgICAgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbklucHV0R2FpbiA9IDAuM2Y7CiAgICAgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbkN1YmVUaHJlc2hvbGQgPSAwLjFmOwotICAgIGNvbnRleHQtPnBhcmFtLmRpc3RvcnRpb25PdXRwdXRHYWluID0gMS41ZjsKKyAgICBjb250ZXh0LT5wYXJhbS5kaXN0b3J0aW9uT3V0cHV0R2FpbiA9IGdldEZsb2F0UHJvcGVydHkoCisgICAgICAgICAgICAidmVuZG9yLmF1ZGlvLmhhcHRpY2dlbmVyYXRvci5kaXN0b3J0aW9uLm91dHB1dC5nYWluIiwgREVGQVVMVF9ESVNUT1JUSU9OX09VVFBVVF9HQUlOKTsKKyAgICBBTE9HRCgiVXNpbmcgZGlzdG9ydGlvbiBvdXRwdXQgZ2FpbiBhcyAlZiIsIGNvbnRleHQtPnBhcmFtLmRpc3RvcnRpb25PdXRwdXRHYWluKTsKIAogICAgIGNvbnRleHQtPnN0YXRlID0gSEFQVElDR0VORVJBVE9SX1NUQVRFX0lOSVRJQUxJWkVEOwogICAgIHJldHVybiAwOwpAQCAtMjg3LDE1ICszMDIsMTcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgSEdfUEFSQU1fVklCUkFUT1JfSU5GTzogewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbHB0ciB8fCBzaXplICE9IDIgKiBzaXplb2YoZmxvYXQpKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxscHRyIHx8IHNpemUgIT0gMyAqIHNpemVvZihmbG9hdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGZsb2F0IHJlc29uYW50RnJlcXVlbmN5ID0gKihmbG9hdCopIHZhbHVlOwogICAgICAgICBjb25zdCBmbG9hdCBxRmFjdG9yID0gKigoZmxvYXQgKikgdmFsdWUgKyAxKTsKKyAgICAgICAgY29uc3QgZmxvYXQgbWF4QW1wbGl0dWRlID0gKigoZmxvYXQgKikgdmFsdWUgKyAyKTsKICAgICAgICAgY29udGV4dC0+cGFyYW0ucmVzb25hbnRGcmVxdWVuY3kgPQogICAgICAgICAgICAgICAgIGlzbmFuKHJlc29uYW50RnJlcXVlbmN5KSA/IERFRkFVTFRfUkVTT05BTlRfRlJFUVVFTkNZIDogcmVzb25hbnRGcmVxdWVuY3k7CiAgICAgICAgIGNvbnRleHQtPnBhcmFtLmJzZlplcm9RID0gaXNuYW4ocUZhY3RvcikgPyBERUZBVUxUX0JTRl9QT0xFX1EgOiBxRmFjdG9yOwogICAgICAgICBjb250ZXh0LT5wYXJhbS5ic2ZQb2xlUSA9IGNvbnRleHQtPnBhcmFtLmJzZlplcm9RIC8gMi4wZjsKKyAgICAgICAgY29udGV4dC0+cGFyYW0ubWF4SGFwdGljQW1wbGl0dWRlID0gbWF4QW1wbGl0dWRlOwogCiAgICAgICAgIGlmIChjb250ZXh0LT5wcm9jZXNzb3JzUmVjb3JkLmJwZiAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBjb250ZXh0LT5wcm9jZXNzb3JzUmVjb3JkLmJwZi0+c2V0Q29lZmZpY2llbnRzKApAQCAtNDQ4LDcgKzQ2NSw4IEBACiAgICAgZmxvYXQqIGhhcHRpY091dEJ1ZmZlciA9IEhhcHRpY0dlbmVyYXRvcl9ydW5Qcm9jZXNzaW5nQ2hhaW4oCiAgICAgICAgICAgICBjb250ZXh0LT5wcm9jZXNzaW5nQ2hhaW4sIGNvbnRleHQtPmlucHV0QnVmZmVyLmRhdGEoKSwKICAgICAgICAgICAgIGNvbnRleHQtPm91dHB1dEJ1ZmZlci5kYXRhKCksIGluQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICBvczo6c2NhbGVIYXB0aWNEYXRhKGhhcHRpY091dEJ1ZmZlciwgaGFwdGljU2FtcGxlQ291bnQsIGNvbnRleHQtPnBhcmFtLm1heEhhcHRpY0ludGVuc2l0eSk7CisgICAgb3M6OnNjYWxlSGFwdGljRGF0YShoYXB0aWNPdXRCdWZmZXIsIGhhcHRpY1NhbXBsZUNvdW50LCBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNBbXBsaXR1ZGUpOwogCiAgICAgLy8gRm9yIGhhcHRpYyBkYXRhLCB0aGUgaGFwdGljIHBsYXliYWNrIHRocmVhZCB3aWxsIGNvcHkgdGhlIGRhdGEgZnJvbSBlZmZlY3QgaW5wdXQgYnVmZmVyLAogICAgIC8vIHdoaWNoIGNvbnRhaW5zIGhhcHRpYyBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgZGlyZWN0bHkgdG8gc2luayBidWZmZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oCmluZGV4IDk2Yjc0NGEuLjg1ZTk2MWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oCkBAIC01MSw2ICs1MSw3IEBACiAgICAgLy8gQSBtYXAgZnJvbSB0cmFjayBpZCB0byBoYXB0aWMgaW50ZW5zaXR5LgogICAgIHN0ZDo6bWFwPGludCwgb3M6OkhhcHRpY1NjYWxlPiBpZDJJbnRlbnNpdHk7CiAgICAgb3M6OkhhcHRpY1NjYWxlIG1heEhhcHRpY0ludGVuc2l0eTsgLy8gbWF4IGludGVuc2l0eSB3aWxsIGJlIHVzZWQgdG8gc2NhbGUgaGFwdGljIGRhdGEuCisgICAgZmxvYXQgbWF4SGFwdGljQW1wbGl0dWRlOyAvLyBtYXggYW1wbGl0dWRlIHdpbGwgYmUgdXNlZCB0byBsaW1pdCBoYXB0aWMgZGF0YSBhYnNvbHV0ZSB2YWx1ZXMuCiAKICAgICBmbG9hdCByZXNvbmFudEZyZXF1ZW5jeTsKICAgICBmbG9hdCBicGZROwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vYmVuY2htYXJrcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vYmVuY2htYXJrcy9BbmRyb2lkLmJwCmluZGV4IDhhMjViODUuLmMyMWM1ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKQEAgLTI5LDkgKzI5LDYgQEAKICAgICBuYW1lOiAicmV2ZXJiX2JlbmNobWFyayIsCiAgICAgdmVuZG9yOiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYiIsCi0gICAgXSwKICAgICBzcmNzOiBbInJldmVyYl9iZW5jaG1hcmsuY3BwIl0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnJldmVyYiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwCmluZGV4IDdlNWNhZWQuLmNjZWY1YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwCkBAIC0xMzUsNyArMTM1LDYgQEAKICAgICBMVk1fVUlOVDMyIGZzID0KICAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWRVFOQl9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAvKiBTYW1wbGUgcmF0ZSAqLwogICAgIExWTV9VSU5UMzIgZmM7ICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIExWTV9JTlQxNiBRRmFjdG9yOyAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KIAogICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOwogCkBAIC0xNDQsNyArMTQzLDYgQEAKICAgICAgICAgICogR2V0IHRoZSBmaWx0ZXIgc2V0dGluZ3MKICAgICAgICAgICovCiAgICAgICAgIGZjID0gKExWTV9VSU5UMzIpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeTsgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7IC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLwogCiAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OyAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KIApAQCAtMzEzLDkgKzMxMSw5IEBACiAgICAgICovCiAgICAgcEluc3RhbmNlLT5lcUJpcXVhZC5yZXNpemUocFBhcmFtcy0+TkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihwUGFyYW1zLT5OckNoYW5uZWxzKSk7Ci0gICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOwogCiAgICAgaWYgKGJDaGFuZ2UgfHwgbW9kZUNoYW5nZSkgeworICAgICAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBjbGVhciB0aGUgaGlzdG9yeQogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcAppbmRleCA4ZTYzNTAyLi5mZmVkNmQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCkBAIC00MjEsNyArNDIxLDYgQEAKICAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCiAgICAgICovCiAgICAgTFZNX0ZMT0FUIFQwOwotICAgIExWTV9GTE9BVCBEOwogICAgIExWTV9GTE9BVCBBMDsKICAgICBMVk1fRkxPQVQgQjE7CiAgICAgTFZNX0ZMT0FUIEIyOwpAQCAtNDQ0LDkgKzQ0Myw2IEBACiAgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKICAgICAgKi8KICAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCi0gICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KLSAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudApAQCAtNTM1LDcgKzUzMSw2IEBACiAgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwogICAgICAqLwogICAgIExWTV9GTE9BVCBUMDsKLSAgICBMVk1fRkxPQVQgRDsKICAgICBMVk1fRkxPQVQgQTA7CiAgICAgTFZNX0ZMT0FUIEIxOwogICAgIExWTV9GTE9BVCBCMjsKQEAgLTU1OCw5ICs1NTMsNiBAQAogICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCiAgICAgICovCiAgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107IC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCi0gICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDk5MzllZDEuLjdkN2Y4YjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMTgsMTAgKzE4LDYgQEAKICAgICAgICAgIkVmZmVjdFJldmVyYlRlc3QuY3BwIiwKICAgICAgICAgIkVmZmVjdFRlc3RIZWxwZXIuY3BwIiwKICAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKLSAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYnJldmVyYiIsCkBAIC0xMDgsMTAgKzEwNCw2IEBACiAgICAgcHJvcHJpZXRhcnk6IHRydWUsCiAgICAgZ3Rlc3Q6IGZhbHNlLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdEJ1bmRsZVRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0QnVuZGxlVGVzdC5jcHAKaW5kZXggODgxZmZiMS4uMDE4Y2I3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0QnVuZGxlVGVzdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0QnVuZGxlVGVzdC5jcHAKQEAgLTE0LDI5ICsxNCwzOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9iYXNzYm9vc3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfZXF1YWxpemVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3ZpcnR1YWxpemVyLmg+CiAjaW5jbHVkZSAiRWZmZWN0VGVzdEhlbHBlci5oIgotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLS8vIFVwZGF0ZSBpc0Jhc3NCb29zdCwgaWYgdGhlIG9yZGVyIG9mIGVmZmVjdHMgaXMgdXBkYXRlZAotY29uc3RleHByIGVmZmVjdF91dWlkX3Qga0VmZmVjdFV1aWRzW10gPSB7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3R5cGVkZWYgZW51bSB7CisgICAgRUZGRUNUX0JBU1NfQk9PU1QsCisgICAgRUZGRUNUX0VRVUFMSVpFUiwKKyAgICBFRkZFQ1RfVklSVFVBTElaRVIsCisgICAgRUZGRUNUX1ZPTFVNRQorfSBlZmZlY3RfdHlwZV90OworCitjb25zdCBzdGQ6Om1hcDxlZmZlY3RfdHlwZV90LCBlZmZlY3RfdXVpZF90PiBrRWZmZWN0VXVpZHMgPSB7CiAgICAgICAgIC8vIE5YUCBTVyBCYXNzQm9vc3QKLSAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIC8vIE5YUCBTVyBWaXJ0dWFsaXplcgotICAgICAgICB7MHgxZDQwMzNjMCwgMHg4NTU3LCAweDExZGYsIDB4OWYyZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAge0VGRkVDVF9CQVNTX0JPT1NULAorICAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX19LAogICAgICAgICAvLyBOWFAgU1cgRXF1YWxpemVyCi0gICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7RUZGRUNUX0VRVUFMSVpFUiwKKyAgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19fSwKKyAgICAgICAgLy8gTlhQIFNXIFZpcnR1YWxpemVyCisgICAgICAgIHtFRkZFQ1RfVklSVFVBTElaRVIsCisgICAgICAgICB7MHgxZDQwMzNjMCwgMHg4NTU3LCAweDExZGYsIDB4OWYyZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fX0sCiAgICAgICAgIC8vIE5YUCBTVyBWb2x1bWUKLSAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHtFRkZFQ1RfVk9MVU1FLCB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fX0sCiB9OwogCi1zdGF0aWMgYm9vbCBpc0Jhc3NCb29zdChjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkKSB7Ci0gICAgLy8gVXBkYXRlIHRoaXMsIGlmIHRoZSBvcmRlciBvZiBlZmZlY3RzIGluIGtFZmZlY3RVdWlkcyBpcyB1cGRhdGVkCi0gICAgcmV0dXJuIHV1aWQgPT0gJmtFZmZlY3RVdWlkc1swXTsKLX0KK2NvbnN0IHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKIAotY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKK2NvbnN0ZXhwciBmbG9hdCBrTWluQW1wbGl0dWRlID0gLTEuMGY7Citjb25zdGV4cHIgZmxvYXQga01heEFtcGxpdHVkZSA9IDEuMGY7CiAKLXR5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludD4gU2luZ2xlRWZmZWN0VGVzdFBhcmFtOwordXNpbmcgU2luZ2xlRWZmZWN0VGVzdFBhcmFtID0gc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludD47CiBjbGFzcyBTaW5nbGVFZmZlY3RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3RUZXN0UGFyYW0+IHsKICAgcHVibGljOgogICAgIFNpbmdsZUVmZmVjdFRlc3QoKQpAQCAtNDYsNyArNTYsOCBAQAogICAgICAgICAgIG1GcmFtZUNvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtGcmFtZUNvdW50c1tzdGQ6OmdldDwyPihHZXRQYXJhbSgpKV0pLAogICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSldKSwKICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCi0gICAgICAgICAgbVV1aWQoJmtFZmZlY3RVdWlkc1tzdGQ6OmdldDw0PihHZXRQYXJhbSgpKV0pIHt9CisgICAgICAgICAgbUVmZmVjdFR5cGUoKGVmZmVjdF90eXBlX3Qpc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSkpLAorICAgICAgICAgIG1VdWlkKGtFZmZlY3RVdWlkcy5hdChtRWZmZWN0VHlwZSkpIHt9CiAKICAgICBjb25zdCBzaXplX3QgbUNoTWFzazsKICAgICBjb25zdCBzaXplX3QgbUNoYW5uZWxDb3VudDsKQEAgLTU0LDcgKzY1LDggQEAKICAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CiAgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CiAgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7Ci0gICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7CisgICAgY29uc3QgZWZmZWN0X3R5cGVfdCBtRWZmZWN0VHlwZTsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90IG1VdWlkOwogfTsKIAogLy8gVGVzdHMgYXBwbHlpbmcgYSBzaW5nbGUgZWZmZWN0CkBAIC02Myw3ICs3NSw3IEBACiAgICAgICAgICAgICAgICAgIDw8ICJjaE1hc2s6ICIgPDwgbUNoTWFzayA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUKICAgICAgICAgICAgICAgICAgPDwgIiBmcmFtZUNvdW50OiAiIDw8IG1GcmFtZUNvdW50IDw8ICIgbG9vcENvdW50OiAiIDw8IG1Mb29wQ291bnQpOwogCi0gICAgRWZmZWN0VGVzdEhlbHBlciBlZmZlY3QobVV1aWQsIG1DaE1hc2ssIG1DaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisgICAgRWZmZWN0VGVzdEhlbHBlciBlZmZlY3QoJm1VdWlkLCBtQ2hNYXNrLCBtQ2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1Mb29wQ291bnQpOwogCiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0Q29uZmlnKCkpOwpAQCAtNzIsNyArODQsNyBAQAogICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CiAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CiAgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obUNoTWFzayk7Ci0gICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKC0xLjBmLCAxLjBmKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoa01pbkFtcGxpdHVkZSwga01heEFtcGxpdHVkZSk7CiAgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CiAgICAgICAgIGluID0gZGlzKGdlbik7CiAgICAgfQpAQCAtODgsNyArMTAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtTG9vcENvdW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bUVmZmVjdFV1aWRzKSkpOwogCi10eXBlZGVmIHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdFBhcmFtOwordXNpbmcgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3RQYXJhbSA9IHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PjsKIGNsYXNzIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0CiAgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0UGFyYW0+IHsKICAgcHVibGljOgpAQCAtOTcsMTMgKzEwOSwxNSBAQAogICAgICAgICAgIG1GcmFtZUNvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtGcmFtZUNvdW50c1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pLAogICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSldKSwKICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCi0gICAgICAgICAgbVV1aWQoJmtFZmZlY3RVdWlkc1tzdGQ6OmdldDwzPihHZXRQYXJhbSgpKV0pIHt9CisgICAgICAgICAgbUVmZmVjdFR5cGUoKGVmZmVjdF90eXBlX3Qpc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSkpLAorICAgICAgICAgIG1VdWlkKGtFZmZlY3RVdWlkcy5hdChtRWZmZWN0VHlwZSkpIHt9CiAKICAgICBjb25zdCBzaXplX3QgbVNhbXBsZVJhdGU7CiAgICAgY29uc3Qgc2l6ZV90IG1GcmFtZUNvdW50OwogICAgIGNvbnN0IHNpemVfdCBtTG9vcENvdW50OwogICAgIGNvbnN0IHNpemVfdCBtVG90YWxGcmFtZUNvdW50OwotICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIG1VdWlkOworICAgIGNvbnN0IGVmZmVjdF90eXBlX3QgbUVmZmVjdFR5cGU7CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCBtVXVpZDsKIH07CiAKIC8vIENvbXBhcmVzIGZpcnN0IHR3byBjaGFubmVscyBpbiBtdWx0aS1jaGFubmVsIG91dHB1dCB0byBzdGVyZW8gb3V0cHV0IHdoZW4gc2FtZSBlZmZlY3QgaXMgYXBwbGllZApAQCAtMTE1LDcgKzEyOSw3IEBACiAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1vbm9JbnB1dChtVG90YWxGcmFtZUNvdW50KTsKIAogICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKG1TYW1wbGVSYXRlKTsKLSAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcyhrTWluQW1wbGl0dWRlLCBrTWF4QW1wbGl0dWRlKTsKICAgICBmb3IgKGF1dG8mIGluIDogbW9ub0lucHV0KSB7CiAgICAgICAgIGluID0gZGlzKGdlbik7CiAgICAgfQpAQCAtMTI2LDcgKzE0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogRkNDXzEpOwogCiAgICAgLy8gQXBwbHkgZWZmZWN0IG9uIHN0ZXJlbyBjaGFubmVscwotICAgIEVmZmVjdFRlc3RIZWxwZXIgc3RlcmVvRWZmZWN0KG1VdWlkLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBFZmZlY3RUZXN0SGVscGVyIHN0ZXJlb0VmZmVjdCgmbVV1aWQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CiAKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QuY3JlYXRlRWZmZWN0KCkpOwpAQCAtMTQyLDcgKzE1Niw3IEBACiAKICAgICBmb3IgKHNpemVfdCBjaE1hc2sgOiBFZmZlY3RUZXN0SGVscGVyOjprQ2hNYXNrcykgewogICAgICAgICBzaXplX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7Ci0gICAgICAgIEVmZmVjdFRlc3RIZWxwZXIgdGVzdEVmZmVjdChtVXVpZCwgY2hNYXNrLCBjaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisgICAgICAgIEVmZmVjdFRlc3RIZWxwZXIgdGVzdEVmZmVjdCgmbVV1aWQsIGNoTWFzaywgY2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1Mb29wQ291bnQpOwogCiAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QuY3JlYXRlRWZmZWN0KCkpOwogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnNldENvbmZpZygpKTsKQEAgLTE3MCw3ICsxODQsNyBAQAogICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc3RlcmVvVGVzdEkxNi5kYXRhKCksIHN0ZXJlb1Rlc3RPdXRwdXQuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKIAotICAgICAgICBpZiAoaXNCYXNzQm9vc3QobVV1aWQpKSB7CisgICAgICAgIGlmIChFRkZFQ1RfQkFTU19CT09TVCA9PSBtRWZmZWN0VHlwZSkgewogICAgICAgICAgICAgLy8gU05SIG11c3QgYmUgYWJvdmUgdGhlIHRocmVzaG9sZAogICAgICAgICAgICAgZmxvYXQgc25yID0gY29tcHV0ZVNucjxpbnQxNl90PihzdGVyZW9SZWZJMTYuZGF0YSgpLCBzdGVyZW9UZXN0STE2LmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKQEAgLTE5MSw2ICsyMDUsMTM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUxvb3BDb3VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1FZmZlY3RVdWlkcykpKTsKIAordXNpbmcgU2luZ2xlRWZmZWN0RGVmYXVsdFNldFBhcmFtVGVzdFBhcmFtID0gc3RkOjp0dXBsZTxpbnQsIGludCwgaW50PjsKK2NsYXNzIFNpbmdsZUVmZmVjdERlZmF1bHRTZXRQYXJhbVRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2luZ2xlRWZmZWN0RGVmYXVsdFNldFBhcmFtVGVzdFBhcmFtPiB7CisgIHB1YmxpYzoKKyAgICBTaW5nbGVFZmZlY3REZWZhdWx0U2V0UGFyYW1UZXN0KCkKKyAgICAgICAgOiBtQ2hNYXNrKEVmZmVjdFRlc3RIZWxwZXI6OmtDaE1hc2tzW3N0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUNoYW5uZWxDb3VudChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoTWFzaykpLAorICAgICAgICAgIG1TYW1wbGVSYXRlKDE2MDAwKSwKKyAgICAgICAgICBtRnJhbWVDb3VudChFZmZlY3RUZXN0SGVscGVyOjprRnJhbWVDb3VudHNbc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtTG9vcENvdW50KDEpLAorICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQobUZyYW1lQ291bnQgKiBtTG9vcENvdW50KSwKKyAgICAgICAgICBtRWZmZWN0VHlwZSgoZWZmZWN0X3R5cGVfdClzdGQ6OmdldDwyPihHZXRQYXJhbSgpKSksCisgICAgICAgICAgbVV1aWQoa0VmZmVjdFV1aWRzLmF0KG1FZmZlY3RUeXBlKSkge30KKworICAgIGNvbnN0IHNpemVfdCBtQ2hNYXNrOworICAgIGNvbnN0IHNpemVfdCBtQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7CisgICAgY29uc3QgZWZmZWN0X3R5cGVfdCBtRWZmZWN0VHlwZTsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90IG1VdWlkOworfTsKKworLy8gVGVzdHMgdmVyaWZ5aW5nIHRoYXQgcmVkdW5kYW50IHNldFBhcmFtIGNhbGxzIGRvIG5vdCBhbHRlciBvdXRwdXQKK1RFU1RfUChTaW5nbGVFZmZlY3REZWZhdWx0U2V0UGFyYW1UZXN0LCBTaW1wbGVQcm9jZXNzKSB7CisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICA8PCAiY2hNYXNrOiAiIDw8IG1DaE1hc2sgPDwgIiBzYW1wbGVSYXRlOiAiIDw8IG1TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudDogIiA8PCBtRnJhbWVDb3VudCA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50KTsKKyAgICAvLyBlZmZlY3QucHJvY2VzcygpIGhhbmRsZXMgbVRvdGFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQgc2FtcGxlcyBpbiBlYWNoIGNhbGwuCisgICAgLy8gVGhpcyB0ZXN0IGNhbGxzIHByb2Nlc3MoKSB0d2ljZSBwZXIgZWZmZWN0LCBoZW5jZSB0b3RhbCBzYW1wbGVzIHdoZW4gYWxsb2NhdGluZworICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgdmVjdG9ycyBpcyB0d2ljZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcHJvY2Vzc2VkIGluIG9uZSBjYWxsLgorICAgIHNpemVfdCB0b3RhbE51bVNhbXBsZXMgPSAyICogbVRvdGFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KHRvdGFsTnVtU2FtcGxlcyk7CisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obUNoTWFzayk7CisgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKGtNaW5BbXBsaXR1ZGUsIGtNYXhBbXBsaXR1ZGUpOworICAgIGZvciAoYXV0byYgaW4gOiBpbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKworICAgIHVpbnQzMl90IGtleTsKKyAgICBpbnQzMl90IHZhbHVlMSwgdmFsdWUyOworICAgIHN3aXRjaCAobUVmZmVjdFR5cGUpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQkFTU19CT09TVDoKKyAgICAgICAgICAgIGtleSA9IEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDsKKyAgICAgICAgICAgIHZhbHVlMSA9IDE7CisgICAgICAgICAgICB2YWx1ZTIgPSAxNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9WSVJUVUFMSVpFUjoKKyAgICAgICAgICAgIGtleSA9IFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIOworICAgICAgICAgICAgdmFsdWUxID0gMDsKKyAgICAgICAgICAgIHZhbHVlMiA9IDEwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9FUVVBTElaRVI6CisgICAgICAgICAgICBrZXkgPSBFUV9QQVJBTV9DVVJfUFJFU0VUOworICAgICAgICAgICAgdmFsdWUxID0gMDsKKyAgICAgICAgICAgIHZhbHVlMiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfVk9MVU1FOgorICAgICAgICAgICAga2V5ID0gMCAvKiBWT0xVTUVfUEFSQU1fTEVWRUwgKi87CisgICAgICAgICAgICB2YWx1ZTEgPSAwOworICAgICAgICAgICAgdmFsdWUyID0gLTEwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRkFJTCgpIDw8ICJVbnN1cHBvcnRlZCBlZmZlY3QgdHlwZSA6ICIgPDwgbUVmZmVjdFR5cGU7CisgICAgfQorCisgICAgRWZmZWN0VGVzdEhlbHBlciByZWZFZmZlY3QoJm1VdWlkLCBtQ2hNYXNrLCBtQ2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1Mb29wQ291bnQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVmRWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWZFZmZlY3Quc2V0Q29uZmlnKCkpOworCisgICAgaWYgKEVGRkVDVF9CQVNTX0JPT1NUID09IG1FZmZlY3RUeXBlKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlZkVmZmVjdC5zZXRQYXJhbTxpbnQxNl90PihrZXksIHZhbHVlMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlZkVmZmVjdC5zZXRQYXJhbTxpbnQzMl90PihrZXksIHZhbHVlMSkpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVmT3V0cHV0KHRvdGFsTnVtU2FtcGxlcyk7CisgICAgZmxvYXQqIHBJbnB1dCA9IGlucHV0LmRhdGEoKTsKKyAgICBmbG9hdCogcE91dHB1dCA9IHJlZk91dHB1dC5kYXRhKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVmRWZmZWN0LnByb2Nlc3MocElucHV0LCBwT3V0cHV0KSk7CisKKyAgICBwSW5wdXQgKz0gdG90YWxOdW1TYW1wbGVzIC8gMjsKKyAgICBwT3V0cHV0ICs9IHRvdGFsTnVtU2FtcGxlcyAvIDI7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVmRWZmZWN0LnByb2Nlc3MocElucHV0LCBwT3V0cHV0KSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVmRWZmZWN0LnJlbGVhc2VFZmZlY3QoKSk7CisKKyAgICBFZmZlY3RUZXN0SGVscGVyIHRlc3RFZmZlY3QoJm1VdWlkLCBtQ2hNYXNrLCBtQ2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1Mb29wQ291bnQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRDb25maWcoKSk7CisKKyAgICBpZiAoRUZGRUNUX0JBU1NfQk9PU1QgPT0gbUVmZmVjdFR5cGUpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRQYXJhbTxpbnQxNl90PihrZXksIHZhbHVlMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0UGFyYW08aW50MzJfdD4oa2V5LCB2YWx1ZTEpKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gdGVzdE91dHB1dCh0b3RhbE51bVNhbXBsZXMpOworICAgIHBJbnB1dCA9IGlucHV0LmRhdGEoKTsKKyAgICBwT3V0cHV0ID0gdGVzdE91dHB1dC5kYXRhKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5wcm9jZXNzKHBJbnB1dCwgcE91dHB1dCkpOworCisgICAgLy8gQ2FsbCBzZXRQYXJhbSBvbmNlIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycywgYW5kIHRoZW4gY2FsbCBzZXRQYXJhbSBhZ2FpbgorICAgIC8vIHRvIHJlc3RvcmUgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGluaXRpYWwgc3RhdGUsIG1ha2luZyB0aGUgZmlyc3Qgc2V0UGFyYW0KKyAgICAvLyBjYWxsIHJlZHVuZGFudAorICAgIGlmIChFRkZFQ1RfQkFTU19CT09TVCA9PSBtRWZmZWN0VHlwZSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnNldFBhcmFtPGludDE2X3Q+KGtleSwgdmFsdWUyKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0UGFyYW08aW50MTZfdD4oa2V5LCB2YWx1ZTEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnNldFBhcmFtPGludDMyX3Q+KGtleSwgdmFsdWUyKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0UGFyYW08aW50MzJfdD4oa2V5LCB2YWx1ZTEpKTsKKyAgICB9CisKKyAgICBwSW5wdXQgKz0gdG90YWxOdW1TYW1wbGVzIC8gMjsKKyAgICBwT3V0cHV0ICs9IHRvdGFsTnVtU2FtcGxlcyAvIDI7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5wcm9jZXNzKHBJbnB1dCwgcE91dHB1dCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfVFJVRShhcmVOZWFybHlTYW1lKHJlZk91dHB1dC5kYXRhKCksIHRlc3RPdXRwdXQuZGF0YSgpLCB0b3RhbE51bVNhbXBsZXMpKQorICAgICAgICAgICAgPDwgIk91dHB1dHMgZG8gbm90IG1hdGNoIHdpdGggZGVmYXVsdCBzZXRQYXJhbSBjYWxscyI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRWZmZWN0QnVuZGxlVGVzdEFsbCwgU2luZ2xlRWZmZWN0RGVmYXVsdFNldFBhcmFtVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtQ2hNYXNrcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUZyYW1lQ291bnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtRWZmZWN0VXVpZHMpKSk7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwCmluZGV4IDYyNWMxNWEuLmVjNzI3YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwCkBAIC01MCwyMyArNTAsNiBAQAogICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgImNtZF9lbmFibGUgcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKIH0KIAotdm9pZCBFZmZlY3RUZXN0SGVscGVyOjpzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCB2YWx1ZSkgewotICAgIGludCByZXBseSA9IDA7Ci0gICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKLSAgICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7dHlwZSwgdmFsdWV9OwotICAgIGF1dG8gZWZmZWN0UGFyYW0gPSBuZXcgZWZmZWN0X3BhcmFtX3Rbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpXTsKLSAgICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7Ci0gICAgZWZmZWN0UGFyYW0tPnBzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVswXSk7Ci0gICAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7Ci0gICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSwgZWZmZWN0UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7Ci0gICAgZGVsZXRlW10gZWZmZWN0UGFyYW07Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInNldF9wYXJhbSByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKLSAgICBBU1NFUlRfRVEocmVwbHksIDApIDw8ICJzZXRfcGFyYW0gcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKLX0KLQogdm9pZCBFZmZlY3RUZXN0SGVscGVyOjpwcm9jZXNzKGZsb2F0KiBpbnB1dCwgZmxvYXQqIG91dHB1dCkgewogICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5mMzIgPSBpbnB1dH07CiAgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5mMzIgPSBvdXRwdXR9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oCmluZGV4IDM4NTRkNDYuLmJjZWU4NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmgKQEAgLTUwLDYgKzUwLDIzIEBACiAgICAgcmV0dXJuIHNucjsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgZmxvYXQgYXJlTmVhcmx5U2FtZShjb25zdCBUKiByZWYsIGNvbnN0IFQqIHRzdCwgc2l6ZV90IGNvdW50KSB7CisgICAgVCBkZWx0YTsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnRfdjxUPikgeworICAgICAgICBkZWx0YSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmVwc2lsb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWx0YSA9IDE7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBkb3VibGUgZGlmZih0c3RbaV0gLSByZWZbaV0pOworICAgICAgICBpZiAoYWJzKGRpZmYpID4gZGVsdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogY2xhc3MgRWZmZWN0VGVzdEhlbHBlciB7CiAgIHB1YmxpYzoKICAgICBFZmZlY3RUZXN0SGVscGVyKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIHNpemVfdCBpbkNoTWFzaywgc2l6ZV90IG91dENoTWFzaywKQEAgLTY1LDcgKzgyLDI1IEBACiAgICAgdm9pZCBjcmVhdGVFZmZlY3QoKTsKICAgICB2b2lkIHJlbGVhc2VFZmZlY3QoKTsKICAgICB2b2lkIHNldENvbmZpZygpOwotICAgIHZvaWQgc2V0UGFyYW0odWludDMyX3QgdHlwZSwgdWludDMyX3QgdmFsKTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVkFMVUVfRFRZUEU+CisgICAgdm9pZCBzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCBWQUxVRV9EVFlQRSBjb25zdCB2YWx1ZSkgeworICAgICAgICBpbnQgcmVwbHkgPSAwOworICAgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworCisgICAgICAgIHVpbnQ4X3QgcGFyYW1EYXRhW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodHlwZSkgKyBzaXplb2YodmFsdWUpXTsKKyAgICAgICAgYXV0byBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopcGFyYW1EYXRhOworCisgICAgICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZ0eXBlLCBzaXplb2YodHlwZSkpOworICAgICAgICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhW3NpemVvZih0eXBlKV0sICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZih0eXBlKTsKKyAgICAgICAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHZhbHVlKTsKKyAgICAgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKG1FZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih0eXBlKSArIHNpemVvZih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RQYXJhbSwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInNldF9wYXJhbSByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKKyAgICAgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAic2V0X3BhcmFtIHJlcGx5IG5vbiB6ZXJvICIgPDwgcmVwbHk7CisgICAgfTsKICAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIGlucHV0LCBmbG9hdCogb3V0cHV0KTsKIAogICAgIC8vIENvcnJlc3BvbmRzIHRvIFNOUiBmb3IgMSBiaXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBpbnQxNl90IHNpZ25hbHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCBlMTY5ZTNjLi4xMjg3NTE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCkBAIC04OSw2ICs4OSw4IEBACiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiUmV2ZXJiIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIlJldmVyYiJdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0IGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGYxYjRmNjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi8uLi9idWlsZC9zb29uZy9zY3JpcHRzL3N5c3RlbS1jbGFuZy1mb3JtYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggMTlhOGIyZi4uNjFhMmJmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtMTUwLDYgKzE1MCw3IEBACiAKIGJvb2wgc0hhc0F1eENoYW5uZWxzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewogICAgICAgICBmYWxzZSwgIC8vIFBSRVBST0NfQUdDCisgICAgICAgIGZhbHNlLCAgLy8gUFJFUFJPQ19BR0MyCiAgICAgICAgIHRydWUsICAgLy8gUFJFUFJPQ19BRUMKICAgICAgICAgdHJ1ZSwgICAvLyBQUkVQUk9DX05TCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAKaW5kZXggZWI1NmZjMy4uMDg1MzY3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogc2lnWSwgaW50IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGVuYWJsZUNyb3NzQ29ycikgewogICAgIGZsb2F0IG1heENvcnJWYWwgPSAwLmYsIHByZXZDb3JyVmFsID0gMC5mOwotICAgIGludCBkZWxheSA9IDAsIHBlYWtJbmRleCA9IDAsIGZsYWcgPSAwOworICAgIGludCBwZWFrSW5kZXggPSAwLCBmbGFnID0gMDsKICAgICBpbnQgbG9vcExpbSA9ICgxID09IGVuYWJsZUNyb3NzQ29ycikgPyBsZW4gOiBrTWluTG9vcExpbWl0VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBwZWFrSW5kZXhWZWN0KGtOdW1QZWFrcywgMCk7CiAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHBlYWtWYWx1ZVZlY3Qoa051bVBlYWtzLCAwLmYpOwpAQCAtNDcsNyArNDcsNiBAQAogICAgICAgICB9CiAgICAgICAgIGNvcnJWYWwgLz0gbGVuIC0gaTsKICAgICAgICAgaWYgKGNvcnJWYWwgPiBtYXhDb3JyVmFsKSB7Ci0gICAgICAgICAgICBkZWxheSA9IGk7CiAgICAgICAgICAgICBtYXhDb3JyVmFsID0gY29yclZhbDsKICAgICAgICAgfQogICAgICAgICAvLyBDb3JyZWxhdGlvbiBwZWFrcyBhcmUgZXhwZWN0ZWQgdG8gYmUgb2JzZXJ2ZWQgYXQgZXF1YWwgaW50ZXJ2YWxzLiBUaGUgaW50ZXJ2YWwgbGVuZ3RoIGlzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhNTZiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDc3IEBACisvLyBUZXN0IFJldmVyYiBsaWJyYXJ5CitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c190ZXN0bGlic19saWNlbnNlIiwKKyAgICBdLAorfQorCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX3Rlc3RsaWJzX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJyZXZlcmJ0ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiRWZmZWN0UmV2ZXJiLmMiLAorICAgICAgICAiRWZmZWN0c01hdGguYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWFkZHJlc3Mtb2YtcGFja2VkLW1lbWJlciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJlcXVhbGl6ZXJ0ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9CaXF1YWRGaWx0ZXIuY3BwIiwKKyAgICAgICAgIkF1ZGlvQ29lZkludGVycG9sYXRvci5jcHAiLAorICAgICAgICAiQXVkaW9FcXVhbGl6ZXIuY3BwIiwKKyAgICAgICAgIkF1ZGlvUGVha2luZ0ZpbHRlci5jcHAiLAorICAgICAgICAiQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAiLAorICAgICAgICAiRWZmZWN0RXF1YWxpemVyLmNwcCIsCisgICAgICAgICJFZmZlY3RzTWF0aC5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18gYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGMzNzNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBUZXN0IFJldmVyYiBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQlFZmZlY3RSZXZlcmIuYy5hcm0gXAotCUVmZmVjdHNNYXRoLmMuYXJtCi0KLUxPQ0FMX0NGTEFHUyA6PSAtTzIKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJkbAotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEUgOj0gbGlicmV2ZXJidGVzdAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBUZXN0IEVxdWFsaXplciBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQlFZmZlY3RzTWF0aC5jLmFybSBcCi0JRWZmZWN0RXF1YWxpemVyLmNwcCBcCi0JQXVkaW9CaXF1YWRGaWx0ZXIuY3BwLmFybSBcCi0JQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmNwcC5hcm0gXAotCUF1ZGlvUGVha2luZ0ZpbHRlci5jcHAuYXJtIFwKLQlBdWRpb1NoZWx2aW5nRmlsdGVyLmNwcC5hcm0gXAotCUF1ZGlvRXF1YWxpemVyLmNwcC5hcm0KLQotTE9DQUxfQ0ZMQUdTIDo9IC1PMgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYmRsCi0KLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLUxPQ0FMX01PRFVMRSA6PSBsaWJlcXVhbGl6ZXJ0ZXN0Ci0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwCmluZGV4IDRmM2EzMDguLjE0MTc1MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRXF1YWxpemVyLmgiCiAjaW5jbHVkZSAiQXVkaW9QZWFraW5nRmlsdGVyLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlci5jcHAKaW5kZXggOTkzMjNhYy4uNDI1N2VjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmNwcApAQCAtODcsOSArODcsOSBAQAogdm9pZCBBdWRpb1BlYWtpbmdGaWx0ZXI6OmNvbW1pdChib29sIGltbWVkaWF0ZSkgewogICAgIGF1ZGlvX2NvZWZfdCBjb2Vmc1s1XTsKICAgICBpbnQgaW50Q29vcmRbM10gPSB7Ci0gICAgICAgIG1GcmVxdWVuY3kgPj4gRlJFUV9QUkVDSVNJT05fQklUUywKKyAgICAgICAgKGludCkobUZyZXF1ZW5jeSA+PiBGUkVRX1BSRUNJU0lPTl9CSVRTKSwKICAgICAgICAgbUdhaW4gPj4gR0FJTl9QUkVDSVNJT05fQklUUywKLSAgICAgICAgbUJhbmR3aWR0aCA+PiBCQU5EV0lEVEhfUFJFQ0lTSU9OX0JJVFMKKyAgICAgICAgKGludCkobUJhbmR3aWR0aCA+PiBCQU5EV0lEVEhfUFJFQ0lTSU9OX0JJVFMpCiAgICAgfTsKICAgICB1aW50MzJfdCBmcmFjQ29vcmRbM10gPSB7CiAgICAgICAgIG1GcmVxdWVuY3kgPDwgKDMyIC0gRlJFUV9QUkVDSVNJT05fQklUUyksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcAppbmRleCBlMDMxMjg3Li5hZDQzYzVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAKQEAgLTg5LDggKzg5LDggQEAKIHZvaWQgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6Y29tbWl0KGJvb2wgaW1tZWRpYXRlKSB7CiAgICAgYXVkaW9fY29lZl90IGNvZWZzWzVdOwogICAgIGludCBpbnRDb29yZFsyXSA9IHsKLSAgICAgICAgbUZyZXF1ZW5jeSA+PiBGUkVRX1BSRUNJU0lPTl9CSVRTLAotICAgICAgICBtR2FpbiA+PiBHQUlOX1BSRUNJU0lPTl9CSVRTCisgICAgICAgIChpbnQpKG1GcmVxdWVuY3kgPj4gRlJFUV9QUkVDSVNJT05fQklUUyksCisgICAgICAgIChpbnQpKG1HYWluID4+IEdBSU5fUFJFQ0lTSU9OX0JJVFMpCiAgICAgfTsKICAgICB1aW50MzJfdCBmcmFjQ29vcmRbMl0gPSB7CiAgICAgICAgIG1GcmVxdWVuY3kgPDwgKDMyIC0gRlJFUV9QUkVDSVNJT05fQklUUyksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKaW5kZXggZGI0ZDAwOS4uNzJiNTMwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMTMxLDcgKzEzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7Ci0gICAgaW50IGk7CisgICAgKHZvaWQpc2Vzc2lvbklkOworICAgICh2b2lkKWlvSWQ7CiAKICAgICBBTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0IHN0YXJ0Iik7CiAKQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKIAogICAgIEFMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAsIHNpemUgJWQiLAotICAgICAgICAgcENvbnRleHQsIEF1ZGlvRXF1YWxpemVyOjpHZXRJbnN0YW5jZVNpemUoa051bUJhbmRzKStzaXplb2YoRXF1YWxpemVyQ29udGV4dCkpOworICAgICAgICAgcENvbnRleHQsIChpbnQpKEF1ZGlvRXF1YWxpemVyOjpHZXRJbnN0YW5jZVNpemUoa051bUJhbmRzKStzaXplb2YoRXF1YWxpemVyQ29udGV4dCkpKTsKIAogICAgIHJldHVybiAwOwogCkBAIC0yOTQsNyArMjk1LDYgQEAKIAogaW50IEVxdWFsaXplcl9pbml0KEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0KQogewotICAgIGludCBzdGF0dXM7CiAKICAgICBBTE9HVigiRXF1YWxpemVyX2luaXQgc3RhcnQiKTsKIApAQCAtNjMwLDcgKzYzMCw2IEBACiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CiAKICAgICBhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqKSBzZWxmOwotICAgIGludCByZXRzaXplOwogCiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNzUwLDEzICs3NDksMTMgQEAKICAgICAgICAgTlVMTAogfTsKIAotCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0gewotICAgIHRhZyA6IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKLSAgICB2ZXJzaW9uIDogRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCi0gICAgbmFtZSA6ICJUZXN0IEVxdWFsaXplciBMaWJyYXJ5IiwKLSAgICBpbXBsZW1lbnRvciA6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICBjcmVhdGVfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAotICAgIHJlbGVhc2VfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKLSAgICBnZXRfZGVzY3JpcHRvciA6IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCisgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgIC5uYW1lID0gIlRlc3QgRXF1YWxpemVyIExpYnJhcnkiLAorICAgIC5pbXBsZW1lbnRvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAuY3JlYXRlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICAucmVsZWFzZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RSZWxlYXNlLAorICAgIC5nZXRfZGVzY3JpcHRvciA9IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKaW5kZXggZmNlOWJlZC4uZWZiYTRmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCkBAIC0xMDcsNiArMTA3LDggQEAKICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOwogICAgIGludCBhdXggPSAwOwogICAgIGludCBwcmVzZXQgPSAwOworICAgICh2b2lkKXNlc3Npb25JZDsKKyAgICAodm9pZClpb0lkOwogCiAgICAgQUxPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCBzdGFydCIpOwogCkBAIC0xNDksNyArMTUxLDcgQEAKIAogICAgIG1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQ7CiAKLSAgICBBTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0ICVwICxzaXplICVkIiwgbW9kdWxlLCBzaXplb2YocmV2ZXJiX21vZHVsZV90KSk7CisgICAgQUxPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCAsc2l6ZSAlenUiLCBtb2R1bGUsIHNpemVvZihyZXZlcmJfbW9kdWxlX3QpKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjgzLDcgKzI4NSw2IEBACiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CiAgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKSBzZWxmOwogICAgIHJldmVyYl9vYmplY3RfdCAqcFJldmVyYjsKLSAgICBpbnQgcmV0c2l6ZTsKIAogICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwgfHwKICAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID09IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CkBAIC03NTgsNyArNzU5LDYgQEAKICAgICBpbnQzMl90ICpwVmFsdWUzMjsKICAgICBpbnQxNl90ICpwVmFsdWUxNjsKICAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7Ci0gICAgaW50MzJfdCBpOwogICAgIGludDMyX3QgdGVtcDsKICAgICBpbnQzMl90IHRlbXAyOwogICAgIHVpbnQzMl90IHNpemU7CkBAIC0xNjU0LDcgKzE2NTQsNiBAQAogICAgIGludDMyX3QgbkFwT3V0OwogCiAgICAgaW50MzJfdCBqOwotICAgIGludDMyX3QgbkVhcmx5T3V0OwogCiAgICAgaW50MzJfdCB0ZW1wVmFsdWU7CiAKQEAgLTIyMDMsNiArMjIwMiw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CiAgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKICAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKaW5kZXggNzU2YzVlYS4uOGY0MDVkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCkBAIC00NDMsNyArNDQzLDQgQEAKICovCiBzdGF0aWMgaW50IFJldmVyYlVwZGF0ZVJvb20ocmV2ZXJiX29iamVjdF90KiBwUmV2ZXJiRGF0YSwgYm9vbCBmdWxsVXBkYXRlKTsKIAotCi1zdGF0aWMgaW50IFJldmVyYkNvbXB1dGVDb25zdGFudHMocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiRGF0YSwgdWludDMyX3Qgc2FtcGxpbmdSYXRlKTsKLQogI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZXJyb3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVycm9yL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0ZDM1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVycm9yL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJleHBlY3RlZHV0aWxzX2hlYWRlcnMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aCIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorfQorCitjY190ZXN0X2hvc3QgeworICAgIG5hbWU6ICJsaWJleHBlY3RlZHV0aWxzX3Rlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImV4cGVjdGVkX3V0aWxzX3Rlc3QuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmV4cGVjdGVkdXRpbHNfaGVhZGVycyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliZXJyb3JfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliZXhwZWN0ZWR1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmV4cGVjdGVkdXRpbHNfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVycm9yL2V4cGVjdGVkX3V0aWxzX3Rlc3QuY3BwIGIvbWVkaWEvbGliZXJyb3IvZXhwZWN0ZWRfdXRpbHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMjEwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVycm9yL2V4cGVjdGVkX3V0aWxzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm9yL2V4cGVjdGVkX3V0aWxzLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBMT0dfVEFHICJSZXN1bHQtdGVzdCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZvbyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFZhbHVlKGludCBpKSA6IG1JbnQoaSkge30KKyAgICBWYWx1ZShjb25zdCBWYWx1ZSYpID0gZGVsZXRlOworICAgIFZhbHVlKFZhbHVlJiYpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIG1JbnQ7IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGludCBtSW50OworfTsKKworY2xhc3MgU3RhdHVzIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFN0YXR1cyhpbnQgaSkgOiBtSW50KGkpIHt9CisgICAgU3RhdHVzKGNvbnN0IFN0YXR1cyYpID0gZGVsZXRlOworICAgIFN0YXR1cyhTdGF0dXMmJikgPSBkZWZhdWx0OworCisgICAgb3BlcmF0b3IgaW50KCkgY29uc3QgeyByZXR1cm4gbUludDsgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50IG1JbnQ7Cit9OworCitib29sIGVycm9ySXNPayhjb25zdCBTdGF0dXMmIGUpIHsKKyAgICByZXR1cm4gZSA9PSAwOworfQorCitzdGQ6OnN0cmluZyBlcnJvclRvU3RyaW5nKGNvbnN0IFN0YXR1cyYgZSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHI7CisgICAgc3RyIDw8IGU7CisgICAgcmV0dXJuIHN0ci5zdHIoKTsKK30KKwordXNpbmcgUmVzdWx0ID0gYmFzZTo6ZXhwZWN0ZWQ8VmFsdWUsIFN0YXR1cz47CisKK30gIC8vIG5hbWVzcGFjZSBmb28KKworbmFtZXNwYWNlIHsKKwordXNpbmcgZm9vOjpSZXN1bHQ7Cit1c2luZyBmb286OlN0YXR1czsKK3VzaW5nIGZvbzo6VmFsdWU7CisKK1RFU1QoUmVzdWx0LCBWYWx1ZU9yUmV0dXJuU3VjY2VzcykgeworICAgIFJlc3VsdCByZXN1bHQgPSBbXSgpIC0+IFJlc3VsdCB7CisgICAgICAgIFZhbHVlIGludGVybWVkaWF0ZSA9IFZBTFVFX09SX1JFVFVSTihSZXN1bHQoVmFsdWUoMykpKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlKGludGVybWVkaWF0ZSArIDEpOworICAgIH0oKTsKKyAgICBBU1NFUlRfVFJVRShyZXN1bHQub2soKSk7CisgICAgRVhQRUNUX0VRKDQsIHJlc3VsdC52YWx1ZSgpKTsKK30KKworVEVTVChSZXN1bHQsIFZhbHVlT3JSZXR1cm5GYWlsdXJlKSB7CisgICAgUmVzdWx0IHJlc3VsdCA9IFtdKCkgLT4gUmVzdWx0IHsKKyAgICAgICAgVmFsdWUgaW50ZXJtZWRpYXRlID0gVkFMVUVfT1JfUkVUVVJOKFJlc3VsdChiYXNlOjp1bmV4cGVjdGVkKFN0YXR1cygyKSkpKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlKGludGVybWVkaWF0ZSArIDEpOworICAgIH0oKTsKKyAgICBBU1NFUlRfRkFMU0UocmVzdWx0Lm9rKCkpOworICAgIEVYUEVDVF9FUSgyLCByZXN1bHQuZXJyb3IoKSk7Cit9CisKK1RFU1QoUmVzdWx0LCBWYWx1ZU9yUmV0dXJuU3RhdHVzU3VjY2VzcykgeworICAgIFN0YXR1cyBzdGF0dXMgPSBbXSgpIC0+IFN0YXR1cyB7CisgICAgICAgIFZhbHVlIGludGVybWVkaWF0ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoUmVzdWx0KFZhbHVlKDMpKSk7CisgICAgICAgICh2b2lkKSBpbnRlcm1lZGlhdGU7CisgICAgICAgIHJldHVybiBTdGF0dXMoMCk7CisgICAgfSgpOworICAgIEVYUEVDVF9FUSgwLCBzdGF0dXMpOworfQorCitURVNUKFJlc3VsdCwgVmFsdWVPclJldHVyblN0YXR1c0ZhaWx1cmUpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gW10oKSAtPiBTdGF0dXMgeworICAgICAgICBWYWx1ZSBpbnRlcm1lZGlhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKFJlc3VsdChiYXNlOjp1bmV4cGVjdGVkKFN0YXR1cygxKSkpKTsKKyAgICAgICAgKHZvaWQpIGludGVybWVkaWF0ZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cygwKTsKKyAgICB9KCk7CisgICAgRVhQRUNUX0VRKDEsIHN0YXR1cyk7Cit9CisKK1RFU1QoUmVzdWx0LCBSZXR1cm5JZkVycm9yU3VjY2VzcykgeworICAgIFJlc3VsdCByZXN1bHQgPSBbXSgpIC0+IFJlc3VsdCB7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihTdGF0dXMoMCkpOworICAgICAgICByZXR1cm4gVmFsdWUoNSk7CisgICAgfSgpOworICAgIEFTU0VSVF9UUlVFKHJlc3VsdC5vaygpKTsKKyAgICBFWFBFQ1RfRVEoNSwgcmVzdWx0LnZhbHVlKCkpOworfQorCitURVNUKFJlc3VsdCwgUmV0dXJuSWZFcnJvckZhaWx1cmUpIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gW10oKSAtPiBSZXN1bHQgeworICAgICAgICBSRVRVUk5fSUZfRVJST1IoU3RhdHVzKDQpKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlKDUpOworICAgIH0oKTsKKyAgICBBU1NFUlRfRkFMU0UocmVzdWx0Lm9rKCkpOworICAgIEVYUEVDVF9FUSg0LCByZXN1bHQuZXJyb3IoKSk7Cit9CisKK1RFU1QoUmVzdWx0LCBSZXR1cm5TdGF0dXNJZkVycm9yU3VjY2VzcykgeworICAgIFN0YXR1cyBzdGF0dXMgPSBbXSgpIC0+IFN0YXR1cyB7CisgICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoU3RhdHVzKDApKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cyg3KTsKKyAgICB9KCk7CisgICAgRVhQRUNUX0VRKDcsIHN0YXR1cyk7Cit9CisKK1RFU1QoUmVzdWx0LCBSZXR1cm5TdGF0dXNJZkVycm9yRmFpbHVyZSkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBbXSgpIC0+IFN0YXR1cyB7CisgICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoU3RhdHVzKDMpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cygwKTsKKyAgICB9KCk7CisgICAgRVhQRUNUX0VRKDMsIHN0YXR1cyk7Cit9CisKK1RFU1QoUmVzdWx0LCBWYWx1ZU9yRmF0YWxTdWNjZXNzKSB7CisgICAgVmFsdWUgdmFsdWUgPSBWQUxVRV9PUl9GQVRBTChSZXN1bHQoVmFsdWUoNykpKTsKKyAgICBFWFBFQ1RfRVEoNywgdmFsdWUpOworfQorCitURVNUKFJlc3VsdCwgVmFsdWVPckZhdGFsRmFpbHVyZSkgeworICAgIEVYUEVDVF9ERUFUSChWQUxVRV9PUl9GQVRBTChSZXN1bHQoYmFzZTo6dW5leHBlY3RlZChTdGF0dXMoMykpKSksICIiKTsKK30KKworVEVTVChSZXN1bHQsIEZhdGFsSWZFcnJvclN1Y2Nlc3MpIHsKKyAgICBGQVRBTF9JRl9FUlJPUihTdGF0dXMoMCkpOworfQorCitURVNUKFJlc3VsdCwgRmF0YWxJZkVycm9yRmFpbHVyZSkgeworICAgIEVYUEVDVF9ERUFUSChGQVRBTF9JRl9FUlJPUihTdGF0dXMoMykpLCAiIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVycm9yL2luY2x1ZGUvZXJyb3IvUmVzdWx0LmggYi9tZWRpYS9saWJlcnJvci9pbmNsdWRlL2Vycm9yL1Jlc3VsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGU2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlcnJvci9pbmNsdWRlL2Vycm9yL1Jlc3VsdC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxlcnJvci9leHBlY3RlZF91dGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZXJyb3IgeworCisvKioKKyAqIEEgY29udmVuaWVuY2Ugc2hvcnQtaGFuZCBmb3IgYmFzZTo6ZXhwZWN0ZWQsIHdoZXJlIHRoZSBlcnJvciB0eXBlIGlzIGEgc3RhdHVzX3QuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordXNpbmcgUmVzdWx0ID0gYmFzZTo6ZXhwZWN0ZWQ8VCwgc3RhdHVzX3Q+OworCit9ICAvLyBuYW1lc3BhY2UgZXJyb3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8vIEJlbG93IGFyZSB0aGUgaW1wbGVtZW50YXRpb25zIG9mIGVycm9ySXNPayBhbmQgZXJyb3JUb1N0cmluZyBmb3Igc3RhdHVzX3QgLgorLy8gVGhpcyBhbGxvd3Mgc3RhdHVzX3QgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBleHBlY3RlZF91dGlscy5oIG1hY3Jvcy4KKy8vIFVuZm9ydHVhbnRlbHksIHNpbmNlIHN0YXR1c190IGlzIG1lcmVseSBhIHR5cGVkZWYgZm9yIGludCByYXRoZXIgdGhhbiBhIHVuaXF1ZSB0eXBlLCB3ZSBoYXZlIHRvCisvLyBvdmVybG9hZCB0aGVzZSBtZXRob2RzIGZvciBhbnkgaW50LCBhbmQgZG8gc28gaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgZm9yIEFETCB0byB3b3JrLgorCitpbmxpbmUgYm9vbCBlcnJvcklzT2soaW50IHN0YXR1cykgeworICAgIHJldHVybiBzdGF0dXMgPT0gYW5kcm9pZDo6T0s7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBlcnJvclRvU3RyaW5nKGludCBzdGF0dXMpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVycm9yL2luY2x1ZGUvZXJyb3IvZXhwZWN0ZWRfdXRpbHMuaCBiL21lZGlhL2xpYmVycm9yL2luY2x1ZGUvZXJyb3IvZXhwZWN0ZWRfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM4NTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZXJyb3IvaW5jbHVkZS9lcnJvci9leHBlY3RlZF91dGlscy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2V4cGVjdGVkLmg+CisjaW5jbHVkZSA8bG9nL2xvZ19tYWluLmg+CisKKy8qKgorICogVXNlZnVsIG1hY3JvcyBmb3Igd29ya2luZyB3aXRoIHN0YXR1cyBjb2RlcyBhbmQgYmFzZTo6ZXhwZWN0ZWQuCisgKgorICogVGhlc2UgbWFjcm9zIGZhY2lsaXRhdGUgdmFyaW91cyBraW5kcyBvZiBzdHJhdGVnaWVzIGZvciByZWR1Y3Rpb24gb2YgZXJyb3ItaGFuZGxpbmctcmVsYXRlZAorICogYm9pbGVycGxhdGUuIFRoZXkgY2FuIGJlIGNhbiBiZSBjbGFzc2lmaWVkIGJ5IHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CisgKiAtIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RhbmRhbG9uZSBzdGF0dXMgY29kZSB2cy4gYmFzZTo6ZXhwZWN0ZWQgKHN0YXR1cyBvciB2YWx1ZSkuIEluIHRoZQorICogICBsYXR0ZXIgY2FzZSwgdGhlIG1hY3JvIHdpbGwgZXZhbHVhdGUgdG8gdGhlIGNvbnRhaW5lZCB2YWx1ZSBpbiB0aGUgY2FzZSBvZiBzdWNjZXNzLgorICogLSBXaGV0aGVyIHRvIEZBVEFMIG9yIHJldHVybiBpbiByZXNwb25zZSB0byBhbiBlcnJvci4KKyAqICAgLSBJbiB0aGUgbGF0dGVyIGNhc2UsIHdoZXRoZXIgdGhlIGVuY2xvc2luZyBmdW5jdGlvbiByZXR1cm5zIGEgc3RhdHVzIGNvZGUgb3IgYSBiYXNlOjpleHBlY3RlZC4KKyAqCisgKiBUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXplcyB3aGljaCBtYWNybyBzZXJ2ZXMgd2hpY2ggY2FzZSwgYmFzZWQgb24gdGhvc2UgY3JpdGVyaWE6CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgIEVycm9yIHJlc3BvbnNlIHwgRkFUQUwgICAgICAgICAgICB8IEVhcmx5IHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8IEV4cHJlc3Npb24gdHlwZSAgICB8ICAgICAgICAgICAgICAgICAgfCBGdW5jdGlvbiByZXR1cm5zIGV4cGVjdGVkIHwgRnVuY3Rpb24gcmV0dXJucyBzdGF0dXMgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBzdGF0dXMgY29kZSAgICAgICAgfCBGQVRBTF9JRl9FUlJPUigpIHwgUkVUVVJOX0lGX0VSUk9SKCkgICAgICAgICB8IFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoKSB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgZXhwZWN0ZWQgICAgICAgICAgIHwgVkFMVUVfT1JfRkFUQUwoKSB8IFZBTFVFX09SX1JFVFVSTigpICAgICAgICAgfCBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKCkgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogQWxsIG1hY3JvcyBleHBlY3QgdGhhdDoKKyAqIC0gVGhlIGVycm9yIHR5cGUgYW5kIHZhbHVlIHZhbHVlIHR5cGUgYXJlIG1vdmFibGUuCisgKiAtIFRoZSBtYWNybyBhcmd1bWVudCBjYW4gYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSB1c2luZyBgYXV0byB4ID0gKGV4cClgLgorICogLSBUaGUgZXhwcmVzc2lvbiBlcnJvcklzT2soZSkgZm9yIHRoZSBlcnJvciB0eXBlIGV2YWx1YXRlYSB0byBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZmYgdGhlCisgKiAgIHN0YXR1cyBpcyBjb25zaWRlcmVkIHN1Y2Nlc3MuCisgKiAtIFRoZSBleHByZXNzaW9uIGVycm9yVG9TdHJpbmcoZSkgZm9yIGEgZ2l2ZW4gZXJyb3IgdHlwZSBldmFsdWF0ZWQgdG8gYSBzdGQ6OnN0cmluZyBjb250YWluaW5nIGEKKyAqICAgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgc3RhdHVzLgorICovCisKKyNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOKGV4cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdXRvIF90bXAgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiA6OmFuZHJvaWQ6OmJhc2U6OnVuZXhwZWN0ZWQoc3RkOjptb3ZlKF90bXAuZXJyb3IoKSkpOyBcCisgICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0pCisKKyNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhleHApICAgICAgICAgICAgICAgICAgICAgXAorICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF1dG8gX3RtcCA9IChleHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBzdGQ6Om1vdmUoX3RtcC5lcnJvcigpKTsgXAorICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSkKKworI2RlZmluZSBWQUxVRV9PUl9GQVRBTChleHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKGV4cCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFfdG1wLm9rKCksICJGdW5jdGlvbjogJXMgTGluZTogJWQgRmFpbGVkIHJlc3VsdCAoJXMpIiwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGVycm9yVG9TdHJpbmcoX3RtcC5lcnJvcigpKS5jX3N0cigpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0pCisKKyNkZWZpbmUgUkVUVVJOX0lGX0VSUk9SKGV4cCkgXAorICAgIGlmIChhdXRvIF90bXAgPSAoZXhwKTsgIWVycm9ySXNPayhfdG1wKSkgcmV0dXJuIDo6YW5kcm9pZDo6YmFzZTo6dW5leHBlY3RlZChzdGQ6Om1vdmUoX3RtcCkpOworCisjZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoZXhwKSBcCisgICAgaWYgKGF1dG8gX3RtcCA9IChleHApOyAhZXJyb3JJc09rKF90bXApKSByZXR1cm4gX3RtcDsKKworI2RlZmluZSBGQVRBTF9JRl9FUlJPUihleHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF1dG8gX3RtcCA9IChleHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFlcnJvcklzT2soX3RtcCksICJGdW5jdGlvbjogJXMgTGluZTogJWQgRmFpbGVkIHJlc3VsdDogKCVzKSIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBlcnJvclRvU3RyaW5nKF90bXApLmNfc3RyKCkpOyAgICAgICAgIFwKKyAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvQW5kcm9pZC5icCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjNmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvQW5kcm9pZC5icApAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJoZWFkdHJhY2tpbmciLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICJIZWFkVHJhY2tpbmdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICJNb2RlU2VsZWN0b3IuY3BwIiwKKyAgICAgICJQb3NlLmNwcCIsCisgICAgICAiUG9zZUJpYXMuY3BwIiwKKyAgICAgICJQb3NlRHJpZnRDb21wZW5zYXRvci5jcHAiLAorICAgICAgIlBvc2VSYXRlTGltaXRlci5jcHAiLAorICAgICAgIlF1YXRlcm5pb25VdGlsLmNwcCIsCisgICAgICAiU2NyZWVuSGVhZEZ1c2lvbi5jcHAiLAorICAgICAgIlN0aWxsbmVzc0RldGVjdG9yLmNwcCIsCisgICAgICAiVHdpc3QuY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmVpZ2VuIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmVpZ2VuIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliaGVhZHRyYWNraW5nLWJpbmRpbmciLAorICAgIHNyY3M6IFsKKyAgICAgICJTZW5zb3JQb3NlUHJvdmlkZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmciLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnNlbnNvciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmciLAorICAgICAgICAibGlic2Vuc29yIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJTZW5zb3JQb3NlUHJvdmlkZXItZXhhbXBsZSIsCisgICAgc3JjczogWworICAgICAgICAiU2Vuc29yUG9zZVByb3ZpZGVyLWV4YW1wbGUuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmciLAorICAgICAgICAibGliaGVhZHRyYWNraW5nLWJpbmRpbmciLAorICAgICAgICAibGlic2Vuc29yIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0X2hvc3QgeworICAgIG5hbWU6ICJsaWJoZWFkdHJhY2tpbmctdGVzdCIsCisgICAgc3JjczogWworICAgICAgICAiSGVhZFRyYWNraW5nUHJvY2Vzc29yLXRlc3QuY3BwIiwKKyAgICAgICAgIk1vZGVTZWxlY3Rvci10ZXN0LmNwcCIsCisgICAgICAgICJQb3NlLXRlc3QuY3BwIiwKKyAgICAgICAgIlBvc2VCaWFzLXRlc3QuY3BwIiwKKyAgICAgICAgIlBvc2VEcmlmdENvbXBlbnNhdG9yLXRlc3QuY3BwIiwKKyAgICAgICAgIlBvc2VSYXRlTGltaXRlci10ZXN0LmNwcCIsCisgICAgICAgICJRdWF0ZXJuaW9uVXRpbC10ZXN0LmNwcCIsCisgICAgICAgICJTY3JlZW5IZWFkRnVzaW9uLXRlc3QuY3BwIiwKKyAgICAgICAgIlN0aWxsbmVzc0RldGVjdG9yLXRlc3QuY3BwIiwKKyAgICAgICAgIlR3aXN0LXRlc3QuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmciLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTkxOTJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci10ZXN0LmNwcApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJtZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorI2luY2x1ZGUgIlRlc3RVdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgeworCit1c2luZyBFaWdlbjo6UXVhdGVybmlvbmY7Cit1c2luZyBFaWdlbjo6VmVjdG9yM2Y7Cit1c2luZyBPcHRpb25zID0gSGVhZFRyYWNraW5nUHJvY2Vzc29yOjpPcHRpb25zOworCitURVNUKEhlYWRUcmFja2luZ1Byb2Nlc3NvciwgSW5pdGlhbCkgeworICAgIGZvciAoYXV0byBtb2RlIDoge0hlYWRUcmFja2luZ01vZGU6OlNUQVRJQywgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUsCisgICAgICAgICAgICAgICAgICAgICAgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFfSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVhZFRyYWNraW5nUHJvY2Vzc29yPiBwcm9jZXNzb3IgPQorICAgICAgICAgICAgICAgIGNyZWF0ZUhlYWRUcmFja2luZ1Byb2Nlc3NvcihPcHRpb25ze30sIG1vZGUpOworICAgICAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgwKTsKKyAgICAgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0QWN0dWFsTW9kZSgpLCBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMpOworICAgICAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgUG9zZTNmKCkpOworICAgIH0KK30KKworVEVTVChIZWFkVHJhY2tpbmdQcm9jZXNzb3IsIEJhc2ljQ29tcG9zaXRpb24pIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWR7ezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpfTsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb1NjcmVlbnt7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCl9OworICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub1N0YWdle3s3LCA4LCA5fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKX07CisgICAgY29uc3QgZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWwgPSBNX1BJXzI7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVhZFRyYWNraW5nUHJvY2Vzc29yPiBwcm9jZXNzb3IgPQorICAgICAgICAgICAgY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKE9wdGlvbnN7fSwgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKKworICAgIC8vIEVzdGFibGlzaCBhIGJhc2VsaW5lIGZvciB0aGUgZHJpZnQgY29tcGVuc2F0b3JzLgorICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb0hlYWRQb3NlKDAsIFBvc2UzZigpLCBUd2lzdDNmKCkpOworICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb1NjcmVlblBvc2UoMCwgUG9zZTNmKCkpOworCisgICAgcHJvY2Vzc29yLT5zZXREaXNwbGF5T3JpZW50YXRpb24ocGh5c2ljYWxUb0xvZ2ljYWwpOworICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb0hlYWRQb3NlKDAsIHdvcmxkVG9IZWFkLCBUd2lzdDNmKCkpOworICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb1NjcmVlblBvc2UoMCwgd29ybGRUb1NjcmVlbik7CisgICAgcHJvY2Vzc29yLT5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgwKTsKKyAgICBBU1NFUlRfRVEocHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCksIEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSk7CisgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSAqIHdvcmxkVG9TY3JlZW4gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2UzZihyb3RhdGVZKC1waHlzaWNhbFRvTG9naWNhbCkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5Ub1N0YWdlKTsKKworICAgIHByb2Nlc3Nvci0+c2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEFTU0VSVF9FUShwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSwgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCB3b3JsZFRvSGVhZC5pbnZlcnNlKCkgKiBzY3JlZW5Ub1N0YWdlKTsKKworICAgIHByb2Nlc3Nvci0+c2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDKTsKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgwKTsKKyAgICBBU1NFUlRfRVEocHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCksIEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQyk7CisgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0SGVhZFRvU3RhZ2VQb3NlKCksIHNjcmVlblRvU3RhZ2UpOworfQorCitURVNUKEhlYWRUcmFja2luZ1Byb2Nlc3NvciwgUHJlZGljdGlvbikgeworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZHt7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCl9OworICAgIGNvbnN0IFR3aXN0M2YgaGVhZFR3aXN0e3s0LCA1LCA2fSwgcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IoUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSkgLyAxMH07CisgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9TY3JlZW57ezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpfTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWFkVHJhY2tpbmdQcm9jZXNzb3I+IHByb2Nlc3NvciA9IGNyZWF0ZUhlYWRUcmFja2luZ1Byb2Nlc3NvcigKKyAgICAgICAgICAgIE9wdGlvbnN7LnByZWRpY3Rpb25EdXJhdGlvbiA9IDIuZn0sIEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKworICAgIC8vIEVzdGFibGlzaCBhIGJhc2VsaW5lIGZvciB0aGUgZHJpZnQgY29tcGVuc2F0b3JzLgorICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb0hlYWRQb3NlKDAsIFBvc2UzZigpLCBUd2lzdDNmKCkpOworICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb1NjcmVlblBvc2UoMCwgUG9zZTNmKCkpOworCisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQsIGhlYWRUd2lzdCk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvU2NyZWVuUG9zZSgwLCB3b3JsZFRvU2NyZWVuKTsKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgwKTsKKyAgICBBU1NFUlRfRVEocHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCksIEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgKHdvcmxkVG9IZWFkICogaW50ZWdyYXRlKGhlYWRUd2lzdCwgMi5mKSkuaW52ZXJzZSgpKTsKKworICAgIHByb2Nlc3Nvci0+c2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgwKTsKKyAgICBBU1NFUlRfRVEocHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCksIEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSk7CisgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0SGVhZFRvU3RhZ2VQb3NlKCksCisgICAgICAgICAgICAgICh3b3JsZFRvSGVhZCAqIGludGVncmF0ZShoZWFkVHdpc3QsIDIuZikpLmludmVyc2UoKSAqIHdvcmxkVG9TY3JlZW4pOworCisgICAgcHJvY2Vzc29yLT5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMpOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEFTU0VSVF9FUShwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSwgSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgUG9zZTNmKCkpOworfQorCitURVNUKEhlYWRUcmFja2luZ1Byb2Nlc3NvciwgU21vb3RoTW9kZVN3aXRjaCkgeworICAgIGNvbnN0IFBvc2UzZiB0YXJnZXRIZWFkVG9Xb3JsZCA9IFBvc2UzZih7NCwgMCwgMH0sIHJvdGF0ZVooTV9QSSAvIDIpKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWFkVHJhY2tpbmdQcm9jZXNzb3I+IHByb2Nlc3NvciA9IGNyZWF0ZUhlYWRUcmFja2luZ1Byb2Nlc3NvcigKKyAgICAgICAgICAgIE9wdGlvbnN7Lm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IDF9LCBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMpOworCisgICAgLy8gRXN0YWJsaXNoIGEgYmFzZWxpbmUgZm9yIHRoZSBkcmlmdCBjb21wZW5zYXRvcnMuCisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgUG9zZTNmKCksIFR3aXN0M2YoKSk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvU2NyZWVuUG9zZSgwLCBQb3NlM2YoKSk7CisKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgwKTsKKworICAgIHByb2Nlc3Nvci0+c2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb0hlYWRQb3NlKDAsIHRhcmdldEhlYWRUb1dvcmxkLmludmVyc2UoKSwgVHdpc3QzZigpKTsKKworICAgIC8vIFdlJ3JlIGV4cGVjdGluZyBhIGdyYWR1YWwgbW92ZSB0byB0aGUgdGFyZ2V0LgorICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgcHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCBQb3NlM2YoKSk7CisKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSgyKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUsIHByb2Nlc3Nvci0+Z2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgUG9zZTNmKHsyLCAwLCAwfSwgcm90YXRlWihNX1BJIC8gNCkpKTsKKworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDQpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgcHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCB0YXJnZXRIZWFkVG9Xb3JsZCk7CisKKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSB0YXJnZXQsIHdlIHNob3VsZCBubyBsb25nZXIgYmUgcmF0ZSBsaW1pdGluZy4KKyAgICBwcm9jZXNzb3ItPnNldFdvcmxkVG9IZWFkUG9zZSg0LCBQb3NlM2YoKSwgVHdpc3QzZigpKTsKKyAgICBwcm9jZXNzb3ItPmNhbGN1bGF0ZSg1KTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUsIHByb2Nlc3Nvci0+Z2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgUG9zZTNmKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmYWU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKXt9CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJtZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgIk1vZGVTZWxlY3Rvci5oIgorI2luY2x1ZGUgIlBvc2VCaWFzLmgiCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJTY3JlZW5IZWFkRnVzaW9uLmgiCisjaW5jbHVkZSAiU3RpbGxuZXNzRGV0ZWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworY2xhc3MgSGVhZFRyYWNraW5nUHJvY2Vzc29ySW1wbCA6IHB1YmxpYyBIZWFkVHJhY2tpbmdQcm9jZXNzb3IgeworICBwdWJsaWM6CisgICAgSGVhZFRyYWNraW5nUHJvY2Vzc29ySW1wbChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBIZWFkVHJhY2tpbmdNb2RlIGluaXRpYWxNb2RlKQorICAgICAgICA6IG1PcHRpb25zKG9wdGlvbnMpLAorICAgICAgICAgIG1IZWFkU3RpbGxuZXNzRGV0ZWN0b3IoU3RpbGxuZXNzRGV0ZWN0b3I6Ok9wdGlvbnN7CisgICAgICAgICAgICAgICAgICAuZGVmYXVsdFZhbHVlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSBvcHRpb25zLmF1dG9SZWNlbnRlcldpbmRvd0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSBvcHRpb25zLmF1dG9SZWNlbnRlclRyYW5zbGF0aW9uYWxUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAucm90YXRpb25hbFRocmVzaG9sZCA9IG9wdGlvbnMuYXV0b1JlY2VudGVyUm90YXRpb25hbFRocmVzaG9sZCwKKyAgICAgICAgICB9KSwKKyAgICAgICAgICBtU2NyZWVuU3RpbGxuZXNzRGV0ZWN0b3IoU3RpbGxuZXNzRGV0ZWN0b3I6Ok9wdGlvbnN7CisgICAgICAgICAgICAgICAgICAuZGVmYXVsdFZhbHVlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IG9wdGlvbnMuc2NyZWVuU3RpbGxuZXNzV2luZG93RHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IG9wdGlvbnMuc2NyZWVuU3RpbGxuZXNzVHJhbnNsYXRpb25hbFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbmFsVGhyZXNob2xkID0gb3B0aW9ucy5zY3JlZW5TdGlsbG5lc3NSb3RhdGlvbmFsVGhyZXNob2xkLAorICAgICAgICAgIH0pLAorICAgICAgICAgIG1Nb2RlU2VsZWN0b3IoTW9kZVNlbGVjdG9yOjpPcHRpb25zey5mcmVzaG5lc3NUaW1lb3V0ID0gb3B0aW9ucy5mcmVzaG5lc3NUaW1lb3V0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxNb2RlKSwKKyAgICAgICAgICBtUmF0ZUxpbWl0ZXIoUG9zZVJhdGVMaW1pdGVyOjpPcHRpb25zeworICAgICAgICAgICAgICAgICAgLm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IG9wdGlvbnMubWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5LAorICAgICAgICAgICAgICAgICAgLm1heFJvdGF0aW9uYWxWZWxvY2l0eSA9IG9wdGlvbnMubWF4Um90YXRpb25hbFZlbG9jaXR5fSkge30KKworICAgIHZvaWQgc2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZSBtb2RlKSBvdmVycmlkZSB7IG1Nb2RlU2VsZWN0b3Iuc2V0RGVzaXJlZE1vZGUobW9kZSk7IH0KKworICAgIHZvaWQgc2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aXN0M2YmIGhlYWRUd2lzdCkgb3ZlcnJpZGUgeworICAgICAgICBQb3NlM2YgcHJlZGljdGVkV29ybGRUb0hlYWQgPQorICAgICAgICAgICAgICAgIHdvcmxkVG9IZWFkICogaW50ZWdyYXRlKGhlYWRUd2lzdCwgbU9wdGlvbnMucHJlZGljdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgbUhlYWRQb3NlQmlhcy5zZXRJbnB1dChwcmVkaWN0ZWRXb3JsZFRvSGVhZCk7CisgICAgICAgIG1IZWFkU3RpbGxuZXNzRGV0ZWN0b3Iuc2V0SW5wdXQodGltZXN0YW1wLCBwcmVkaWN0ZWRXb3JsZFRvSGVhZCk7CisgICAgICAgIG1Xb3JsZFRvSGVhZFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICB2b2lkIHNldFdvcmxkVG9TY3JlZW5Qb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9TY3JlZW4pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1QaHlzaWNhbFRvTG9naWNhbEFuZ2xlICE9IG1QZW5kaW5nUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkgeworICAgICAgICAgICAgLy8gV2UncmUgaW50cm9kdWNpbmcgYW4gYXJ0aWZpY2lhbCBkaXNjb250aW51aXR5LiBFbmFibGUgdGhlIHJhdGUgbGltaXRlci4KKyAgICAgICAgICAgIG1SYXRlTGltaXRlci5lbmFibGUoKTsKKyAgICAgICAgICAgIG1QaHlzaWNhbFRvTG9naWNhbEFuZ2xlID0gbVBlbmRpbmdQaHlzaWNhbFRvTG9naWNhbEFuZ2xlOworICAgICAgICB9CisKKyAgICAgICAgUG9zZTNmIHdvcmxkVG9Mb2dpY2FsU2NyZWVuID0gd29ybGRUb1NjcmVlbiAqIFBvc2UzZihyb3RhdGVZKC1tUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkpOworICAgICAgICBtU2NyZWVuUG9zZUJpYXMuc2V0SW5wdXQod29ybGRUb0xvZ2ljYWxTY3JlZW4pOworICAgICAgICBtU2NyZWVuU3RpbGxuZXNzRGV0ZWN0b3Iuc2V0SW5wdXQodGltZXN0YW1wLCB3b3JsZFRvTG9naWNhbFNjcmVlbik7CisgICAgICAgIG1Xb3JsZFRvU2NyZWVuVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgIH0KKworICAgIHZvaWQgc2V0U2NyZWVuVG9TdGFnZVBvc2UoY29uc3QgUG9zZTNmJiBzY3JlZW5Ub1N0YWdlKSBvdmVycmlkZSB7CisgICAgICAgIG1Nb2RlU2VsZWN0b3Iuc2V0U2NyZWVuVG9TdGFnZVBvc2Uoc2NyZWVuVG9TdGFnZSk7CisgICAgfQorCisgICAgdm9pZCBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkgb3ZlcnJpZGUgeworICAgICAgICBtUGVuZGluZ1BoeXNpY2FsVG9Mb2dpY2FsQW5nbGUgPSBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlOworICAgIH0KKworICAgIHZvaWQgY2FsY3VsYXRlKGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgc2NyZWVuIGZpcnN0LCBzaW5jZSBpdCBtaWdodCB0cmlnZ2VyIGEgcmVjZW50ZXJpbmcgb2YgdGhlIGhlYWQuCisgICAgICAgIGlmIChtV29ybGRUb1NjcmVlblRpbWVzdGFtcC5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9Mb2dpY2FsU2NyZWVuID0gbVNjcmVlblBvc2VCaWFzLmdldE91dHB1dCgpOworICAgICAgICAgICAgYm9vbCBzY3JlZW5TdGFibGUgPSBtU2NyZWVuU3RpbGxuZXNzRGV0ZWN0b3IuY2FsY3VsYXRlKHRpbWVzdGFtcCk7CisgICAgICAgICAgICBtTW9kZVNlbGVjdG9yLnNldFNjcmVlblN0YWJsZShtV29ybGRUb1NjcmVlblRpbWVzdGFtcC52YWx1ZSgpLCBzY3JlZW5TdGFibGUpOworICAgICAgICAgICAgLy8gV2hlbmV2ZXIgdGhlIHNjcmVlbiBpcyB1bnN0YWJsZSwgcmVjZW50ZXIgdGhlIGhlYWQgcG9zZS4KKyAgICAgICAgICAgIGlmICghc2NyZWVuU3RhYmxlKSB7CisgICAgICAgICAgICAgICAgcmVjZW50ZXIodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNjcmVlbkhlYWRGdXNpb24uc2V0V29ybGRUb1NjcmVlblBvc2UobVdvcmxkVG9TY3JlZW5UaW1lc3RhbXAudmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkVG9Mb2dpY2FsU2NyZWVuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSBoZWFkLgorICAgICAgICBpZiAobVdvcmxkVG9IZWFkVGltZXN0YW1wLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBQb3NlM2Ygd29ybGRUb0hlYWQgPSBtSGVhZFBvc2VCaWFzLmdldE91dHB1dCgpOworICAgICAgICAgICAgLy8gQXV0by1yZWNlbnRlci4KKyAgICAgICAgICAgIGlmIChtSGVhZFN0aWxsbmVzc0RldGVjdG9yLmNhbGN1bGF0ZSh0aW1lc3RhbXApKSB7CisgICAgICAgICAgICAgICAgcmVjZW50ZXIodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHdvcmxkVG9IZWFkID0gbUhlYWRQb3NlQmlhcy5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNjcmVlbkhlYWRGdXNpb24uc2V0V29ybGRUb0hlYWRQb3NlKG1Xb3JsZFRvSGVhZFRpbWVzdGFtcC52YWx1ZSgpLCB3b3JsZFRvSGVhZCk7CisgICAgICAgICAgICBtTW9kZVNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZShtV29ybGRUb0hlYWRUaW1lc3RhbXAudmFsdWUoKSwgd29ybGRUb0hlYWQpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBtYXliZVNjcmVlblRvSGVhZCA9IG1TY3JlZW5IZWFkRnVzaW9uLmNhbGN1bGF0ZSgpOworICAgICAgICBpZiAobWF5YmVTY3JlZW5Ub0hlYWQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIG1Nb2RlU2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZShtYXliZVNjcmVlblRvSGVhZC0+dGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlU2NyZWVuVG9IZWFkLT5wb3NlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2RlU2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZSh0aW1lc3RhbXAsIHN0ZDo6bnVsbG9wdCk7CisgICAgICAgIH0KKworICAgICAgICBIZWFkVHJhY2tpbmdNb2RlIHByZXZNb2RlID0gbU1vZGVTZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCk7CisgICAgICAgIG1Nb2RlU2VsZWN0b3IuY2FsY3VsYXRlKHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChtTW9kZVNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKSAhPSBwcmV2TW9kZSkgeworICAgICAgICAgICAgLy8gTW9kZSBoYXMgY2hhbmdlZCwgZW5hYmxlIHJhdGUgbGltaXRpbmcuCisgICAgICAgICAgICBtUmF0ZUxpbWl0ZXIuZW5hYmxlKCk7CisgICAgICAgIH0KKyAgICAgICAgbVJhdGVMaW1pdGVyLnNldFRhcmdldChtTW9kZVNlbGVjdG9yLmdldEhlYWRUb1N0YWdlUG9zZSgpKTsKKyAgICAgICAgbUhlYWRUb1N0YWdlUG9zZSA9IG1SYXRlTGltaXRlci5jYWxjdWxhdGVQb3NlKHRpbWVzdGFtcCk7CisgICAgfQorCisgICAgUG9zZTNmIGdldEhlYWRUb1N0YWdlUG9zZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1IZWFkVG9TdGFnZVBvc2U7IH0KKworICAgIEhlYWRUcmFja2luZ01vZGUgZ2V0QWN0dWFsTW9kZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Nb2RlU2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpOyB9CisKKyAgICB2b2lkIHJlY2VudGVyKGJvb2wgcmVjZW50ZXJIZWFkLCBib29sIHJlY2VudGVyU2NyZWVuKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChyZWNlbnRlckhlYWQpIHsKKyAgICAgICAgICAgIG1IZWFkUG9zZUJpYXMucmVjZW50ZXIoKTsKKyAgICAgICAgICAgIG1IZWFkU3RpbGxuZXNzRGV0ZWN0b3IucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVjZW50ZXJTY3JlZW4pIHsKKyAgICAgICAgICAgIG1TY3JlZW5Qb3NlQmlhcy5yZWNlbnRlcigpOworICAgICAgICAgICAgbVNjcmVlblN0aWxsbmVzc0RldGVjdG9yLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBhIHNlbnNvciBiZWluZyByZWNlbnRlcmVkIGlzIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IG1vZGUsIGFwcGx5IHJhdGUgbGltaXRpbmcgdG8KKyAgICAgICAgLy8gYXZvaWQgZGlzY29udGludWl0aWVzLgorICAgICAgICBIZWFkVHJhY2tpbmdNb2RlIG1vZGUgPSBtTW9kZVNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKTsKKyAgICAgICAgaWYgKChyZWNlbnRlckhlYWQgJiYgKG1vZGUgPT0gSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKSkgfHwKKyAgICAgICAgICAgIChyZWNlbnRlclNjcmVlbiAmJiBtb2RlID09IEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSkpIHsKKyAgICAgICAgICAgIG1SYXRlTGltaXRlci5lbmFibGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IE9wdGlvbnMgbU9wdGlvbnM7CisgICAgZmxvYXQgbVBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUgPSAwOworICAgIC8vIFdlIHN0b3JlIHRoZSBwaHlzaWNhbCB0byBsb2dpY2FsIGFuZ2xlIGFzICJwZW5kaW5nIiB1bnRpbCB0aGUgbmV4dCB3b3JsZC10by1zY3JlZW4gc2FtcGxlIGl0CisgICAgLy8gYXBwbGllcyB0byBhcnJpdmVzLgorICAgIGZsb2F0IG1QZW5kaW5nUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSA9IDA7CisgICAgc3RkOjpvcHRpb25hbDxpbnQ2NF90PiBtV29ybGRUb0hlYWRUaW1lc3RhbXA7CisgICAgc3RkOjpvcHRpb25hbDxpbnQ2NF90PiBtV29ybGRUb1NjcmVlblRpbWVzdGFtcDsKKyAgICBQb3NlM2YgbUhlYWRUb1N0YWdlUG9zZTsKKyAgICBQb3NlQmlhcyBtSGVhZFBvc2VCaWFzOworICAgIFBvc2VCaWFzIG1TY3JlZW5Qb3NlQmlhczsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBtSGVhZFN0aWxsbmVzc0RldGVjdG9yOworICAgIFN0aWxsbmVzc0RldGVjdG9yIG1TY3JlZW5TdGlsbG5lc3NEZXRlY3RvcjsKKyAgICBTY3JlZW5IZWFkRnVzaW9uIG1TY3JlZW5IZWFkRnVzaW9uOworICAgIE1vZGVTZWxlY3RvciBtTW9kZVNlbGVjdG9yOworICAgIFBvc2VSYXRlTGltaXRlciBtUmF0ZUxpbWl0ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjp1bmlxdWVfcHRyPEhlYWRUcmFja2luZ1Byb2Nlc3Nvcj4gY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKAorICAgICAgICBjb25zdCBIZWFkVHJhY2tpbmdQcm9jZXNzb3I6Ok9wdGlvbnMmIG9wdGlvbnMsIEhlYWRUcmFja2luZ01vZGUgaW5pdGlhbE1vZGUpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIZWFkVHJhY2tpbmdQcm9jZXNzb3JJbXBsPihvcHRpb25zLCBpbml0aWFsTW9kZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3ItdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzZlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLXRlc3QuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk1vZGVTZWxlY3Rvci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworVEVTVChNb2RlU2VsZWN0b3IsIEluaXRpYWwpIHsKKyAgICBNb2RlU2VsZWN0b3I6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CisKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQywgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIFBvc2UzZigpKTsKK30KKworVEVTVChNb2RlU2VsZWN0b3IsIEluaXRpYWxXb3JsZFJlbGF0aXZlKSB7CisgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisKKyAgICBNb2RlU2VsZWN0b3I6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucywgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworCisgICAgc2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKDAsIHdvcmxkVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5TdGFibGUoMCwgdHJ1ZSk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDApOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBJbml0aWFsU2NyZWVuUmVsYXRpdmUpIHsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisKKyAgICBNb2RlU2VsZWN0b3I6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucywgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvSGVhZFBvc2UoMCwgc2NyZWVuVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHNjcmVlblRvSGVhZC5pbnZlcnNlKCkpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgV29ybGRSZWxhdGl2ZSkgeworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZCh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub1N0YWdlKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisKKyAgICBNb2RlU2VsZWN0b3I6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CisKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisgICAgc2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKDAsIHdvcmxkVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5TdGFibGUoMCwgdHJ1ZSk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDApOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSAqIHNjcmVlblRvU3RhZ2UpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgV29ybGRSZWxhdGl2ZVVuc3RhYmxlKSB7CisgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2UoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zey5mcmVzaG5lc3NUaW1lb3V0ID0gMTAwfTsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CisKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisgICAgc2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKDAsIHdvcmxkVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5TdGFibGUoMCwgZmFsc2UpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgxMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQywgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHNjcmVlblRvU3RhZ2UpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgV29ybGRSZWxhdGl2ZVN0YWJsZVN0YWxlKSB7CisgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2UoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zey5mcmVzaG5lc3NUaW1lb3V0ID0gMTAwfTsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CisKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisgICAgc2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKDEwMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSgwLCB0cnVlKTsKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMTAxKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgc2NyZWVuVG9TdGFnZSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBXb3JsZFJlbGF0aXZlU3RhbGUpIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSAxMDB9OworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgxMDEpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMsIHNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKSk7CisgICAgRVhQRUNUX0VRKHNlbGVjdG9yLmdldEhlYWRUb1N0YWdlUG9zZSgpLCBzY3JlZW5Ub1N0YWdlKTsKK30KKworVEVTVChNb2RlU2VsZWN0b3IsIFNjcmVlblJlbGF0aXZlKSB7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvSGVhZCh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub1N0YWdlKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisKKyAgICBNb2RlU2VsZWN0b3I6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CisKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvSGVhZFBvc2UoMCwgc2NyZWVuVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHNjcmVlblRvSGVhZC5pbnZlcnNlKCkgKiBzY3JlZW5Ub1N0YWdlKTsKK30KKworVEVTVChNb2RlU2VsZWN0b3IsIFNjcmVlblJlbGF0aXZlU3RhbGVUb1dvcmxkUmVsYXRpdmUpIHsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2UoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezcsIDgsIDl9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zey5mcmVzaG5lc3NUaW1lb3V0ID0gMTAwfTsKKyAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CisKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvSGVhZFBvc2UoMCwgc2NyZWVuVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoNTAsIHdvcmxkVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5TdGFibGUoNTAsIHRydWUpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgxMDEpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSAqIHNjcmVlblRvU3RhZ2UpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgU2NyZWVuUmVsYXRpdmVJbnZhbGlkVG9Xb3JsZFJlbGF0aXZlKSB7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2UoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezcsIDgsIDl9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zOworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworCisgICAgc2VsZWN0b3Iuc2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub0hlYWRQb3NlKDUwLCBzdGQ6Om51bGxvcHQpOworICAgIHNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZSg1MCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSg1MCwgdHJ1ZSk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwMSk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpICogc2NyZWVuVG9TdGFnZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNhMjdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTW9kZVNlbGVjdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK01vZGVTZWxlY3Rvcjo6TW9kZVNlbGVjdG9yKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIEhlYWRUcmFja2luZ01vZGUgaW5pdGlhbE1vZGUpCisgICAgOiBtT3B0aW9ucyhvcHRpb25zKSwgbURlc2lyZWRNb2RlKGluaXRpYWxNb2RlKSwgbUFjdHVhbE1vZGUoaW5pdGlhbE1vZGUpIHt9CisKK3ZvaWQgTW9kZVNlbGVjdG9yOjpzZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIHsKKyAgICBtRGVzaXJlZE1vZGUgPSBtb2RlOworfQorCit2b2lkIE1vZGVTZWxlY3Rvcjo6c2V0U2NyZWVuVG9TdGFnZVBvc2UoY29uc3QgUG9zZTNmJiBzY3JlZW5Ub1N0YWdlKSB7CisgICAgbVNjcmVlblRvU3RhZ2UgPSBzY3JlZW5Ub1N0YWdlOworfQorCit2b2lkIE1vZGVTZWxlY3Rvcjo6c2V0U2NyZWVuVG9IZWFkUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiYgc2NyZWVuVG9IZWFkKSB7CisgICAgbVNjcmVlblRvSGVhZCA9IHNjcmVlblRvSGVhZDsKKyAgICBtU2NyZWVuVG9IZWFkVGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCit2b2lkIE1vZGVTZWxlY3Rvcjo6c2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkKSB7CisgICAgbVdvcmxkVG9IZWFkID0gd29ybGRUb0hlYWQ7CisgICAgbVdvcmxkVG9IZWFkVGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCit2b2lkIE1vZGVTZWxlY3Rvcjo6c2V0U2NyZWVuU3RhYmxlKGludDY0X3QgdGltZXN0YW1wLCBib29sIHN0YWJsZSkgeworICAgIG1TY3JlZW5TdGFibGUgPSBzdGFibGU7CisgICAgbVNjcmVlblN0YWJsZVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKK30KKwordm9pZCBNb2RlU2VsZWN0b3I6OmNhbGN1bGF0ZUFjdHVhbE1vZGUoaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBib29sIGlzVmFsaWRTY3JlZW5Ub0hlYWQgPSBtU2NyZWVuVG9IZWFkLmhhc192YWx1ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIC0gbVNjcmVlblRvSGVhZFRpbWVzdGFtcCA8IG1PcHRpb25zLmZyZXNobmVzc1RpbWVvdXQ7CisgICAgYm9vbCBpc1ZhbGlkV29ybGRUb0hlYWQgPSBtV29ybGRUb0hlYWQuaGFzX3ZhbHVlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCAtIG1Xb3JsZFRvSGVhZFRpbWVzdGFtcCA8IG1PcHRpb25zLmZyZXNobmVzc1RpbWVvdXQ7CisgICAgYm9vbCBpc1ZhbGlkU2NyZWVuU3RhYmxlID0gbVNjcmVlblN0YWJsZS5oYXNfdmFsdWUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIC0gbVNjcmVlblN0YWJsZVRpbWVzdGFtcCA8IG1PcHRpb25zLmZyZXNobmVzc1RpbWVvdXQ7CisKKyAgICBIZWFkVHJhY2tpbmdNb2RlIG1vZGUgPSBtRGVzaXJlZE1vZGU7CisKKyAgICAvLyBPcHRpb25hbCBkb3duZ3JhZGUgZnJvbSBzY3JlZW4tcmVsYXRpdmUgdG8gd29ybGQtcmVsYXRpdmUuCisgICAgaWYgKG1vZGUgPT0gSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKSB7CisgICAgICAgIGlmICghaXNWYWxpZFNjcmVlblRvSGVhZCkgeworICAgICAgICAgICAgbW9kZSA9IEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3B0aW9uYWwgZG93bmdyYWRlIGZyb20gd29ybGQtcmVsYXRpdmUgdG8gc3RhdGljLgorICAgIGlmIChtb2RlID09IEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKSB7CisgICAgICAgIGlmICghaXNWYWxpZFdvcmxkVG9IZWFkIHx8ICFpc1ZhbGlkU2NyZWVuU3RhYmxlIHx8ICFtU2NyZWVuU3RhYmxlLnZhbHVlKCkpIHsKKyAgICAgICAgICAgIG1vZGUgPSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQWN0dWFsTW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgTW9kZVNlbGVjdG9yOjpjYWxjdWxhdGUoaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBjYWxjdWxhdGVBY3R1YWxNb2RlKHRpbWVzdGFtcCk7CisKKyAgICBzd2l0Y2ggKG1BY3R1YWxNb2RlKSB7CisgICAgICAgIGNhc2UgSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDOgorICAgICAgICAgICAgbUhlYWRUb1N0YWdlID0gbVNjcmVlblRvU3RhZ2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFOgorICAgICAgICAgICAgbUhlYWRUb1N0YWdlID0gbVdvcmxkVG9IZWFkLnZhbHVlKCkuaW52ZXJzZSgpICogbVNjcmVlblRvU3RhZ2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRToKKyAgICAgICAgICAgIG1IZWFkVG9TdGFnZSA9IG1TY3JlZW5Ub0hlYWQudmFsdWUoKS5pbnZlcnNlKCkgKiBtU2NyZWVuVG9TdGFnZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworUG9zZTNmIE1vZGVTZWxlY3Rvcjo6Z2V0SGVhZFRvU3RhZ2VQb3NlKCkgY29uc3QgeworICAgIHJldHVybiBtSGVhZFRvU3RhZ2U7Cit9CisKK0hlYWRUcmFja2luZ01vZGUgTW9kZVNlbGVjdG9yOjpnZXRBY3R1YWxNb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtQWN0dWFsTW9kZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzcwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxvcHRpb25hbD4KKworI2luY2x1ZGUgIm1lZGlhL0hlYWRUcmFja2luZ01vZGUuaCIKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisKKyNpbmNsdWRlICJQb3NlUmF0ZUxpbWl0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBIZWFkLXRyYWNraW5nIG1vZGUgc2VsZWN0b3IuCisgKgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgcHJvZHVjdGlvbiBvZiB0aGUgZGV0ZXJtaW5pbmcgcG9zZSBmb3IgYXVkaW8gdmlydHVhbGl6YXRpb24sIGJhc2VkCisgKiBvbiBhIG51bWJlciBvZiBhdmFpbGFibGUgc291cmNlcyBhbmQgYSBzZWxlY3RhYmxlIG1vZGUuCisgKgorICogVHlwaWNhbCBmbG93IGlzOgorICogTW9kZVNlbGVjdG9yIHNlbGVjdG9yKC4uLik7CisgKiB3aGlsZSAoLi4uKSB7CisgKiAgICAgLy8gU2V0IGlucHV0cy4KKyAqICAgICBzZWxlY3Rvci5zZXRGb28oLi4uKTsKKyAqICAgICBzZWxlY3Rvci5zZXRCYXIoLi4uKTsKKyAqCisgKiAgICAgLy8gVXBkYXRlIG91dHB1dHMgYmFzZWQgb24gaW5wdXRzLgorICogICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSguLi4pOworICoKKyAqICAgICAvLyBHZXQgb3V0cHV0cy4KKyAqICAgICBQb3NlM2YgcG9zZSA9IHNlbGVjdG9yLmdldEhlYWRUb1N0YWdlUG9zZSgpOworICogfQorICoKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLCBidXQgdGhyZWFkLWNvbXBhdGlibGUuCisgKgorICogRm9yIGRldGFpbHMgb24gdGhlIGZyYW1lcyBvZiByZWZlcmVuY2UgaW52b2x2ZWQsIHRoZWlyIGNvbXBvc2l0aW9uIGFuZCB0aGUgZGVmaW5pdGlvbnMgdG8gdGhlCisgKiBkaWZmZXJlbnQgbW9kZXMsIHJlZmVyIHRvOgorICogZ28vaW1tZXJzaXZlLWF1ZGlvLWZyYW1lcworICoKKyAqIFRoZSBhY3R1YWwgbW9kZSBtYXkgZGV2aWF0ZSBmcm9tIHRoZSBkZXNpcmVkIG1vZGUgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKyAqIC0gV2hlbiB3ZSBjYW5ub3QgZ2V0IGEgdmFsaWQgYW5kIGZyZXNoIGVzdGltYXRlIG9mIHRoZSBzY3JlZW4tdG8taGVhZCBwb3NlLCB3ZSB3aWxsIGZhbGwgYmFjaworICogICBmcm9tIHNjcmVlbi1yZWxhdGl2ZSB0byB3b3JsZC1yZWxhdGl2ZS4KKyAqIC0gV2hlbiB3ZSBjYW5ub3QgZ2V0IGEgZnJlc2ggZXN0aW1hdGUgb2YgdGhlIHdvcmxkLXRvLWhlYWQgcG9zZSwgd2Ugd2lsbCBmYWxsIGJhY2sgZnJvbQorICogICB3b3JsZC1yZWxhdGl2ZSB0byBzdGF0aWMuCisgKiAtIEluIHdvcmxkLXJlbGF0aXZlIG1vZGUsIGlmIHRoZSBzY3JlZW4gaXMgdW5zdGFibGUsIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHN0YXRpYy4KKyAqCisgKiBBbGwgdGhlIHRpbWVzdGFtcHMgdXNlZCBoZXJlIGFyZSBvZiBhcmJpdHJhcnkgdW5pdHMgYW5kIG9yaWdpbi4gVGhleSBqdXN0IG5lZWQgdG8gYmUgY29uc2lzdGVudAorICogYmV0d2VlbiBhbGwgdGhlIGNhbGxzIGFuZCB3aXRoIHRoZSBPcHRpb25zIHByb3ZpZGVkIGZvciBkZXRlcm1pbmluZyBmcmVzaG5lc3MgYW5kIHJhdGUgbGltaXRpbmcuCisgKi8KK2NsYXNzIE1vZGVTZWxlY3RvciB7CisgIHB1YmxpYzoKKyAgICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgICAgIGludDY0X3QgZnJlc2huZXNzVGltZW91dCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworICAgIH07CisKKyAgICBNb2RlU2VsZWN0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgSGVhZFRyYWNraW5nTW9kZSBpbml0aWFsTW9kZSA9IEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQyk7CisKKyAgICAvKiogU2V0cyB0aGUgZGVzaXJlZCBoZWFkLXRyYWNraW5nIG1vZGUuICovCisgICAgdm9pZCBzZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlIG1vZGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY3JlZW4tdG8tc3RhZ2UgcG9zZSwgdXNlZCBpbiBhbGwgbW9kZXMuCisgICAgICovCisgICAgdm9pZCBzZXRTY3JlZW5Ub1N0YWdlUG9zZShjb25zdCBQb3NlM2YmIHNjcmVlblRvU3RhZ2UpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY3JlZW4tdG8taGVhZCBwb3NlLCB1c2VkIGluIHNjcmVlbi1yZWxhdGl2ZSBtb2RlLgorICAgICAqIFRoZSB0aW1lc3RhbXAgbmVlZHMgdG8gcmVmbGVjdCBob3cgZnJlc2ggdGhlIHNhbXBsZSBpcyAobm90IG5lY2Vzc2FyaWx5IHdoaWNoIHBvaW50IGluIHRpbWUKKyAgICAgKiBpdCBhcHBsaWVzIHRvKS4gbnVsbG9wdCBjYW4gYmUgdXNlZCBpZiBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbiBmcm9udCBvZgorICAgICAqIHRoZSBzY3JlZW4uCisgICAgICovCisgICAgdm9pZCBzZXRTY3JlZW5Ub0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6Om9wdGlvbmFsPFBvc2UzZj4mIHNjcmVlblRvSGVhZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdvcmxkLXRvLWhlYWQgcG9zZSwgdXNlZCBpbiB3b3JsZC1yZWxhdGl2ZSBtb2RlLgorICAgICAqIFRoZSB0aW1lc3RhbXAgbmVlZHMgdG8gcmVmbGVjdCBob3cgZnJlc2ggdGhlIHNhbXBsZSBpcyAobm90IG5lY2Vzc2FyaWx5IHdoaWNoIHBvaW50IGluIHRpbWUKKyAgICAgKiBpdCBhcHBsaWVzIHRvKS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFdvcmxkVG9IZWFkUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwgY29uc3QgUG9zZTNmJiB3b3JsZFRvSGVhZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgc2NyZWVuIGlzIGNvbnNpZGVyZWQgc3RhYmxlLgorICAgICAqIFRoZSB0aW1lc3RhbXAgbmVlZHMgdG8gcmVmbGVjdCBob3cgZnJlc2ggdGhlIHNhbXBsZSBpcy4KKyAgICAgKi8KKyAgICAgdm9pZCBzZXRTY3JlZW5TdGFibGUoaW50NjRfdCB0aW1lc3RhbXAsIGJvb2wgc3RhYmxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYWxsIHRoZSBwcmV2aW91cyBpbnB1dHMgYW5kIHVwZGF0ZSB0aGUgb3V0cHV0cy4KKyAgICAgKi8KKyAgICB2b2lkIGNhbGN1bGF0ZShpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFnZ3JlZ2F0ZSBoZWFkLXRvLXN0YWdlIHBvc2UgKHByaW1hcnkgb3V0cHV0IG9mIHRoaXMgbW9kdWxlKS4KKyAgICAgKi8KKyAgICBQb3NlM2YgZ2V0SGVhZFRvU3RhZ2VQb3NlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjdHVhbCBoZWFkLXRyYWNraW5nIG1vZGUgKHdoaWNoIG1heSBkZXZpYXRlIGZyb20gdGhlIGRlc2lyZWQgb25lIGFzIG1lbnRpb25lZCBpbiB0aGUKKyAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uIGFib3ZlKS4KKyAgICAgKi8KKyAgICBIZWFkVHJhY2tpbmdNb2RlIGdldEFjdHVhbE1vZGUoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIGNvbnN0IE9wdGlvbnMgbU9wdGlvbnM7CisKKyAgICBIZWFkVHJhY2tpbmdNb2RlIG1EZXNpcmVkTW9kZTsKKyAgICBQb3NlM2YgbVNjcmVlblRvU3RhZ2U7CisgICAgc3RkOjpvcHRpb25hbDxQb3NlM2Y+IG1TY3JlZW5Ub0hlYWQ7CisgICAgaW50NjRfdCBtU2NyZWVuVG9IZWFkVGltZXN0YW1wOworICAgIHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiBtV29ybGRUb0hlYWQ7CisgICAgaW50NjRfdCBtV29ybGRUb0hlYWRUaW1lc3RhbXA7CisgICAgc3RkOjpvcHRpb25hbDxib29sPiBtU2NyZWVuU3RhYmxlOworICAgIGludDY0X3QgbVNjcmVlblN0YWJsZVRpbWVzdGFtcDsKKworICAgIEhlYWRUcmFja2luZ01vZGUgbUFjdHVhbE1vZGU7CisgICAgUG9zZTNmIG1IZWFkVG9TdGFnZTsKKworICAgIHZvaWQgY2FsY3VsYXRlQWN0dWFsTW9kZShpbnQ2NF90IHRpbWVzdGFtcCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvT1dORVJTIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWQwMzcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK3l0YWlAZ29vZ2xlLmNvbQorZWxhdXJlbnRAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2UtdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUxOGNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2UtdGVzdC5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibWVkaWEvUG9zZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZjsKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoUG9zZSwgQ3RvckRlZmF1bHQpIHsKKyAgICBQb3NlM2YgcG9zZTsKKyAgICBFWFBFQ1RfRVEocG9zZS50cmFuc2xhdGlvbigpLCBWZWN0b3IzZjo6WmVybygpKTsKKyAgICBFWFBFQ1RfRVEocG9zZS5yb3RhdGlvbigpLCBRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSk7Cit9CisKK1RFU1QoUG9zZSwgQ3RvclJvdGF0aW9uKSB7CisgICAgUXVhdGVybmlvbmYgcm90ID0gUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKTsKKyAgICBQb3NlM2YgcG9zZShyb3QpOworICAgIEVYUEVDVF9FUShwb3NlLnRyYW5zbGF0aW9uKCksIFZlY3RvcjNmOjpaZXJvKCkpOworICAgIEVYUEVDVF9FUShwb3NlLnJvdGF0aW9uKCksIHJvdCk7Cit9CisKK1RFU1QoUG9zZSwgQ3RvclRyYW5zbGF0aW9uKSB7CisgICAgVmVjdG9yM2YgdHJhbnN7MSwgMiwgM307CisgICAgUG9zZTNmIHBvc2UodHJhbnMpOworICAgIEVYUEVDVF9FUShwb3NlLnRyYW5zbGF0aW9uKCksIHRyYW5zKTsKKyAgICBFWFBFQ1RfRVEocG9zZS5yb3RhdGlvbigpLCBRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSk7Cit9CisKK1RFU1QoUG9zZSwgQ3RvclRyYW5zbGF0aW9uUm90YXRpb24pIHsKKyAgICBRdWF0ZXJuaW9uZiByb3QgPSBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpOworICAgIFZlY3RvcjNmIHRyYW5zezEsIDIsIDN9OworICAgIFBvc2UzZiBwb3NlKHRyYW5zLCByb3QpOworICAgIEVYUEVDVF9FUShwb3NlLnRyYW5zbGF0aW9uKCksIHRyYW5zKTsKKyAgICBFWFBFQ1RfRVEocG9zZS5yb3RhdGlvbigpLCByb3QpOworfQorCitURVNUKFBvc2UsIEludmVyc2UpIHsKKyAgICBQb3NlM2YgcG9zZSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIEVYUEVDVF9FUShwb3NlLmludmVyc2UoKSAqIHBvc2UsIFBvc2UzZigpKTsKKyAgICBFWFBFQ1RfRVEocG9zZSAqIHBvc2UuaW52ZXJzZSgpLCBQb3NlM2YoKSk7Cit9CisKK1RFU1QoUG9zZSwgSXNBcHByb3gpIHsKKyAgICBjb25zdGV4cHIgZmxvYXQgZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKTsKKworICAgIEVYUEVDVF9FUShQb3NlM2YoezEsIDIsIDN9LCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbih7NCwgNSwgNn0pKSwKKyAgICAgICAgICAgICAgUG9zZTNmKHsxICsgZXBzLCAyICsgZXBzLCAzICsgZXBzfSwKKyAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHs0ICsgZXBzLCA1ICsgZXBzLCA2ICsgZXBzfSkpKTsKKworICAgIEVYUEVDVF9ORShQb3NlM2YoezEsIDIsIDN9LCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbih7NCwgNSwgNn0pKSwKKyAgICAgICAgICAgICAgUG9zZTNmKHsxLjAxLCAyLCAzfSwgcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oezQsIDUsIDZ9KSkpOworCisgICAgRVhQRUNUX05FKFBvc2UzZih7MSwgMiwgM30sIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHs0LCA1LCA2fSkpLAorICAgICAgICAgICAgICBQb3NlM2YoezEsIDIsIDN9LCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbih7NC4wMSwgNSwgNn0pKSk7Cit9CisKK1RFU1QoUG9zZSwgQ29tcG9zZSkgeworICAgIFBvc2UzZiBwMSh7MSwgMiwgM30sIHJvdGF0ZVooTV9QSV8yKSk7CisgICAgUG9zZTNmIHAyKHs0LCA1LCA2fSwgcm90YXRlWChNX1BJXzIpKTsKKyAgICBQb3NlM2YgcDMoey00LCA2LCA5fSwgcDEucm90YXRpb24oKSAqIHAyLnJvdGF0aW9uKCkpOworICAgIEVYUEVDVF9FUShwMSAqIHAyLCBwMyk7Cit9CisKK1RFU1QoUG9zZSwgTW92ZVdpdGhSYXRlTGltaXRfTm9MaW1pdCkgeworICAgIFBvc2UzZiBmcm9tKHsxLCAxLCAxfSwgUXVhdGVybmlvbmY6OklkZW50aXR5KCkpOworICAgIFBvc2UzZiB0byh7MSwgMSwgMn0sIHJvdGF0ZVooTV9QSV8yKSk7CisgICAgYXV0byByZXN1bHQgPSBtb3ZlV2l0aFJhdGVMaW1pdChmcm9tLCB0bywgMSwgMTAsIDEwKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpnZXQ8MD4ocmVzdWx0KSwgdG8pOworICAgIEVYUEVDVF9GQUxTRShzdGQ6OmdldDwxPihyZXN1bHQpKTsKK30KKworVEVTVChQb3NlLCBNb3ZlV2l0aFJhdGVMaW1pdF9UcmFuc2xhdGlvbkxpbWl0KSB7CisgICAgUG9zZTNmIGZyb20oezEsIDEsIDF9LCBRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSk7CisgICAgUG9zZTNmIHRvKHsxLCAxLCAyfSwgcm90YXRlWihNX1BJXzIpKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1vdmVXaXRoUmF0ZUxpbWl0KGZyb20sIHRvLCAxLCAwLjVmLCAxMCk7CisgICAgUG9zZTNmIGV4cGVjdGVkKHsxLCAxLCAxLjVmfSwgcm90YXRlWihNX1BJXzQpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpnZXQ8MD4ocmVzdWx0KSwgZXhwZWN0ZWQpOworICAgIEVYUEVDVF9UUlVFKHN0ZDo6Z2V0PDE+KHJlc3VsdCkpOworfQorCitURVNUKFBvc2UsIE1vdmVXaXRoUmF0ZUxpbWl0X1JvdGF0aW9uTGltaXQpIHsKKyAgICBQb3NlM2YgZnJvbSh7MSwgMSwgMX0sIFF1YXRlcm5pb25mOjpJZGVudGl0eSgpKTsKKyAgICBQb3NlM2YgdG8oezEsIDEsIDJ9LCByb3RhdGVaKE1fUElfMikpOworICAgIGF1dG8gcmVzdWx0ID0gbW92ZVdpdGhSYXRlTGltaXQoZnJvbSwgdG8sIDEsIDEwLCBNX1BJXzQpOworICAgIFBvc2UzZiBleHBlY3RlZCh7MSwgMSwgMS41Zn0sIHJvdGF0ZVooTV9QSV80KSk7CisgICAgRVhQRUNUX0VRKHN0ZDo6Z2V0PDA+KHJlc3VsdCksIGV4cGVjdGVkKTsKKyAgICBFWFBFQ1RfVFJVRShzdGQ6OmdldDwxPihyZXN1bHQpKTsKK30KKworVEVTVChQb3NlLCBGbG9hdFZlY3RvclJvdW5kVHJpcDEpIHsKKyAgICAvLyBSb3RhdGlvbiB2ZWN0b3IgbWFnbml0dWRlIG11c3QgYmUgbGVzcyB0aGFuIFBpLgorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB2ZWMgPSB7IDEsIDIsIDMsIDAuNCwgMC41LCAwLjZ9OworICAgIHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiBwb3NlID0gUG9zZTNmOjpmcm9tVmVjdG9yKHZlYyk7CisgICAgQVNTRVJUX1RSVUUocG9zZS5oYXNfdmFsdWUoKSk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlY29uc3RydWN0ZWQgPSBwb3NlLT50b1ZlY3RvcigpOworICAgIEVYUEVDVF9FUSh2ZWMsIHJlY29uc3RydWN0ZWQpOworfQorCitURVNUKFBvc2UsIEZsb2F0VmVjdG9yUm91bmRUcmlwMikgeworICAgIFBvc2UzZiBwb3NlKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHZlYyA9IHBvc2UudG9WZWN0b3IoKTsKKyAgICBzdGQ6Om9wdGlvbmFsPFBvc2UzZj4gcmVjb25zdHJ1Y3RlZCA9IFBvc2UzZjo6ZnJvbVZlY3Rvcih2ZWMpOworICAgIEFTU0VSVF9UUlVFKHJlY29uc3RydWN0ZWQuaGFzX3ZhbHVlKCkpOworICAgIEVYUEVDVF9FUShwb3NlLCByZWNvbnN0cnVjdGVkLnZhbHVlKCkpOworfQorCitURVNUKFBvc2UsIEZsb2F0VmVjdG9ySW52YWxpZCkgeworICAgIEVYUEVDVF9GQUxTRShQb3NlM2Y6OmZyb21WZWN0b3Ioe30pLmhhc192YWx1ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoUG9zZTNmOjpmcm9tVmVjdG9yKHsxLCAyLCAzLCA0LCA1fSkuaGFzX3ZhbHVlKCkpOworICAgIEVYUEVDVF9GQUxTRShQb3NlM2Y6OmZyb21WZWN0b3IoezEsIDIsIDMsIDQsIDUsIDYsIDd9KS5oYXNfdmFsdWUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2UuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzk1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisjaW5jbHVkZSAibWVkaWEvVHdpc3QuaCIKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCit1c2luZyBFaWdlbjo6VmVjdG9yM2Y7CisKK3N0ZDo6b3B0aW9uYWw8UG9zZTNmPiBQb3NlM2Y6OmZyb21WZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiB2ZWMpIHsKKyAgICBpZiAodmVjLnNpemUoKSAhPSA2KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHJldHVybiBQb3NlM2Yoe3ZlY1swXSwgdmVjWzFdLCB2ZWNbMl19LCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbih7dmVjWzNdLCB2ZWNbNF0sIHZlY1s1XX0pKTsKK30KKworc3RkOjp2ZWN0b3I8ZmxvYXQ+IFBvc2UzZjo6dG9WZWN0b3IoKSBjb25zdCB7CisgICAgRWlnZW46OlZlY3RvcjNmIHJvdCA9IHF1YXRlcm5pb25Ub1JvdGF0aW9uVmVjdG9yKG1Sb3RhdGlvbik7CisgICAgcmV0dXJuIHttVHJhbnNsYXRpb25bMF0sIG1UcmFuc2xhdGlvblsxXSwgbVRyYW5zbGF0aW9uWzJdLCByb3RbMF0sIHJvdFsxXSwgcm90WzJdfTsKK30KKworc3RkOjp0dXBsZTxQb3NlM2YsIGJvb2w+IG1vdmVXaXRoUmF0ZUxpbWl0KGNvbnN0IFBvc2UzZiYgZnJvbSwgY29uc3QgUG9zZTNmJiB0bywgZmxvYXQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4Um90YXRpb25hbFZlbG9jaXR5KSB7CisgICAgLy8gTmV2ZXIgcmF0ZSBsaW1pdCBpZiBib3RoIGxpbWl0cyBhcmUgc2V0IHRvIGluZmluaXR5LgorICAgIGlmIChpc2luZihtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkpICYmIGlzaW5mKG1heFJvdGF0aW9uYWxWZWxvY2l0eSkpIHsKKyAgICAgICAgcmV0dXJuIHt0bywgZmFsc2V9OworICAgIH0KKyAgICAvLyBBbHdheXMgcmF0ZSBsaW1pdCBpZiB0IGlzIDAgKHJlcXVpcmVkIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IDApLgorICAgIGlmICh0ID09IDAgfHwgbWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID09IDAgfHwgbWF4Um90YXRpb25hbFZlbG9jaXR5ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHtmcm9tLCB0cnVlfTsKKyAgICB9CisKKyAgICBQb3NlM2YgZnJvbVRvVG8gPSBmcm9tLmludmVyc2UoKSAqIHRvOworICAgIFR3aXN0M2YgdHdpc3QgPSBkaWZmZXJlbnRpYXRlKGZyb21Ub1RvLCB0KTsKKyAgICBmbG9hdCBhbmd1bGFyUm90YXRpb25hbFJhdGlvID0gdHdpc3Quc2NhbGFyUm90YXRpb25hbFZlbG9jaXR5KCkgLyBtYXhSb3RhdGlvbmFsVmVsb2NpdHk7CisgICAgZmxvYXQgdHJhbnNsYXRpb25hbFZlbG9jaXR5UmF0aW8gPQorICAgICAgICAgICAgdHdpc3Quc2NhbGFyVHJhbnNsYXRpb25hbFZlbG9jaXR5KCkgLyBtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHk7CisgICAgZmxvYXQgbWF4UmF0aW8gPSBzdGQ6Om1heChhbmd1bGFyUm90YXRpb25hbFJhdGlvLCB0cmFuc2xhdGlvbmFsVmVsb2NpdHlSYXRpbyk7CisgICAgaWYgKG1heFJhdGlvIDw9IDEpIHsKKyAgICAgICAgcmV0dXJuIHt0bywgZmFsc2V9OworICAgIH0KKyAgICByZXR1cm4ge2Zyb20gKiBpbnRlZ3JhdGUodHdpc3QsIHQgLyBtYXhSYXRpbyksIHRydWV9OworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgUG9zZTNmJiBwb3NlKSB7CisgICAgb3MgPDwgInRyYW5zbGF0aW9uOiAiIDw8IHBvc2UudHJhbnNsYXRpb24oKS50cmFuc3Bvc2UoKQorICAgICAgIDw8ICIgcXVhdGVybmlvbjogIiA8PCBwb3NlLnJvdGF0aW9uKCkuY29lZmZzKCkudHJhbnNwb3NlKCk7CisgICAgcmV0dXJuIG9zOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMtdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0MmEyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy10ZXN0LmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJQb3NlQmlhcy5oIgorI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworVEVTVChQb3NlQmlhcywgSW5pdGlhbCkgeworICAgIFBvc2VCaWFzIGJpYXM7CisgICAgRVhQRUNUX0VRKGJpYXMuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKK30KKworVEVTVChQb3NlQmlhcywgQmFzaWMpIHsKKyAgICBQb3NlM2YgcG9zZTEoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlM2YgcG9zZTIoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIFBvc2VCaWFzIGJpYXM7CisgICAgYmlhcy5zZXRJbnB1dChwb3NlMSk7CisgICAgRVhQRUNUX0VRKHBvc2UxLCBiaWFzLmdldE91dHB1dCgpKTsKKyAgICBiaWFzLnJlY2VudGVyKCk7CisgICAgRVhQRUNUX0VRKGJpYXMuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKyAgICBiaWFzLnNldElucHV0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEoYmlhcy5nZXRPdXRwdXQoKSwgcG9zZTEuaW52ZXJzZSgpICogcG9zZTIpOworICAgIGJpYXMucmVjZW50ZXIoKTsKKyAgICBFWFBFQ1RfRVEoYmlhcy5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpe30KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlBvc2VCaWFzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK3ZvaWQgUG9zZUJpYXM6OnNldElucHV0KGNvbnN0IFBvc2UzZiYgaW5wdXQpIHsKKyAgICBtTGFzdFdvcmxkVG9JbnB1dCA9IGlucHV0OworfQorCit2b2lkIFBvc2VCaWFzOjpyZWNlbnRlcigpIHsKKyAgICBtQmlhc1RvV29ybGQgPSBtTGFzdFdvcmxkVG9JbnB1dC5pbnZlcnNlKCk7Cit9CisKK1Bvc2UzZiBQb3NlQmlhczo6Z2V0T3V0cHV0KCkgY29uc3QgeworICAgIHJldHVybiBtQmlhc1RvV29ybGQgKiBtTGFzdFdvcmxkVG9JbnB1dDsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VCaWFzLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNiNDlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VCaWFzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIm1lZGlhL1Bvc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBCaWFzaW5nIGZvciBhIHN0cmVhbSBvZiBwb3Nlcy4KKyAqCisgKiBUaGlzIGZpbHRlciB0YWtlcyBhIHN0cmVhbSBvZiBwb3NlcyBhbmQgYXQgYW55IHRpbWUgZHVyaW5nIHRoZSBzdHJlYW0sIGNhbiBjaGFuZ2UgdGhlIGZyYW1lIG9mCisgKiByZWZlcmVuY2UgZm9yIHRoZSBzdHJlYW0gdG8gYmUgdGhhdCBvZiB0aGUgbGFzdCBwb3NlIHJlY2VpdmVkLCB2aWEgdGhlIHJlY2VudGVyKCkgb3BlcmF0aW9uLgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKiBQb3NlQmlhcyBiaWFzOworICoKKyAqIGJpYXMuc2V0SW5wdXQoLi4uKTsKKyAqIG91dHB1dCA9IGJpYXMuZ2V0T3V0cHV0KCk7CisgKiBiaWFzLnNldElucHV0KC4uLik7CisgKiBvdXRwdXQgPSBiaWFzLmdldE91dHB1dCgpOworICogYmlhcy5zZXRJbnB1dCguLi4pOworICogb3V0cHV0ID0gYmlhcy5nZXRPdXRwdXQoKTsKKyAqIGJpYXMucmVjZW50ZXIoKTsgIC8vIFJlZmVyZW5jZSBmcmFtZSBpcyBub3cgZXF1YWwgdG8gdGhlIGxhc3QgaW5wdXQuCisgKiBvdXRwdXQgPSBiaWFzLmdldE91dHB1dCgpOyAgLy8gVGhpcyBpcyBub3cgdGhlIGlkZW50aXR5IHBvc2UuCisgKgorICogVGhlcmUgZG9lc24ndCBuZWVkIHRvIGJlIGEgMToxIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gc2V0SW5wdXQoKSBhbmQgZ2V0T3V0cHV0KCkgY2FsbHMuCisgKiBUaGUgaW5pdGlhbCBiaWFzIHBvaW50IGlzIGlkZW50aXR5LgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGhyZWFkLWNvbXBhdGlibGUsIGJ1dCBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIFBvc2VCaWFzIHsKKyAgcHVibGljOgorICAgIHZvaWQgc2V0SW5wdXQoY29uc3QgUG9zZTNmJiBpbnB1dCk7CisKKyAgICB2b2lkIHJlY2VudGVyKCk7CisKKyAgICBQb3NlM2YgZ2V0T3V0cHV0KCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBQb3NlM2YgbUxhc3RXb3JsZFRvSW5wdXQ7CisgICAgUG9zZTNmIG1CaWFzVG9Xb3JsZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlRHJpZnRDb21wZW5zYXRvci10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlRHJpZnRDb21wZW5zYXRvci10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBhMDVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLXRlc3QuY3BwCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJQb3NlRHJpZnRDb21wZW5zYXRvci5oIgorI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKK3VzaW5nIE9wdGlvbnMgPSBQb3NlRHJpZnRDb21wZW5zYXRvcjo6T3B0aW9uczsKKworVEVTVChQb3NlRHJpZnRDb21wZW5zYXRvciwgSW5pdGlhbCkgeworICAgIFBvc2VEcmlmdENvbXBlbnNhdG9yIGNvbXAoT3B0aW9uc3t9KTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworfQorCitURVNUKFBvc2VEcmlmdENvbXBlbnNhdG9yLCBOb0RyaWZ0KSB7CisgICAgUG9zZTNmIHBvc2UxKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZTNmIHBvc2UyKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZURyaWZ0Q29tcGVuc2F0b3IgY29tcChPcHRpb25ze30pOworCisgICAgLy8gRmlyc3QgcG9zZSBzZXRzIHRoZSBiYXNlbGluZS4KKyAgICBjb21wLnNldElucHV0KDEwMDAsIHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworCisgICAgY29tcC5zZXRJbnB1dCgyMDAwLCBwb3NlMik7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIHBvc2UxLmludmVyc2UoKSAqIHBvc2UyKTsKKworICAgIC8vIFJlY2VudGVyaW5nIHJlc2V0cyB0aGUgYmFzZWxpbmUuCisgICAgY29tcC5yZWNlbnRlcigpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDMwMDAsIHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworCisgICAgY29tcC5zZXRJbnB1dCg0MDAwLCBwb3NlMik7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIHBvc2UxLmludmVyc2UoKSAqIHBvc2UyKTsKK30KKworVEVTVChQb3NlRHJpZnRDb21wZW5zYXRvciwgTm9EcmlmdFplcm9UaW1lKSB7CisgICAgUG9zZTNmIHBvc2UxKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZTNmIHBvc2UyKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZURyaWZ0Q29tcGVuc2F0b3IgY29tcChPcHRpb25ze30pOworCisgICAgY29tcC5zZXRJbnB1dCgxMDAwLCBwb3NlMSk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKworICAgIGNvbXAuc2V0SW5wdXQoMTAwMCwgcG9zZTIpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBwb3NlMS5pbnZlcnNlKCkgKiBwb3NlMik7CisKKyAgICBjb21wLnJlY2VudGVyKCk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKworICAgIGNvbXAuc2V0SW5wdXQoMTAwMCwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDEwMDAsIHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgcG9zZTEuaW52ZXJzZSgpICogcG9zZTIpOworfQorCitURVNUKFBvc2VEcmlmdENvbXBlbnNhdG9yLCBBc3ltcHRvdGljKSB7CisgICAgUG9zZTNmIHBvc2UoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIFBvc2VEcmlmdENvbXBlbnNhdG9yIGNvbXAoCisgICAgICAgICAgICBPcHRpb25zey50cmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSAxLCAucm90YXRpb25hbERyaWZ0VGltZUNvbnN0YW50ID0gMX0pOworCisgICAgLy8gU2V0IHRoZSBzYW1lIHBvc2UgZm9yIGEgbG9uZyB0aW1lLgorICAgIGZvciAoaW50NjRfdCB0ID0gMDsgdCA8IDEwMDA7ICsrdCkgeworICAgICAgICBjb21wLnNldElucHV0KHQsIHBvc2UpOworICAgIH0KKworICAgIC8vIE91dHB1dCB3b3VsZCBoYXZlIGZhZGVkIHRvIGFwcHJveC4gaWRlbnRpdHkuCisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKK30KKworVEVTVChQb3NlRHJpZnRDb21wZW5zYXRvciwgRmFzdCkgeworICAgIFBvc2UzZiBwb3NlMSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2UzZiBwb3NlMih7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2VEcmlmdENvbXBlbnNhdG9yIGNvbXAoCisgICAgICAgICAgICBPcHRpb25zey50cmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSAxZTcsIC5yb3RhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSAxZTd9KTsKKworICAgIGNvbXAuc2V0SW5wdXQoMCwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDEsIHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgcG9zZTEuaW52ZXJzZSgpICogcG9zZTIpOworCisgICAgY29tcC5yZWNlbnRlcigpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDIsIHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworCisgICAgY29tcC5zZXRJbnB1dCgzLCBwb3NlMik7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIHBvc2UxLmludmVyc2UoKSAqIHBvc2UyKTsKK30KKworVEVTVChQb3NlRHJpZnRDb21wZW5zYXRvciwgRHJpZnQpIHsKKyAgICBQb3NlM2YgcG9zZTEoezEsIDIsIDN9LCByb3RhdGVaKC1NX1BJICogMyAvIDQpKTsKKyAgICBQb3NlRHJpZnRDb21wZW5zYXRvciBjb21wKAorICAgICAgICAgICAgT3B0aW9uc3sudHJhbnNsYXRpb25hbERyaWZ0VGltZUNvbnN0YW50ID0gNTAwLCAucm90YXRpb25hbERyaWZ0VGltZUNvbnN0YW50ID0gMTAwMH0pOworCisgICAgLy8gRXN0YWJsaXNoIGEgYmFzZWxpbmUuCisgICAgY29tcC5zZXRJbnB1dCgxMDAwLCBQb3NlM2YoKSk7CisKKyAgICAvLyBJbml0aWFsIHBvc2UgaXMgdXNlZCBhcyBpcy4KKyAgICBjb21wLnNldElucHV0KDEwMDAsIHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgcG9zZTEpOworCisgICAgLy8gQWZ0ZXIgMTAwMCB0aWNrcywgb3VyIHJvdGF0aW9uIHNob3VsZCBiZSBleHAoLTEpIGFuZCB0cmFuc2xhdGlvbiBleHAoLTIpIGZyb20gaWRlbnRpdHkuCisgICAgY29tcC5zZXRJbnB1dCgyMDAwLCBwb3NlMSk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksCisgICAgICAgICAgICAgIFBvc2UzZihWZWN0b3IzZnsxLCAyLCAzfSAqIHN0ZDo6ZXhwZigtMiksIHJvdGF0ZVooLU1fUEkgKiAzIC8gNCAqIHN0ZDo6ZXhwZigtMSkpKSk7CisKKyAgICAvLyBBcyBsb25nIGFzIHRoZSBpbnB1dCBzdGF5cyB0aGUgc2FtZSwgd2UnbGwgY29udGludWUgdG8gYWR2YW5jZSB0b3dhcmRzIGlkZW50aXR5LgorICAgIGNvbXAuc2V0SW5wdXQoMzAwMCwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLAorICAgICAgICAgICAgICBQb3NlM2YoVmVjdG9yM2Z7MSwgMiwgM30gKiBzdGQ6OmV4cGYoLTQpLCByb3RhdGVaKC1NX1BJICogMyAvIDQgKiBzdGQ6OmV4cGYoLTIpKSkpOworCisgICAgY29tcC5yZWNlbnRlcigpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlRHJpZnRDb21wZW5zYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MGNhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlRHJpZnRDb21wZW5zYXRvci5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIil7fQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUG9zZURyaWZ0Q29tcGVuc2F0b3IuaCIKKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCitQb3NlRHJpZnRDb21wZW5zYXRvcjo6UG9zZURyaWZ0Q29tcGVuc2F0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgOiBtT3B0aW9ucyhvcHRpb25zKSB7fQorCit2b2lkIFBvc2VEcmlmdENvbXBlbnNhdG9yOjpzZXRJbnB1dChpbnQ2NF90IHRpbWVzdGFtcCwgY29uc3QgUG9zZTNmJiBpbnB1dCkgeworICAgIGlmIChtVGltZXN0YW1wLmhhc192YWx1ZSgpKSB7CisgICAgICAgIC8vIEF2b2lkIGNvbXB1dGF0aW9uIHVwb24gZmlyc3QgaW5wdXQgKG9ubHkgc2V0cyB0aGUgaW5pdGlhbCBzdGF0ZSkuCisgICAgICAgIFBvc2UzZiBwcmV2SW5wdXRUb0lucHV0ID0gbVByZXZJbnB1dC5pbnZlcnNlKCkgKiBpbnB1dDsKKyAgICAgICAgbU91dHB1dCA9IHNjYWxlKG1PdXRwdXQsIHRpbWVzdGFtcCAtIG1UaW1lc3RhbXAudmFsdWUoKSkgKiBwcmV2SW5wdXRUb0lucHV0OworICAgIH0KKyAgICBtUHJldklucHV0ID0gaW5wdXQ7CisgICAgbVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKK30KKwordm9pZCBQb3NlRHJpZnRDb21wZW5zYXRvcjo6cmVjZW50ZXIoKSB7CisgICAgbVRpbWVzdGFtcC5yZXNldCgpOworICAgIG1PdXRwdXQgPSBQb3NlM2YoKTsKK30KKworUG9zZTNmIFBvc2VEcmlmdENvbXBlbnNhdG9yOjpnZXRPdXRwdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1PdXRwdXQ7Cit9CisKK1Bvc2UzZiBQb3NlRHJpZnRDb21wZW5zYXRvcjo6c2NhbGUoY29uc3QgUG9zZTNmJiBwb3NlLCBpbnQ2NF90IGR0KSB7CisgICAgLy8gVHJhbnNsYXRpb24uCisgICAgVmVjdG9yM2YgdHJhbnNsYXRpb24gPSBwb3NlLnRyYW5zbGF0aW9uKCk7CisgICAgdHJhbnNsYXRpb24gKj0gc3RkOjpleHBmKC1zdGF0aWNfY2FzdDxmbG9hdD4oZHQpIC8gbU9wdGlvbnMudHJhbnNsYXRpb25hbERyaWZ0VGltZUNvbnN0YW50KTsKKworICAgIC8vIFJvdGF0aW9uLgorICAgIFZlY3RvcjNmIHJvdGF0aW9uVmVjID0gcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IocG9zZS5yb3RhdGlvbigpKTsKKyAgICByb3RhdGlvblZlYyAqPSBzdGQ6OmV4cGYoLXN0YXRpY19jYXN0PGZsb2F0PihkdCkgLyBtT3B0aW9ucy5yb3RhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQpOworCisgICAgcmV0dXJuIFBvc2UzZih0cmFuc2xhdGlvbiwgcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24ocm90YXRpb25WZWMpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZURyaWZ0Q29tcGVuc2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzE0ODNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSAibWVkaWEvUG9zZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIERyaWZ0IGNvbXBlbnNhdG9yIGZvciBhIHN0cmVhbSBvZiBwb3Nlcy4KKyAqCisgKiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgaGlnaC1wYXNzIGZpbHRlciBmb3IgYSBwb3NlIHN0cmVhbSwgcmVtb3ZpbmcgYW55IERDLW9mZnNldCAvIGJpYXMuIFRoZQorICogcHJvdmlkZWQgaW5wdXQgc3RyZWFtIHdpbGwgYmUgInB1bGxlZCIgdG93YXJkIGlkZW50aXR5IHdpdGggYW4gZXhwb25lbnRpYWwgZGVjYXkgZmlsdGVyIHdpdGggYQorICogY29uZmlndXJhYmxlIHRpbWUgY29uc3RhbnQuIFJvdGF0aW9uIGFuZCB0cmFuc2xhdGlvbiBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKiBQb3NlRHJpZnRDb21wZW5zYXRvciBjb21wKC4uLik7CisgKgorICogd2hpbGUgKC4uLikgeworICogICBjb21wLnNldElucHV0KC4uLik7CisgKiAgIFBvc2UzZiBvdXRwdXQgPSBjb21wLmdldE91dHB1dCgpOworICogfQorICoKKyAqIFRoZXJlIGRvZXNuJ3QgbmVlZCB0byBiZSBhIDE6MSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHNldElucHV0KCkgYW5kIGdldE91dHB1dCgpIGNhbGxzLiBUaGUKKyAqIG91dHB1dCB0aW1lc3RhbXAgaXMgYWx3YXlzIHRoYXQgb2YgdGhlIGxhc3Qgc2V0SW5wdXQoKSBjYWxsLiBDYWxsaW5nIHJlY2VudGVyKCkgd2lsbCByZXNldCB0aGUKKyAqIGJpYXMgdG8gdGhlIGN1cnJlbnQgb3V0cHV0LCBjYXVzaW5nIHRoZSBvdXRwdXQgdG8gYmUgaWRlbnRpdHkuCisgKgorICogVGhlIGluaXRpYWwgYmlhcyBwb2ludCBpcyBpZGVudGl0eS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRocmVhZC1jb21wYXRpYmxlLCBidXQgbm90IHRocmVhZC1zYWZlLgorICovCitjbGFzcyBQb3NlRHJpZnRDb21wZW5zYXRvciB7CisgIHB1YmxpYzoKKyAgICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgICAgIGZsb2F0IHRyYW5zbGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICBmbG9hdCByb3RhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICB9OworCisgICAgZXhwbGljaXQgUG9zZURyaWZ0Q29tcGVuc2F0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgICB2b2lkIHNldElucHV0KGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIGlucHV0KTsKKworICAgIHZvaWQgcmVjZW50ZXIoKTsKKworICAgIFBvc2UzZiBnZXRPdXRwdXQoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIGNvbnN0IE9wdGlvbnMgbU9wdGlvbnM7CisKKyAgICBQb3NlM2YgbVByZXZJbnB1dDsKKyAgICBQb3NlM2YgbU91dHB1dDsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDY0X3Q+IG1UaW1lc3RhbXA7CisKKyAgICBQb3NlM2Ygc2NhbGUoY29uc3QgUG9zZTNmJiBwb3NlLCBpbnQ2NF90IGR0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUHJvY2Vzc2luZ0dyYXBoLnBuZyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUHJvY2Vzc2luZ0dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjViNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VQcm9jZXNzaW5nR3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXItdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDYxODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLXRlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJQb3NlUmF0ZUxpbWl0ZXIuaCIKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorI2luY2x1ZGUgIlRlc3RVdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgeworCit1c2luZyBFaWdlbjo6UXVhdGVybmlvbmY7Cit1c2luZyBFaWdlbjo6VmVjdG9yM2Y7Cit1c2luZyBPcHRpb25zID0gUG9zZVJhdGVMaW1pdGVyOjpPcHRpb25zOworCitURVNUKFBvc2VSYXRlTGltaXRlciwgSW5pdGlhbCkgeworICAgIFBvc2UzZiB0YXJnZXQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlUmF0ZUxpbWl0ZXIgbGltaXRlcihPcHRpb25zey5tYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSAxMCwgLm1heFJvdGF0aW9uYWxWZWxvY2l0eSA9IDEwfSk7CisgICAgbGltaXRlci5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDApLCB0YXJnZXQpOworfQorCitURVNUKFBvc2VSYXRlTGltaXRlciwgVW5saW1pdGVkWmVyb1RpbWUpIHsKKyAgICBQb3NlM2YgdGFyZ2V0MSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2UzZiB0YXJnZXQyKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZVJhdGVMaW1pdGVyIGxpbWl0ZXIoT3B0aW9uc3t9KTsKKyAgICBsaW1pdGVyLnNldFRhcmdldCh0YXJnZXQxKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDApLCB0YXJnZXQxKTsKKyAgICBsaW1pdGVyLnNldFRhcmdldCh0YXJnZXQyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDApLCB0YXJnZXQyKTsKKyAgICBsaW1pdGVyLnNldFRhcmdldCh0YXJnZXQxKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDApLCB0YXJnZXQxKTsKK30KKworVEVTVChQb3NlUmF0ZUxpbWl0ZXIsIExpbWl0ZWQpIHsKKyAgICBQb3NlM2YgcG9zZTEoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSk7CisgICAgUG9zZTNmIHBvc2UyKHsxLCAyLCA4fSwgcm90YXRlWihNX1BJICogNSAvIDgpKTsKKyAgICBQb3NlUmF0ZUxpbWl0ZXIgbGltaXRlcihPcHRpb25zey5tYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSAxLCAubWF4Um90YXRpb25hbFZlbG9jaXR5ID0gMTB9KTsKKyAgICBsaW1pdGVyLnNldFRhcmdldChwb3NlMik7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDAwKSwgcG9zZTIpOworCisgICAgLy8gUmF0ZSBsaW1pdGluZyBpcyBpbmFjdGl2ZS4gU2hvdWxkIHRyYWNrIGRlc3BpdGUgdGhlIHZpb2xhdGlvbi4KKyAgICBsaW1pdGVyLnNldFRhcmdldChwb3NlMSk7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDAxKSwgcG9zZTEpOworCisgICAgLy8gRW5hYmxlIHJhdGUgbGltaXRpbmcgYW5kIG9ic2VydmUgZ3JhZHVhbCBtb3Rpb24gZnJvbSBwb3NlMSB0byBwb3NlMi4KKyAgICBsaW1pdGVyLmVuYWJsZSgpOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDIpLCBQb3NlM2YoezEsIDIsIDR9LCByb3RhdGVaKE1fUEkgKiAxIC8gOCkpKTsKKyAgICBsaW1pdGVyLnNldFRhcmdldChwb3NlMik7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDAzKSwgUG9zZTNmKHsxLCAyLCA1fSwgcm90YXRlWihNX1BJICogMiAvIDgpKSk7CisgICAgLy8gU2tpcCBhIHRpY2suCisgICAgbGltaXRlci5zZXRUYXJnZXQocG9zZTIpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMTAwNSksIFBvc2UzZih7MSwgMiwgN30sIHJvdGF0ZVooTV9QSSAqIDQgLyA4KSkpOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDYpLCBwb3NlMik7CisKKyAgICAvLyBXZSByZWFjaGVkIHRoZSB0YXJnZXQsIHNvIHJhdGUgbGltaXRpbmcgc2hvdWxkIG5vdyBiZSBkaXNhYmxlZC4KKyAgICBsaW1pdGVyLnNldFRhcmdldChwb3NlMSk7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDA3KSwgcG9zZTEpOworfQorCitURVNUKFBvc2VSYXRlTGltaXRlciwgUmVzZXQpIHsKKyAgICBQb3NlM2YgcG9zZTEoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSk7CisgICAgUG9zZTNmIHBvc2UyKHsxLCAyLCA4fSwgcm90YXRlWihNX1BJICogNSAvIDgpKTsKKyAgICBQb3NlUmF0ZUxpbWl0ZXIgbGltaXRlcihPcHRpb25zey5tYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSAxLCAubWF4Um90YXRpb25hbFZlbG9jaXR5ID0gMTB9KTsKKyAgICBsaW1pdGVyLnNldFRhcmdldChwb3NlMSk7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDAwKSwgcG9zZTEpOworCisgICAgLy8gRW5hYmxlIHJhdGUgbGltaXRpbmcgYW5kIG9ic2VydmUgZ3JhZHVhbCBtb3Rpb24gZnJvbSBwb3NlMSB0byBwb3NlMi4KKyAgICBsaW1pdGVyLmVuYWJsZSgpOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDEpLCBQb3NlM2YoezEsIDIsIDR9LCByb3RhdGVaKE1fUEkgKiAxIC8gOCkpKTsKKworICAgIC8vIFJlc2V0IHRoZSBwb3NlIGFuZCBkaXNhYmxlIHJhdGUgbGltaXRpbmcuCisgICAgbGltaXRlci5yZXNldChwb3NlMik7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDAyKSwgcG9zZTIpOworCisgICAgLy8gUmF0ZSBsaW1pdGluZyBzaG91bGQgbm93IGJlIGRpc2FibGVkLgorICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDMpLCBwb3NlMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VSYXRlTGltaXRlci5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBlMjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VSYXRlTGltaXRlci5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIil7fQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUG9zZVJhdGVMaW1pdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK1Bvc2VSYXRlTGltaXRlcjo6UG9zZVJhdGVMaW1pdGVyKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDogbU9wdGlvbnMob3B0aW9ucyksIG1MaW1pdGluZyhmYWxzZSkge30KKwordm9pZCBQb3NlUmF0ZUxpbWl0ZXI6OmVuYWJsZSgpIHsKKyAgICBtTGltaXRpbmcgPSB0cnVlOworfQorCit2b2lkIFBvc2VSYXRlTGltaXRlcjo6cmVzZXQoY29uc3QgUG9zZTNmJiB0YXJnZXQpIHsKKyAgICBtTGltaXRpbmcgPSBmYWxzZTsKKyAgICBtVGFyZ2V0UG9zZSA9IHRhcmdldDsKK30KKwordm9pZCBQb3NlUmF0ZUxpbWl0ZXI6OnNldFRhcmdldChjb25zdCBQb3NlM2YmIHRhcmdldCkgeworICAgIG1UYXJnZXRQb3NlID0gdGFyZ2V0OworfQorCitQb3NlM2YgUG9zZVJhdGVMaW1pdGVyOjpjYWxjdWxhdGVQb3NlKGludDY0X3QgdGltZXN0YW1wKSB7CisgICAgYXNzZXJ0KG1UYXJnZXRQb3NlLmhhc192YWx1ZSgpKTsKKyAgICBQb3NlM2YgcG9zZTsKKyAgICBpZiAobUxpbWl0aW5nICYmIG1PdXRwdXQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgc3RkOjp0aWUocG9zZSwgbUxpbWl0aW5nKSA9IG1vdmVXaXRoUmF0ZUxpbWl0KAorICAgICAgICAgICAgICAgIG1PdXRwdXQtPnBvc2UsIG1UYXJnZXRQb3NlLnZhbHVlKCksIHRpbWVzdGFtcCAtIG1PdXRwdXQtPnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBtT3B0aW9ucy5tYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHksIG1PcHRpb25zLm1heFJvdGF0aW9uYWxWZWxvY2l0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG9zZSA9IG1UYXJnZXRQb3NlLnZhbHVlKCk7CisgICAgfQorICAgIG1PdXRwdXQgPSBQb2ludHtwb3NlLCB0aW1lc3RhbXB9OworICAgIHJldHVybiBwb3NlOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyZmU4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXIuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogTGltaXRzIGEgc3RyZWFtIG9mIHBvc2VzIHRvIGEgZ2l2ZW4gbWF4aW11bSB0cmFuc2xhdGlvbmFsIGFuZCByb3RhdGlvbmFsIHZlbG9jaXRpZXMuCisgKgorICogTm9ybWFsIG9wZXJhdGlvbjoKKyAqCisgKiBQb3NlM2Ygb3V0cHV0OworICogUG9zZVJhdGVMaW1pdGVyIGxpbWl0ZXIoLi4uKTsKKyAqCisgKiAvLyBMaW1pdGluZyBpcyBkaXNhYmxlZC4gT3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgYXMgbGFzdCBpbnB1dC4KKyAqIGxpbWl0ZXIuc2V0VGFyZ2V0KC4uLik7CisgKiBvdXRwdXQgPSBsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoLi4uKTsKKyAqIGxpbWl0ZXIuc2V0VGFyZ2V0KC4uLik7CisgKiBvdXRwdXQgPSBsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoLi4uKTsKKyAqCisgKiAvLyBFbmFibGUgbGltaXRpbmcuIE91dHB1dCB3aWxsIG5vIGxvbmdlciBiZSBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyBsYXN0IGlucHV0LgorICogbGltaXRlci5lbmFibGUoKTsKKyAqIGxpbWl0ZXIuc2V0VGFyZ2V0KC4uLik7CisgKiBvdXRwdXQgPSBsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoLi4uKTsKKyAqIGxpbWl0ZXIuc2V0VGFyZ2V0KC4uLik7CisgKiBvdXRwdXQgPSBsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoLi4uKTsKKyAqCisgKiAvLyBXaGVuIGV2ZW50dWFsbHkgdGhlIG91dHB1dCBoYXMgYmVlbiBhYmxlIHRvIGNhdGNoIHVwIHdpdGggdGhlIGxhc3QgaW5wdXQsIHRoZSBsaW1pdGVkIHdpbGwgYmUKKyAqIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYWdhaW4gYW5kIHRoZSBvdXRwdXQgd2lsbCBtYXRjaCB0aGUgaW5wdXQgYWdhaW4uCisgKiBsaW1pdGVyLnNldFRhcmdldCguLi4pOworICogb3V0cHV0ID0gbGltaXRlci5jYWxjdWxhdGVQb3NlKC4uLik7CisgKgorICogQXMgc2hvd24gYWJvdmUsIHRoZSBsaW1pdGVyIGlzIHR1cm5lZCBvbiBtYW51YWxseSB2aWEgZW5hYmxlKCksIGJ1dCB0dXJucyBvZmYgYXV0b21hdGljYWxseSBhcworICogc29vbiBhcyB0aGUgb3V0cHV0IGlzIGFibGUgdG8gY2F0Y2ggdXAgdG8gdGhlIGlucHV0LiBUaGUgaW50ZW50aW9uIGlzIHRoYXQgcmF0ZSBsaW1pdGluZyB3aWxsIGJlCisgKiB0dXJuZWQgb24gYXQgc3BlY2lmaWMgdGltZXMgdG8gc21vb3RoIG91dCBhbnkgYXJ0aWZpY2lhbCBkaXNjb250aW51aXRpZXMgaW50cm9kdWNlZCB0byB0aGUgcG9zZQorICogc3RyZWFtLCBidXQgdGhlIHJlc3Qgb2YgdGhlIHRpbWUgd2lsbCBiZSBhIHNpbXBsZSBwYXNzdGhyb3VnaC4KKworICogc2V0VGFyZ2V0KC4uLikgYW5kIGNhbGN1bGF0ZVBvc2UoLi4uKSBkb24ndCBoYXZlIHRvIGJlIG9yZGVyZWQgaW4gYW55IHBhcnRpY3VsYXIgd2F5LiBIb3dldmVyLAorICogc2V0VGFyZ2V0IG9yIHJlc2V0KCkgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBwcmlvciB0byB0aGUgZmlyc3QgY2FsY3VsYXRlUG9zZSgpLgorICoKKyAqIENhbGxpbmcgcmVzZXQoKSBpbnN0ZWFkIG9mIHNldFRhcmdldCgpIGZvcmNlcyB0aGUgb3V0cHV0IHRvIHRoZSBnaXZlbiBwb3NlIGFuZCBkaXNhYmxlcyByYXRlCisgKiBsaW1pdGluZy4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRocmVhZC1jb21wYXRpYmxlLCBidXQgbm90IHRocmVhZC1zYWZlLgorICovCitjbGFzcyBQb3NlUmF0ZUxpbWl0ZXIgeworICBwdWJsaWM6CisgICAgc3RydWN0IE9wdGlvbnMgeworICAgICAgICBmbG9hdCBtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgZmxvYXQgbWF4Um90YXRpb25hbFZlbG9jaXR5ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgfTsKKworICAgIGV4cGxpY2l0IFBvc2VSYXRlTGltaXRlcihjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICAgIHZvaWQgZW5hYmxlKCk7CisKKyAgICB2b2lkIHJlc2V0KGNvbnN0IFBvc2UzZiYgdGFyZ2V0KTsKKyAgICB2b2lkIHNldFRhcmdldChjb25zdCBQb3NlM2YmIHRhcmdldCk7CisKKyAgICBQb3NlM2YgY2FsY3VsYXRlUG9zZShpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUG9pbnQgeworICAgICAgICBQb3NlM2YgcG9zZTsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgfTsKKworICAgIGNvbnN0IE9wdGlvbnMgbU9wdGlvbnM7CisgICAgYm9vbCBtTGltaXRpbmc7CisgICAgc3RkOjpvcHRpb25hbDxQb3NlM2Y+IG1UYXJnZXRQb3NlOworICAgIHN0ZDo6b3B0aW9uYWw8UG9pbnQ+IG1PdXRwdXQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUXVhdGVybmlvblV0aWwtdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUXVhdGVybmlvblV0aWwtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ZTU0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9RdWF0ZXJuaW9uVXRpbC10ZXN0LmNwcApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorI2luY2x1ZGUgIlRlc3RVdGlsLmgiCisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoUXVhdGVybmlvblV0aWwsIFJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKSB7CisgICAgLy8gOTAgZGVncmVlcyBhcm91bmQgWi4KKyAgICBWZWN0b3IzZiByb3QgPSB7MCwgMCwgTV9QSV8yfTsKKyAgICBRdWF0ZXJuaW9uZiBxdWF0ID0gcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24ocm90KTsKKyAgICBBU1NFUlRfRVEocXVhdCAqIFZlY3RvcjNmKDEsIDAsIDApLCBWZWN0b3IzZigwLCAxLCAwKSk7CisgICAgQVNTRVJUX0VRKHF1YXQgKiBWZWN0b3IzZigwLCAxLCAwKSwgVmVjdG9yM2YoLTEsIDAsIDApKTsKKyAgICBBU1NFUlRfRVEocXVhdCAqIFZlY3RvcjNmKDAsIDAsIDEpLCBWZWN0b3IzZigwLCAwLCAxKSk7Cit9CisKK1RFU1QoUXVhdGVybmlvblV0aWwsIFF1YXRlcm5pb25Ub1JvdGF0aW9uVmVjdG9yKSB7CisgICAgUXVhdGVybmlvbmYgcXVhdCA9IFF1YXRlcm5pb25mOjpGcm9tVHdvVmVjdG9ycyhWZWN0b3IzZigxLCAwLCAwKSwgVmVjdG9yM2YoMCwgMSwgMCkpOworICAgIFZlY3RvcjNmIHJvdCA9IHF1YXRlcm5pb25Ub1JvdGF0aW9uVmVjdG9yKHF1YXQpOworICAgIEFTU0VSVF9FUShyb3QsIFZlY3RvcjNmKDAsIDAsIE1fUElfMikpOworfQorCitURVNUKFF1YXRlcm5pb25VdGlsLCBSb3VuZFRyaXBGcm9tUXVhdGVybmlvbikgeworICAgIFF1YXRlcm5pb25mIHF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpOworICAgIEVYUEVDVF9FUShxdWF0ZXJuaW9uLCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihxdWF0ZXJuaW9uVG9Sb3RhdGlvblZlY3RvcihxdWF0ZXJuaW9uKSkpOworfQorCitURVNUKFF1YXRlcm5pb25VdGlsLCBSb3VuZFRyaXBGcm9tVmVjdG9yKSB7CisgICAgVmVjdG9yM2YgdmVjezAuMSwgMC4yLCAwLjN9OworICAgIEVYUEVDVF9FUSh2ZWMsIHF1YXRlcm5pb25Ub1JvdGF0aW9uVmVjdG9yKHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHZlYykpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUXVhdGVybmlvblV0aWwuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1F1YXRlcm5pb25VdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDA5MGRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1F1YXRlcm5pb25VdGlsLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKwordXNpbmcgRWlnZW46Ok51bVRyYWl0czsKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworbmFtZXNwYWNlIHsKKworVmVjdG9yM2YgTG9nU1UyKGNvbnN0IFF1YXRlcm5pb25mJiBxKSB7CisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGxvZ2FyaXRobWljIG1hcCBvZiBTVSgyKSB1c2luZyBhdGFuLgorICAgIC8vIFRoaXMgZm9sbG93cyBIZXJ0emJlcmcgZXQgYWwuICJJbnRlZ3JhdGluZyBHZW5lcmljIFNlbnNvciBGdXNpb24gQWxnb3JpdGhtcworICAgIC8vIHdpdGggU291bmQgU3RhdGUgUmVwcmVzZW50YXRpb25zIHRocm91Z2ggRW5jYXBzdWxhdGlvbiBvZiBNYW5pZm9sZHMiLCBFcS4KKyAgICAvLyAoMzEpCisgICAgLy8gV2UgdXNlIGFzaW4gYW5kIGFjb3MgaW5zdGVhZCBvZiBhdGFuIHRvIGVuYWJsZSB0aGUgdXNlIG9mIEVpZ2VuIEF1dG9kaWZmCisgICAgLy8gd2l0aCBTVTIuCisgICAgY29uc3QgZmxvYXQgc2lnbl9vZl93ID0gcS53KCkgPCAwLmYgPyAtMS5mIDogMS5mOworICAgIGNvbnN0IGZsb2F0IGFic193ID0gc2lnbl9vZl93ICogcS53KCk7CisgICAgY29uc3QgVmVjdG9yM2YgdiA9IHNpZ25fb2ZfdyAqIHEudmVjKCk7CisgICAgY29uc3QgZmxvYXQgc3F1YXJlZF9ub3JtX29mX3YgPSB2LnNxdWFyZWROb3JtKCk7CisKKyAgICBhc3NlcnQoYWJzKDEuZiAtIGFic193ICogYWJzX3cgLSBzcXVhcmVkX25vcm1fb2ZfdikgPCBOdW1UcmFpdHM8ZmxvYXQ+OjpkdW1teV9wcmVjaXNpb24oKSk7CisKKyAgICBpZiAoc3F1YXJlZF9ub3JtX29mX3YgPiBOdW1UcmFpdHM8ZmxvYXQ+OjpkdW1teV9wcmVjaXNpb24oKSkgeworICAgICAgICBjb25zdCBmbG9hdCBub3JtX29mX3YgPSBzcXJ0KHNxdWFyZWRfbm9ybV9vZl92KTsKKyAgICAgICAgaWYgKGFic193ID4gTnVtVHJhaXRzPGZsb2F0Pjo6ZHVtbXlfcHJlY2lzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIGFzaW4oeCkgPSBhY29zKHgpIGF0IHggPSAxL3NxcnQoMikuCisgICAgICAgICAgICBpZiAobm9ybV9vZl92IDw9IGZsb2F0KE1fU1FSVDFfMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGFzaW4obm9ybV9vZl92KSAvIG5vcm1fb2ZfdikgKiB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChhY29zKGFic193KSAvIG5vcm1fb2ZfdikgKiB2OworICAgICAgICB9CisgICAgICAgIHJldHVybiAoTV9QSV8yIC8gbm9ybV9vZl92KSAqIHY7CisgICAgfQorCisgICAgLy8gVGF5bG9yIGV4cGFuc2lvbiBhdCBzcXVhcmVkX25vcm1fb2ZfdiA9PSAwCisgICAgcmV0dXJuICgxLmYgLyBhYnNfdyAtIHNxdWFyZWRfbm9ybV9vZl92IC8gKDMuZiAqIHBvdyhhYnNfdywgMykpKSAqIHY7Cit9CisKK1F1YXRlcm5pb25mIEV4cFNVMihjb25zdCBWZWN0b3IzZiYgZGVsdGEpIHsKKyAgICBRdWF0ZXJuaW9uZiBxX2RlbHRhOworICAgIGNvbnN0IGZsb2F0IHRoZXRhX3NxdWFyZWQgPSBkZWx0YS5zcXVhcmVkTm9ybSgpOworICAgIGlmICh0aGV0YV9zcXVhcmVkID4gTnVtVHJhaXRzPGZsb2F0Pjo6ZHVtbXlfcHJlY2lzaW9uKCkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgdGhldGEgPSBzcXJ0KHRoZXRhX3NxdWFyZWQpOworICAgICAgICBxX2RlbHRhLncoKSA9IGNvcyh0aGV0YSk7CisgICAgICAgIHFfZGVsdGEudmVjKCkgPSAoc2luKHRoZXRhKSAvIHRoZXRhKSAqIGRlbHRhOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRheWxvciBleHBhbnNpb25zIGFyb3VuZCB0aGV0YSA9PSAwCisgICAgICAgIHFfZGVsdGEudygpID0gMS5mIC0gMC41ZiAqIHRoZXRhX3NxdWFyZWQ7CisgICAgICAgIHFfZGVsdGEudmVjKCkgPSAoMS5mIC0gMS5mIC8gNi5mICogdGhldGFfc3F1YXJlZCkgKiBkZWx0YTsKKyAgICB9CisgICAgcmV0dXJuIHFfZGVsdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitRdWF0ZXJuaW9uZiByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihjb25zdCBWZWN0b3IzZiYgcm90YXRpb25WZWN0b3IpIHsKKyAgICAvLyAgU1UoMikgaXMgYSBkb3VibGUgY292ZXIgb2YgU08oMyksIHRodXMgd2UgaGF2ZSB0byBoYWxmIHRoZSB0YW5nZW50IHZlY3RvcgorICAgIC8vICBkZWx0YQorICAgIGNvbnN0IFZlY3RvcjNmIGhhbGZfZGVsdGEgPSAwLjVmICogcm90YXRpb25WZWN0b3I7CisgICAgcmV0dXJuIEV4cFNVMihoYWxmX2RlbHRhKTsKK30KKworVmVjdG9yM2YgcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IoY29uc3QgUXVhdGVybmlvbmYmIHF1YXRlcm5pb24pIHsKKyAgICAvLyBTVSgyKSBpcyBhIGRvdWJsZSBjb3ZlciBvZiBTTygzKSwgdGh1cyB3ZSBoYXZlIHRvIG11bHRpcGx5IHRoZSB0YW5nZW50CisgICAgLy8gdmVjdG9yIGRlbHRhIGJ5IHR3bworICAgIHJldHVybiAyLmYgKiBMb2dTVTIocXVhdGVybmlvbik7Cit9CisKK1F1YXRlcm5pb25mIHJvdGF0ZVgoZmxvYXQgYW5nbGUpIHsKKyAgICByZXR1cm4gcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oVmVjdG9yM2YoMSwgMCwgMCkgKiBhbmdsZSk7Cit9CisKK1F1YXRlcm5pb25mIHJvdGF0ZVkoZmxvYXQgYW5nbGUpIHsKKyAgICByZXR1cm4gcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oVmVjdG9yM2YoMCwgMSwgMCkgKiBhbmdsZSk7Cit9CisKK1F1YXRlcm5pb25mIHJvdGF0ZVooZmxvYXQgYW5nbGUpIHsKKyAgICByZXR1cm4gcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oVmVjdG9yM2YoMCwgMCwgMSkgKiBhbmdsZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9RdWF0ZXJuaW9uVXRpbC5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1F1YXRlcm5pb25VdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMmNhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9RdWF0ZXJuaW9uVXRpbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBDb252ZXJ0cyBhIHJvdGF0aW9uIHZlY3RvciB0byBhbiBlcXVpdmFsZW50IHF1YXRlcm5pb24uCisgKiBUaGUgcm90YXRpb24gdmVjdG9yIGlzIGdpdmVuIGFzIGEgMy12ZWN0b3Igd2hvc2UgZGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIGF4aXMgYW5kIGl0cworICogbWFnbml0dWRlIHRoZSByb3RhdGlvbiBhbmdsZSAoaW4gcmFkaWFucykgYXJvdW5kIHRoYXQgYXhpcy4KKyAqLworRWlnZW46OlF1YXRlcm5pb25mIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgcm90YXRpb25WZWN0b3IpOworCisvKioKKyAqIENvbnZlcnRzIGEgcXVhdGVybmlvbiB0byBhbiBlcXVpdmFsZW50IHJvdGF0aW9uIHZlY3Rvci4KKyAqIFRoZSByb3RhdGlvbiB2ZWN0b3IgaXMgZ2l2ZW4gYXMgYSAzLXZlY3RvciB3aG9zZSBkaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgcm90YXRpb24gYXhpcyBhbmQgaXRzCisgKiBtYWduaXR1ZGUgdGhlIHJvdGF0aW9uIGFuZ2xlIChpbiByYWRpYW5zKSBhcm91bmQgdGhhdCBheGlzLgorICovCitFaWdlbjo6VmVjdG9yM2YgcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IoY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBxdWF0ZXJuaW9uKTsKKworLyoqCisgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgYSByb3RhdGlvbiBhcm91bmQgdGhlIFgtYXhpcyB3aXRoIHRoZSBnaXZlbiBhbW91bnQgKGluCisgKiByYWRpYW5zKS4KKyAqLworRWlnZW46OlF1YXRlcm5pb25mIHJvdGF0ZVgoZmxvYXQgYW5nbGUpOworCisvKioKKyAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgWS1heGlzIHdpdGggdGhlIGdpdmVuIGFtb3VudCAoaW4KKyAqIHJhZGlhbnMpLgorICovCitFaWdlbjo6UXVhdGVybmlvbmYgcm90YXRlWShmbG9hdCBhbmdsZSk7CisKKy8qKgorICogUmV0dXJucyBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIGEgcm90YXRpb24gYXJvdW5kIHRoZSBaLWF4aXMgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IChpbgorICogcmFkaWFucykuCisgKi8KK0VpZ2VuOjpRdWF0ZXJuaW9uZiByb3RhdGVaKGZsb2F0IGFuZ2xlKTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1JFQURNRS5tZCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmN2JiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9SRUFETUUubWQKQEAgLTAsMCArMSwxODcgQEAKKyMgSGVhZC1UcmFja2luZyBMaWJyYXJ5IEZvciBJbW1lcnNpdmUgQXVkaW8KKworVGhpcyBsaWJyYXJ5IGhhbmRsZXMgdGhlIHByb2Nlc3Npbmcgb2YgaGVhZC10cmFja2luZyBpbmZvcm1hdGlvbiwgbmVjZXNzYXJ5IGZvcgorSW1tZXJzaXZlIEF1ZGlvIGZ1bmN0aW9uYWxpdHkuIEl0IGdvZXMgZnJvbSBiYXJlIHNlbnNvciByZWFkaW5nIGludG8gdGhlIGZpbmFsCitwb3NlIGZlZCBpbnRvIGEgdmlydHVhbGl6ZXIuCisKKyMjIEJhc2ljIFVzYWdlCisKK1RoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhpcyBsaWJyYXJ5IGlzIHRoZSBgSGVhZFRyYWNraW5nUHJvY2Vzc29yYCBjbGFzcy4KK1RoaXMgY2xhc3MgaXMgcHJvdmlkZWQgd2l0aCB0aGUgZm9sbG93aW5nIGlucHV0czoKKworLSBIZWFkIHBvc2UsIHJlbGF0aXZlIHRvIHNvbWUgYXJiaXRyYXJ5IHdvcmxkIGZyYW1lLgorLSBTY3JlZW4gcG9zZSwgcmVsYXRpdmUgdG8gc29tZSBhcmJpdHJhcnkgd29ybGQgZnJhbWUuCistIERpc3BsYXkgb3JpZW50YXRpb24sIGRlZmluZWQgYXMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlICJwaHlzaWNhbCIgc2NyZWVuIGFuZAorICB0aGUgImxvZ2ljYWwiIHNjcmVlbi4KKy0gVHJhbnNmb3JtIGJldHdlZW4gdGhlIHNjcmVlbiBhbmQgdGhlIHNvdW5kIHN0YWdlLgorLSBEZXNpcmVkIG9wZXJhdGlvbmFsIG1vZGU6CisgICAgLSBTdGF0aWM6IG9ubHkgdGhlIHNvdW5kIHN0YWdlIHBvc2UgaXMgdGFrZW4gaW50byBhY2NvdW50LiBUaGlzIHdpbGwgcmVzdWx0CisgICAgICBpbiBhbiBleHBlcmllbmNlIHdoZXJlIHRoZSBzb3VuZCBzdGFnZSBtb3ZlZCB3aXRoIHRoZSBsaXN0ZW5lcidzIGhlYWQuCisgICAgLSBXb3JsZC1yZWxhdGl2ZTogYm90aCB0aGUgaGVhZCBwb3NlIGFuZCBzdGFnZSBwb3NlIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgICBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGV4cGVyaWVuY2Ugd2hlcmUgdGhlIHNvdW5kIHN0YWdlIGlzIHBlcmNlaXZlZCB0byBiZQorICAgICAgbG9jYXRlZCBhdCBhIGZpeGVkIHBsYWNlIGluIHRoZSB3b3JsZC4KKyAgICAtIFNjcmVlbi1yZWxhdGl2ZTogdGhlIGhlYWQgcG9zZSwgc2NyZWVuIHBvc2UgYW5kIHN0YWdlIHBvc2UgYXJlIGFsbCB0YWtlbgorICAgICAgaW50byBhY2NvdW50LiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGV4cGVyaWVuY2Ugd2hlcmUgdGhlIHNvdW5kIHN0YWdlIGlzCisgICAgICBwZXJjZWl2ZWQgdG8gYmUgbG9jYXRlZCBhdCBhIGZpeGVkIHBsYWNlIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4uCisKK09uY2UgaW5wdXRzIGFyZSBwcm92aWRlZCwgdGhlIGBjYWxjdWxhdGUoKWAgbWV0aG9kIHdpbGwgbWFrZSB0aGUgZm9sbG93aW5nCitvdXRwdXQgYXZhaWxhYmxlOgorCistIFN0YWdlIHBvc2UsIHJlbGF0aXZlIHRvIHRoZSBoZWFkLiBUaGlzIGFnZ3JlZ2F0ZXMgYWxsIHRoZSBpbnB1dHMgbWVudGlvbmVkCisgIGFib3ZlIGFuZCBpcyByZWFkeSB0byBiZSBmZWQgaW50byBhIHZpcnR1YWxpemVyLgorLSBBY3R1YWwgb3BlcmF0aW9uYWwgbW9kZS4gTWF5IGRldmlhdGUgZnJvbSB0aGUgZGVzaXJlZCBvbmUgaW4gY2FzZXMgd2hlcmUgdGhlCisgIGRlc2lyZWQgbW9kZSBjYW5ub3QgYmUgY2FsY3VsYXRlZCAoZm9yIGV4YW1wbGUsIGFzIHJlc3VsdCBvZiBkcm9wcGVkIG1lc3NhZ2VzCisgIGZyb20gb25lIG9mIHRoZSBzZW5zb3JzKS4KKworQSBgcmVjZW50ZXIoKWAgb3BlcmF0aW9uIGlzIGFsc28gYXZhaWxhYmxlLCB3aGljaCBpbmRpY2F0ZXMgdG8gdGhlIHN5c3RlbSB0aGF0Cit3aGF0ZXZlciBwb3NlIHRoZSBzY3JlZW4gYW5kIGhlYWQgYXJlIGN1cnJlbnRseSBhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyB0aGUKKyJjZW50ZXIiIHBvc2UsIG9yIGZyYW1lIG9mIHJlZmVyZW5jZS4KKworIyMgUG9zZS1SZWxhdGVkIENvbnZlbnRpb25zCisKKyMjIyBOYW1pbmcgYW5kIENvbXBvc2l0aW9uCisKK1doZW4gcmVmZXJyaW5nIHRvIHBvc2VzIGluIGNvZGUsIGl0IGlzIGFsd2F5cyBnb29kIHByYWN0aWNlIHRvIGZvbGxvdworY29udmVudGlvbmFsIG5hbWluZywgd2hpY2ggaGlnaGxpZ2h0cyB0aGUgcmVmZXJlbmNlIGFuZCB0YXJnZXQgZnJhbWVzIGNsZWFybHk6CisKK0JhZDoKKworYGBgCitQb3NlM2YgaGVhZFBvc2U7CitgYGAKKworR29vZDoKKworYGBgCitQb3NlM2Ygd29ybGRUb0hlYWQ7ICAvLyDigJx3b3JsZOKAnSBpcyB0aGUgcmVmZXJlbmNlIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgLy8g4oCcaGVhZOKAnSBpcyB0aGUgdGFyZ2V0IGZyYW1lLgorYGBgCisKK0J5IGZvbGxvd2luZyB0aGlzIGNvbnZlbnRpb24sIGl0IGlzIGVhc3kgdG8gZm9sbG93IGNvcnJlY3QgY29tcG9zaXRpb24gb2YgcG9zZXMsCitieSBtYWtpbmcgc3VyZSBhZGphY2VudCBmcmFtZXMgYXJlIGlkZW50aWNhbDoKKworYGBgCitQb3NlM2YgYVRvRCA9IGFUb0IgKiBiVG9DICogY1RvRDsKK2BgYAorCitBbmQgc2ltaWxhcmx5LCBpbnZlcnRpbmcgdGhlIHRyYW5zZm9ybSBzaW1wbHkgZmxpcHMgdGhlIHJlZmVyZW5jZSBhbmQgdGFyZ2V0OgorCitgYGAKK1Bvc2UzZiBhVG9CID0gYlRvQS5pbnZlcnNlKCk7CitgYGAKKworIyMjIFR3aXN0CisKK+KAnFR3aXN04oCdIGlzIHRvIHBvc2Ugd2hhdCB2ZWxvY2l0eSBpcyB0byBkaXN0YW5jZTogaXQgaXMgdGhlIHRpbWUtZGVyaXZhdGl2ZSBvZiBhCitwb3NlLCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBpbiBwb3NlIG92ZXIgYSBzaG9ydCBwZXJpb2Qgb2YgdGltZS4gSXRzIG5hbWluZworY29udmVudGlvbiBhbHdheXMgc3RhdGVzIG9uZSBmcmFtZSwgZS5nLjoKK1R3aXN0M2YgaGVhZFR3aXN0OworCitUaGlzIG1lYW5zIHRoYXQgdGhpcyB0d2lzdCByZXByZXNlbnRzIHRoZSBoZWFkLWF0LXRpbWUtVCB0byBoZWFkLWF0LXRpbWUtVCtkdAordHJhbnNmb3JtLiBUd2lzdHMgYXJlIG5vdCBjb21wb3NhYmxlIGluIHRoZSBzYW1lIHdheSBhcyBwb3Nlcy4KKworIyMjIEZyYW1lcyBvZiBJbnRlcmVzdAorCitUaGUgZnJhbWVzIG9mIGludGVyZXN0IGluIHRoaXMgbGlicmFyeSBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgorCisjIyMjIEhlYWQKKworVGhpcyBpcyB0aGUgbGlzdGVuZXLigJlzIGhlYWQuIFRoZSBvcmlnaW4gaXMgYXQgdGhlIGNlbnRlciBwb2ludCBiZXR3ZWVuIHRoZQorZWFyLWRydW1zLCB0aGUgWC1heGlzIGdvZXMgZnJvbSBsZWZ0IGVhciB0byByaWdodCBlYXIsIFktYXhpcyBnb2VzIGZyb20gdGhlIGJhY2sKK29mIHRoZSBoZWFkIHRvd2FyZHMgdGhlIGZhY2UgYW5kIFotYXhpcyBnb2VzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgaGVhZCB0byB0aGUKK3RvcC4KKworIyMjIyBTY3JlZW4KKworVGhpcyBpcyB0aGUgcHJpbWFyeSBzY3JlZW4gdGhhdCB0aGUgdXNlciB3aWxsIGJlIGxvb2tpbmcgYXQsIHdoaWNoIGlzIHJlbGV2YW50Citmb3Igc29tZSBJbW1lcnNpdmUgQXVkaW8gdXNlLWNhc2VzLCBzdWNoIGFzIHdhdGNoaW5nIGEgbW92aWUuIFdlIHdpbGwgZm9sbG93IGEKK2RpZmZlcmVudCBjb252ZW50aW9uIGZvciB0aGlzIGZyYW1lIHRoYW4gd2hhdCB0aGUgU2Vuc29yIGZyYW1ld29yayB1c2VzLiBUaGUKK29yaWdpbiBpcyBhdCB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uIFgtYXhpcyBnb2VzIGZyb20gbGVmdCB0byByaWdodCwgWi1heGlzCitnb2VzIGZyb20gdGhlIHNjcmVlbiBib3R0b20gdG8gdGhlIHNjcmVlbiB0b3AsIFktYXhpcyBnb2VzIOKAnGludG/igJ0gdGhlIHNjcmVlbiAoCitmcm9tIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHZpZXdlcikuIFRoZSB1cC9kb3duL2xlZnQvcmlnaHQgb2YgdGhlIHNjcmVlbiBhcmUKK2RlZmluZWQgYXMgdGhlIGxvZ2ljYWwgZGlyZWN0aW9ucyB1c2VkIGZvciBkaXNwbGF5LiBTbyB3aGVuIGZsaXBwaW5nIHRoZSBkaXNwbGF5CitvcmllbnRhdGlvbiBiZXR3ZWVuIOKAnGxhbmRzY2FwZeKAnSBhbmQg4oCccG9ydHJhaXTigJ0sIHRoZSBmcmFtZSBvZiByZWZlcmVuY2Ugd2lsbAorY2hhbmdlIHdpdGggcmVzcGVjdCB0byB0aGUgcGh5c2ljYWwgc2NyZWVuLgorCisjIyMjIFN0YWdlCisKK1RoaXMgaXMgdGhlIGZyYW1lIG9mIHJlZmVyZW5jZSB1c2VkIGJ5IHRoZSB2aXJ0dWFsaXplciBmb3IgcG9zaXRpb25pbmcgc291bmQKK29iamVjdHMuIEl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHBoeXNpY2FsIGZyYW1lLiBJbiBhIHR5cGljYWwKK211bHRpLWNoYW5uZWwgc2NlbmFyaW8sIHRoZSBsaXN0ZW5lciBpcyBhdCB0aGUgb3JpZ2luLCB0aGUgWC1heGlzIGdvZXMgZnJvbSBsZWZ0Cit0byByaWdodCwgWS1heGlzIGZyb20gYmFjayB0byBmcm9udCBhbmQgWi1heGlzIGZyb20gZG93biB0byB1cC4gRm9yIGV4YW1wbGUsIGEKK2Zyb250LXJpZ2h0IHNwZWFrZXIgaXMgbG9jYXRlZCBhdCBwb3NpdGl2ZSBYLCBZIGFuZCBaPTAsIGEgaGVpZ2h0IHNwZWFrZXIgd2lsbAoraGF2ZSBhIHBvc2l0aXZlIFouCisKKyMjIyMgV29ybGQKKworSXQgaXMgc29tZXRpbWVzIGNvbnZlbmllbnQgdG8gdXNlIGFuIGludGVybWVkaWF0ZSBmcmFtZSB3aGVuIGRlYWxpbmcgd2l0aAoraGVhZC10by1zY3JlZW4gdHJhbnNmb3Jtcy4gVGhlIOKAnHdvcmxk4oCdIGZyYW1lIGlzIGEgZnJhbWUgb2YgcmVmZXJlbmNlIGluIHRoZQorcGh5c2ljYWwgd29ybGQsIHJlbGF0aXZlIHRvIHdoaWNoIHdlIGNhbiBtZWFzdXJlIHRoZSBoZWFkIHBvc2UgYW5kIHNjcmVlbiBwb3NlLgorSXQgaXMgYXJiaXRyYXJ5LCBidXQgZXhwZWN0ZWQgdG8gYmUgc3RhYmxlIChmaXhlZCkuCisKKyMjIFByb2Nlc3NpbmcgRGVzY3JpcHRpb24KKworIVtQb3NlIHByb2Nlc3NpbmcgZ3JhcGhdKFBvc2VQcm9jZXNzaW5nR3JhcGgucG5nKQorCitUaGUgZGlhZ3JhbSBhYm92ZSBpbGx1c3RyYXRlcyB0aGUgcHJvY2Vzc2luZyB0aGF0IHRha2VzIHBsYWNlIGZyb20gdGhlIGlucHV0cyB0bwordGhlIG91dHB1dHMuCisKKyMjIyBQcmVkaWN0b3IKKworVGhlIFByZWRpY3RvciBibG9jayBnZXRzIHBvc2UgKyB0d2lzdCAocG9zZSBkZXJpdmF0aXZlKSBhbmQgZXh0cmFwb2xhdGVzIHRvCitvYnRhaW4gYSBwcmVkaWN0ZWQgaGVhZCBwb3NlICh3LyBnaXZlbiBsYXRlbmN5KS4KKworIyMjIEJpYXMKKworVGhlIEJpYXMgYmxvY2tzIGVzdGFibGlzaCB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciB0aGUgcG9zZXMgYnkgaGF2aW5nIHRoZQorYWJpbGl0eSB0byBzZXQgdGhlIGN1cnJlbnQgcG9zZSBhcyB0aGUgcmVmZXJlbmNlIGZvciBmdXR1cmUgcG9zZXMgKHJlY2VudGVyaW5nKS4KKworIyMjIE9yaWVudGF0aW9uIENvbXBlbnNhdGlvbgorCitUaGUgT3JpZW50YXRpb24gQ29tcGVuc2F0aW9uIGJsb2NrIGFwcGxpZXMgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24gdG8gdGhlIHNjcmVlbgorcG9zZSB0byBvYnRhaW4gdGhlIHBvc2Ugb2YgdGhlIOKAnGxvZ2ljYWwgc2NyZWVu4oCdIGZyYW1lLCBpbiB3aGljaCB0aGUgWS1heGlzIGlzCitwb2ludGluZyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsb2dpY2FsIHNjcmVlbiDigJx1cOKAnSByYXRoZXIgdGhhbiB0aGUgcGh5c2ljYWwKK29uZS4KKworIyMjIFNjcmVlbi1SZWxhdGl2ZSBQb3NlCisKK1RoZSBTY3JlZW4tUmVsYXRpdmUgUG9zZSBibG9jayBpcyBwcm92aWRlZCB3aXRoIGEgaGVhZCBwb3NlIGFuZCBhIHNjcmVlbiBwb3NlCithbmQgZXN0aW1hdGVzIHRoZSBwb3NlIG9mIHRoZSBoZWFkIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4uIE9wdGlvbmFsbHksIHRoaXMKK21vZHVsZSBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgdXNlciBpcyBsaWtlbHkgbm90IGluIGZyb250IG9mIHRoZSBzY3JlZW4gdmlhIHRoZQor4oCcdmFsaWTigJ0gb3V0cHV0LgorCisjIyMgU3RpbGxuZXNzIERldGVjdG9yCisKK1RoZSBzdGlsbG5lc3MgZGV0ZWN0b3IgYmxvY2tzIGRldGVjdCB3aGVuIHRoZWlyIGluY29taW5nIHBvc2Ugc3RyZWFtIGhhcyBiZWVuCitzdGFibGUgZm9yIGEgZ2l2ZW4gYW1vdW50IG9mIHRpbWUgKGFsbG93aW5nIGZvciBhIGNvbmZpZ3VyYWJsZSBhbW91bnQgb2YgZXJyb3IpLgorV2hlbiB0aGUgaGVhZCBpcyBjb25zaWRlcmVkIHN0aWxsLCB3ZSB3b3VsZCB0cmlnZ2VyIGEgcmVjZW50ZXIgb3BlcmF0aW9uCiso4oCcYXV0by1yZWNlbnRlcmluZ+KAnSkgYW5kIHdoZW4gdGhlIHNjcmVlbiBpcyBjb25zaWRlcmVkIG5vdCBzdGlsbCwgdGhlIG1vZGUKK3NlbGVjdG9yIHdvdWxkIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGZvcmNlIHN0YXRpYyBtb2RlLgorCisjIyMgTW9kZSBTZWxlY3RvcgorCitUaGUgTW9kZSBTZWxlY3RvciBibG9jayBhZ2dyZWdhdGVzIHRoZSB2YXJpb3VzIHNvdXJjZXMgb2YgcG9zZSBpbmZvcm1hdGlvbiBpbnRvCithIGhlYWQtdG8tc3RhZ2UgcG9zZSB0aGF0IGlzIGdvaW5nIHRvIGZlZWQgdGhlIHZpcnR1YWxpemVyLiBJdCBpcyBjb250cm9sbGVkIGJ5Cit0aGUg4oCcZGVzaXJlZCBtb2Rl4oCdIHNpZ25hbCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBwcmVmZXJlbmNlIGlzIHRvIGJlIGluCitlaXRoZXIgc3RhdGljLCB3b3JsZC1yZWxhdGl2ZSBvciBzY3JlZW4tcmVsYXRpdmUuCisKK1RoZSBhY3R1YWwgbW9kZSBtYXkgZGl2ZXJnZSBmcm9tIHRoZSBkZXNpcmVkIG1vZGUuIEl0IGlzIGRldGVybWluZWQgYXMgZm9sbG93czoKKworLSBJZiB0aGUgZGVzaXJlZCBtb2RlIGlzIHN0YXRpYywgdGhlIGFjdHVhbCBtb2RlIGlzIHN0YXRpYy4KKy0gSWYgdGhlIGRlc2lyZWQgbW9kZSBpcyB3b3JsZC1yZWxhdGl2ZToKKyAgICAtIElmIGhlYWQgYW5kIHNjcmVlbiBwb3NlcyBhcmUgZnJlc2ggYW5kIHRoZSBzY3JlZW4gaXMgc3RhYmxlIChzdGlsbG5lc3MKKyAgICAgIGRldGVjdG9yIG91dHB1dCBpcyB0cnVlKSwgdGhlIGFjdHVhbCBtb2RlIGlzIHdvcmxkLXJlbGF0aXZlLgorICAgIC0gT3RoZXJ3aXNlIHRoZSBhY3R1YWwgbW9kZSBpcyBzdGF0aWMuCistIElmIHRoZSBkZXNpcmVkIG1vZGUgaXMgc2NyZWVuLXJlbGF0aXZlOgorICAgIC0gSWYgaGVhZCBhbmQgc2NyZWVuIHBvc2VzIGFyZSBmcmVzaCBhbmQgdGhlIOKAmHZhbGlk4oCZIHNpZ25hbCBpcyBhc3NlcnRlZCwgdGhlCisgICAgICBhY3R1YWwgbW9kZSBpcyBzY3JlZW4tcmVsYXRpdmUuCisgICAgLSBPdGhlcndpc2UsIGFwcGx5IHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZXNpcmVkIG1vZGUgYmVpbmcgd29ybGQtcmVsYXRpdmUuCisKKyMjIyBSYXRlIExpbWl0ZXIKKworQSBSYXRlIExpbWl0ZXIgYmxvY2sgaXMgYXBwbGllZCB0byB0aGUgZmluYWwgb3V0cHV0IHRvIHNtb290aCBvdXQgYW55IGFicnVwdAordHJhbnNpdGlvbnMgY2F1c2VkIGJ5IGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50czoKKworLSBNb2RlIHN3aXRjaC4KKy0gRGlzcGxheSBvcmllbnRhdGlvbiBzd2l0Y2guCistIFJlY2VudGVyIG9wZXJhdGlvbi4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24tdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmMjdmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLXRlc3QuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlNjcmVlbkhlYWRGdXNpb24uaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCit1c2luZyBFaWdlbjo6UXVhdGVybmlvbmY7Cit1c2luZyBFaWdlbjo6VmVjdG9yM2Y7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgeworCitURVNUKFNjcmVlbkhlYWRGdXNpb24sIEluaXQpIHsKKyAgICBTY3JlZW5IZWFkRnVzaW9uIGZ1c2lvbjsKKyAgICBFWFBFQ1RfRkFMU0UoZnVzaW9uLmNhbGN1bGF0ZSgpLmhhc192YWx1ZSgpKTsKK30KKworVEVTVChTY3JlZW5IZWFkRnVzaW9uLCBDYWxjdWxhdGVfTm9IZWFkKSB7CisgICAgU2NyZWVuSGVhZEZ1c2lvbiBmdXNpb247CisgICAgZnVzaW9uLnNldFdvcmxkVG9TY3JlZW5Qb3NlKDAsIFBvc2UzZigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZnVzaW9uLmNhbGN1bGF0ZSgpLmhhc192YWx1ZSgpKTsKK30KKworVEVTVChTY3JlZW5IZWFkRnVzaW9uLCBDYWxjdWxhdGVfTm9TY3JlZW4pIHsKKyAgICBTY3JlZW5IZWFkRnVzaW9uIGZ1c2lvbjsKKyAgICBmdXNpb24uc2V0V29ybGRUb0hlYWRQb3NlKDAsIFBvc2UzZigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZnVzaW9uLmNhbGN1bGF0ZSgpLmhhc192YWx1ZSgpKTsKK30KKworVEVTVChTY3JlZW5IZWFkRnVzaW9uLCBDYWxjdWxhdGUpIHsKKyAgICBQb3NlM2Ygd29ybGRUb1NjcmVlbjEoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlM2Ygd29ybGRUb0hlYWQxKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZTNmIHdvcmxkVG9TY3JlZW4yKHsxMSwgMTIsIDEzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZTNmIHdvcmxkVG9IZWFkMih7MTQsIDE1LCAxNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgU2NyZWVuSGVhZEZ1c2lvbiBmdXNpb247CisgICAgZnVzaW9uLnNldFdvcmxkVG9IZWFkUG9zZSgxMjMsIHdvcmxkVG9IZWFkMSk7CisgICAgZnVzaW9uLnNldFdvcmxkVG9TY3JlZW5Qb3NlKDQ1Niwgd29ybGRUb1NjcmVlbjEpOworICAgIGF1dG8gcmVzdWx0ID0gZnVzaW9uLmNhbGN1bGF0ZSgpOworICAgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgICAgRVhQRUNUX0VRKDEyMywgcmVzdWx0LT50aW1lc3RhbXApOworICAgIEVYUEVDVF9FUSh3b3JsZFRvU2NyZWVuMS5pbnZlcnNlKCkgKiB3b3JsZFRvSGVhZDEsIHJlc3VsdC0+cG9zZSk7CisKKyAgICBmdXNpb24uc2V0V29ybGRUb0hlYWRQb3NlKDU2Nywgd29ybGRUb0hlYWQyKTsKKyAgICByZXN1bHQgPSBmdXNpb24uY2FsY3VsYXRlKCk7CisgICAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNDU2LCByZXN1bHQtPnRpbWVzdGFtcCk7CisgICAgRVhQRUNUX0VRKHdvcmxkVG9TY3JlZW4xLmludmVyc2UoKSAqIHdvcmxkVG9IZWFkMiwgcmVzdWx0LT5wb3NlKTsKKworICAgIGZ1c2lvbi5zZXRXb3JsZFRvU2NyZWVuUG9zZSg2NzgsIHdvcmxkVG9TY3JlZW4yKTsKKyAgICByZXN1bHQgPSBmdXNpb24uY2FsY3VsYXRlKCk7CisgICAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNTY3LCByZXN1bHQtPnRpbWVzdGFtcCk7CisgICAgRVhQRUNUX0VRKHdvcmxkVG9TY3JlZW4yLmludmVyc2UoKSAqIHdvcmxkVG9IZWFkMiwgcmVzdWx0LT5wb3NlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2NyZWVuSGVhZEZ1c2lvbi5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2NyZWVuSGVhZEZ1c2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyMzU3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKXt9CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTY3JlZW5IZWFkRnVzaW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK3ZvaWQgU2NyZWVuSGVhZEZ1c2lvbjo6c2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkKSB7CisgICAgbVdvcmxkVG9IZWFkID0gVGltZXN0YW1wZWRQb3Nley50aW1lc3RhbXAgPSB0aW1lc3RhbXAsIC5wb3NlID0gd29ybGRUb0hlYWR9OworfQorCit2b2lkIFNjcmVlbkhlYWRGdXNpb246OnNldFdvcmxkVG9TY3JlZW5Qb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9TY3JlZW4pIHsKKyAgICBtV29ybGRUb1NjcmVlbiA9IFRpbWVzdGFtcGVkUG9zZXsudGltZXN0YW1wID0gdGltZXN0YW1wLCAucG9zZSA9IHdvcmxkVG9TY3JlZW59OworfQorCitzdGQ6Om9wdGlvbmFsPFNjcmVlbkhlYWRGdXNpb246OlRpbWVzdGFtcGVkUG9zZT4gU2NyZWVuSGVhZEZ1c2lvbjo6Y2FsY3VsYXRlKCkgeworICAgIC8vIFRPRE86IHRoaXMgaXMgdGVtcG9yYXJ5LCBzaW1wbGlzdGljIGxvZ2ljLgorICAgIGlmICghbVdvcmxkVG9IZWFkLmhhc192YWx1ZSgpIHx8ICFtV29ybGRUb1NjcmVlbi5oYXNfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICByZXR1cm4gVGltZXN0YW1wZWRQb3NleworICAgICAgICAgICAgLnRpbWVzdGFtcCA9IHN0ZDo6bWluKG1Xb3JsZFRvSGVhZC0+dGltZXN0YW1wLCBtV29ybGRUb1NjcmVlbi0+dGltZXN0YW1wKSwKKyAgICAgICAgICAgIC5wb3NlID0gbVdvcmxkVG9TY3JlZW4tPnBvc2UuaW52ZXJzZSgpICogbVdvcmxkVG9IZWFkLT5wb3NlfTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24uaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4MTEwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSAibWVkaWEvUG9zZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIENvbWJpbmVzIHdvcmxkLXRvLWhlYWQgcG9zZSB3aXRoIHdvcmxkLXRvLXNjcmVlbiBwb3NlIHRvIG9idGFpbiBzY3JlZW4tdG8taGVhZC4KKyAqCisgKiBJbnB1dCBwb3NlcyBtYXkgYXJyaXZlIHNlcGFyYXRlbHkuIFRoZSBsYXN0IHBvc2Ugb2YgZWFjaCBraW5kIGlzIHRha2VuIGludG8gYWNjb3VudC4gVGhlCisgKiB0aW1lc3RhbXAgb2YgdGhlIG91dHB1dCBpcyB0aGUgZWFsaWVyIChvbGRlcikgdGltZXN0YW1wIG9mIHRoZSB0d28gaW5wdXRzLgorICoKKyAqIE91dHB1dCBtYXkgYmUgbnVsbG9wdCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorICogLSBFaXRoZXIgb25lIG9mIHRoZSBpbnB1dHMgaGFzIG5vdCB5ZXQgYmVlbiBwcm92aWRlZC4KKyAqIC0gSXQgaXMgZXN0aW1hdGVkIHRoYXQgdGhlIHVzZXIgaXMgbm8gbG9uZ2VyIGZhY2luZyB0aGUgc2NyZWVuLgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKgorICogU2NyZWVuSGVhZEZ1c2lvbiBmdXNpb24oLi4uKTsKKyAqIGZ1c2lvbi5zZXRXb3JsZFRvSGVhZFBvc2UoLi4uKTsKKyAqIGZ1c2lvbi5zZXRXb3JsZFRvU2NyZWVuUG9zZSguLi4pOworICogYXV0byBvdXRwdXQgPSBmdXNpb24uY2FsY3VsYXRlKCk7CisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUsIGJ1dCB0aHJlYWQtY29tcGF0aWJsZS4KKyAqLworY2xhc3MgU2NyZWVuSGVhZEZ1c2lvbiB7CisgIHB1YmxpYzoKKyAgICBzdHJ1Y3QgVGltZXN0YW1wZWRQb3NlIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgIFBvc2UzZiBwb3NlOworICAgIH07CisKKyAgICB2b2lkIHNldFdvcmxkVG9IZWFkUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwgY29uc3QgUG9zZTNmJiB3b3JsZFRvSGVhZCk7CisKKyAgICB2b2lkIHNldFdvcmxkVG9TY3JlZW5Qb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9TY3JlZW4pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2NyZWVuLXRvLWhlYWQgcG9zZSwgb3IgbnVsbG9wdCBpZiBpbnZhbGlkLgorICAgICAqLworICAgIHN0ZDo6b3B0aW9uYWw8VGltZXN0YW1wZWRQb3NlPiBjYWxjdWxhdGUoKTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6b3B0aW9uYWw8VGltZXN0YW1wZWRQb3NlPiBtV29ybGRUb0hlYWQ7CisgICAgc3RkOjpvcHRpb25hbDxUaW1lc3RhbXBlZFBvc2U+IG1Xb3JsZFRvU2NyZWVuOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NlbnNvclBvc2VQcm92aWRlci1leGFtcGxlLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXItZXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlMjIyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXItZXhhbXBsZS5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQvc2Vuc29yLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9TZW5zb3JQb3NlUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxzZW5zb3IvU2Vuc29yLmg+CisjaW5jbHVkZSA8c2Vuc29yL1NlbnNvck1hbmFnZXIuaD4KKwordXNpbmcgYW5kcm9pZDo6ZWxhcHNlZFJlYWx0aW1lTmFubzsKK3VzaW5nIGFuZHJvaWQ6OlNlbnNvcjsKK3VzaW5nIGFuZHJvaWQ6OlNlbnNvck1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpQb3NlM2Y7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6U2Vuc29yUG9zZVByb3ZpZGVyOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OlR3aXN0M2Y7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworY29uc3QgY2hhciBrUGFja2FnZU5hbWVbXSA9ICJTZW5zb3JQb3NlUHJvdmlkZXItZXhhbXBsZSI7CisKK2NsYXNzIExpc3RlbmVyIDogcHVibGljIFNlbnNvclBvc2VQcm92aWRlcjo6TGlzdGVuZXIgeworICBwdWJsaWM6CisgICAgdm9pZCBvblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGludDMyX3QgaGFuZGxlLCBjb25zdCBQb3NlM2YmIHBvc2UsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxUd2lzdDNmPiYgdHdpc3QsIGJvb2wgaXNOZXdSZWZlcmVuY2UpIG92ZXJyaWRlIHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBlbGFwc2VkUmVhbHRpbWVOYW5vKCk7CisKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJvblBvc2UgdD0iIDw8IHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgPDwgIiBsYWc9IiA8PCAoKG5vdyAtIHRpbWVzdGFtcCkgLyAxZTYpIDw8ICJbbXNdIgorICAgICAgICAgICAgICAgICAgPDwgIiBzZW5zb3I9IiA8PCBoYW5kbGUKKyAgICAgICAgICAgICAgICAgIDw8ICIgcG9zZT0iIDw8IHBvc2UKKyAgICAgICAgICAgICAgICAgIDw8ICIgdHdpc3Q9IjsKKyAgICAgICAgaWYgKHR3aXN0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgdHdpc3QudmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5vbmU+IjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OmNvdXQgPDwgIiBpc05ld1JlZmVyZW5jZT0iIDw8IGlzTmV3UmVmZXJlbmNlIDw8IHN0ZDo6ZW5kbDsKKyAgICB9Cit9OworCitpbnQgbWFpbigpIHsKKyAgICBTZW5zb3JNYW5hZ2VyJiBzZW5zb3JNYW5hZ2VyID0gU2Vuc29yTWFuYWdlcjo6Z2V0SW5zdGFuY2VGb3JQYWNrYWdlKFN0cmluZzE2KGtQYWNrYWdlTmFtZSkpOworCisgICAgY29uc3QgU2Vuc29yKiBoZWFkU2Vuc29yID0gc2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKFNFTlNPUl9UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SKTsKKyAgICBjb25zdCBTZW5zb3IqIHNjcmVlblNlbnNvciA9IHNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IpOworCisgICAgTGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2Vuc29yUG9zZVByb3ZpZGVyPiBwcm92aWRlciA9CisgICAgICAgICAgICBTZW5zb3JQb3NlUHJvdmlkZXI6OmNyZWF0ZShrUGFja2FnZU5hbWUsICZsaXN0ZW5lcik7CisgICAgaWYgKCFwcm92aWRlci0+c3RhcnRTZW5zb3IoaGVhZFNlbnNvci0+Z2V0SGFuZGxlKCksIDUwMG1zKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCB0byBzdGFydCBoZWFkIHNlbnNvciIgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzbGVlcCgyKTsKKyAgICBpZiAoIXByb3ZpZGVyLT5zdGFydFNlbnNvcihzY3JlZW5TZW5zb3ItPmdldEhhbmRsZSgpLCA1MDBtcykpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsZWQgdG8gc3RhcnQgc2NyZWVuU2Vuc29yIHNlbnNvciIgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzbGVlcCgyKTsKKyAgICBwcm92aWRlci0+c3RvcFNlbnNvcihoZWFkU2Vuc29yLT5nZXRIYW5kbGUoKSk7CisgICAgc2xlZXAoMik7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2Vuc29yUG9zZVByb3ZpZGVyLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmFmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2Vuc29yUG9zZVByb3ZpZGVyLmNwcApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9TZW5zb3JQb3NlUHJvdmlkZXIuaD4KKworI2RlZmluZSBMT0dfVEFHICJTZW5zb3JQb3NlUHJvdmlkZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisjaW5jbHVkZSA8bG9nL2xvZ19tYWluLmg+CisjaW5jbHVkZSA8c2Vuc29yL1NlbnNvckV2ZW50UXVldWUuaD4KKyNpbmNsdWRlIDxzZW5zb3IvU2Vuc29yTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgorCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKKy8vIElkZW50aWZpZXIgdG8gdXNlIGZvciBvdXIgZXZlbnQgcXVldWUgb24gdGhlIGxvb3AuCisvLyBUaGUgbnVtYmVyIDE5IGlzIGFyYml0cmFyeSwgb25seSB1c2VmdWwgaWYgdXNpbmcgbXVsdGlwbGUgb2JqZWN0cyBvbiB0aGUgc2FtZSBsb29wZXIuCitjb25zdGV4cHIgaW50IGtJZGVudCA9IDE5OworCitzdGF0aWMgaW5saW5lIExvb3BlciogQUxvb3Blcl90b19Mb29wZXIoQUxvb3BlciogYWxvb3BlcikgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PExvb3Blcio+KGFsb29wZXIpOworfQorCitzdGF0aWMgaW5saW5lIEFMb29wZXIqIExvb3Blcl90b19BTG9vcGVyKExvb3BlciogbG9vcGVyKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QUxvb3Blcio+KGxvb3Blcik7Cit9CisKKy8qKgorICogUkFJSS13cmFwcGVyIGFyb3VuZCBTZW5zb3JFdmVudFF1ZXVlLCB3aGljaCB1bnJlZ2lzdGVycyBpdCBvbiBkZXN0cnVjdGlvbi4KKyAqLworY2xhc3MgRXZlbnRRdWV1ZUd1YXJkIHsKKyAgcHVibGljOgorICAgIEV2ZW50UXVldWVHdWFyZChjb25zdCBzcDxTZW5zb3JFdmVudFF1ZXVlPiYgcXVldWUsIExvb3BlciogbG9vcGVyKSA6IG1RdWV1ZShxdWV1ZSkgeworICAgICAgICBtUXVldWUtPmxvb3BlciA9IExvb3Blcl90b19BTG9vcGVyKGxvb3Blcik7CisgICAgICAgIG1RdWV1ZS0+cmVxdWVzdEFkZGl0aW9uYWxJbmZvID0gZmFsc2U7CisgICAgICAgIGxvb3Blci0+YWRkRmQobVF1ZXVlLT5nZXRGZCgpLCBrSWRlbnQsIEFMT09QRVJfRVZFTlRfSU5QVVQsIG51bGxwdHIsIG51bGxwdHIpOworICAgIH0KKworICAgIH5FdmVudFF1ZXVlR3VhcmQoKSB7CisgICAgICAgIGlmIChtUXVldWUpIHsKKyAgICAgICAgICAgIEFMb29wZXJfdG9fTG9vcGVyKG1RdWV1ZS0+bG9vcGVyKS0+cmVtb3ZlRmQobVF1ZXVlLT5nZXRGZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEV2ZW50UXVldWVHdWFyZChjb25zdCBFdmVudFF1ZXVlR3VhcmQmKSA9IGRlbGV0ZTsKKyAgICBFdmVudFF1ZXVlR3VhcmQmIG9wZXJhdG9yPShjb25zdCBFdmVudFF1ZXVlR3VhcmQmKSA9IGRlbGV0ZTsKKworICAgIFtbbm9kaXNjYXJkXV0gU2Vuc29yRXZlbnRRdWV1ZSogZ2V0KCkgY29uc3QgeyByZXR1cm4gbVF1ZXVlLmdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzcDxTZW5zb3JFdmVudFF1ZXVlPiBtUXVldWU7Cit9OworCisvKioKKyAqIFJBSUktd3JhcHBlciBhcm91bmQgYW4gZW5hYmxlZCBzZW5zb3IsIHdoaWNoIGRpc2FibGVzIGl0IHVwb24gZGVzdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIFNlbnNvckVuYWJsZUd1YXJkIHsKKyAgcHVibGljOgorICAgIFNlbnNvckVuYWJsZUd1YXJkKGNvbnN0IHNwPFNlbnNvckV2ZW50UXVldWU+JiBxdWV1ZSwgaW50MzJfdCBzZW5zb3IpCisgICAgICAgIDogbVF1ZXVlKHF1ZXVlKSwgbVNlbnNvcihzZW5zb3IpIHt9CisKKyAgICB+U2Vuc29yRW5hYmxlR3VhcmQoKSB7CisgICAgICAgIGlmIChtU2Vuc29yICE9IFNlbnNvclBvc2VQcm92aWRlcjo6SU5WQUxJRF9IQU5ETEUpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtUXVldWUtPmRpc2FibGVTZW5zb3IobVNlbnNvcik7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNlbnNvcjogJXMiLCBzdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFNlbnNvckVuYWJsZUd1YXJkKGNvbnN0IFNlbnNvckVuYWJsZUd1YXJkJikgPSBkZWxldGU7CisgICAgU2Vuc29yRW5hYmxlR3VhcmQmIG9wZXJhdG9yPShjb25zdCBTZW5zb3JFbmFibGVHdWFyZCYpID0gZGVsZXRlOworCisgICAgLy8gRW5hYmxlIG1vdmluZy4KKyAgICBTZW5zb3JFbmFibGVHdWFyZChTZW5zb3JFbmFibGVHdWFyZCYmIG90aGVyKSA6IG1RdWV1ZShvdGhlci5tUXVldWUpLCBtU2Vuc29yKG90aGVyLm1TZW5zb3IpIHsKKyAgICAgICAgb3RoZXIubVNlbnNvciA9IFNlbnNvclBvc2VQcm92aWRlcjo6SU5WQUxJRF9IQU5ETEU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3A8U2Vuc29yRXZlbnRRdWV1ZT4gY29uc3QgbVF1ZXVlOworICAgIGludDMyX3QgbVNlbnNvcjsKK307CisKKy8qKgorICogU3RyZWFtcyB0aGUgcmVxdWlyZWQgZXZlbnRzIHRvIGEgUG9zZUxpc3RlbmVyLCBiYXNlZCBvbiBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgU2Vuc29yIHN0YWNrLgorICovCitjbGFzcyBTZW5zb3JQb3NlUHJvdmlkZXJJbXBsIDogcHVibGljIFNlbnNvclBvc2VQcm92aWRlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNlbnNvclBvc2VQcm92aWRlcj4gY3JlYXRlKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLCBMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNlbnNvclBvc2VQcm92aWRlckltcGw+IHJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgU2Vuc29yUG9zZVByb3ZpZGVySW1wbChwYWNrYWdlTmFtZSwgbGlzdGVuZXIpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC0+d2FpdEluaXRGaW5pc2hlZCgpID8gc3RkOjptb3ZlKHJlc3VsdCkgOiBudWxscHRyOworICAgIH0KKworICAgIH5TZW5zb3JQb3NlUHJvdmlkZXJJbXBsKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBEaXNhYmxlIGFsbCBhY3RpdmUgc2Vuc29ycy4KKyAgICAgICAgbUVuYWJsZWRTZW5zb3JzLmNsZWFyKCk7CisgICAgICAgIG1Mb29wZXItPndha2UoKTsKKyAgICAgICAgbVRocmVhZC5qb2luKCk7CisgICAgfQorCisgICAgYm9vbCBzdGFydFNlbnNvcihpbnQzMl90IHNlbnNvciwgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBzYW1wbGluZ1BlcmlvZCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBzZW5zb3IncyBkYXRhIGZvcm1hdC4KKyAgICAgICAgRGF0YUZvcm1hdCBmb3JtYXQgPSBnZXRTZW5zb3JGb3JtYXQoc2Vuc29yKTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBEYXRhRm9ybWF0OjprVW5rbm93bikgeworICAgICAgICAgICAgQUxPR0UoIlVua25vd24gZm9ybWF0IGZvciBzZW5zb3IgJSIgUFJJZDMyLCBzZW5zb3IpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIG1FbmFibGVkU2Vuc29yc0V4dHJhLmVtcGxhY2Uoc2Vuc29yLCBTZW5zb3JFeHRyYXsgLmZvcm1hdCA9IGZvcm1hdCB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuYWJsZSB0aGUgc2Vuc29yLgorICAgICAgICBpZiAobVF1ZXVlLT5lbmFibGVTZW5zb3Ioc2Vuc29yLCBzYW1wbGluZ1BlcmlvZC5jb3VudCgpLCAwLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmFibGUgc2Vuc29yIik7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgbUVuYWJsZWRTZW5zb3JzRXh0cmEuZXJhc2Uoc2Vuc29yKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1FbmFibGVkU2Vuc29ycy5lbXBsYWNlKHNlbnNvciwgU2Vuc29yRW5hYmxlR3VhcmQobVF1ZXVlLmdldCgpLCBzZW5zb3IpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzdG9wU2Vuc29yKGludCBoYW5kbGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUVuYWJsZWRTZW5zb3JzLmVyYXNlKGhhbmRsZSk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgICAgIG1FbmFibGVkU2Vuc29yc0V4dHJhLmVyYXNlKGhhbmRsZSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgZW51bSBEYXRhRm9ybWF0IHsKKyAgICAgICAga1Vua25vd24sCisgICAgICAgIGtRdWF0ZXJuaW9uLAorICAgICAgICBrUm90YXRpb25WZWN0b3JzQW5kRGlzY29udGludWl0eUNvdW50LAorICAgIH07CisKKyAgICBzdHJ1Y3QgUG9zZUV2ZW50IHsKKyAgICAgICAgUG9zZTNmIHBvc2U7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8VHdpc3QzZj4gdHdpc3Q7CisgICAgICAgIGJvb2wgaXNOZXdSZWZlcmVuY2U7CisgICAgfTsKKworICAgIHN0cnVjdCBTZW5zb3JFeHRyYSB7CisgICAgICAgIERhdGFGb3JtYXQgZm9ybWF0OworICAgICAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IGRpc2NvbnRpbnVpdHlDb3VudDsKKyAgICB9OworCisgICAgc3A8TG9vcGVyPiBtTG9vcGVyOworICAgIExpc3RlbmVyKiBjb25zdCBtTGlzdGVuZXI7CisgICAgU2Vuc29yTWFuYWdlciogY29uc3QgbVNlbnNvck1hbmFnZXI7CisgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBTZW5zb3JFbmFibGVHdWFyZD4gbUVuYWJsZWRTZW5zb3JzOworICAgIHN0ZDo6bWFwPGludDMyX3QsIFNlbnNvckV4dHJhPiBtRW5hYmxlZFNlbnNvcnNFeHRyYSBHVUFSREVEX0JZKG1NdXRleCk7CisgICAgc3A8U2Vuc29yRXZlbnRRdWV1ZT4gbVF1ZXVlOworCisgICAgLy8gV2UgbXVzdCBkbyBzb21lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBvcGVyYXRpb25zIG9uIHRoZSB3b3JrZXIgdGhyZWFkLCBiZWNhdXNlIHRoZSBBUEkgcmVsaWVzCisgICAgLy8gb24gdGhlIHRocmVhZC1sb2NhbCBsb29wZXIuIEluIGFkZGl0aW9uLCBhcyBhIG1hdHRlciBvZiBjb252ZW5pZW5jZSwgd2Ugc3RvcmUgc29tZSBvZiB0aGUKKyAgICAvLyBzdGF0ZSBvbiB0aGUgc3RhY2suCisgICAgLy8gRm9yIHRoYXQgcmVhc29uLCB3ZSB1c2UgYSB0d28tc3RlcCBpbml0aWFsaXphdGlvbiBhcHByb2FjaCwgd2hlcmUgdGhlIGN0b3IgbW9zdGx5IGp1c3Qgc3RhcnRzCisgICAgLy8gdGhlIHdvcmtlciB0aHJlYWQgYW5kIHRoYXQgdGhyZWFkIHdvdWxkIG5vdGlmeSwgdmlhIHRoZSBwcm9taXNlIGJlbG93IHdoZW5ldmVyIGluaXRpYWxpemF0aW9uCisgICAgLy8gaXMgZmluaXNoZWQsIGFuZCB3aGV0aGVyIGl0IHdhcyBzdWNjZXNzZnVsLgorICAgIHN0ZDo6cHJvbWlzZTxib29sPiBtSW5pdFByb21pc2U7CisKKyAgICBTZW5zb3JQb3NlUHJvdmlkZXJJbXBsKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLCBMaXN0ZW5lciogbGlzdGVuZXIpCisgICAgICAgIDogbUxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgICAgICBtU2Vuc29yTWFuYWdlcigmU2Vuc29yTWFuYWdlcjo6Z2V0SW5zdGFuY2VGb3JQYWNrYWdlKFN0cmluZzE2KHBhY2thZ2VOYW1lKSkpLAorICAgICAgICAgIG1UaHJlYWQoW3RoaXNdIHsgdGhyZWFkRnVuYygpOyB9KSB7fQorCisgICAgdm9pZCBpbml0RmluaXNoZWQoYm9vbCBzdWNjZXNzKSB7IG1Jbml0UHJvbWlzZS5zZXRfdmFsdWUoc3VjY2Vzcyk7IH0KKworICAgIGJvb2wgd2FpdEluaXRGaW5pc2hlZCgpIHsgcmV0dXJuIG1Jbml0UHJvbWlzZS5nZXRfZnV0dXJlKCkuZ2V0KCk7IH0KKworICAgIHZvaWQgdGhyZWFkRnVuYygpIHsKKyAgICAgICAgLy8gT2J0YWluIGxvb3Blci4KKyAgICAgICAgbUxvb3BlciA9IExvb3Blcjo6cHJlcGFyZShBTE9PUEVSX1BSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLUyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGV2ZW50IHF1ZXVlLgorICAgICAgICBtUXVldWUgPSBtU2Vuc29yTWFuYWdlci0+Y3JlYXRlRXZlbnRRdWV1ZSgpOworCisgICAgICAgIGlmIChtUXVldWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgYSBzZW5zb3IgZXZlbnQgcXVldWUiKTsKKyAgICAgICAgICAgIGluaXRGaW5pc2hlZChmYWxzZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBFdmVudFF1ZXVlR3VhcmQgZXZlbnRRdWV1ZUd1YXJkKG1RdWV1ZSwgbUxvb3Blci5nZXQoKSk7CisKKyAgICAgICAgaW5pdEZpbmlzaGVkKHRydWUpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gbUxvb3Blci0+cG9sbE9uY2UoLTEgLyogbm8gdGltZW91dCAqLywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfV0FLRToKKyAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIHdheSB0byBleGl0LgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBjYXNlIGtJZGVudDoKKyAgICAgICAgICAgICAgICAgICAgLy8gUG9zc2libGUgZXZlbnRzIG9uIG91ciBxdWV1ZS4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBzdGF0dXMgb3V0IG9mIExvb3Blcjo6cG9sbE9uY2U6ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJvY2VzcyBhbiBldmVudC4KKyAgICAgICAgICAgIEFTZW5zb3JFdmVudCBldmVudDsKKyAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsID0gbVF1ZXVlLT5yZWFkKCZldmVudCwgMSk7CisgICAgICAgICAgICBpZiAoYWN0dWFsID4gMCkgeworICAgICAgICAgICAgICAgIG1RdWV1ZS0+c2VuZEFjaygmZXZlbnQsIGFjdHVhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2l6ZV90IHNpemUgPSBtUXVldWUtPmZpbHRlckV2ZW50cygmZXZlbnQsIGFjdHVhbCk7CisKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCB8fCBzaXplID4gMSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIFNlbnNvckV2ZW50UXVldWU6OmZpbHRlckV2ZW50czogJXpkIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gZXZlbnRzLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZUV2ZW50KGNvbnN0IEFTZW5zb3JFdmVudCYgZXZlbnQpIHsKKyAgICAgICAgUG9zZUV2ZW50IHZhbHVlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgYXV0byBpdGVyID0gbUVuYWJsZWRTZW5zb3JzRXh0cmEuZmluZChldmVudC5zZW5zb3IpOworICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbUVuYWJsZWRTZW5zb3JzRXh0cmEuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSBhbnkgcGVuZGluZyBldmVudHMgc2hvcnRseSBhZnRlciBzdG9wcGluZy4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRXZlbnQoZXZlbnQsIGl0ZXItPnNlY29uZC5mb3JtYXQsICZpdGVyLT5zZWNvbmQuZGlzY29udGludWl0eUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXItPm9uUG9zZShldmVudC50aW1lc3RhbXAsIGV2ZW50LnNlbnNvciwgdmFsdWUucG9zZSwgdmFsdWUudHdpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmlzTmV3UmVmZXJlbmNlKTsKKyAgICB9CisKKyAgICBEYXRhRm9ybWF0IGdldFNlbnNvckZvcm1hdChpbnQzMl90IGhhbmRsZSkgeworICAgICAgICBzdGQ6Om9wdGlvbmFsPGNvbnN0IFNlbnNvcj4gc2Vuc29yID0gZ2V0U2Vuc29yQnlIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgaWYgKCFzZW5zb3IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTZW5zb3Igbm90IGZvdW5kOiAlZCIsIGhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gRGF0YUZvcm1hdDo6a1Vua25vd247CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbnNvci0+Z2V0VHlwZSgpID09IEFTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IgfHwKKyAgICAgICAgICAgIHNlbnNvci0+Z2V0VHlwZSgpID09IEFTRU5TT1JfVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUikgeworICAgICAgICAgICAgcmV0dXJuIERhdGFGb3JtYXQ6OmtRdWF0ZXJuaW9uOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbnNvci0+Z2V0VHlwZSgpID09IEFTRU5TT1JfVFlQRV9IRUFEX1RSQUNLRVIpIHsKKyAgICAgICAgICAgIHJldHVybiBEYXRhRm9ybWF0OjprUm90YXRpb25WZWN0b3JzQW5kRGlzY29udGludWl0eUNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIERhdGFGb3JtYXQ6OmtVbmtub3duOworICAgIH0KKworICAgIHN0ZDo6b3B0aW9uYWw8Y29uc3QgU2Vuc29yPiBnZXRTZW5zb3JCeUhhbmRsZShpbnQzMl90IGhhbmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBjb25zdCBTZW5zb3IqIGNvbnN0KiBsaXN0OworICAgICAgICBzc2l6ZV90IHNpemU7CisKKyAgICAgICAgLy8gU2VhcmNoIHN0YXRpYyBzZW5zb3IgbGlzdC4KKyAgICAgICAgc2l6ZSA9IG1TZW5zb3JNYW5hZ2VyLT5nZXRTZW5zb3JMaXN0KCZsaXN0KTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0U2Vuc29yTGlzdCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICV6ZCIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgaWYgKGxpc3RbaV0tPmdldEhhbmRsZSgpID09IGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAqbGlzdFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlYXJjaCBkeW5hbWljIHNlbnNvciBsaXN0LgorICAgICAgICBWZWN0b3I8U2Vuc29yPiBkeW5MaXN0OworICAgICAgICBzaXplID0gbVNlbnNvck1hbmFnZXItPmdldER5bmFtaWNTZW5zb3JMaXN0KGR5bkxpc3QpOworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXREeW5hbWljU2Vuc29yTGlzdCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICV6ZCIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgaWYgKGR5bkxpc3RbaV0uZ2V0SGFuZGxlKCkgPT0gaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGR5bkxpc3RbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKworICAgIHN0YXRpYyBQb3NlRXZlbnQgcGFyc2VFdmVudChjb25zdCBBU2Vuc29yRXZlbnQmIGV2ZW50LCBEYXRhRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxpbnQzMl90PiogZGlzY29udGludXR5Q291bnQpIHsKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgRGF0YUZvcm1hdDo6a1F1YXRlcm5pb246IHsKKyAgICAgICAgICAgICAgICBFaWdlbjo6UXVhdGVybmlvbmYgcXVhdChldmVudC5kYXRhWzNdLCBldmVudC5kYXRhWzBdLCBldmVudC5kYXRhWzFdLCBldmVudC5kYXRhWzJdKTsKKyAgICAgICAgICAgICAgICAvLyBBZGFwdCB0byBkaWZmZXJlbnQgZnJhbWUgY29udmVudGlvbi4KKyAgICAgICAgICAgICAgICBxdWF0ICo9IHJvdGF0ZVgoLU1fUElfMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBvc2VFdmVudHtQb3NlM2YocXVhdCksIHN0ZDo6b3B0aW9uYWw8VHdpc3QzZj4oKSwgZmFsc2V9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIERhdGFGb3JtYXQ6OmtSb3RhdGlvblZlY3RvcnNBbmREaXNjb250aW51aXR5Q291bnQ6IHsKKyAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yM2Ygcm90YXRpb24gPSB7ZXZlbnQuaGVhZF90cmFja2VyLnJ4LCBldmVudC5oZWFkX3RyYWNrZXIucnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmhlYWRfdHJhY2tlci5yen07CisgICAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNmIHR3aXN0ID0ge2V2ZW50LmhlYWRfdHJhY2tlci52eCwgZXZlbnQuaGVhZF90cmFja2VyLnZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5oZWFkX3RyYWNrZXIudnp9OworICAgICAgICAgICAgICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiBxdWF0ID0gcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24ocm90YXRpb24pOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdSZWZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgIWRpc2NvbnRpbnV0eUNvdW50LT5oYXNfdmFsdWUoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludXR5Q291bnQtPnZhbHVlKCkgIT0gZXZlbnQuaGVhZF90cmFja2VyLmRpc2NvbnRpbnVpdHlfY291bnQ7CisgICAgICAgICAgICAgICAgKmRpc2NvbnRpbnV0eUNvdW50ID0gZXZlbnQuaGVhZF90cmFja2VyLmRpc2NvbnRpbnVpdHlfY291bnQ7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zZUV2ZW50e1Bvc2UzZihxdWF0KSwgVHdpc3QzZihFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSwgdHdpc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXdSZWZlcmVuY2V9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgc2Vuc29yIHR5cGU6ICVkIiwgc3RhdGljX2Nhc3Q8aW50Pihmb3JtYXQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGQ6OnVuaXF1ZV9wdHI8U2Vuc29yUG9zZVByb3ZpZGVyPiBTZW5zb3JQb3NlUHJvdmlkZXI6OmNyZWF0ZShjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbmVyKiBsaXN0ZW5lcikgeworICAgIHJldHVybiBTZW5zb3JQb3NlUHJvdmlkZXJJbXBsOjpjcmVhdGUocGFja2FnZU5hbWUsIGxpc3RlbmVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Y2Q0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3ItdGVzdC5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiU3RpbGxuZXNzRGV0ZWN0b3IuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOwordXNpbmcgT3B0aW9ucyA9IFN0aWxsbmVzc0RldGVjdG9yOjpPcHRpb25zOworCitjbGFzcyBTdGlsbG5lc3NEZXRlY3RvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBtRGVmYXVsdFZhbHVlID0gR2V0UGFyYW0oKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBib29sIG1EZWZhdWx0VmFsdWU7Cit9OworCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBTdGlsbCkgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3aXRoaW5UaHJlc2hvbGQgPQorICAgICAgICAgICAgYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC4zLCAtMC4zLCAwKSwgcm90YXRlWCgwLjAxKSAqIHJvdGF0ZVkoLTAuMDEpKTsKKworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgzMDAsIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgzMDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDYwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDk5OSwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDk5OSkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEwMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTAwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBaZXJvRHVyYXRpb24pIHsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBkZXRlY3RvcihPcHRpb25zey5kZWZhdWx0VmFsdWUgPSBtRGVmYXVsdFZhbHVlLCAud2luZG93RHVyYXRpb24gPSAwfSk7CisgICAgRVhQRUNUX1RSVUUoZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTAwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBOb3RTdGlsbFRyYW5zbGF0aW9uKSB7CisgICAgU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoT3B0aW9uc3suZGVmYXVsdFZhbHVlID0gbURlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucm90YXRpb25hbFRocmVzaG9sZCA9IDAuMDV9KTsKKworICAgIGNvbnN0IFBvc2UzZiBiYXNlbGluZShWZWN0b3IzZnsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHdpdGhpblRocmVzaG9sZCA9CisgICAgICAgICAgICBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigwLjMsIC0wLjMsIDApLCByb3RhdGVYKDAuMDEpICogcm90YXRlWSgtMC4wMSkpOworICAgIGNvbnN0IFBvc2UzZiBvdXRzaWRlVGhyZXNob2xkID0gYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMSwgMSwgMCkpOworCisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDMwMCwgb3V0c2lkZVRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgzMDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDYwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEyOTksIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0ZBTFNFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMjk5KSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTMwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMzAwKSk7Cit9CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIE5vdFN0aWxsUm90YXRpb24pIHsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBkZXRlY3RvcihPcHRpb25zey5kZWZhdWx0VmFsdWUgPSBtRGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpbmRvd0R1cmF0aW9uID0gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsVGhyZXNob2xkID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbmFsVGhyZXNob2xkID0gMC4wNX0pOworCisgICAgY29uc3QgUG9zZTNmIGJhc2VsaW5lKFZlY3RvcjNmezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygd2l0aGluVGhyZXNob2xkID0KKyAgICAgICAgICAgIGJhc2VsaW5lICogUG9zZTNmKFZlY3RvcjNmKDAuMywgLTAuMywgMCksIHJvdGF0ZVgoMC4wMykgKiByb3RhdGVZKC0wLjAzKSk7CisgICAgY29uc3QgUG9zZTNmIG91dHNpZGVUaHJlc2hvbGQgPSBiYXNlbGluZSAqIFBvc2UzZihyb3RhdGVaKDAuMDYpKTsKKworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgzMDAsIG91dHNpZGVUaHJlc2hvbGQpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMzAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoNjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSg2MDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxMjk5LCB3aXRoaW5UaHJlc2hvbGQpOworICAgIEVYUEVDVF9GQUxTRShkZXRlY3Rvci5jYWxjdWxhdGUoMTI5OSkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEzMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTMwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBTdXBwcmVzc2lvbikgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiBvdXRzaWRlVGhyZXNob2xkID0gYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMS4xLCAwLCAwKSk7CisgICAgY29uc3QgUG9zZTNmIG1pZGRsZVBvaW50ID0gYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC41NSwgMCwgMCkpOworCisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMCwgYmFzZWxpbmUpOworICAgIGRldGVjdG9yLnNldElucHV0KDEwMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTAwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDExMDAsIG91dHNpZGVUaHJlc2hvbGQpOworICAgIEVYUEVDVF9GQUxTRShkZXRlY3Rvci5jYWxjdWxhdGUoMTEwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDE1MDAsIG1pZGRsZVBvaW50KTsKKyAgICBFWFBFQ1RfRkFMU0UoZGV0ZWN0b3IuY2FsY3VsYXRlKDE1MDApKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGV0ZWN0b3IuY2FsY3VsYXRlKDE5OTkpKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMjAwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBSZXNldCkgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3aXRoaW5UaHJlc2hvbGQgPQorICAgICAgICAgICAgYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC4zLCAtMC4zLCAwKSwgcm90YXRlWCgwLjAxKSAqIHJvdGF0ZVkoLTAuMDEpKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgzMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDMwMCkpOworICAgIGRldGVjdG9yLnJlc2V0KCk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoNjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSg2MDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg5MDAsIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSg5MDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxMjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgxMjAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTU5OSwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDE1OTkpKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxNjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX1RSVUUoZGV0ZWN0b3IuY2FsY3VsYXRlKDE2MDApKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFN0aWxsbmVzc0RldGVjdG9yVGVzdFBhcmFtZXRyaXplZCwgU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhmYWxzZSwgdHJ1ZSkpOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlN2M4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN0aWxsbmVzc0RldGVjdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK1N0aWxsbmVzc0RldGVjdG9yOjpTdGlsbG5lc3NEZXRlY3Rvcihjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogbU9wdGlvbnMob3B0aW9ucyksIG1Db3NIYWxmUm90YXRpb25hbFRocmVzaG9sZChjb3MobU9wdGlvbnMucm90YXRpb25hbFRocmVzaG9sZCAvIDIpKSB7fQorCit2b2lkIFN0aWxsbmVzc0RldGVjdG9yOjpyZXNldCgpIHsKKyAgICBtRmlmby5jbGVhcigpOworICAgIG1XaW5kb3dGdWxsID0gZmFsc2U7CisgICAgbVN1cHByZXNzaW9uRGVhZGxpbmUucmVzZXQoKTsKK30KKwordm9pZCBTdGlsbG5lc3NEZXRlY3Rvcjo6c2V0SW5wdXQoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgaW5wdXQpIHsKKyAgICBtRmlmby5wdXNoX2JhY2soVGltZXN0YW1wZWRQb3Nle3RpbWVzdGFtcCwgaW5wdXR9KTsKKyAgICBkaXNjYXJkT2xkKHRpbWVzdGFtcCk7Cit9CisKK2Jvb2wgU3RpbGxuZXNzRGV0ZWN0b3I6OmNhbGN1bGF0ZShpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGRpc2NhcmRPbGQodGltZXN0YW1wKTsKKworICAgIC8vIENoZWNrIHdoZXRoZXIgYWxsIHRoZSBwb3NlcyBpbiB0aGUgcXVldWUgYXJlIGluIHRoZSBwcm94aW1pdHkgb2YgdGhlIG5ldyBvbmUuIFdlIHdhbnQgdG8gZG8KKyAgICAvLyB0aGlzIGJlZm9yZSBjaGVja2luZyB0aGUgb3ZlcnJpZGluZyBjb25kaXRpb25zIGJlbG93LCBpbiBvcmRlciB0byB1cGRhdGUgdGhlIHN1cHByZXNzaW9uCisgICAgLy8gZGVhZGxpbmUgY29ycmVjdGx5LiBXZSBhbHdheXMgZ28gZnJvbSBlbmQgdG8gc3RhcnQsIHRvIGZpbmQgdGhlIG1vc3QgcmVjZW50IHBvc2UgdGhhdAorICAgIC8vIHZpb2xhdGVkIHN0aWxsbmVzcyBhbmQgdXBkYXRlIHRoZSBzdXBwcmVzc2lvbiBkZWFkbGluZSBpZiBpdCBoYXMgbm90IGJlZW4gc2V0IG9yIGlmIHRoZSBuZXcKKyAgICAvLyBvbmUgZW5kcyBhZnRlciB0aGUgY3VycmVudCBvbmUuCisgICAgYm9vbCBtb3ZlZCA9IGZhbHNlOworCisgICAgaWYgKCFtRmlmby5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdGVyID0gbUZpZm8ucmJlZ2luKCkgKyAxOyBpdGVyICE9IG1GaWZvLnJlbmQoKTsgKytpdGVyKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBldmVudCA9ICppdGVyOworICAgICAgICAgICAgaWYgKCFhcmVOZWFyKGV2ZW50LnBvc2UsIG1GaWZvLmJhY2soKS5wb3NlKSkgeworICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBzdXBwcmVzc2lvbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3aW5kb3cuCisgICAgICAgICAgICAgICAgaW50NjRfdCBkZWFkbGluZSA9IGV2ZW50LnRpbWVzdGFtcCArIG1PcHRpb25zLndpbmRvd0R1cmF0aW9uOworICAgICAgICAgICAgICAgIGlmICghbVN1cHByZXNzaW9uRGVhZGxpbmUuaGFzX3ZhbHVlKCkgfHwgbVN1cHByZXNzaW9uRGVhZGxpbmUudmFsdWUoKSA8IGRlYWRsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwcmVzc2lvbkRlYWRsaW5lID0gZGVhZGxpbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSB3aW5kb3cgaGFzIG5vdCBiZWVuIGZ1bGwsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICBpZiAoIW1XaW5kb3dGdWxsKSB7CisgICAgICAgIHJldHVybiBtT3B0aW9ucy5kZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLy8gRm9yY2UgImluIG1vdGlvbiIgd2hpbGUgdGhlIHN1cHByZXNzaW9uIGRlYWRsaW5lIGlzIGFjdGl2ZS4KKyAgICBpZiAobVN1cHByZXNzaW9uRGVhZGxpbmUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAhbW92ZWQ7Cit9CisKK3ZvaWQgU3RpbGxuZXNzRGV0ZWN0b3I6OmRpc2NhcmRPbGQoaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgd2luZG93IGR1cmF0aW9uIGJlaW5nIHplcm8gKGFsd2F5cyBjb25zaWRlcmVkIGZ1bGwpLgorICAgIGlmIChtT3B0aW9ucy53aW5kb3dEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIG1GaWZvLmNsZWFyKCk7CisgICAgICAgIG1XaW5kb3dGdWxsID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgYW55IGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSB0aGF0IGFyZSBvbGRlciB0aGFuIHRoZSB3aW5kb3cuIElmIHRoZXJlIHdlcmUgYW55IHN1Y2gKKyAgICAvLyBldmVudHMgd2UgY29uc2lkZXIgdGhlIHdpbmRvdyBmdWxsLgorICAgIGNvbnN0IGludDY0X3Qgd2luZG93U3RhcnQgPSB0aW1lc3RhbXAgLSBtT3B0aW9ucy53aW5kb3dEdXJhdGlvbjsKKyAgICB3aGlsZSAoIW1GaWZvLmVtcHR5KCkgJiYgbUZpZm8uZnJvbnQoKS50aW1lc3RhbXAgPD0gd2luZG93U3RhcnQpIHsKKyAgICAgICAgbVdpbmRvd0Z1bGwgPSB0cnVlOworICAgICAgICBtRmlmby5wb3BfZnJvbnQoKTsKKyAgICB9CisKKyAgICAvLyBFeHBpcmUgdGhlIHN1cHByZXNzaW9uIGRlYWRsaW5lLgorICAgIGlmIChtU3VwcHJlc3Npb25EZWFkbGluZS5oYXNfdmFsdWUoKSAmJiBtU3VwcHJlc3Npb25EZWFkbGluZSA8PSB0aW1lc3RhbXApIHsKKyAgICAgICAgbVN1cHByZXNzaW9uRGVhZGxpbmUucmVzZXQoKTsKKyAgICB9Cit9CisKK2Jvb2wgU3RpbGxuZXNzRGV0ZWN0b3I6OmFyZU5lYXIoY29uc3QgUG9zZTNmJiBwb3NlMSwgY29uc3QgUG9zZTNmJiBwb3NlMikgY29uc3QgeworICAgIC8vIENoZWNrIHRyYW5zbGF0aW9uLiBXZSB1c2UgdGhlIEwxIG5vcm0gdG8gcmVkdWNlIGNvbXB1dGF0aW9uYWwgbG9hZCBvbiBleHBlbnNlIG9mIGFjY3VyYWN5LgorICAgIC8vIFRoZSBMMSBub3JtIGlzIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgYWN0dWFsIChMMikgbm9ybSwgc28gdGhpcyBhcHByb2FjaCB3aWxsIGVyciBvbiB0aGUgc2lkZQorICAgIC8vIG9mICJub3QgbmVhciIuCisgICAgaWYgKChwb3NlMS50cmFuc2xhdGlvbigpIC0gcG9zZTIudHJhbnNsYXRpb24oKSkubHBOb3JtPDE+KCkgPiBtT3B0aW9ucy50cmFuc2xhdGlvbmFsVGhyZXNob2xkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBvcmllbnRhdGlvbi4KKyAgICAvLyBUaGUgYW5nbGUgeCBiZXR3ZWVuIHRoZSBxdWF0ZXJuaW9ucyBpcyBncmVhdGVyIHRoYW4gdGhhdCB0aHJlc2hvbGQgaWZmCisgICAgLy8gY29zKHgvMikgPCBjb3ModGhyZXNob2xkLzIpLgorICAgIC8vIGNvcyh4LzIpIGNhbiBiZSBlZmZpY2llbnRseSBjYWxjdWxhdGVkIGFzIHRoZSBkb3QgcHJvZHVjdCBvZiBib3RoIHF1YXRlcm5pb25zLgorICAgIGlmIChwb3NlMS5yb3RhdGlvbigpLmRvdChwb3NlMi5yb3RhdGlvbigpKSA8IG1Db3NIYWxmUm90YXRpb25hbFRocmVzaG9sZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0YjJkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpbmNsdWRlIDxtZWRpYS9Qb3NlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogR2l2ZW4gYSBzdHJlYW0gb2YgcG9zZXMsIGRldGVybWluZXMgaWYgdGhlIHBvc2UgaXMgc3RhYmxlICgic3RpbGwiKS4KKyAqIFN0aWxsbmVzcyBpcyBkZWZpbmVkIGFzIGFsbCBwb3NlcyBpbiB0aGUgcmVjZW50IGhpc3RvcnkgKCJ3aW5kb3ciKSBiZWluZyBuZWFyIHRoZSBtb3N0IHJlY2VudAorICogc2FtcGxlLgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKgorICogU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoU3RpbG5lc3NEZXRlY3Rvcjo6T3B0aW9uc3suLi59KTsKKyAqCisgKiB3aGlsZSAoLi4uKSB7CisgKiAgICBkZXRlY3Rvci5zZXRJbnB1dCh0aW1lc3RhbXAsIHBvc2UpOworICogICAgYm9vbCBzdGlsbCA9IGRldGVjdG9yLmNhbGN1bGF0ZSh0aW1lc3RhbXApOworICogfQorICoKKyAqIFRoZSBkZXRlY3Rpb24gaXMgbm90IGNvbnNpZGVyZWQgcmVsaWFibGUgdW50aWwgYSBzdWZmaWNpZW50IG51bWJlciBvZiBzYW1wbGVzIGhhcyBiZWVuIHByb3ZpZGVkCisgKiBmb3IgYW4gaW5pdGlhbCBmaWxsLXVwIG9mIHRoZSB3aW5kb3cuIER1cmluZyB0aGF0IHRpbWUsIHRoZSBkZXRlY3RvciB3aWxsIHJldHVybiB3aGF0ZXZlciBkZWZhdWx0CisgKiB2YWx1ZSBoYXMgYmVlbiBjb25maWd1cmVkLgorICogVGhlIHJlc2V0KCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGVtcHR5IHRoZSB3aW5kb3cgYWdhaW4gYW5kIGdldCBiYWNrIHRvIHRoaXMgaW5pdGlhbCBzdGF0ZS4KKyAqIEluIHRoZSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHdpbmRvdyBzaXplIGJlaW5nIDAsIHRoZSBzdGF0ZSB3aWxsIGFsd2F5cyBiZSBjb25zaWRlcmVkICJzdGlsbCIuCisgKi8KK2NsYXNzIFN0aWxsbmVzc0RldGVjdG9yIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGRldGVjdG9yLgorICAgICAqLworICAgIHN0cnVjdCBPcHRpb25zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCBmaWxsIG9mIHRoZSB3aW5kb3csIHNob3VsZCB3ZSBjb25zaWRlciB0aGUgc3RhdGUgc3RpbGw/CisgICAgICAgICAqLworICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgbG9uZyBpcyB0aGUgd2luZG93LCBpbiB0aWNrcy4gVGhlIHNwZWNpYWwgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIGlzCisgICAgICAgICAqIGFsd2F5cyBjb25zaWRlcmVkIHN0aWxsLgorICAgICAgICAgKi8KKyAgICAgICAgaW50NjRfdCB3aW5kb3dEdXJhdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvdyBtdWNoIG9mIGEgdHJhbnNsYXRpb25hbCBkZXZpYXRpb24gZnJvbSB0aGUgdGFyZ2V0IChpbiBtZXRlcnMpIGlzIGNvbnNpZGVyZWQgbW90aW9uLgorICAgICAgICAgKiBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHF1YW50aXR5IC0gdGhlIGFjdHVhbCB0aHJlc2hvbGQgbWlnaHQgYmUgYSBsaXR0bGUgZGlmZmVyZW50IGFzIHdlCisgICAgICAgICAqIHRyYWRlLW9mZiBhY2N1cmFjeSB3aXRoIGNvbXB1dGF0aW9uYWwgZWZmaWNpZW5jeS4KKyAgICAgICAgICovCisgICAgICAgIGZsb2F0IHRyYW5zbGF0aW9uYWxUaHJlc2hvbGQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgbXVjaCBvZiBhIHJvdGF0aW9uYWwgZGV2aWF0aW9uIGZyb20gdGhlIHRhcmdldCAoaW4gcmFkaWFucykgaXMgY29uc2lkZXJlZCBtb3Rpb24uCisgICAgICAgICAqIFRoaXMgaXMgYW4gYXBwcm94aW1hdGUgcXVhbnRpdHkgLSB0aGUgYWN0dWFsIHRocmVzaG9sZCBtaWdodCBiZSBhIGxpdHRsZSBkaWZmZXJlbnQgYXMgd2UKKyAgICAgICAgICogdHJhZGUtb2ZmIGFjY3VyYWN5IHdpdGggY29tcHV0YXRpb25hbCBlZmZpY2llbmN5LgorICAgICAgICAgKi8KKyAgICAgICAgZmxvYXQgcm90YXRpb25hbFRocmVzaG9sZDsKKyAgICB9OworCisgICAgLyoqIEN0b3IuICovCisgICAgZXhwbGljaXQgU3RpbGxuZXNzRGV0ZWN0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgICAvKiogQ2xlYXIgdGhlIHdpbmRvdy4gKi8KKyAgICB2b2lkIHJlc2V0KCk7CisgICAgLyoqIFB1c2ggYSBuZXcgc2FtcGxlLiAqLworICAgIHZvaWQgc2V0SW5wdXQoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgaW5wdXQpOworICAgIC8qKiBDYWxjdWxhdGUgd2hldGhlciB0aGUgc3RyZWFtIGlzIHN0aWxsIGF0IHRoZSBnaXZlbiB0aW1lc3RhbXAuICovCisgICAgYm9vbCBjYWxjdWxhdGUoaW50NjRfdCB0aW1lc3RhbXApOworCisgIHByaXZhdGU6CisgICAgc3RydWN0IFRpbWVzdGFtcGVkUG9zZSB7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICBQb3NlM2YgcG9zZTsKKyAgICB9OworCisgICAgY29uc3QgT3B0aW9ucyBtT3B0aW9uczsKKyAgICAvLyBQcmVjYWxjdWxhdGVkIGNvcyhtT3B0aW9ucy5yb3RhdGlvbmFsVGhyZXNob2xkIC8gMikKKyAgICBjb25zdCBmbG9hdCBtQ29zSGFsZlJvdGF0aW9uYWxUaHJlc2hvbGQ7CisgICAgc3RkOjpkZXF1ZTxUaW1lc3RhbXBlZFBvc2U+IG1GaWZvOworICAgIGJvb2wgbVdpbmRvd0Z1bGwgPSBmYWxzZTsKKyAgICAvLyBBcyBzb29uIGFzIG1vdGlvbiBpcyBkZXRlY3RlZCwgdGhpcyB3aWxsIGJlIHNldCBmb3IgdGhlIHRpbWUgb2YgZGV0ZWN0aW9uICsgd2luZG93IGR1cmF0aW9uLAorICAgIC8vIGFuZCBkdXJpbmcgdGhpcyB0aW1lIHdlIHdpbGwgYWx3YXlzIGNvbnNpZGVyIG91dHNlbHZlcyBpbiBtb3Rpb24gd2l0aG91dCBjaGVja2luZy4gVGhpcyBpcworICAgIC8vIHVzZWQgZm9yIGh5dGVyZXNpcyBwdXJwb3Nlcywgc2luY2UgYmVjYXVzZSBvZiB0aGUgYXBwcm94aW1hdGUgbWV0aG9kIHdlIHVzZSBmb3IgZGV0ZXJtaW5pbmcKKyAgICAvLyBzdGlsbG5lc3MsIHdlIG1heSB0b2dnbGUgYmFjayBhbmQgZm9ydGggYXQgYSByYXRlIGZhc3RlciB0aGFuIHRoZSB3aW5kb3cgc2lkZS4KKyAgICBzdGQ6Om9wdGlvbmFsPGludDY0X3Q+IG1TdXBwcmVzc2lvbkRlYWRsaW5lOworCisgICAgYm9vbCBhcmVOZWFyKGNvbnN0IFBvc2UzZiYgcG9zZTEsIGNvbnN0IFBvc2UzZiYgcG9zZTIpIGNvbnN0OworICAgIHZvaWQgZGlzY2FyZE9sZChpbnQ2NF90IHRpbWVzdGFtcCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvVGVzdFV0aWwuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9UZXN0VXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzZkODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvVGVzdFV0aWwuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisjaW5jbHVkZSAibWVkaWEvVHdpc3QuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGZsb2F0IGtQb3NlQ29tcGFyaXNvblByZWNpc2lvbiA9IDFlLTU7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUaGVzZSBzcGVjaWFsaXphdGlvbnMgbWFrZSB7RVhQRUNULEFTU0VSVH1fe0VRLE5FfSB3b3JrIGNvcnJlY3RseSBmb3IgUG9zZTNmLCBUd2lzdDNmLCBWZWN0b3IzZgorLy8gYW5kIFF1YXRlcm5pb25mLgorbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPD4KK2lubGluZSBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVE8YW5kcm9pZDo6bWVkaWE6OlBvc2UzZiwgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZj4oCisgICAgICAgIGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLCBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZiYgbGhzLAorICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6UG9zZTNmJiByaHMpIHsKKyAgICBpZiAobGhzLmlzQXBwcm94KHJocywga1Bvc2VDb21wYXJpc29uUHJlY2lzaW9uKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIHJldHVybiBDbXBIZWxwZXJFUUZhaWx1cmUobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlck5FPGFuZHJvaWQ6Om1lZGlhOjpQb3NlM2YsIGFuZHJvaWQ6Om1lZGlhOjpQb3NlM2Y+KAorICAgICAgICBjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpQb3NlM2YmIGxocywKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZiYgcmhzKSB7CisgICAgaWYgKCFsaHMuaXNBcHByb3gocmhzLCBrUG9zZUNvbXBhcmlzb25QcmVjaXNpb24pKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIENtcEhlbHBlckVRRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVE8YW5kcm9pZDo6bWVkaWE6OlR3aXN0M2YsIGFuZHJvaWQ6Om1lZGlhOjpUd2lzdDNmPigKKyAgICAgICAgY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLCBjb25zdCBhbmRyb2lkOjptZWRpYTo6VHdpc3QzZiYgbGhzLAorICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6VHdpc3QzZiYgcmhzKSB7CisgICAgaWYgKGxocy5pc0FwcHJveChyaHMsIGtQb3NlQ29tcGFyaXNvblByZWNpc2lvbikpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJORTxhbmRyb2lkOjptZWRpYTo6VHdpc3QzZiwgYW5kcm9pZDo6bWVkaWE6OlR3aXN0M2Y+KAorICAgICAgICBjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpUd2lzdDNmJiBsaHMsCisgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpUd2lzdDNmJiByaHMpIHsKKyAgICBpZiAoIWxocy5pc0FwcHJveChyaHMsIGtQb3NlQ29tcGFyaXNvblByZWNpc2lvbikpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUTxFaWdlbjo6VmVjdG9yM2YsIEVpZ2VuOjpWZWN0b3IzZj4oY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWlnZW46OlZlY3RvcjNmJiByaHMpIHsKKyAgICBpZiAobGhzLmlzQXBwcm94KHJocykpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJORTxFaWdlbjo6VmVjdG9yM2YsIEVpZ2VuOjpWZWN0b3IzZj4oY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWlnZW46OlZlY3RvcjNmJiByaHMpIHsKKyAgICBpZiAoIWxocy5pc0FwcHJveChyaHMpKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIENtcEhlbHBlckVRRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVE8RWlnZW46OlF1YXRlcm5pb25mLCBFaWdlbjo6UXVhdGVybmlvbmY+KAorICAgICAgICBjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sIGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgbGhzLAorICAgICAgICBjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIHJocykgeworICAgIC8vIE5lZ2F0aW5nIHRoZSBjb2VmcyByZXN1bHRzIGluIGFuIGVxdWl2YWxlbnQgcXVhdGVybmlvbi4KKyAgICBpZiAobGhzLmlzQXBwcm94KHJocykgfHwgbGhzLmlzQXBwcm94KEVpZ2VuOjpRdWF0ZXJuaW9uZigtcmhzLmNvZWZmcygpKSkpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJORTxFaWdlbjo6UXVhdGVybmlvbmYsIEVpZ2VuOjpRdWF0ZXJuaW9uZj4oCisgICAgICAgIGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLCBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBsaHMsCisgICAgICAgIGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgcmhzKSB7CisgICAgLy8gTmVnYXRpbmcgdGhlIGNvZWZzIHJlc3VsdHMgaW4gYW4gZXF1aXZhbGVudCBxdWF0ZXJuaW9uLgorICAgIGlmICghKGxocy5pc0FwcHJveChyaHMpIHx8IGxocy5pc0FwcHJveChFaWdlbjo6UXVhdGVybmlvbmYoLXJocy5jb2VmZnMoKSkpKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIHJldHVybiBDbXBIZWxwZXJFUUZhaWx1cmUobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Ud2lzdC10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Ud2lzdC10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTg0ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1R3aXN0LXRlc3QuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibWVkaWEvVHdpc3QuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorI2luY2x1ZGUgIlRlc3RVdGlsLmgiCisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoVHdpc3QsIERlZmF1bHRDdG9yKSB7CisgICAgVHdpc3QzZiB0d2lzdDsKKyAgICBFWFBFQ1RfRVEodHdpc3QudHJhbnNsYXRpb25hbFZlbG9jaXR5KCksIFZlY3RvcjNmOjpaZXJvKCkpOworICAgIEVYUEVDVF9FUSh0d2lzdC5yb3RhdGlvbmFsVmVsb2NpdHkoKSwgVmVjdG9yM2Y6Olplcm8oKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHR3aXN0LnNjYWxhclJvdGF0aW9uYWxWZWxvY2l0eSgpLCAwKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodHdpc3Quc2NhbGFyVHJhbnNsYXRpb25hbFZlbG9jaXR5KCksIDApOworfQorCitURVNUKFR3aXN0LCBGdWxsQ3RvcikgeworICAgIFZlY3RvcjNmIHJvdHsxLCAyLCAzfTsKKyAgICBWZWN0b3IzZiB0cmFuc3s0LCA1LCA2fTsKKyAgICBUd2lzdDNmIHR3aXN0KHRyYW5zLCByb3QpOworICAgIEVYUEVDVF9FUSh0d2lzdC50cmFuc2xhdGlvbmFsVmVsb2NpdHkoKSwgdHJhbnMpOworICAgIEVYUEVDVF9FUSh0d2lzdC5yb3RhdGlvbmFsVmVsb2NpdHkoKSwgcm90KTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodHdpc3Quc2NhbGFyUm90YXRpb25hbFZlbG9jaXR5KCksIHN0ZDo6c3FydCgxNC5mKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHR3aXN0LnNjYWxhclRyYW5zbGF0aW9uYWxWZWxvY2l0eSgpLCBzdGQ6OnNxcnQoNzcuZikpOworfQorCitURVNUKFR3aXN0LCBJbnRlZ3JhdGUpIHsKKyAgICBWZWN0b3IzZiB0cmFuc3sxLCAyLCAzfTsKKyAgICAvLyA0NSBkZWcvc2VjIGFyb3VuZCBaLgorICAgIFZlY3RvcjNmIHJvdHswLCAwLCBNX1BJXzR9OworICAgIFR3aXN0M2YgdHdpc3QodHJhbnMsIHJvdCk7CisgICAgUG9zZTNmIHBvc2UgPSBpbnRlZ3JhdGUodHdpc3QsIDIuZik7CisKKyAgICBFWFBFQ1RfRVEocG9zZSwgUG9zZTNmKFZlY3RvcjNmezIsIDQsIDZ9LCByb3RhdGVaKE1fUElfMikpKTsKK30KKworVEVTVChUd2lzdCwgRGlmZmVyZW50aWF0ZSkgeworICAgIFBvc2UzZiBwb3NlKFZlY3RvcjNmezIsIDQsIDZ9LCByb3RhdGVaKE1fUElfMikpOworICAgIFR3aXN0M2YgdHdpc3QgPSBkaWZmZXJlbnRpYXRlKHBvc2UsIDIuZik7CisgICAgRVhQRUNUX0VRKHR3aXN0LCBUd2lzdDNmKFZlY3RvcjNmKDEsIDIsIDMpLCBWZWN0b3IzZigwLCAwLCBNX1BJXzQpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1R3aXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Ud2lzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0YzRkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Ud2lzdC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJtZWRpYS9Ud2lzdC5oIgorCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworUG9zZTNmIGludGVncmF0ZShjb25zdCBUd2lzdDNmJiB0d2lzdCwgZmxvYXQgZHQpIHsKKyAgICBFaWdlbjo6VmVjdG9yM2YgdHJhbnNsYXRpb24gPSB0d2lzdC50cmFuc2xhdGlvbmFsVmVsb2NpdHkoKSAqIGR0OworICAgIEVpZ2VuOjpWZWN0b3IzZiByb3RhdGlvblZlY3RvciA9IHR3aXN0LnJvdGF0aW9uYWxWZWxvY2l0eSgpICogZHQ7CisgICAgcmV0dXJuIFBvc2UzZih0cmFuc2xhdGlvbiwgcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24ocm90YXRpb25WZWN0b3IpKTsKK30KKworVHdpc3QzZiBkaWZmZXJlbnRpYXRlKGNvbnN0IFBvc2UzZiYgcG9zZSwgZmxvYXQgZHQpIHsKKyAgICBFaWdlbjo6VmVjdG9yM2YgdHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gcG9zZS50cmFuc2xhdGlvbigpIC8gZHQ7CisgICAgRWlnZW46OlZlY3RvcjNmIHJvdGF0aW9uYWxWZWxvY2l0eSA9IHF1YXRlcm5pb25Ub1JvdGF0aW9uVmVjdG9yKHBvc2Uucm90YXRpb24oKSkgLyBkdDsKKyAgICByZXR1cm4gVHdpc3QzZih0cmFuc2xhdGlvbmFsVmVsb2NpdHksIHJvdGF0aW9uYWxWZWxvY2l0eSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUd2lzdDNmJiB0d2lzdCkgeworICAgIG9zIDw8ICJ0cmFuc2xhdGlvbjogIiA8PCB0d2lzdC50cmFuc2xhdGlvbmFsVmVsb2NpdHkoKS50cmFuc3Bvc2UoKQorICAgICAgIDw8ICIgcm90YXRpb24gdmVjdG9yOiAiIDw8IHR3aXN0LnJvdGF0aW9uYWxWZWxvY2l0eSgpLnRyYW5zcG9zZSgpOworICAgIHJldHVybiBvczsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvSGVhZFRyYWNraW5nTW9kZS5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvSGVhZFRyYWNraW5nTW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDk2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdNb2RlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBNb2RlIG9mIGhlYWQtdHJhY2tpbmcuCisgKi8KK2VudW0gY2xhc3MgSGVhZFRyYWNraW5nTW9kZSB7CisgICAgLyoqIE5vIGhlYWQtdHJhY2tpbmcgLSBzY3JlZW4tdG8taGVhZCBwb3NlIGlzIGFzc3VtZWQgdG8gYmUgaWRlbnRpdHkuICovCisgICAgU1RBVElDLAorICAgIC8qKiBIZWFkIHRyYWNraW5nIGVuYWJsZWQgLSB3b3JsZC10by1zY3JlZW4gcG9zZSBpcyBhc3N1bWVkIHRvIGJlIGlkZW50aXR5LiAqLworICAgIFdPUkxEX1JFTEFUSVZFLAorICAgIC8qKiBGdWxsIHNjcmVlbi10by1oZWFkIHRyYWNraW5nIGVuYWJsZWQuICovCisgICAgU0NSRUVOX1JFTEFUSVZFLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQ0YmUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJIZWFkVHJhY2tpbmdNb2RlLmgiCisjaW5jbHVkZSAiUG9zZS5oIgorI2luY2x1ZGUgIlR3aXN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogTWFpbiBlbnRyeS1wb2ludCBmb3IgdGhpcyBsaWJyYXJ5LgorICogVGhpcyBpbnRlcmZhY2VzIGVuY29tcGFzc2VzIGFsbCB0aGUgcHJvY2Vzc2luZyByZXF1aXJlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGhlYWQtdG8tc3RhZ2UgcG9zZQorICogdXNlZCBmb3IgYXVkaW8gdmlydHVhbGl6YXRpb24uCisgKiBUaGUgdXNhZ2UgaW52b2x2ZXMgcGVyaW9kaWMgc2V0dGluZyBvZiB0aGUgaW5wdXRzLCBjYWxsaW5nIGNhbGN1bGF0ZSgpIGFuZCBvYnRhaW5pbmcgdGhlIG91dHB1dHMuCisgKiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRocmVhZC1jb21wYXRpYmxlLgorICovCitjbGFzcyBIZWFkVHJhY2tpbmdQcm9jZXNzb3IgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SGVhZFRyYWNraW5nUHJvY2Vzc29yKCkgPSBkZWZhdWx0OworCisgICAgc3RydWN0IE9wdGlvbnMgeworICAgICAgICBmbG9hdCBtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgZmxvYXQgbWF4Um90YXRpb25hbFZlbG9jaXR5ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgICAgIGludDY0X3QgZnJlc2huZXNzVGltZW91dCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworICAgICAgICBmbG9hdCBwcmVkaWN0aW9uRHVyYXRpb24gPSAwOworICAgICAgICBpbnQ2NF90IGF1dG9SZWNlbnRlcldpbmRvd0R1cmF0aW9uID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCk7CisgICAgICAgIGZsb2F0IGF1dG9SZWNlbnRlclRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgZmxvYXQgYXV0b1JlY2VudGVyUm90YXRpb25hbFRocmVzaG9sZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICBpbnQ2NF90IHNjcmVlblN0aWxsbmVzc1dpbmRvd0R1cmF0aW9uID0gMDsKKyAgICAgICAgZmxvYXQgc2NyZWVuU3RpbGxuZXNzVHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICBmbG9hdCBzY3JlZW5TdGlsbG5lc3NSb3RhdGlvbmFsVGhyZXNob2xkID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgfTsKKworICAgIC8qKiBTZXRzIHRoZSBkZXNpcmVkIGhlYWQtdHJhY2tpbmcgbW9kZS4gKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZSBtb2RlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3b3JsZC10by1oZWFkIHBvc2UgYW5kIGhlYWQgdHdpc3QgKHZlbG9jaXR5KS4KKyAgICAgKiBoZWFkVHdpc3QgaXMgZ2l2ZW4gaW4gdGhlIGhlYWQgY29vcmRpbmF0ZSBmcmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpc3QzZiYgaGVhZFR3aXN0KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3b3JsZC10by1zY3JlZW4gcG9zZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0V29ybGRUb1NjcmVlblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb1NjcmVlbikgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY3JlZW4tdG8tc3RhZ2UgcG9zZSwgdXNlZCBpbiBhbGwgbW9kZXMuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldFNjcmVlblRvU3RhZ2VQb3NlKGNvbnN0IFBvc2UzZiYgc2NyZWVuVG9TdGFnZSkgPSAwOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGlzcGxheSBvcmllbnRhdGlvbi4KKyAgICAgKiBPcmllbnRhdGlvbiBpcyBleHByZXNzZWQgaW4gdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGZyb20gdGhlIHBoeXNpY2FsICJ1cCIgc2lkZSBvZiB0aGUgc2NyZWVuCisgICAgICogdG8gdGhlIGxvZ2ljYWwgInVwIiBzaWRlIG9mIHRoZSBjb250ZW50IGRpc3BsYXllZCB0aGUgc2NyZWVuLiBDb3VudGVyY2xvY2t3aXNlIGFuZ2xlcywgYXMKKyAgICAgKiB2aWV3ZWQgd2hpbGUgZmFjaW5nIHRoZSBzY3JlZW4gYXJlIHBvc2l0aXZlLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkgPSAwOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhbGwgdGhlIHByZXZpb3VzIGlucHV0cyBhbmQgdXBkYXRlIHRoZSBvdXRwdXRzLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBjYWxjdWxhdGUoaW50NjRfdCB0aW1lc3RhbXApID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWdncmVnYXRlIGhlYWQtdG8tc3RhZ2UgcG9zZSAocHJpbWFyeSBvdXRwdXQgb2YgdGhpcyBtb2R1bGUpLgorICAgICAqLworICAgIHZpcnR1YWwgUG9zZTNmIGdldEhlYWRUb1N0YWdlUG9zZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWN0dWFsIGhlYWQtdHJhY2tpbmcgbW9kZSAod2hpY2ggbWF5IGRldmlhdGUgZnJvbSB0aGUgZGVzaXJlZCBvbmUgYXMgbWVudGlvbmVkIGluIHRoZQorICAgICAqIGNsYXNzIGRvY3VtZW50YXRpb24gYWJvdmUpLgorICAgICAqLworICAgIHZpcnR1YWwgSGVhZFRyYWNraW5nTW9kZSBnZXRBY3R1YWxNb2RlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogVGhpcyBjYXVzZXMgdGhlIGN1cnJlbnQgcG9zZXMgZm9yIGJvdGggdGhlIGhlYWQgYW5kL29yIHNjcmVlbiB0byBiZSBjb25zaWRlcmVkICJjZW50ZXIiLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZWNlbnRlcihib29sIHJlY2VudGVySGVhZCA9IHRydWUsIGJvb2wgcmVjZW50ZXJTY3JlZW4gPSB0cnVlKSA9IDA7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmVhdHVyaW5nIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSGVhZFRyYWNraW5nUHJvY2Vzc29yIGludGVyZmFjZS4KKyAqLworc3RkOjp1bmlxdWVfcHRyPEhlYWRUcmFja2luZ1Byb2Nlc3Nvcj4gY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKAorICAgICAgICBjb25zdCBIZWFkVHJhY2tpbmdQcm9jZXNzb3I6Ok9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgIEhlYWRUcmFja2luZ01vZGUgaW5pdGlhbE1vZGUgPSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMpOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9Qb3NlLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9Qb3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MGJiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1Bvc2UuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBBIDYtRG9GIHBvc2UuCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcm9wZXIgcmlnaWQgdHJhbnNmb3JtYXRpb24gKHRyYW5zbGF0aW9uICsgcm90YXRpb24pIGJldHdlZW4gYSByZWZlcmVuY2UKKyAqIGZyYW1lIGFuZCBhIHRhcmdldCBmcmFtZSwKKyAqCisgKiBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2l4X2RlZ3JlZXNfb2ZfZnJlZWRvbQorICovCitjbGFzcyBQb3NlM2YgeworICBwdWJsaWM6CisgICAgLyoqIFR5cGljYWwgcHJlY2lzaW9uIGZvciBpc0FwcHJveCBjb21wYXJpc29ucy4gKi8KKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtEdW1teVByZWNpc2lvbiA9IDFlLTVmOworCisgICAgUG9zZTNmKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgdHJhbnNsYXRpb24sIGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgcm90YXRpb24pCisgICAgICAgIDogbVRyYW5zbGF0aW9uKHRyYW5zbGF0aW9uKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSB7fQorCisgICAgZXhwbGljaXQgUG9zZTNmKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgdHJhbnNsYXRpb24pCisgICAgICAgIDogUG9zZTNmKHRyYW5zbGF0aW9uLCBFaWdlbjo6UXVhdGVybmlvbmY6OklkZW50aXR5KCkpIHt9CisKKyAgICBleHBsaWNpdCBQb3NlM2YoY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiByb3RhdGlvbikKKyAgICAgICAgOiBQb3NlM2YoRWlnZW46OlZlY3RvcjNmOjpaZXJvKCksIHJvdGF0aW9uKSB7fQorCisgICAgUG9zZTNmKCkgOiBQb3NlM2YoRWlnZW46OlZlY3RvcjNmOjpaZXJvKCksIEVpZ2VuOjpRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSkge30KKworICAgIFBvc2UzZihjb25zdCBQb3NlM2YmIG90aGVyKSB7ICp0aGlzID0gb3RoZXI7IH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgdmVjdG9yLW9mLWZsb2F0cyByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBUaGUgdmVjdG9yIGlzIGV4cGVjdGVkIHRvIGhhdmUgZXhhY3RseSA2IGVsZW1lbnRzLCB3aGVyZSB0aGUgZmlyc3QgdGhyZWUgYXJlIGEgdHJhbnNsYXRpb24KKyAgICAgKiB2ZWN0b3IgYW5kIHRoZSBsYXN0IHRocmVlIGFyZSBhIHJvdGF0aW9uIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFJldHVybnMgbnVsbG9wdCBpZiB0aGUgaW5wdXQgdmVjdG9yIGlzIGlsbGVnYWwuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiBmcm9tVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgdmVjKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgaW5zdGFuY2UgdG8gYSB2ZWN0b3Itb2YtZmxvYXRzIHJlcHJlc2VudGF0aW9uLgorICAgICAqIFRoZSB2ZWN0b3Igd2lsbCBoYXZlIGV4YWN0bHkgNiBlbGVtZW50cywgd2hlcmUgdGhlIGZpcnN0IHRocmVlIGFyZSBhIHRyYW5zbGF0aW9uIHZlY3RvciBhbmQKKyAgICAgKiB0aGUgbGFzdCB0aHJlZSBhcmUgYSByb3RhdGlvbiB2ZWN0b3IuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHRvVmVjdG9yKCkgY29uc3Q7CisKKyAgICBQb3NlM2YmIG9wZXJhdG9yPShjb25zdCBQb3NlM2YmIG90aGVyKSB7CisgICAgICAgIG1UcmFuc2xhdGlvbiA9IG90aGVyLm1UcmFuc2xhdGlvbjsKKyAgICAgICAgbVJvdGF0aW9uID0gb3RoZXIubVJvdGF0aW9uOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRWlnZW46OlZlY3RvcjNmIHRyYW5zbGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbVRyYW5zbGF0aW9uOyB9OworICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiByb3RhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1Sb3RhdGlvbjsgfTsKKworICAgIC8qKgorICAgICAqIFJldmVyc2VzIHRoZSByZWZlcmVuY2UgYW5kIHRhcmdldCBmcmFtZXMuCisgICAgICovCisgICAgUG9zZTNmIGludmVyc2UoKSBjb25zdCB7CisgICAgICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiBpbnZSb3RhdGlvbiA9IG1Sb3RhdGlvbi5pbnZlcnNlKCk7CisgICAgICAgIHJldHVybiBQb3NlM2YoLShpbnZSb3RhdGlvbiAqIHRyYW5zbGF0aW9uKCkpLCBpbnZSb3RhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgKGNoYWlucykgdG9nZXRoZXIgdHdvIHBvc2VzLiBCeSBjb252ZW50aW9uLCB0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIHRhcmdldAorICAgICAqIGZyYW1lIG9mIHRoZSBsZWZ0LWhhbmQgcG9zZSBpcyB0aGUgc2FtZSB0aGUgcmVmZXJlbmNlIGZyYW1lIG9mIHRoZSByaWdodC1oYW5kIHBvc2UuCisgICAgICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0b3IgaXMgbm90IGNvbW11dGF0aXZlLgorICAgICAqLworICAgIFBvc2UzZiBvcGVyYXRvciooY29uc3QgUG9zZTNmJiBvdGhlcikgY29uc3QgeworICAgICAgICBQb3NlM2YgcmVzdWx0ID0gKnRoaXM7CisgICAgICAgIHJlc3VsdCAqPSBvdGhlcjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBQb3NlM2YmIG9wZXJhdG9yKj0oY29uc3QgUG9zZTNmJiBvdGhlcikgeworICAgICAgICBtVHJhbnNsYXRpb24gKz0gbVJvdGF0aW9uICogb3RoZXIubVRyYW5zbGF0aW9uOworICAgICAgICBtUm90YXRpb24gKj0gb3RoZXIubVJvdGF0aW9uOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhbiBpbXByZWNpc2UgImZ1enp5IiBjb21wYXJpc29uLCB3aGljaCBpcyBvbmx5IHRvIGJlIHVzZWQgZm9yIHZhbGlkaXR5LXRlc3RpbmcKKyAgICAgKiBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICBib29sIGlzQXBwcm94KGNvbnN0IFBvc2UzZiYgb3RoZXIsIGZsb2F0IHByZWMgPSBrRHVtbXlQcmVjaXNpb24pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtVHJhbnNsYXRpb24gLSBvdGhlci5tVHJhbnNsYXRpb24pLm5vcm0oKSA8IHByZWMgJiYKKyAgICAgICAgICAgICAgIC8vIFF1YXRlcm5pb25zIGFyZSBlcXVpdmFsZW50IHVuZGVyIHNpZ24gaW52ZXJzaW9uLgorICAgICAgICAgICAgICAgKChtUm90YXRpb24uY29lZmZzKCkgLSBvdGhlci5tUm90YXRpb24uY29lZmZzKCkpLm5vcm0oKSA8IHByZWMgfHwKKyAgICAgICAgICAgICAgICAobVJvdGF0aW9uLmNvZWZmcygpICsgb3RoZXIubVJvdGF0aW9uLmNvZWZmcygpKS5ub3JtKCkgPCBwcmVjKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBFaWdlbjo6VmVjdG9yM2YgbVRyYW5zbGF0aW9uOworICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiBtUm90YXRpb247Cit9OworCisvKioKKyAqIFByZXR0eS1wcmludGVyIGZvciBQb3NlM2YuCisgKi8KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBQb3NlM2YmIHBvc2UpOworCisvKioKKyAqIE1vdmUgYmV0d2VlbiB0aGUgJ2Zyb20nIHBvc2UgYW5kIHRoZSAndG8nIHBvc2UsIHdoaWxlIG1ha2luZyBzdXJlIHZlbG9jaXR5IGxpbWl0cyBhcmUgZW5mb3JjZWQuCisgKiBJZiB2ZWxvY2l0eSBsaW1pdHMgYXJlIG5vdCB2aW9sYXRlZCwgcmV0dXJucyB0aGUgJ3RvJyBwb3NlIGFuZCBmYWxzZS4KKyAqIElmIHZlbG9jaXR5IGxpbWl0cyBhcmUgdmlvbGF0ZWQsIHJldHVybnMgcG9zZSBmYXJ0aGVzdCBhbG9uZyB0aGUgcGF0aCB0aGF0IGNhbiBiZSByZWFjaGVkIHdpdGhpbgorICogdGhlIGxpbWl0cywgYW5kIHRydWUuCisgKi8KK3N0ZDo6dHVwbGU8UG9zZTNmLCBib29sPiBtb3ZlV2l0aFJhdGVMaW1pdChjb25zdCBQb3NlM2YmIGZyb20sIGNvbnN0IFBvc2UzZiYgdG8sIGZsb2F0IHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJvdGF0aW9uYWxWZWxvY2l0eSk7CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvU2Vuc29yUG9zZVByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0MjA3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKworI2luY2x1ZGUgPGFuZHJvaWQvc2Vuc29yLmg+CisjaW5jbHVkZSA8c2Vuc29yL1NlbnNvci5oPgorCisjaW5jbHVkZSAiUG9zZS5oIgorI2luY2x1ZGUgIlR3aXN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogQSB1dGlsaXR5IHByb3ZpZGluZyBzdHJlYW1pbmcgb2YgcG9zZSBkYXRhIGZyb20gbW90aW9uIHNlbnNvcnMgcHJvdmlkZWQgYnkgdGhlIFNlbnNvciBGcmFtZXdvcmsuCisgKgorICogQSBsaXZlIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGtlZXBzIGFyb3VuZCBzb21lIHJlc291cmNlcyByZXF1aXJlZCBmb3IgYWNjZXNzaW5nIHNlbnNvcgorICogcmVhZGluZ3MgKGUuZy4gYSB0aHJlYWQgYW5kIGEgcXVldWUpLiBUaG9zZSB3b3VsZCBiZSByZWxlYXNlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBkZWxldGVkLgorICoKKyAqIE9uY2UgYWxpdmUsIGluZGl2aWR1YWwgc2Vuc29ycyBjYW4gYmUgc3Vic2NyaWJlZCB0byB1c2luZyBzdGFydFNlbnNvcigpIGFuZCB1cGRhdGVzIGNhbiBiZQorICogc3RvcHBlZCB2aWEgc3RvcFNlbnNvcigpLiBUaG9zZSB0d28gbWV0aG9kcyBzaG91bGQgbm90IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgYW5kIGNvcnJlY3QgdXNhZ2UKKyAqIGlzIGFzc3VtZWQuCisgKi8KK2NsYXNzIFNlbnNvclBvc2VQcm92aWRlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgSU5WQUxJRF9IQU5ETEUgPSBBU0VOU09SX0lOVkFMSUQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZm9yIGNvbnN1bWluZyBwb3NlLXJlbGF0ZWQgc2Vuc29yIGV2ZW50cy4KKyAgICAgKgorICAgICAqIFRoZSBsaXN0ZW5lciB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBzdHJlYW0gb2YgZXZlbnRzLCBlYWNoIGluY2x1ZGluZzoKKyAgICAgKiAtIEEgaGFuZGxlIG9mIHRoZSBzZW5zb3IgcmVzcG9uc2libGUgZm9yIHRoZSBldmVudC4KKyAgICAgKiAtIFRpbWVzdGFtcC4KKyAgICAgKiAtIFBvc2UuCisgICAgICogLSBPcHRpb25hbCB0d2lzdCAodGltZS1kZXJpdmF0aXZlIG9mIHBvc2UpLgorICAgICAqCisgICAgICogU2Vuc29ycyBoYXZpbmcgb25seSBvcmllbnRhdGlvbiBkYXRhIHdpbGwgaGF2ZSB0aGUgdHJhbnNsYXRpb24gcGFydCBvZiB0aGUgcG9zZSBzZXQgdG8KKyAgICAgKiBpZGVudGl0eS4KKyAgICAgKgorICAgICAqIEV2ZW50cyBhcmUgZGVsaXZlcmVkIGluIGEgc2VyaWFsaXplZCBtYW5uZXIgKGkuZS4gY2FsbGJhY2tzIGRvIG5vdCBuZWVkIHRvIGJlIHJlZW50cmFudCkuCisgICAgICogQ2FsbGJhY2tzIHNob3VsZCBub3QgYmxvY2suCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgeworICAgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Qb3NlKGludDY0X3QgdGltZXN0YW1wLCBpbnQzMl90IGhhbmRsZSwgY29uc3QgUG9zZTNmJiBwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8VHdpc3QzZj4mIHR3aXN0LCBib29sIGlzTmV3UmVmZXJlbmNlKSA9IDA7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU2Vuc29yUG9zZVByb3ZpZGVyIGluc3RhbmNlLgorICAgICAqIEV2ZW50cyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgbGlzdGVuZXIgYXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgaXMga2VwdCBhbGl2ZS4KKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgQ2xpZW50J3MgcGFja2FnZSBuYW1lLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGdldCB0aGUgZXZlbnRzLgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbHB0ciBpbiBjYXNlIG9mIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTZW5zb3JQb3NlUHJvdmlkZXI+IGNyZWF0ZShjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSwgTGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAgIHZpcnR1YWwgflNlbnNvclBvc2VQcm92aWRlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHJlY2VpdmluZyBwb3NlIHVwZGF0ZXMgZnJvbSBhIGdpdmVuIHNlbnNvci4KKyAgICAgKiBBdHRlbXB0aW5nIHRvIHN0YXJ0IGEgc2Vuc29yIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqIEBwYXJhbSBzZW5zb3IgVGhlIHNlbnNvciB0byBzdWJzY3JpYmUgdG8uCisgICAgICogQHBhcmFtIHNhbXBsaW5nUGVyaW9kIFNhbXBsaW5nIGludGVydmFsLCBpbiBtaWNyb3NlY29uZHMuIEFjdHVhbCByYXRlIG1pZ2h0IGJlIHNsaWdodGx5CisgICAgICogZGlmZmVyZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgc3VjY2VlZGVkLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzdGFydFNlbnNvcihpbnQzMl90IHNlbnNvciwgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBzYW1wbGluZ1BlcmlvZCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCBhIHNlbnNvciwgcHJldmlvdXNseSBzdGFydGVkIHdpdGggc3RhcnRTZW5zb3IoKS4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIHN0b3AgYWxsIHNlbnNvcnMKKyAgICAgKiBiZWZvcmUgZGVsZXRpbmcgdGhlIFNlbnNvclBvc2VQcm92aWRlciBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlIFRoZSBzZW5zb3IgaGFuZGxlLCBhcyBwcm92aWRlZCB0byBzdGFydFNlbnNvcigpLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzdG9wU2Vuc29yKGludDMyX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZW5zb3Igb3IgbnVsbG9wdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIFRoZSBTZW5zb3Igb2JqZWN0IGhhcyBjb25zdCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgKiBkaXNjb3ZlciBwcm9wZXJ0aWVzIG9mIHRoZSBzZW5zb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPGNvbnN0IFNlbnNvcj4gZ2V0U2Vuc29yQnlIYW5kbGUoaW50MzJfdCBoYW5kbGUpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1R3aXN0LmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9Ud2lzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MWNlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9Ud2lzdC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKworI2luY2x1ZGUgIlBvc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBBIDYtRG9GIHR3aXN0LgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSB0cmFuc2xhdGlvbmFsIGFuZCByb3RhdGlvbmFsIHZlbG9jaXR5IG9mIGEgcmlnaWQgb2JqZWN0LCB0eXBpY2FsbHkKKyAqIHJlbGF0aXZlIHRvIGl0cyBvd24gY29vcmRpbmF0ZS1mcmFtZS4KKyAqIEl0IGlzIGNyZWF0ZWQgYnkgdHdvIDMtdmVjdG9ycywgb25lIHJlcHJlc2VudGluZyBsaW5lYXIgbW90aW9uIHBlciB0aW1lLXVuaXQgYW5kIHRoZSBvdGhlciwgYQorICogcm90YXRpb24tdmVjdG9yIGluIHJhZGlhbnMgcGVyIHRpbWUtdW5pdCAocmlnaHQtaGFuZGVkKS4KKyAqLworY2xhc3MgVHdpc3QzZiB7CisgIHB1YmxpYzoKKyAgICBUd2lzdDNmKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgdHJhbnNsYXRpb25hbFZlbG9jaXR5LCBjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHJvdGF0aW9uYWxWZWxvY2l0eSkKKyAgICAgICAgOiBtVHJhbnNsYXRpb25hbFZlbG9jaXR5KHRyYW5zbGF0aW9uYWxWZWxvY2l0eSksIG1Sb3RhdGlvbmFsVmVsb2NpdHkocm90YXRpb25hbFZlbG9jaXR5KSB7fQorCisgICAgVHdpc3QzZigpIDogVHdpc3QzZihFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSwgRWlnZW46OlZlY3RvcjNmOjpaZXJvKCkpIHt9CisKKyAgICBUd2lzdDNmKGNvbnN0IFR3aXN0M2YmIG90aGVyKSB7ICp0aGlzID0gb3RoZXI7IH0KKworICAgIFR3aXN0M2YmIG9wZXJhdG9yPShjb25zdCBUd2lzdDNmJiBvdGhlcikgeworICAgICAgICBtVHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gb3RoZXIubVRyYW5zbGF0aW9uYWxWZWxvY2l0eTsKKyAgICAgICAgbVJvdGF0aW9uYWxWZWxvY2l0eSA9IG90aGVyLm1Sb3RhdGlvbmFsVmVsb2NpdHk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFaWdlbjo6VmVjdG9yM2YgdHJhbnNsYXRpb25hbFZlbG9jaXR5KCkgY29uc3QgeyByZXR1cm4gbVRyYW5zbGF0aW9uYWxWZWxvY2l0eTsgfQorICAgIEVpZ2VuOjpWZWN0b3IzZiByb3RhdGlvbmFsVmVsb2NpdHkoKSBjb25zdCB7IHJldHVybiBtUm90YXRpb25hbFZlbG9jaXR5OyB9CisKKyAgICBmbG9hdCBzY2FsYXJUcmFuc2xhdGlvbmFsVmVsb2NpdHkoKSBjb25zdCB7IHJldHVybiBtVHJhbnNsYXRpb25hbFZlbG9jaXR5Lm5vcm0oKTsgfQorICAgIGZsb2F0IHNjYWxhclJvdGF0aW9uYWxWZWxvY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1Sb3RhdGlvbmFsVmVsb2NpdHkubm9ybSgpOyB9CisKKyAgICBib29sIGlzQXBwcm94KGNvbnN0IFR3aXN0M2YmIG90aGVyLAorICAgICAgICAgICAgICAgICAgZmxvYXQgcHJlYyA9IEVpZ2VuOjpOdW1UcmFpdHM8ZmxvYXQ+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uYWxWZWxvY2l0eS5pc0FwcHJveChvdGhlci5tVHJhbnNsYXRpb25hbFZlbG9jaXR5LCBwcmVjKSAmJgorICAgICAgICAgICAgICAgbVJvdGF0aW9uYWxWZWxvY2l0eS5pc0FwcHJveChvdGhlci5tUm90YXRpb25hbFZlbG9jaXR5LCBwcmVjKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFR3aXN0M2Ygb3BlcmF0b3IqKGNvbnN0IFQmIHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFR3aXN0M2YobVRyYW5zbGF0aW9uYWxWZWxvY2l0eSAqIHMsIG1Sb3RhdGlvbmFsVmVsb2NpdHkgKiBzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFR3aXN0M2Ygb3BlcmF0b3IvKGNvbnN0IFQmIHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFR3aXN0M2YobVRyYW5zbGF0aW9uYWxWZWxvY2l0eSAvIHMsIG1Sb3RhdGlvbmFsVmVsb2NpdHkgLyBzKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBFaWdlbjo6VmVjdG9yM2YgbVRyYW5zbGF0aW9uYWxWZWxvY2l0eTsKKyAgICBFaWdlbjo6VmVjdG9yM2YgbVJvdGF0aW9uYWxWZWxvY2l0eTsKK307CisKKy8qKgorICogSW50ZWdyYXRlIGEgdHdpc3Qgb3ZlciB0aW1lIHRvIG9idGFpbiBhIHBvc2UuCisgKiBkdCBpcyB0aGUgdGltZSBvdmVyIHdoaWNoIHRvIGludGVncmF0aW9uLgorICogVGhlIHJlc3VsdGluZyBwb3NlIHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0aW5nIHBvaW50IGFuZCB0aGUgZW5kaW5nIHBvaW50CisgKiBvZiB0aGUgbW90aW9uIG92ZXIgdGhlIHRpbWUgcGVyaW9kLgorICovCitQb3NlM2YgaW50ZWdyYXRlKGNvbnN0IFR3aXN0M2YmIHR3aXN0LCBmbG9hdCBkdCk7CisKKy8qKgorICogRGlmZmVyZW50aWF0ZSBwb3NlIHRvIG9idGFpbiBhIHR3aXN0LgorICogZHQgaXMgdGhlIHRpbWUgb2YgdGhlIG1vdGlvbiBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgYW5kIHRoZSB0YXJnZXQgZnJhbWVzIG9mIHRoZSBwb3NlLgorICovCitUd2lzdDNmIGRpZmZlcmVudGlhdGUoY29uc3QgUG9zZTNmJiBwb3NlLCBmbG9hdCBkdCk7CisKKy8qKgorICogUHJldHR5LXByaW50ZXIgZm9yIHR3aXN0LgorICovCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVHdpc3QzZiYgdHdpc3QpOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKaW5kZXggNmEzNDI3ZS4uNTViYTYxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icApAQCAtMjYsNyArMjYsNSBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFtdLAotCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKaW5kZXggNGE5NmU3Yi4uMWI4NjU2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApAQCAtMTUsNiArMTUsNyBAQAogICovCiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlICJpbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgiCiAjZGVmaW5lIExPR19UQUcgIkhlaWZEZWNvZGVySW1wbCIKIAogI2luY2x1ZGUgIkhlaWZEZWNvZGVySW1wbC5oIgpAQCAtNDYsNiArNDcsNyBAQAogICAgIGluZm8tPm1Sb3RhdGlvbkFuZ2xlID0gdmlkZW9GcmFtZS0+bVJvdGF0aW9uQW5nbGU7CiAgICAgaW5mby0+bUJ5dGVzUGVyUGl4ZWwgPSB2aWRlb0ZyYW1lLT5tQnl0ZXNQZXJQaXhlbDsKICAgICBpbmZvLT5tRHVyYXRpb25VcyA9IHZpZGVvRnJhbWUtPm1EdXJhdGlvblVzOworICAgIGluZm8tPm1CaXREZXB0aCA9IHZpZGVvRnJhbWUtPm1CaXREZXB0aDsKICAgICBpZiAodmlkZW9GcmFtZS0+bUljY1NpemUgPiAwKSB7CiAgICAgICAgIGluZm8tPm1JY2NEYXRhLmFzc2lnbigKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5nZXRGbGF0dGVuZWRJY2NEYXRhKCksCkBAIC0zNzYsMTMgKzM3OCwxNCBAQAogICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KICAgICAgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihzaGFyZWRNZW0tPnVuc2VjdXJlUG9pbnRlcigpKTsKIAotICAgICAgICBBTE9HVigiSW1hZ2UgZGltZW5zaW9uICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBhbmdsZSAlZCwgaWNjU2l6ZSAlZCIsCisgICAgICAgIEFMT0dWKCJJbWFnZSBkaW1lbnNpb24gJWR4JWQsIGRpc3BsYXkgJWR4JWQsIGFuZ2xlICVkLCBpY2NTaXplICVkLCBiaXREZXB0aCAlZCIsCiAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVdpZHRoLAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1IZWlnaHQsCiAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bURpc3BsYXlXaWR0aCwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheUhlaWdodCwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tUm90YXRpb25BbmdsZSwKLSAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSk7CisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUljY1NpemUsCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUJpdERlcHRoKTsKIAogICAgICAgICBpbml0RnJhbWVJbmZvKCZtSW1hZ2VJbmZvLCB2aWRlb0ZyYW1lKTsKIApAQCAtNDcxLDcgKzQ3NCw3IEBACiB9CiAKIGJvb2wgSGVpZkRlY29kZXJJbXBsOjpzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgaGVpZkNvbG9yKSB7Ci0gICAgaWYgKGhlaWZDb2xvciA9PSBtT3V0cHV0Q29sb3IpIHsKKyAgICBpZiAoaGVpZkNvbG9yID09IChIZWlmQ29sb3JGb3JtYXQpbU91dHB1dENvbG9yKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNDkxLDYgKzQ5NCwxMSBAQAogICAgICAgICAgICAgbU91dHB1dENvbG9yID0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIGtIZWlmQ29sb3JGb3JtYXRfUkdCQV8xMDEwMTAyOgorICAgICAgICB7CisgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yIGZvcm1hdCAlZCIsIGhlaWZDb2xvcik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03MjMsNCArNzMxLDEzIEBACiAgICAgcmV0dXJuIChtQ3VyU2NhbmxpbmUgPiBvbGRTY2FubGluZSkgPyAobUN1clNjYW5saW5lIC0gb2xkU2NhbmxpbmUpIDogMDsKIH0KIAordWludDMyX3QgSGVpZkRlY29kZXJJbXBsOjpnZXRDb2xvckRlcHRoKCkgeworICAgIEhlaWZGcmFtZUluZm8qIGluZm8gPSAmbUltYWdlSW5mbzsKKyAgICBpZiAoaW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSW1hZ2VJbmZvLm1CaXREZXB0aDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmgKaW5kZXggMmI5YzcxMC4uODZhODYyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCkBAIC01NCw2ICs1NCw4IEBACiAKICAgICBzaXplX3Qgc2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpIG92ZXJyaWRlOwogCisgICAgdWludDMyX3QgZ2V0Q29sb3JEZXB0aCgpIG92ZXJyaWRlOworCiBwcml2YXRlOgogICAgIHN0cnVjdCBEZWNvZGVUaHJlYWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKaW5kZXggOTA3MzY3Mi4uZGMxMjQ4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKKysrIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKQEAgLTIzLDkgKzIzLDEwIEBACiAgKiBUaGUgb3V0cHV0IGNvbG9yIHBpeGVsIGZvcm1hdCBvZiBoZWlmIGRlY29kZXIuCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAga0hlaWZDb2xvckZvcm1hdF9SR0I1NjUgICAgID0gMCwKLSAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQkFfODg4OCAgPSAxLAotICAgIGtIZWlmQ29sb3JGb3JtYXRfQkdSQV84ODg4ICA9IDIsCisgICAga0hlaWZDb2xvckZvcm1hdF9SR0I1NjUgICAgICAgPSAwLAorICAgIGtIZWlmQ29sb3JGb3JtYXRfUkdCQV84ODg4ICAgID0gMSwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X0JHUkFfODg4OCAgICA9IDIsCisgICAga0hlaWZDb2xvckZvcm1hdF9SR0JBXzEwMTAxMDIgPSAzLAogfSBIZWlmQ29sb3JGb3JtYXQ7CiAKIC8qCkBAIC00NSw3ICs0Niw4IEBACiAgICAgdWludDMyX3QgbUhlaWdodDsKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAogICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKLSAgICBpbnQ2NF90IG1EdXJhdGlvblVzOyAgICAgICAgICAgICAgIC8vIER1cmF0aW9uIG9mIHRoZSBmcmFtZSBpbiB1cworICAgIGludDY0X3QgIG1EdXJhdGlvblVzOyAgICAgICAgICAgICAgLy8gRHVyYXRpb24gb2YgdGhlIGZyYW1lIGluIHVzCisgICAgdWludDMyX3QgbUJpdERlcHRoOyAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYml0cyBmb3IgZWFjaCBvZiB0aGUgUi9HL0IgY2hhbm5lbHMKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtSWNjRGF0YTsgICAgIC8vIElDQyBkYXRhIGFycmF5CiB9OwogCkBAIC0xNjEsNiArMTYzLDExIEBACiAgICAgICovCiAgICAgdmlydHVhbCBzaXplX3Qgc2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpID0gMDsKIAorICAgIC8qCisgICAgICogUmV0dXJucyBjb2xvciBkZXB0aCBpbiBiaXRzIGZvciBlYWNoIG9mIHRoZSBSL0cvQiBjaGFubmVscy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbG9yRGVwdGgoKSA9IDA7CisKIHByaXZhdGU6CiAgICAgSGVpZkRlY29kZXIoY29uc3QgSGVpZkZyYW1lSW5mbyYpID0gZGVsZXRlOwogICAgIEhlaWZEZWNvZGVyJiBvcGVyYXRvcj0oY29uc3QgSGVpZkZyYW1lSW5mbyYpID0gZGVsZXRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggZTk4ZDdkOC4uMmRkNTc4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSwxMCBAQAogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTIxNCw2ICsyMTgsMTEgQEAKICAgICBuYW1lOiAibGlibWVkaWFfbWlkaWlvd3JhcHBlciIsCiAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisKIAogICAgIHNyY3M6IFsiTWlkaUlvV3JhcHBlci5jcHAiXSwKIApAQCAtMzQ3LDYgKzM1Niw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGlibG9nIiwKQEAgLTM3OCwxMiArMzg4LDEyIEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKQEAgLTQ0MCw2ICs0NTAsNiBAQAogCiAgICAgYXBleF9hdmFpbGFibGU6IFsKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGM4OWMwMjMuLmM5ZjM2MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMTcsNyArMTcsNiBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL0lEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDY3ZDMzZmEuLjg1NzY4YmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0yMCwxMiArMjAsMTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQcm9maWxlcyIKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGV4cGF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPE9NWF9WaWRlby5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKQEAgLTg2LDcgKzg4LDI0IEBACiAgICAgeyJoMjYzIiwgVklERU9fRU5DT0RFUl9IMjYzfSwKICAgICB7ImgyNjQiLCBWSURFT19FTkNPREVSX0gyNjR9LAogICAgIHsibTR2IiwgIFZJREVPX0VOQ09ERVJfTVBFR180X1NQfSwKLSAgICB7ImhldmMiLCBWSURFT19FTkNPREVSX0hFVkN9CisgICAgeyJ2cDgiLCAgVklERU9fRU5DT0RFUl9WUDh9LAorICAgIHsiaGV2YyIsIFZJREVPX0VOQ09ERVJfSEVWQ30sCisgICAgeyJ2cDkiLCAgVklERU9fRU5DT0RFUl9WUDl9LAorICAgIHsiZG9sYnl2aXNpb24iLCBWSURFT19FTkNPREVSX0RPTEJZX1ZJU0lPTn0sCit9OworCitjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0Nocm9tYVN1YnNhbXBsaW5nTmFtZU1hcFtdID0geworICAgIHsieXV2IDQ6MjowIiwgQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjB9LAorICAgIHsieXV2IDQ6MjoyIiwgQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjJ9LAorICAgIHsieXV2IDQ6NDo0IiwgQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80NDR9LAorfTsKKworY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNIZHJGb3JtYXROYW1lTWFwW10gPSB7CisgICAgeyJzZHIiLCBIRFJfRk9STUFUX05PTkV9LAorICAgIHsiaGxnIiwgSERSX0ZPUk1BVF9ITEd9LAorICAgIHsiaGRyMTAiLCBIRFJfRk9STUFUX0hEUjEwfSwKKyAgICB7ImhkcjEwKyIsIEhEUl9GT1JNQVRfSERSMTBQTFVTfSwKKyAgICB7ImRvbGJ5dmlzaW9uIiwgSERSX0ZPUk1BVF9ET0xCWV9WSVNJT059LAogfTsKIAogY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNBdWRpb0VuY29kZXJOYW1lTWFwW10gPSB7CkBAIC0xNjQsMTIgKzE4MywxOCBAQAogTWVkaWFQcm9maWxlczo6bG9nVmlkZW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjJiBjb2RlYyBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGNvZGVjOiIpOwotICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY29kZWMubUNvZGVjKTsKKyAgICBBTE9HVigiY29kZWMgPSAlZCAoJXMpIiwgY29kZWMubUNvZGVjLAorICAgICAgICAgICAgZmluZE5hbWVGb3JUYWcoc1ZpZGVvRW5jb2Rlck5hbWVNYXAsIE5FTEVNKHNWaWRlb0VuY29kZXJOYW1lTWFwKSwgY29kZWMubUNvZGVjKSk7CiAgICAgQUxPR1YoImJpdCByYXRlOiAlZCIsIGNvZGVjLm1CaXRSYXRlKTsKICAgICBBTE9HVigiZnJhbWUgd2lkdGg6ICVkIiwgY29kZWMubUZyYW1lV2lkdGgpOwogICAgIEFMT0dWKCJmcmFtZSBoZWlnaHQ6ICVkIiwgY29kZWMubUZyYW1lSGVpZ2h0KTsKICAgICBBTE9HVigiZnJhbWUgcmF0ZTogJWQiLCBjb2RlYy5tRnJhbWVSYXRlKTsKICAgICBBTE9HVigicHJvZmlsZTogJWQiLCBjb2RlYy5tUHJvZmlsZSk7CisgICAgQUxPR1YoImNocm9tYTogJXMiLCBmaW5kTmFtZUZvclRhZyhzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwLCBORUxFTShzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLm1DaHJvbWFTdWJzYW1wbGluZykpOworICAgIEFMT0dWKCJiaXQgZGVwdGg6ICVkIiwgY29kZWMubUJpdERlcHRoKTsKKyAgICBBTE9HVigiaGRyIGZvcm1hdDogJXMiLCBmaW5kTmFtZUZvclRhZyhzSGRyRm9ybWF0TmFtZU1hcCwgTkVMRU0oc0hkckZvcm1hdE5hbWVNYXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLm1IZHJGb3JtYXQpKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCkBAIC0yMzIsNiArMjU3LDE1NSBAQAogICAgIHJldHVybiB0YWc7CiB9CiAKKy8qc3RhdGljKi8gY29uc3QgY2hhciAqCitNZWRpYVByb2ZpbGVzOjpmaW5kTmFtZUZvclRhZygKKyAgICAgICAgY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwICptYXAsIHNpemVfdCBuTWFwcGluZ3MsIGludCB0YWcsIGNvbnN0IGNoYXIgKmRlZl8pCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTWFwcGluZ3M7ICsraSkgeworICAgICAgICBpZiAobWFwW2ldLnRhZyA9PSB0YWcpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBbaV0ubmFtZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVmXzsKK30KKworLypzdGF0aWMqLyBib29sCitNZWRpYVByb2ZpbGVzOjpkZXRlY3RBZHZhbmNlZFZpZGVvUHJvZmlsZSgKKyAgICAgICAgdmlkZW9fZW5jb2RlciBjb2RlYywgaW50IHByb2ZpbGUsCisgICAgICAgIGNocm9tYV9zdWJzYW1wbGluZyAqY2hyb21hLCBpbnQgKmJpdERlcHRoLCBoZHJfZm9ybWF0ICpoZHIpCit7CisgICAgLy8gZGVmYXVsdCB2YWx1ZXMKKyAgICAqY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjA7CisgICAgKmJpdERlcHRoID0gODsKKyAgICAqaGRyID0gSERSX0ZPUk1BVF9OT05FOworCisgICAgc3dpdGNoIChjb2RlYykgeworICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgorICAgIGNhc2UgVklERU9fRU5DT0RFUl9NUEVHXzRfU1A6CisgICAgY2FzZSBWSURFT19FTkNPREVSX1ZQODoKKyAgICAgICAgLy8gdGhlc2UgYXJlIGFsd2F5cyA0OjI6MCBTRFIgOC1iaXQKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2NDoKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUJhc2VsaW5lOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVNYWluOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVFeHRlbmRlZDoKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDoKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUhpZ2gxMDoKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIHRoaXMgY291bGQgYmUgYW4gSExHIHN0cmVhbQorICAgICAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUhpZ2g0MjI6CisgICAgICAgICAgICAqY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjI7CisgICAgICAgICAgICAvLyByZXR1cm5pbmcgZmFsc2UgaGVyZSBhcyBiaXQtZGVwdGggY291bGQgYmUgOCBvciAxMAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDQ0OgorICAgICAgICAgICAgKmNocm9tYSA9IENIUk9NQV9TVUJTQU1QTElOR19ZVVZfNDQ0OworICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZhbHNlIGhlcmUgYXMgYml0LWRlcHRoIGNvdWxkIGJlIDggb3IgMTAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmbG93IGRvZXMgbm90IGdldCBoZXJlCisKKyAgICBjYXNlIFZJREVPX0VOQ09ERVJfSEVWQzoKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTA6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIHRoaXMgY291bGQgYmUgYW4gSExHIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwSERSMTA6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0hEUjEwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0hEUjEwUExVUzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9WUDk6CisgICAgICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIFZQOVByb2ZpbGUwOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTI6CisgICAgICAgICAgICAvLyB0aGlzIGlzIGFsd2F5cyAxMC1iaXQgb24gQW5kcm9pZCAqLworICAgICAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICAgICAvLyByZXR1cm5pbmcgZmFsc2UgaGVyZSBhcyB0aGlzIGNvdWxkIGJlIGFuIEhMRyBzdHJlYW0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMkhEUjoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYWx3YXlzIDEwLWJpdCBvbiBBbmRyb2lkICovCisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0hEUjEwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0hEUjEwUExVUzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9ET0xCWV9WSVNJT046CisgICAgeworICAgICAgICAvLyBmb3IgRG9sYnkgVmlzaW9uIGNvZGVjIHdlIGFsd2F5cyBhc3N1bWUgMTAtYml0IERWCisgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAqaGRyID0gSERSX0ZPUk1BVF9ET0xCWV9WSVNJT047CisKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlciAvKiBwcm9maWxlIDIgZGVwcmVjYXRlZCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVuIC8qIHByb2ZpbGUgMyBkZXByZWNhdGVkICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXIgLyogcHJvZmlsZSAwIGRlcHJlY2F0ZWQgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiAvKiBwcm9maWxlIDEgZGVwcmVjYXRlZCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyIC8qIGR2aGUuMDQgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0biAvKiBkdmhlLjA1ICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGggLyogcHJvZmlsZSA2IGRlcHJlY2F0ZWQgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiAvKiBkdmhlLjA3ICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCAgLyogZHZoZS4wOCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgIC8qIGR2YXYuMDkgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCAvKiBkdmF2MS4xMCAqLzoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKKyAgICB9CisKKyAgICBjYXNlIFZJREVPX0VOQ09ERVJfQVYxOgorICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwOgorICAgICAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICAgICAvLyByZXR1cm5pbmcgZmFsc2UgaGVyZSBhcyB0aGlzIGNvdWxkIGJlIGFuIEhMRyBzdHJlYW0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTA6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0hEUjEwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1czoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBmbG93IGRvZXMgbm90IGdldCBoZXJlCit9CisKIC8qc3RhdGljKi8gdm9pZAogTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKIHsKQEAgLTI1MCwxMyArNDI0LDU2IEBACiAgICAgfQogCiAgICAgaW50IHByb2ZpbGUgPSAtMTsKLSAgICBpZiAobmF0dHMgPj0gMTIgJiYgIXN0cmNtcCgicHJvZmlsZSIsIGF0dHNbMTBdKSkgewotICAgICAgICBwcm9maWxlID0gYXRvaShhdHRzWzExXSk7CisgICAgY2hyb21hX3N1YnNhbXBsaW5nIGNocm9tYSA9IENIUk9NQV9TVUJTQU1QTElOR19ZVVZfNDIwOworICAgIGludCBiaXREZXB0aCA9IDg7CisgICAgaGRyX2Zvcm1hdCBoZHIgPSBIRFJfRk9STUFUX05PTkU7CisgICAgaWYgKGNvZGVjID09IFZJREVPX0VOQ09ERVJfRE9MQllfVklTSU9OKSB7CisgICAgICAgIGJpdERlcHRoID0gMTA7CisgICAgICAgIGhkciA9IEhEUl9GT1JNQVRfRE9MQllfVklTSU9OOwogICAgIH0KIAotICAgIFZpZGVvQ29kZWMgdmlkZW9Db2RlYyB7CisgICAgaWYgKG5hdHRzID49IDEyICYmICFzdHJjbXAoInByb2ZpbGUiLCBhdHRzWzEwXSkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGF0b2koYXR0c1sxMV0pOworICAgICAgICBpZiAoIWRldGVjdEFkdmFuY2VkVmlkZW9Qcm9maWxlKAorICAgICAgICAgICAgICAgICh2aWRlb19lbmNvZGVyKWNvZGVjLCBwcm9maWxlLCAmY2hyb21hLCAmYml0RGVwdGgsICZoZHIpKSB7CisgICAgICAgICAgICAvLyBpZiBub3QgZGV0ZWN0ZWQgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgYXR0cmlidXRlcworICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAxMjsgbmF0dHMgPj0gaXggKyAyOyBpeCArPSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoImNocm9tYSIsIGF0dHNbaXhdKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2hyb21hVGFnID0gZmluZFRhZ0Zvck5hbWUoc0Nocm9tYVN1YnNhbXBsaW5nTmFtZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVMRU0oc0Nocm9tYVN1YnNhbXBsaW5nTmFtZU1hcCksIGF0dHNbaXggKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHJvbWFUYWcgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjIGludmFsaWQgY2hyb21hICVzIiwgYXR0c1tpeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYSA9IChjaHJvbWFfc3Vic2FtcGxpbmcpY2hyb21hVGFnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJiaXREZXB0aCIsIGF0dHNbaXhdKSkgeworICAgICAgICAgICAgICAgICAgICBiaXREZXB0aCA9IGF0b2koYXR0c1tpeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdERlcHRoIDwgOCB8fCBiaXREZXB0aCA+IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyBpbnZhbGlkIGJpZERlcHRoICVzIiwgYXR0c1tpeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiaGRyIiwgYXR0c1tpeF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBoZHJUYWcgPSBmaW5kVGFnRm9yTmFtZShzSGRyRm9ybWF0TmFtZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FTEVNKHNIZHJGb3JtYXROYW1lTWFwKSwgYXR0c1tpeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhkclRhZyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvQ29kZWMgaW52YWxpZCBoZHIgJXMiLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGRyID0gKGhkcl9mb3JtYXQpaGRyVGFnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JpbmcgaGVyZS4gVE9ETzogcmV3cml0ZSB0aGlzIHdob2xlIGZpbGUgdG8gaWdub3JlIGludmFsaWQgYXR0cnMKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvQ29kZWMgaWdub3JpbmcgaW52YWxpZCBhdHRyICVzIiwgYXR0c1tpeF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZpZGVvQ29kZWMgdmlkZW9Db2RlY3sKICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZpZGVvX2VuY29kZXI+KGNvZGVjKSwKLSAgICAgICAgICAgIGF0b2koYXR0c1szXSksIGF0b2koYXR0c1s1XSksIGF0b2koYXR0c1s3XSksIGF0b2koYXR0c1s5XSksIHByb2ZpbGUgfTsKKyAgICAgICAgICAgIGF0b2koYXR0c1szXSkgLyogYml0UmF0ZSAqLywgYXRvaShhdHRzWzVdKSAvKiB3aWR0aCAqLywgYXRvaShhdHRzWzddKSAvKiBoZWlnaHQgKi8sCisgICAgICAgICAgICBhdG9pKGF0dHNbOV0pIC8qIGZyYW1lUmF0ZSAqLywgcHJvZmlsZSwgY2hyb21hLCBiaXREZXB0aCwgaGRyIH07CiAgICAgbG9nVmlkZW9Db2RlYyh2aWRlb0NvZGVjKTsKIAogICAgIHNpemVfdCBuQ2FtY29yZGVyUHJvZmlsZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCmluZGV4IGVjNTJhNDkuLmE2ZjBiNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCkBAIC00MywxMCArNDMsMTAgQEAKIH0KIAogLy9zdGF0aWMKLU1lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgYm9vbCB2aWRlbywgaW50NjRfdCBpbnN0YW5jZUNvdW50KSB7CitNZWRpYVJlc291cmNlIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIFN1YlR5cGUgc3ViVHlwZSwgaW50NjRfdCBpbnN0YW5jZUNvdW50KSB7CiAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoCiAgICAgICAgICAgICBzZWN1cmUgPyBUeXBlOjprU2VjdXJlQ29kZWMgOiBUeXBlOjprTm9uU2VjdXJlQ29kZWMsCi0gICAgICAgICAgICB2aWRlbyA/IFN1YlR5cGU6OmtWaWRlb0NvZGVjIDogU3ViVHlwZTo6a0F1ZGlvQ29kZWMsCisgICAgICAgICAgICBzdWJUeXBlLAogICAgICAgICAgICAgaW5zdGFuY2VDb3VudCk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggNGE4OThlMi4uZTc1YjY5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTgxLDYgKzgxLDE5IEBACiAgICAgQVVESU9fREVDT0RFUl9XTUEsCiB9OwogCitlbnVtIGNocm9tYV9zdWJzYW1wbGluZyB7CisgICAgQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjAsCisgICAgQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjIsCisgICAgQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80NDQsCit9OworCitlbnVtIGhkcl9mb3JtYXQgeworICAgIEhEUl9GT1JNQVRfTk9ORSwKKyAgICBIRFJfRk9STUFUX0hMRywKKyAgICBIRFJfRk9STUFUX0hEUjEwLAorICAgIEhEUl9GT1JNQVRfSERSMTBQTFVTLAorICAgIEhEUl9GT1JNQVRfRE9MQllfVklTSU9OLAorfTsKIAogY2xhc3MgTWVkaWFQcm9maWxlcwogewpAQCAtMTE3LDEzICsxMzAsMTkgQEAKICAgICAgICAgICogQHBhcmFtIHByb2ZpbGUgY29kZWMgcHJvZmlsZSAoZm9yIE1lZGlhQ29kZWMpIG9yIC0xIGZvciBub25lCiAgICAgICAgICAqLwogICAgICAgICBWaWRlb0NvZGVjKHZpZGVvX2VuY29kZXIgY29kZWMsIGludCBiaXRyYXRlLCBpbnQgZnJhbWVXaWR0aCwgaW50IGZyYW1lSGVpZ2h0LCBpbnQgZnJhbWVSYXRlLAotICAgICAgICAgICAgICAgICAgIGludCBwcm9maWxlID0gLTEpCisgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUgPSAtMSwKKyAgICAgICAgICAgICAgICAgICBjaHJvbWFfc3Vic2FtcGxpbmcgY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjAsCisgICAgICAgICAgICAgICAgICAgaW50IGJpdERlcHRoID0gOCwKKyAgICAgICAgICAgICAgICAgICBoZHJfZm9ybWF0IGhkciA9IEhEUl9GT1JNQVRfTk9ORSkKICAgICAgICAgICAgIDogbUNvZGVjKGNvZGVjKSwKICAgICAgICAgICAgICAgbUJpdFJhdGUoYml0cmF0ZSksCiAgICAgICAgICAgICAgIG1GcmFtZVdpZHRoKGZyYW1lV2lkdGgpLAogICAgICAgICAgICAgICBtRnJhbWVIZWlnaHQoZnJhbWVIZWlnaHQpLAogICAgICAgICAgICAgICBtRnJhbWVSYXRlKGZyYW1lUmF0ZSksCi0gICAgICAgICAgICAgIG1Qcm9maWxlKHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgbVByb2ZpbGUocHJvZmlsZSksCisgICAgICAgICAgICAgIG1DaHJvbWFTdWJzYW1wbGluZyhjaHJvbWEpLAorICAgICAgICAgICAgICBtQml0RGVwdGgoYml0RGVwdGgpLAorICAgICAgICAgICAgICBtSGRyRm9ybWF0KGhkcikgewogICAgICAgICB9CiAKICAgICAgICAgVmlkZW9Db2RlYyhjb25zdCBWaWRlb0NvZGVjJikgPSBkZWZhdWx0OwpAQCAtMTYwLDYgKzE3OSwyMSBAQAogICAgICAgICAgICAgcmV0dXJuIG1Qcm9maWxlOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGNocm9tYSBzdWJzYW1wbGluZy4gKi8KKyAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nIGdldENocm9tYVN1YnNhbXBsaW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1DaHJvbWFTdWJzYW1wbGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBiaXQgZGVwdGguICovCisgICAgICAgIGludCBnZXRCaXREZXB0aCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQml0RGVwdGg7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgY2hyb21hIHN1YnNhbXBsaW5nLiAqLworICAgICAgICBoZHJfZm9ybWF0IGdldEhkckZvcm1hdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtSGRyRm9ybWF0OworICAgICAgICB9CisKICAgICBwcml2YXRlOgogICAgICAgICB2aWRlb19lbmNvZGVyIG1Db2RlYzsKICAgICAgICAgaW50IG1CaXRSYXRlOwpAQCAtMTY3LDYgKzIwMSw5IEBACiAgICAgICAgIGludCBtRnJhbWVIZWlnaHQ7CiAgICAgICAgIGludCBtRnJhbWVSYXRlOwogICAgICAgICBpbnQgbVByb2ZpbGU7CisgICAgICAgIGNocm9tYV9zdWJzYW1wbGluZyBtQ2hyb21hU3Vic2FtcGxpbmc7CisgICAgICAgIGludCBtQml0RGVwdGg7CisgICAgICAgIGhkcl9mb3JtYXQgbUhkckZvcm1hdDsKICAgICAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUHJvZmlsZXM7CiAgICAgfTsKIApAQCAtNTMzLDYgKzU3MCwzOSBAQAogICAgIHN0YXRpYyBpbnQgZmluZFRhZ0Zvck5hbWUoY29uc3QgTmFtZVRvVGFnTWFwICptYXAsIHNpemVfdCBuTWFwcGluZ3MsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgLyoqCisgICAgICogRmluZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgYW4gaW50ZWdlciBlbnVtIHRhZy4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIHJldmVyc2UgZm9yIGZpbmRUYWdGb3JOYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwICAgICAgIHRoZSBuYW1lLXRvLXRhZyBtYXAgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG5NYXBwaW5ncyB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHxtYXB8CisgICAgICogQHBhcmFtIHRhZyAgICAgICB0aGUgZW51bSB2YWx1ZSB0byBmaW5kCisgICAgICogQHBhcmFtIGRlZl8gICAgICB0aGUgcmV0dXJuIHZhbHVlIGlmIHRoZSBlbnVtIGlzIG5vdCBmb3VuZAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIG5hbWUgY29ycmVzcG9uZGluZyB0byB8dGFnfCBvciB8ZGVmX3wgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpmaW5kTmFtZUZvclRhZygKKyAgICAgICAgICAgIGNvbnN0IE5hbWVUb1RhZ01hcCAqbWFwLCBzaXplX3Qgbk1hcHBpbmdzLAorICAgICAgICAgICAgaW50IHRhZywgY29uc3QgY2hhciAqZGVmXyA9ICIodW5rbm93bikiKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIGNocm9tYSBzdWJzYW1wbGluZywgYml0LWRlcHRoIGFuZCBoZHItZm9ybWF0IGZvcgorICAgICAqIGFkdmFuY2VkIGNvZGVjIHByb2ZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGVjICAgIHRoZSB2aWRlbyBjb2RlYyB0eXBlCisgICAgICogQHBhcmFtIHByb2ZpbGUgIHRoZSBNZWRpYUNvZGVjIHByb2ZpbGUKKyAgICAgKiBAcGFyYW0gY2hyb21hICAgcG9pbnRlciB0byB0aGUgY2hyb21hIHN1YnNhbXBsaW5nIG91dHB1dAorICAgICAqIEBwYXJhbSBiaXREZXB0aCBwb2ludGVyIHRvIHRoZSBiaXQgZGVwdGggb3V0cHV0CisgICAgICogQHBhcmFtIGhkciAgICAgIHBvaW50ZXIgdG8gdGhlIGhkciBmb3JtYXQgb3V0cHV0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwcm9maWxlIGZ1bGx5IGRldGVybWluZWQgY2hyb21hLCBiaXQtZGVwdGggYW5kIGhkci1mb3JtYXQsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljIGJvb2wgZGV0ZWN0QWR2YW5jZWRWaWRlb1Byb2ZpbGUoCisgICAgICAgICAgICB2aWRlb19lbmNvZGVyIGNvZGVjLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgIGNocm9tYV9zdWJzYW1wbGluZyAqY2hyb21hLCBpbnQgKmJpdERlcHRoLCBoZHJfZm9ybWF0ICpoZHIpOworCisgICAgLyoqCiAgICAgICogQ2hlY2sgb24gZXhpc3RpbmcgcHJvZmlsZXMgd2l0aCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgogICAgICAqIDEuIExvdyBxdWFsaXR5IHByb2ZpbGUgbXVzdCBoYXZlIHRoZSBsb3dlc3QgdmlkZW8KICAgICAgKiAgICByZXNvbHV0aW9uIHByb2R1Y3QgKHdpZHRoIHggaGVpZ2h0KQpAQCAtNTQ5LDYgKzYxOSw4IEBACiAKICAgICAvLyBNYXBwaW5ncyBmcm9tIG5hbWUgKGZvciBpbnN0YW5jZSwgY29kZWMgbmFtZSkgdG8gZW51bSB2YWx1ZQogICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc1ZpZGVvRW5jb2Rlck5hbWVNYXBbXTsKKyAgICBzdGF0aWMgY29uc3QgTmFtZVRvVGFnTWFwIHNDaHJvbWFTdWJzYW1wbGluZ05hbWVNYXBbXTsKKyAgICBzdGF0aWMgY29uc3QgTmFtZVRvVGFnTWFwIHNIZHJGb3JtYXROYW1lTWFwW107CiAgICAgc3RhdGljIGNvbnN0IE5hbWVUb1RhZ01hcCBzQXVkaW9FbmNvZGVyTmFtZU1hcFtdOwogICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc0ZpbGVGb3JtYXRNYXBbXTsKICAgICBzdGF0aWMgY29uc3QgTmFtZVRvVGFnTWFwIHNWaWRlb0RlY29kZXJOYW1lTWFwW107CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCmluZGV4IDQ3MTI1MjguLjNiNjlkNGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCkBAIC0zNyw3ICszNyw4IEBACiAgICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIFN1YlR5cGUgc3ViVHlwZSwgaW50NjRfdCB2YWx1ZSk7CiAgICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CiAKLSAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBib29sIHZpZGVvLCBpbnQ2NF90IGluc3RhbmNlQ291bnQgPSAxKTsKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBNZWRpYVJlc291cmNlU3ViVHlwZSBzdWJUeXBlLAorICAgICAgICAgICAgaW50NjRfdCBpbnN0YW5jZUNvdW50ID0gMSk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgR3JhcGhpY01lbW9yeVJlc291cmNlKGludDY0X3QgdmFsdWUpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENwdUJvb3N0UmVzb3VyY2UoKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBWaWRlb0JhdHRlcnlSZXNvdXJjZSgpOwpAQCAtNjIsNiArNjMsNyBAQAogICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU6IHJldHVybiAidW5zcGVjaWZpZWQiOwogICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtBdWRpb0NvZGVjOiAgICAgICAgIHJldHVybiAiYXVkaW8tY29kZWMiOwogICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtWaWRlb0NvZGVjOiAgICAgICAgIHJldHVybiAidmlkZW8tY29kZWMiOworICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtJbWFnZUNvZGVjOiAgICAgICAgIHJldHVybiAiaW1hZ2UtY29kZWMiOwogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkNTRmZjMyLi5kZDE4MTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMTA4LDcgKzEwOCw5IEBACiAgICAgVklERU9fRU5DT0RFUl9NUEVHXzRfU1AgPSAzLAogICAgIFZJREVPX0VOQ09ERVJfVlA4ID0gNCwKICAgICBWSURFT19FTkNPREVSX0hFVkMgPSA1LAotCisgICAgVklERU9fRU5DT0RFUl9WUDkgPSA2LAorICAgIFZJREVPX0VOQ09ERVJfRE9MQllfVklTSU9OID0gNywKKyAgICBWSURFT19FTkNPREVSX0FWMSA9IDgsCiAgICAgVklERU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgdmlkZW8gZW5jb2RlciB0eXBlCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMWM5YjllNC4uNTIxNWMxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtOTQ5LDYgKzk0OSw5IEBACiAgICAgICAgIG1WaWRlb1dpZHRoID0gZXh0MTsKICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZXh0MjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9TVEFSVEVEOgorICAgICAgICBBTE9HVigiUmVjZWl2ZWQgbWVkaWEgc3RhcnRlZCBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVESUFfTk9USUZZX1RJTUU6CiAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBub3RpZnkgdGltZSBtZXNzYWdlIik7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icAppbmRleCA3ZGQwY2FhLi4yZWQzMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icApAQCAtMjUsOSArMjUsMjUgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIkNvZGVjTGlzdFRlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyIsICJtdHMiXSwKICAgICBndGVzdDogdHJ1ZSwKIAorICAgIC8vIFN1cHBvcnQgbXVsdGlsaWIgdmFyaWFudHMgKHVzaW5nIGRpZmZlcmVudCBzdWZmaXggcGVyIHN1Yi1hcmNoaXRlY3R1cmUpLCB3aGljaCBpcyBuZWVkZWQgb24KKyAgICAvLyBidWlsZCB0YXJnZXRzIHdpdGggc2Vjb25kYXJ5IGFyY2hpdGVjdHVyZXMsIGFzIHRoZSBNVFMgdGVzdCBzdWl0ZSBwYWNrYWdpbmcgbG9naWMgZmxhdHRlbnMKKyAgICAvLyBhbGwgdGVzdCBhcnRpZmFjdHMgaW50byBhIHNpbmdsZSBgdGVzdGNhc2VzYCBkaXJlY3RvcnkuCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGxpYjMyOiB7CisgICAgICAgICAgICBzdWZmaXg6ICIzMiIsCisgICAgICAgIH0sCisgICAgICAgIGxpYjY0OiB7CisgICAgICAgICAgICBzdWZmaXg6ICI2NCIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIC8vIHVzZWQgd2l0aGluIG1haW5saW5lIE1UUywgYnV0IG9ubHkgdG8gUiwgbm90IHRvIFEuCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzAiLAorCiAgICAgc3JjczogWwogICAgICAgICAiQ29kZWNMaXN0VGVzdC5jcHAiLAogICAgIF0sCkBAIC0zNSw3ICs1MSw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsIC8vIGF2YWlsYWJsZSA+PSBSCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFhYjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQ29kZWNMaXN0IHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJDb2RlY0xpc3RUZXN0IiAvPgorICAgIDxvYmplY3QgdHlwZT0ibW9kdWxlX2NvbnRyb2xsZXIiIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5zdWl0ZS5tb2R1bGUuU2RrMzBNb2R1bGVDb250cm9sbGVyIiAvPgorCisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhcHBlbmQtYml0bmVzcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkNvZGVjTGlzdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9Db2RlY0xpc3RUZXN0IiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJDb2RlY0xpc3RUZXN0IiAvPgorICAgIDwvdGVzdD4KKworCis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL09XTkVSUyBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjJlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKKyMgQnVnIGNvbXBvbmVudDogMTUxODYyCitzdW5kb25nYWhuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9BbmRyb2lkLmJwCmluZGV4IGJkZDE0NjUuLjdlOGYzNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQW5kcm9pZC5icApAQCAtOTUsMTAgKzk1LDEwIEBACiAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCi0gICAgXSwKKyAgICAvLyB0aGUgbGlicmFyeSBsaXZlcyBvbmx5IGluIHRoZSBtb2R1bGUKKyAgICAvLyBmcmFtZXdvcmsgYWNjZXNzZXMgd2l0aCBkbG9wZW4oKSBhbmQgdXNlcyAibGlibWVkaWFmb3JtYXRzaGFwZXJfaGVhZGVycyIgc28gYm90aAorICAgIC8vIHNpZGVzIHRyYWNrIHRvIHRoZSBpbnRlcmZhY2UuCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEiXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icAppbmRleCA5YjU0MTk5Li4xNjVhOGFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKQEAgLTIwLDcgKzIwLDcgQEAKICAgICB9LAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCkBAIC0yOSw2ICsyOSw3IEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFfaGVscGVyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKQEAgLTQzLDcgKzQ0LDEwIEBACiAgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIiwgImxpYmxvZyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKQEAgLTUxLDExICs1NSwxNiBAQAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKICAgICBdLAotICAgIGNsYW5nOiB0cnVlLAorCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIGRhcndpbjogewogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9WYWxpZGF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9WYWxpZGF0b3IuY3BwCmluZGV4IDdlZGRiZTEuLjVhMGQ1MTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvVmFsaWRhdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAKQEAgLTQ3LDggKzQ3LDcgQEAKICAgICAgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCYgZGVzYywgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5uYW1lKQotICAgICAgICB8IC8qIGFsd2F5cyAqLyBjaGVja1N0cmluZ092ZXJmbG93KGRlc2MuaW1wbGVtZW50b3IpKSB7CisgICAgaWYgKGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5uYW1lKSB8fCBjaGVja1N0cmluZ092ZXJmbG93KGRlc2MuaW1wbGVtZW50b3IpKSB7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICB9CiAgICAgcmV0dXJuIHNhZmV0eU5ldExvZyhzdGF0dXMsIGJ1Z051bWJlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IGQzYTUxN2YuLmUyOTM2NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC0zMCw2ICszMCw4IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfSU5fQ0FMTCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfQ0FMTF9TQ1JFRU4pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX0NBTExfUkVESVJFQ1QpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1QpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTUwLDYgKzUyLDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19NVVRFX0hBUFRJQyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkUpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRSksCiAgICAgVEVSTUlOQVRPUgogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCBkNzU4MzkxLi44YTM4ZGQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtNjUsNiArNjUsNyBAQAogICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UvYXBleC9tZWRpYS9mcmFtZXdvcmsiLAogICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAogICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvam5pIiwKKwkiLy9wYWNrYWdlcy9tb2R1bGVzL01lZGlhL2FwZXgvZnJhbWV3b3JrIiwKICAgICBdLAogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhTWV0cmljc1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2NzVlNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhTWV0cmljc1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhTWV0cmljcyIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRPRE86IEN1cnJlbnRseSBPTkVfV0FZIHRyYW5zYWN0aW9ucywgbWFrZSBib3RoIE9ORV9XQVkgYW5kIHN5bmNocm9ub3VzIG9wdGlvbnMuCi0KLWVudW0gewotICAgIFNVQk1JVF9JVEVNID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTVUJNSVRfQlVGRkVSLAotfTsKLQotY2xhc3MgQnBNZWRpYU1ldHJpY3NTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhTWV0cmljc1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBNZWRpYU1ldHJpY3NTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYU1ldHJpY3NTZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdWJtaXQobWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJXM6IChPTkVXQVkpIGl0ZW09JXMiLCBfX2Z1bmNfXywgaXRlbS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgICAgICBQYXJjZWwgZGF0YTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldHJpY3NTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGl0ZW0tPndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7IC8vIGFzc3VtZSBmYWlsdXJlIGxvZ2dlZCBpbiBpdGVtCi0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KAotICAgICAgICAgICAgICAgIFNVQk1JVF9JVEVNLCBkYXRhLCBudWxscHRyIC8qIHJlcGx5ICovLCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzOiBiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGZvciBzdWJtaXQsIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0ciB8fCBsZW5ndGggPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzOiAoT05FV0FZKSBsZW5ndGg6JXp1IiwgX19mdW5jX18sIGxlbmd0aCk7Ci0KLSAgICAgICAgUGFyY2VsIGRhdGE7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRyaWNzU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlSW50MzIobGVuZ3RoKQotICAgICAgICAgICAgICAgID86IGRhdGEud3JpdGUoKHVpbnQ4X3QqKWJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdCgKLSAgICAgICAgICAgICAgICBTVUJNSVRfQlVGRkVSLCBkYXRhLCBudWxscHRyIC8qIHJlcGx5ICovLCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzOiBiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGZvciBzdWJtaXQsIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhTWV0cmljc1NlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYU1ldHJpY3NTZXJ2aWNlIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5NZWRpYU1ldHJpY3NTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBTVUJNSVRfSVRFTTogewotICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0cmljc1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICBtZWRpYW1ldHJpY3M6Okl0ZW0gKiBjb25zdCBpdGVtID0gbWVkaWFtZXRyaWNzOjpJdGVtOjpjcmVhdGUoKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaXRlbS0+cmVhZEZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGluIGl0ZW0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3VibWl0SW50ZXJuYWwoaXRlbSwgdHJ1ZSAvKiByZWxlYXNlICovKTsKLSAgICAgICAgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGJ5IHN1Ym1pdEludGVybmFsCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgY2FzZSBTVUJNSVRfQlVGRkVSOiB7Ci0gICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRyaWNzU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICBpbnQzMl90IGxlbmd0aDsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJmxlbmd0aCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbGVuZ3RoIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgdm9pZCAqcHRyID0gZGF0YS5yZWFkSW5wbGFjZShsZW5ndGgpOwotICAgICAgICBpZiAocHRyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3VibWl0QnVmZmVyKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4ocHRyKSwgbGVuZ3RoKTsKLSAgICAgICAgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGJ5IHN1Ym1pdEJ1ZmZlcgotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc0l0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc0l0ZW0uY3BwCmluZGV4IGQ1OTdhNGQuLmVjYjI0OGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzSXRlbS5jcHAKQEAgLTIzLDggKzIzLDEwIEBACiAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTUxLDYgKzUzLDMzIEBACiAvLyB0aGUgc2VydmljZSBpcyBvZmYuCiAjZGVmaW5lIFNWQ19UUklFUyAgICAgICAgICAgICAgIDIKIAorc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50MzJfdD4mIGdldEVycm9yU3RyaW5nTWFwKCkgeworICAgIC8vIERPIE5PVCBNT0RJRlkgVkFMVUVTIChPSyB0byBhZGQgbmV3IG9uZXMpLgorICAgIC8vIFRoaXMgbWF5IGJlIGZvdW5kIGluIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiBtYXB7CisgICAgICAgIHsiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0VSUk9SfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfT0ssICAgICAgIE5PX0VSUk9SfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfQVJHVU1FTlQsIEJBRF9WQUxVRX0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0lPLCAgICAgICBERUFEX09CSkVDVH0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX01FTU9SWSwgICBOT19NRU1PUll9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9TRUNVUklUWSwgUEVSTUlTU0lPTl9ERU5JRUR9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9TVEFURSwgICAgSU5WQUxJRF9PUEVSQVRJT059LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9USU1FT1VULCAgV09VTERfQkxPQ0t9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9VTktOT1dOLCAgVU5LTk9XTl9FUlJPUn0sCisgICAgfTsKKyAgICByZXR1cm4gbWFwOworfQorCitzdGF0dXNfdCBzdGF0dXNTdHJpbmdUb1N0YXR1cyhjb25zdCBjaGFyICplcnJvcikgeworICAgIGNvbnN0IGF1dG8mIG1hcCA9IGdldEVycm9yU3RyaW5nTWFwKCk7CisgICAgaWYgKGVycm9yID09IG51bGxwdHIgfHwgZXJyb3JbMF0gPT0gJ1wwJykgcmV0dXJuIE5PX0VSUk9SOworICAgIGF1dG8gaXQgPSBtYXAuZmluZChlcnJvcik7CisgICAgaWYgKGl0ICE9IG1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKIG1lZGlhbWV0cmljczo6SXRlbSogbWVkaWFtZXRyaWNzOjpJdGVtOjpjb252ZXJ0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKICAgICBtZWRpYW1ldHJpY3M6Okl0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtICopIGhhbmRsZTsKICAgICByZXR1cm4gaXRlbTsKQEAgLTMxNSw3ICszNDQsOCBAQAogICAgICAgICAvLyBub3cuCiAgICAgICAgIC8vIFRPRE8oYi8xOTAxNTEyMDUpOiBFaXRoZXIgYWxsb3cgdGhlIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlIHRvIGFjY2VzcyBNZWRpYU1ldHJpY3Mgb3IKICAgICAgICAgLy8gbWFrZSB0aGlzIGRpc2FibGluZyBzcGVjaWZpYyB0byB0aGF0IHByb2Nlc3MuCi0gICAgICAgIGlmICh1aWQgPj0gQUlEX0lTT0xBVEVEX1NUQVJUICYmIHVpZCA8PSBBSURfSVNPTEFURURfRU5EKSB7CisgICAgICAgIHVpZF90IGFwcGlkID0gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKTsKKyAgICAgICAgaWYgKGFwcGlkID49IEFJRF9JU09MQVRFRF9TVEFSVCAmJiBhcHBpZCA8PSBBSURfSVNPTEFURURfRU5EKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3NDb25zdGFudHMuaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljc0NvbnN0YW50cy5oCmluZGV4IGEwOWE2NzMuLjFjMzA1MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljc0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljc0NvbnN0YW50cy5oCkBAIC0yNSw2ICsyNSw5IEBACiAgKiAyKSBDb25zaXN0ZW50IGJlaGF2aW9yIGFuZCBkb2N1bWVudGF0aW9uLgogICovCiAKKyNkZWZpbmUgQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUUgKDAuZikKKyNkZWZpbmUgQU1FRElBTUVUUklDU19JTklUSUFMX01JTl9WT0xVTUUgKDEuZikKKwogLyoKICAqIFRheG9ub215IG9mIGF1ZGlvIGtleXMKICAqCkBAIC00OCw2ICs1MSwxMiBAQAogLy8gVGhlIEF1ZGlvUmVjb3JkIGtleSBhcHBlbmRzIHRoZSAidHJhY2tJZCIgdG8gdGhlIHByZWZpeC4KICNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU8gInJlY29yZC4iCiAKKy8vIFRoZSBBdWRpbyBTZW5zb3Iga2V5IGFwcGVuZHMgdGhlIHNlbnNvciBoYW5kbGUgaW50ZWdlci4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NFTlNPUiBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU8gInNlbnNvci4iCisKKy8vIFRoZSBBdWRpbyBTcGF0aWFsaXplciBrZXkgYXBwZW5kcyB0aGUgc3BhdGlhbGl6ZXJJZCAoY3VycmVudGx5IDApCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19TUEFUSUFMSVpFUiBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU8gInNwYXRpYWxpemVyLiIKKwogLy8gVGhlIEF1ZGlvU3RyZWFtIGtleSBhcHBlbmRzIHRoZSAic3RyZWFtSWQiIHRvIHRoZSBwcmVmaXguCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19TVFJFQU0gIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAic3RyZWFtLiIKIApAQCAtNjEsNiArNzAsMTAgQEAKICNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfQVVESU9fRkxJTkdFUiAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU8gImZsaW5nZXIiCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX1BPTElDWSAgICAgICAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPICJwb2xpY3kiCiAKKy8vIEVycm9yIGtleXMKKyNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfQVVESU9fVFJBQ0tfRVJST1IgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0sgImVycm9yIgorI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19SRUNPUkRfRVJST1IgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQgImVycm9yIgorCiAvKgogICogTWVkaWFNZXRyaWNzIFByb3BlcnRpZXMgYXJlIHVuaWZpZWQgc3BhY2UgZm9yIGNvbnNpc3RlbmN5IGFuZCByZWFkYWJpbGl0eS4KICAqLwpAQCAtMTEyLDkgKzEyNSwxNSBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFVElNRU5TICAgImRldmljZVRpbWVOcyIgICAvLyBpbnQ2NF90IHBsYXliYWNrL3JlY29yZCB0aW1lCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VWT0xVTUUgICAiZGV2aWNlVm9sdW1lIiAgIC8vIGRvdWJsZSAtIGF2ZXJhZ2UgZGV2aWNlIHZvbHVtZQogCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNQVhWT0xVTUVEVVJBVElPTk5TICJkZXZpY2VNYXhWb2x1bWVEdXJhdGlvbk5zIiAvLyBpbnQ2NF90CisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNQVhWT0xVTUUgImRldmljZU1heFZvbHVtZSIgLy8gZG91YmxlIC0gbWF4aW11bSBkZXZpY2Ugdm9sdW1lCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNSU5WT0xVTUVEVVJBVElPTk5TICJkZXZpY2VNaW5Wb2x1bWVEdXJhdGlvbk5zIiAvLyBpbnQ2NF90CisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNSU5WT0xVTUUgImRldmljZU1pblZvbHVtZSIgLy8gZG91YmxlIC0gbWluaW11bSBkZXZpY2Ugdm9sdW1lCisKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RJUkVDVElPTiAgICAgICJkaXJlY3Rpb24iICAgICAgLy8gc3RyaW5nIEFBdWRpbyBpbnB1dCBvciBvdXRwdXQKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RVUkFUSU9OTlMgICAgICJkdXJhdGlvbk5zIiAgICAgLy8gaW50NjQgZHVyYXRpb24gdGltZSBzcGFuCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORyAgICAgICAiZW5jb2RpbmciICAgICAgIC8vIHN0cmluZyB2YWx1ZSBvZiBmb3JtYXQKKwogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQgICAgICAgICAgImV2ZW50IyIgICAgICAgICAvLyBzdHJpbmcgdmFsdWUgKG9mdGVuIGZ1bmMgbmFtZSkKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VYRUNVVElPTlRJTUVOUyAiZXhlY3V0aW9uVGltZU5zIiAgLy8gdGltZSB0byBleGVjdXRlIHRoZSBldmVudAogCkBAIC0xMjIsMTEgKzE0MSwxNyBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRkxBR1MgICAgICAgICAgImZsYWdzIgogCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5UICAgICAiZnJhbWVDb3VudCIgICAgIC8vIGludDMyCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9IRUFEVFJBQ0tJTkdNT0RFUyAiaGVhZFRyYWNraW5nTW9kZXMiIC8vIHN0cmluZyB8LCBsaWtlIG1vZGVzLgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5QVVRERVZJQ0VTICAgImlucHV0RGV2aWNlcyIgICAvLyBzdHJpbmcgdmFsdWUKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0lOVEVSTkFMVFJBQ0tJRCAiaW50ZXJuYWxUcmFja0lkIiAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5URVJWQUxDT1VOVCAgImludGVydmFsQ291bnQiICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTEFURU5DWU1TICAgICAgImxhdGVuY3lNcyIgICAgICAvLyBkb3VibGUgdmFsdWUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0xFVkVMUyAgICAgICAgICJsZXZlbHMiICAgICAgICAgIC8vIHN0cmluZyB8IHdpdGggbGV2ZWxzCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9MT0dTRVNTSU9OSUQgICAibG9nU2Vzc2lvbklkIiAgIC8vIGhleCBzdHJpbmcsICIiIG5vbmUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01FVEhPRENPREUgICAgICJtZXRob2RDb2RlIiAgICAgLy8gaW50NjRfdCBhbiBpbnQgaW5kaWNhdGluZyBtZXRob2QKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01FVEhPRE5BTUUgICAgICJtZXRob2ROYW1lIiAgICAgLy8gc3RyaW5nIG1ldGhvZCBuYW1lCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFICAgICAgICAgICAibW9kZSIgICAgICAgICAgIC8vIHN0cmluZworI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTU9ERVMgICAgICAgICAgIm1vZGVzIiAgICAgICAgICAvLyBzdHJpbmcgfCB3aXRoIG1vZGVzCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9OQU1FICAgICAgICAgICAibmFtZSIgICAgICAgICAgIC8vIHN0cmluZyB2YWx1ZQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUyAgIm9yaWdpbmFsRmxhZ3MiICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfT1VUUFVUREVWSUNFUyAgIm91dHB1dERldmljZXMiICAvLyBzdHJpbmcgdmFsdWUKQEAgLTE0Niw3ICsxNzEsMTcgQEAKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVJUVVBNUyAgICAgICJzdGFydHVwTXMiICAgICAgLy8gZG91YmxlIHZhbHVlCiAvLyBTdGF0ZSBpcyAiQUNUSVZFIiBvciAiU1RPUFBFRCIgZm9yIEF1ZGlvUmVjb3JkCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFURSAgICAgICAgICAic3RhdGUiICAgICAgICAgIC8vIHN0cmluZwotI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTICAgICAgICAgInN0YXR1cyIgICAgICAgICAvLyBpbnQzMiBzdGF0dXNfdAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTICAgICAgICAgInN0YXR1cyMiICAgICAgICAvLyBpbnQzMiBzdGF0dXNfdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBQXVkaW8gdXNlcyB0aGVpciBvd24gc3RhdHVzIGNvZGVzCisvLyBTdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gdG8gdGhlIHN0YXR1cyBjb2RlLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTU1VCQ09ERSAgInN0YXR1c1N1YkNvZGUiICAvLyBpbnQzMiwgc3BlY2lmaWMgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggc3RhdHVzLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTTUVTU0FHRSAgInN0YXR1c01lc3NhZ2UiICAvLyBzdHJpbmcsIHN1cHBsZW1lbnRhbCBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcmJpdHJhcnkgaW5mb3JtYXRpb24gdHJlYXRlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbmFsLCBtYXkgYmUgbG9nY2F0IG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gZXhjZXB0aW9uIHdpdGggc3RhY2sgdHJhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0ZWQgYXMgImRlYnVnIiBpbmZvcm1hdGlvbi4KKwogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RSRUFNVFlQRSAgICAgInN0cmVhbVR5cGUiICAgICAvLyBzdHJpbmcgKEF1ZGlvVHJhY2spCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9USFJFQURJRCAgICAgICAidGhyZWFkSWQiICAgICAgIC8vIGludDMyIHZhbHVlIGlvIGhhbmRsZQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfVEhST1RUTEVNUyAgICAgInRocm90dGxlTXMiICAgICAvLyBkb3VibGUKQEAgLTIwMSw2ICsyMzYsNyBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUVk9MVU1FICAic2V0Vm9sdW1lIiAgLy8gQXVkaW9UcmFjawogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RBUlQgICAgICAic3RhcnQiICAvLyBBdWRpb1RyYWNrLCBBdWRpb1JlY29yZAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RPUCAgICAgICAic3RvcCIgICAvLyBBdWRpb1RyYWNrLCBBdWRpb1JlY29yZAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVElNRU9VVCAgICAidGltZW91dCIgIC8vIEF1ZGlvRmxpbmdlciwgQXVkaW9Qb2xpY3kKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1VOREVSUlVOICAgInVuZGVycnVuIiAvLyBmcm9tIFRocmVhZAogCiAvLyBQb3NzaWJsZSB2YWx1ZXMgZm9yIEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FCkBAIC0yMTUsNCArMjUxLDgzIEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX1RPTkVHRU5FUkFUT1IgInRvbmVnZW5lcmF0b3IiICAvLyBkaWFsIHRvbmVzCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX1VOS05PV04gICAgICAgInVua25vd24iICAgICAgICAvLyBjYWxsZXJOYW1lIG5vdCBzZXQKIAorLy8gTWFueSBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzZW5zb3IuCisvLyBUaGUgbW9kZSBpcyBob3cgdGhlIHNlbnNvciBpcyBiZWluZyBjdXJyZW50bHkgdXNlZC4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfSEVBRCAgICAgICAgICAiaGVhZCIgICAgICAgIC8vIHVzZWQgZm9yIGhlYWQgdHJhY2tpbmcKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfU0NSRUVOICAgICAgICAic2NyZWVuIiAgICAgIC8vIHVzZWQgZm9yIHNjcmVlbgorCisvLyBNZWRpYU1ldHJpY3MgZXJyb3JzIGFyZSBleHBlY3RlZCB0byBjb3ZlciB0aGUgZm9sbG93aW5nIHNvdXJjZXM6CisvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbi5odG1sCisvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL2xhbmcvRXhjZXB0aW9uLmh0bWwKKy8vIGh0dHBzOi8vY3MuYW5kcm9pZC5jb20vYW5kcm9pZC9wbGF0Zm9ybS9zdXBlcnByb2plY3QvKy9tYXN0ZXI6ZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9iaW5kZXIvaW5jbHVkZS9iaW5kZXIvU3RhdHVzLmg7ZHJjPTg4ZTI1YzA4NjE0OTllZTNhYjg4NTgxNGRkZGMwOTdhYjIzNGNiN2I7bD01NworLy8gaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU3lzdGVtLmphdmE7ZHJjPTNhYzI0NmM0MzI5NGQ3ZjcwMTJiZGNiMGNjYjdiYWUxYWE2OTViZDQ7bD03ODUKKy8vIGh0dHBzOi8vY3MuYW5kcm9pZC5jb20vYW5kcm9pZC9wbGF0Zm9ybS9zdXBlcnByb2plY3QvKy9tYXN0ZXI6ZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmg7ZHJjPWNmZDNhNmZhM2FhYWY3MTJhODkwZGMwMjQ1MmIzOGVmNDAxMDgzYjg7bD0xMjAKKy8vIGh0dHBzOi8vYWJzZWlsLmlvL2RvY3MvY3BwL2d1aWRlcy9zdGF0dXMtY29kZXMKKworLy8gU3RhdHVzIGVycm9yczoKKy8vIEFuIGVtcHR5IHN0YXR1cyBzdHJpbmcgb3IgIm9rIiBpcyBpbnRlcnByZXRlZCBhcyBubyBlcnJvci4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSyAgICAgICAgICAgICAgICAib2siCisKKy8vIEVycm9yIGNhdGVnb3J5OiBhcmd1bWVudAorLy8gICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKy8vICAgTnVsbFBvaW50ZXJFeGNlcHRpb24KKy8vICAgQkFEX1ZBTFVFCisvLyAgIGFic2w6OklOVkFMSURfQVJHVU1FTlQKKy8vICAgYWJzbDo6T1VUX09GX1JBTkdFCisvLyAgIE91dCBvZiByYW5nZSwgb3V0IG9mIGJvdW5kcy4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9BUkdVTUVOVCAgICAgICAgICAiYXJndW1lbnQiCisKKy8vIEVycm9yIGNhdGVnb3J5OiBpbworLy8gICBJT0V4Y2VwdGlvbgorLy8gICBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb24sIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisvLyAgIERFQURfT0JKRUNUCisvLyAgIEZBSUxFRF9UUkFOU0FDVElPTgorLy8gICBJT19FUlJPUgorLy8gICBmaWxlIG9yIGlvY3RsIGZhaWx1cmUKKy8vICAgU2VydmljZSwgcnBjLCBiaW5kZXIsIG9yIHNvY2tldCBmYWlsdXJlLgorLy8gICBIYXJkd2FyZSBvciBkZXZpY2UgZmFpbHVyZS4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9JTyAgICAgICAgICAgICAgICAiaW8iCisKKy8vIEVycm9yIGNhdGVnb3J5OiBvdXRPZk1lbW9yeQorLy8gICBPdXRPZk1lbW9yeUV4Y2VwdGlvbgorLy8gICBOT19NRU1PUlkKKy8vICAgYWJzbDo6UkVTT1VSQ0VfRVhIQVVTVEVECisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfTUVNT1JZICAgICAgICAgICAgIm1lbW9yeSIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IHNlY3VyaXR5CisvLyAgIFNlY3VyaXR5RXhjZXB0aW9uCisvLyAgIFBFUk1JU1NJT05fREVOSUVECisvLyAgIGFic2w6OlBFUk1JU1NJT05fREVOSUVECisvLyAgIGFic2w6OlVOQVVUSEVOVElDQVRFRAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NFQ1VSSVRZICAgICAgICAgICJzZWN1cml0eSIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IHN0YXRlCisvLyAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorLy8gICBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorLy8gICBJTlZBTElEX09QRVJBVElPTgorLy8gICBOT19JTklUCisvLyAgIGFic2w6Ok5PVF9GT1VORAorLy8gICBhYnNsOjpBTFJFQURZX0VYSVNUUworLy8gICBhYnNsOjpGQUlMRURfUFJFQ09ORElUSU9OCisvLyAgIGFic2w6OlVOQVZBSUxBQkxFCisvLyAgIGFic2w6OlVOSU1QTEVNRU5URUQKKy8vICAgRnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgKGFyZ3VtZW50IG1heSBvciBtYXkgbm90IGJlIGNvcnJlY3QpLgorLy8gICBDYWxsIHVuZXhwZWN0ZWQgb3Igb3V0IG9mIG9yZGVyLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NUQVRFICAgICAgICAgICAgICJzdGF0ZSIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IHRpbWVvdXQKKy8vICAgVGltZW91dEV4Y2VwdGlvbgorLy8gICBXT1VMRF9CTE9DSworLy8gICBhYnNsOjpERUFETElORV9FWENFRURFRAorLy8gICBhYnNsOjpBQk9SVEVECisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfVElNRU9VVCAgICAgICAgICAgInRpbWVvdXQiCisKKy8vIEVycm9yIGNhdGVnb3J5OiB1bmtub3duCisvLyAgIEV4Y2VwdGlvbiAoSmF2YSBzcGVjaWZpZWQgbm90IGxpc3RlZCBhYm92ZSwgb3IgY3VzdG9tIGFwcC9zZXJ2aWNlKQorLy8gICBVTktOT1dOX0VSUk9SCisvLyAgIGFic2w6OklOVEVSTkFMCisvLyAgIGFic2w6OkRBVEFfTE9TUworLy8gICBDYXRjaC1hbGwgYnVja2V0IGZvciBlcnJvcnMgbm90IGxpc3RlZCBhYm92ZS4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9VTktOT1dOICAgICAgICAgICAidW5rbm93biIKKwogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTQ09OU1RBTlRTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljc0l0ZW0uaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljc0l0ZW0uaAppbmRleCBjYmY4OWM2Li5kZTU2NjY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oCkBAIC0xMDYsNiArMTA2LDM2IEBACiB9OwogCiAvKgorICogSGVscGVyIGZvciBzdGF0dXMgY29udmVyc2lvbnMKKyAqLworCitpbmxpbmUgY29uc3RleHByIGNvbnN0IGNoYXIqIHN0YXR1c1RvU3RhdHVzU3RyaW5nKHN0YXR1c190IHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBCQURfVkFMVUU6CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0FSR1VNRU5UOworICAgIGNhc2UgREVBRF9PQkpFQ1Q6CisgICAgY2FzZSBGQUlMRURfVFJBTlNBQ1RJT046CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0lPOworICAgIGNhc2UgTk9fTUVNT1JZOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9NRU1PUlk7CisgICAgY2FzZSBQRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU0VDVVJJVFk7CisgICAgY2FzZSBOT19JTklUOgorICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NUQVRFOworICAgIGNhc2UgV09VTERfQkxPQ0s6CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1RJTUVPVVQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHN0YXR1cyA+PSAwKSByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSzsgLy8gbm9uLW5lZ2F0aXZlIHZhbHVlcyAiT0siCisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsgICAgICAgICAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9yLgorICAgIGNhc2UgVU5LTk9XTl9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfVU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXR1c190IHN0YXR1c1N0cmluZ1RvU3RhdHVzKGNvbnN0IGNoYXIgKmVycm9yKTsKKworLyoKICAqIFRpbWUgcHJpbnRpbmcKICAqCiAgKiBrUHJpbnRGb3JtYXRMb25nIHRpbWUgc3RyaW5nIGlzIDE5IGNoYXJhY3RlcnMgKGluY2x1ZGluZyBudWxsIHRlcm1pbmF0aW9uKS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggZjU1Njc4ZC4uMjY2Y2IxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTY1LDEwICs2NSwxNCBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm1faGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC04NCwxMyArODgsMTYgQEAKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtIiwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiLiIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKaW5kZXggMDVmNzM2NS4uY2Q0MTFlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlICJNZWRpYVBsYXllckZhY3RvcnkuaCIKIAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCi0jaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKKyNpbmNsdWRlIDxudXBsYXllci9OdVBsYXllckRyaXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggZDI3OGEwMS4uOGUxOWQwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXJTZXJ2aWNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTgxLDcgKzgyLDcgQEAKICNpbmNsdWRlICJNZWRpYVBsYXllckZhY3RvcnkuaCIKIAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCi0jaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKKyNpbmNsdWRlIDxudXBsYXllci9OdVBsYXllckRyaXZlci5oPgogCiAKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwpAQCAtNjEwLDI5ICs2MTEsNDIgQEAKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1DbGllbnRzLnNpemUoKTsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgc3A8Q2xpZW50PiBjID0gbUNsaWVudHNbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGMgIT0gMCkgYy0+ZHVtcChmZCwgYXJncyk7Ci0gICAgICAgICAgICBjbGllbnRzLmFkZChjKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhUmVjb3JkZXJDbGllbnRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE5vIG1lZGlhIHJlY29yZGVyIGNsaWVudFxuXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2FwdHVyZSBjbGllbnRzIHVuZGVyIGxvY2sKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbUNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8Q2xpZW50PiBjID0gbUNsaWVudHNbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1NZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCk7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgICAgICBzcDxNZWRpYVJlY29yZGVyQ2xpZW50PiBjID0gbU1lZGlhUmVjb3JkZXJDbGllbnRzW2ldLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiIE1lZGlhUmVjb3JkZXJDbGllbnQgcGlkKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5tQXR0cmlidXRpb25Tb3VyY2UucGlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKLSAgICAgICAgICAgICAgICAgICAgYy0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBtZWRpYVJlY29yZGVyQ2xpZW50cy5hZGQoYyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gZHVtcCBjbGllbnRzIG91dHNpZGUgb2YgbG9jaworICAgICAgICBmb3IgKGNvbnN0IHNwPENsaWVudD4gJmMgOiBjbGllbnRzKSB7CisgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBObyBtZWRpYSByZWNvcmRlciBjbGllbnRcblxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+ICZjIDogbWVkaWFSZWNvcmRlckNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiBNZWRpYVJlY29yZGVyQ2xpZW50IHBpZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjLT5tQXR0cmlidXRpb25Tb3VyY2UucGlkKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKKyAgICAgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSAtIDEsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOwogICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOwpAQCAtMTgzMCw3ICsxODQ0LDYgQEAKIHsKICAgICBjbG9zZSgpOwogICAgIGZyZWUobUF0dHJpYnV0ZXMpOwotICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCiAvL3N0YXRpYwpAQCAtMjA1MSw4ICsyMDY0LDcgQEAKIAogICAgICAgICBtUmVjeWNsZWRUcmFjay5jbGVhcigpOwogICAgICAgICBjbG9zZV9sKCk7Ci0gICAgICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwotICAgICAgICBtQ2FsbGJhY2tEYXRhID0gTlVMTDsKKyAgICAgICAgbUNhbGxiYWNrRGF0YS5jbGVhcigpOwogICAgIH0KIH0KIApAQCAtMjE3Myw3ICsyMTg1LDcgQEAKICAgICB9CiAKICAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gTlVMTDsKKyAgICBzcDxDYWxsYmFja0RhdGE+IG5ld2NiZDsKIAogICAgIC8vIFdlIGRvbid0IGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHRyYWNrIGlmIHdlIGFyZSByZWN5Y2xpbmcgYW4KICAgICAvLyBvZmZsb2FkZWQgdHJhY2suIEJ1dCwgaWYgd2UgYXJlIHJlY3ljbGluZyBhIG5vbi1vZmZsb2FkZWQgb3Igd2UKQEAgLTIxODMsOCArMjE5NSw4IEBACiAgICAgaWYgKCEocmV1c2UgJiYgYm90aE9mZmxvYWRlZCkpIHsKICAgICAgICAgQUxPR1YoImNyZWF0aW5nIG5ldyBBdWRpb1RyYWNrIik7CiAKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuZXdjYmQgPSBuZXcgQ2FsbGJhY2tEYXRhKHRoaXMpOworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5ld2NiZCA9IHNwPENhbGxiYWNrRGF0YT46Om1ha2Uod3A8QXVkaW9PdXRwdXQ+Ojpmcm9tRXhpc3RpbmcodGhpcykpOwogICAgICAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKQEAgLTIxOTIsNyArMjIwNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAogICAgICAgICAgICAgICAgICAgICBuZXdjYmQsCiAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBub3RpZmljYXRpb24gZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCkBAIC0yMjE5LDggKzIyMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAwLCAvLyBub3RpZmljYXRpb24gZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCkBAIC0yMjM2LDggKzIyNDYsNyBAQAogICAgICAgICB0LT5zZXRDYWxsZXJOYW1lKCJtZWRpYSIpOwogICAgICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKLSAgICAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7Ci0gICAgICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybworICAgICAgICAgICAgLy8gdCwgbmV3Y2JkIGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCkBAIC0yMjcxLDcgKzIyODAsNiBAQAogICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPnNldE91dHB1dCh0aGlzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CiAgICAgICAgICAgICByZXR1cm4gdXBkYXRlVHJhY2soKTsKICAgICAgICAgfQogICAgIH0KQEAgLTIzNzcsNyArMjM4NSw3IEBACiAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gdHdvIGFsdGVybmF0aXZlIGFwcHJvYWNoZXMKICNpZiAxCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tEYXRhICpjYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOworICAgICAgICAgICAgICAgIHNwPENhbGxiYWNrRGF0YT4gY2FsbGJhY2tEYXRhID0gbUNhbGxiYWNrRGF0YTsKICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAvLyBwcm9wZXIgYWNxdWlzaXRpb24gc2VxdWVuY2UKICAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEtPmxvY2soKTsKQEAgLTI0MTQsOSArMjQyMiw4IEBACiAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIG5leHQgcGxheWVyIGNvdWxkIGJlIHByZXBhcmVkIGFuZCBzZWVrZWQuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gUHJlc3VtaW5nIGl0IGlzbid0IGFkdmlzYWJsZSB0byBmb3JjZSB0aGUgdHJhY2sgb3Zlci4KLSAgICAgICAgICAgICBpZiAobU5leHRPdXRwdXQtPm1UcmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgaWYgKG1OZXh0T3V0cHV0LT5tVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dEKCJSZWN5Y2xpbmcgdHJhY2sgZm9yIGdhcGxlc3MgcGxheWJhY2siKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGE7CiAgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOwogICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tUmVjeWNsZWRUcmFjayA9IG1UcmFjazsKICAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bVNhbXBsZVJhdGVIeiA9IG1TYW1wbGVSYXRlSHo7CkBAIC0yNDI0LDExICsyNDMxLDExIEBACiAgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1GbGFncyA9IG1GbGFnczsKICAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUZyYW1lU2l6ZSA9IG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgY2xvc2VfbCgpOwotICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOyAgLy8gZGVzdHJ1Y3Rpb24gaGFuZGxlZCBieSBtTmV4dE91dHB1dAorICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEuY2xlYXIoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGdhcGxlc3MgcGxheWJhY2sgYmVjYXVzZSBuZXh0IHBsYXllciBoYXMgYWxyZWFkeSBzdGFydGVkIik7CiAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWNrIGluIGNhc2UgcmVzb3VyY2UgbmVlZGVkIGZvciBmdXR1cmUgcGxheWVycy4KLSAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOyAgLy8gcmVsZWFzZSBsb2NrIGZvciBjYWxsYmFja3MgYmVmb3JlIGNsb3NlLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjbG9zZV9sKCk7CkBAIC0yNDY3LDggKzI0NzQsMTMgQEAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6cGF1c2UoKQogewogICAgIEFMT0dWKCJwYXVzZSIpOworICAgIC8vIFdlIHVzZSBwYXVzZUFuZFdhaXQoKSBpbnN0ZWFkIG9mIHBhdXNlKCkgdG8gZW5zdXJlIHRyYWNrcyByYW1wIHRvIHNpbGVuY2UgYmVmb3JlCisgICAgLy8gYW55IGZsdXNoLiBXZSBjaG9vc2UgNDAgbXMgdGltZW91dCB0byBhbGxvdyAxIGRlZXAgYnVmZmVyIG1peGVyIHBlcmlvZAorICAgIC8vIHRvIG9jY3VyLiAgT2Z0ZW4gd2FpdGluZyBpcyAwIC0gMjAgbXMuCisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworICAgIGNvbnN0ZXhwciBhdXRvIFRJTUVPVVRfTVMgPSA0MG1zOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+cGF1c2UoKTsKKyAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+cGF1c2VBbmRXYWl0KFRJTUVPVVRfTVMpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmNsb3NlKCkKQEAgLTI2NTAsNzYgKzI2NjIsNzEgQEAKICAgICB9CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpDYWxsYmFja1dyYXBwZXIoCi0gICAgICAgIGludCBldmVudCwgdm9pZCAqY29va2llLCB2b2lkICppbmZvKSB7Ci0gICAgLy9BTE9HVigiY2FsbGJhY2t3cmFwcGVyIik7Ci0gICAgQ2FsbGJhY2tEYXRhICpkYXRhID0gKENhbGxiYWNrRGF0YSopY29va2llOwotICAgIC8vIGxvY2sgdG8gZW5zdXJlIHdlIGFyZW4ndCBjYXVnaHQgaW4gdGhlIG1pZGRsZSBvZiBhIHRyYWNrIHN3aXRjaC4KLSAgICBkYXRhLT5sb2NrKCk7Ci0gICAgQXVkaW9PdXRwdXQgKm1lID0gZGF0YS0+Z2V0T3V0cHV0KCk7Ci0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICBpZiAobWUgPT0gTlVMTCkgewotICAgICAgICAvLyBubyBvdXRwdXQgc2V0LCBsaWtlbHkgYmVjYXVzZSB0aGUgdHJhY2sgd2FzIHNjaGVkdWxlZCB0byBiZSByZXVzZWQKLSAgICAgICAgLy8gYnkgYW5vdGhlciBwbGF5ZXIsIGJ1dCB0aGUgZm9ybWF0IHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlLgotICAgICAgICBkYXRhLT51bmxvY2soKTsKLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBidWZmZXItPnNpemUgPSAwOwotICAgICAgICB9CitzaXplX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Q2FsbGJhY2tEYXRhOjpvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSB7CisgICAgQUxPR0QoImRhdGEgY2FsbGJhY2siKTsKKyAgICBsb2NrKCk7CisgICAgc3A8QXVkaW9PdXRwdXQ+IG1lID0gZ2V0T3V0cHV0KCk7CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKKyAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCisgICAgICAgICAgICBtZS5nZXQoKSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKKyAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKKworICAgIC8vIExvZyB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2suCisgICAgLy8gKDEpIFdlIG1heSBoYXZlIG5vIGRhdGEgKGVzcGVjaWFsbHkgd2l0aCBuZXR3b3JrIHN0cmVhbWluZyBzb3VyY2VzKS4KKyAgICAvLyAoMikgV2UgbWF5IGhhdmUgcmVhY2hlZCB0aGUgRU9TIGFuZCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LgorICAgIC8vIE5vdGUgdGhhdCBBd2Vzb21lUGxheWVyL0F1ZGlvUGxheWVyIHdpbGwgb25seSByZXR1cm4gemVybyBzaXplIHdoZW4gaXQgcmVhY2hlcyB0aGUgRU9TLgorICAgIC8vIE51UGxheWVyUmVuZGVyZXIgd2lsbCByZXR1cm4gemVybyB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBkYXRhIChpdCBkb2Vzbid0IGJsb2NrIHRvIGZpbGwpLgorICAgIC8vCisgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOworICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCisKKyAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CisgICAgdW5sb2NrKCk7CisgICAgcmV0dXJuIGFjdHVhbFNpemU7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Q2FsbGJhY2tEYXRhOjpvblN0cmVhbUVuZCgpIHsKKyAgICBsb2NrKCk7CisgICAgc3A8QXVkaW9PdXRwdXQ+IG1lID0gZ2V0T3V0cHV0KCk7CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKKyAgICAgICAgdW5sb2NrKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7CisgICAgKCptZS0+bUNhbGxiYWNrKShtZS5nZXQoKSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1NUUkVBTV9FTkQpOworICAgIHVubG9jaygpOworfQogCi0gICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKLSAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAotICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAotICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgotICAgICAgICAvLyAoMSkgV2UgbWF5IGhhdmUgbm8gZGF0YSAoZXNwZWNpYWxseSB3aXRoIG5ldHdvcmsgc3RyZWFtaW5nIHNvdXJjZXMpLgotICAgICAgICAvLyAoMikgV2UgbWF5IGhhdmUgcmVhY2hlZCB0aGUgRU9TIGFuZCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LgotICAgICAgICAvLyBOb3RlIHRoYXQgQXdlc29tZVBsYXllci9BdWRpb1BsYXllciB3aWxsIG9ubHkgcmV0dXJuIHplcm8gc2l6ZSB3aGVuIGl0IHJlYWNoZXMgdGhlIEVPUy4KLSAgICAgICAgLy8gTnVQbGF5ZXJSZW5kZXJlciB3aWxsIHJldHVybiB6ZXJvIHdoZW4gaXQgZG9lc24ndCBoYXZlIGRhdGEgKGl0IGRvZXNuJ3QgYmxvY2sgdG8gZmlsbCkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKLSAgICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KLQotICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7Ci0KLSAgICAgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKLSAgICAgICAgfSBicmVhazsKLQotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKLSAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgb2NjdXJzIGZvciBvZmZsb2FkZWQgY2FsbGJhY2tzCi0gICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfU1RSRUFNX0VORCIpOwotICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAotICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1NUUkVBTV9FTkQpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLIDoKLSAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9URUFSX0RPV04iKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCi0gICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfVEVBUl9ET1dOKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgotICAgICAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlLCB0eXBpY2FsbHkKLSAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gc3VwcGx5IGRhdGEgdG8gdGhlIEF1ZGlvVHJhY2suICBJdCBjYW4gYWxzbwotICAgICAgICAvLyBvY2N1ciBpbiBub24tb2ZmbG9hZGVkIG1vZGUgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIGNvbWVzIG91dCBvZiBzdGFuZGJ5LgotICAgICAgICAvLwotICAgICAgICAvLyBJZiBhbiBBdWRpb1RyYWNrIHVuZGVycnVucyBpdCBvdXRwdXRzIHNpbGVuY2UuIFNpbmNlIHRoaXMgaGFwcGVucyBzdWRkZW5seQotICAgICAgICAvLyBpdCBtYXkgc291bmQgbGlrZSBhbiBhdWRpYmxlIHBvcCBvciBnbGl0Y2guCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSB1bmRlcnJ1biBldmVudCBpcyBzZW50IG9uY2UgcGVyIHRyYWNrIHVuZGVycnVuOyB0aGUgY29uZGl0aW9uIGlzIHJlc2V0Ci0gICAgICAgIC8vIHdoZW4gbW9yZSBkYXRhIGlzIHNlbnQgdG8gdGhlIEF1ZGlvVHJhY2suCi0gICAgICAgIEFMT0dEKCJjYWxsYmFja3dyYXBwZXI6IEVWRU5UX1VOREVSUlVOIChkaXNjYXJkZWQpIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoInJlY2VpdmVkIHVua25vd24gZXZlbnQgdHlwZTogJWQgaW5zaWRlIENhbGxiYWNrV3JhcHBlciAhIiwgZXZlbnQpOwordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpDYWxsYmFja0RhdGE6Om9uTmV3SUF1ZGlvVHJhY2soKSB7CisgICAgbG9jaygpOworICAgIHNwPEF1ZGlvT3V0cHV0PiBtZSA9IGdldE91dHB1dCgpOworICAgIGlmIChtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHVubG9jaygpOworICAgICAgICByZXR1cm47CiAgICAgfQorICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7CisgICAgKCptZS0+bUNhbGxiYWNrKShtZS5nZXQoKSwgIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOworICAgIHVubG9jaygpOworfQogCi0gICAgZGF0YS0+dW5sb2NrKCk7Cit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkNhbGxiYWNrRGF0YTo6b25VbmRlcnJ1bigpIHsKKyAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlLCB0eXBpY2FsbHkKKyAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCisgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KKyAgICAvLworICAgIC8vIElmIGFuIEF1ZGlvVHJhY2sgdW5kZXJydW5zIGl0IG91dHB1dHMgc2lsZW5jZS4gU2luY2UgdGhpcyBoYXBwZW5zIHN1ZGRlbmx5CisgICAgLy8gaXQgbWF5IHNvdW5kIGxpa2UgYW4gYXVkaWJsZSBwb3Agb3IgZ2xpdGNoLgorICAgIC8vCisgICAgLy8gVGhlIHVuZGVycnVuIGV2ZW50IGlzIHNlbnQgb25jZSBwZXIgdHJhY2sgdW5kZXJydW47IHRoZSBjb25kaXRpb24gaXMgcmVzZXQKKyAgICAvLyB3aGVuIG1vcmUgZGF0YSBpcyBzZW50IHRvIHRoZSBBdWRpb1RyYWNrLgorICAgIEFMT0dEKCJjYWxsYmFja3dyYXBwZXI6IEVWRU5UX1VOREVSUlVOIChkaXNjYXJkZWQpIik7CisKIH0KIAogYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggOTgwOTFiZS4uODZiZTNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMzAsOSArMzAsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1N5bmNocm9uaXphdGlvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTQxLDcgKzQzLDYgQEAKIAogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAotY2xhc3MgQXVkaW9UcmFjazsKIHN0cnVjdCBBVlN5bmNTZXR0aW5nczsKIGNsYXNzIERlYXRoTm90aWZpZXI7CiBjbGFzcyBJRGF0YVNvdXJjZTsKQEAgLTE2MSw3ICsxNjIsNyBAQAogICAgICAgICBzcDxBdWRpb091dHB1dD4gICAgICAgICBtTmV4dE91dHB1dDsKICAgICAgICAgQXVkaW9DYWxsYmFjayAgICAgICAgICAgbUNhbGxiYWNrOwogICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7Ci0gICAgICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7CisgICAgICAgIHNwPENhbGxiYWNrRGF0YT4gICAgICAgIG1DYWxsYmFja0RhdGE7CiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwogICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICBtQXR0cmlidXRlczsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CkBAIC0xODksMTUgKzE5MCwxNSBAQAogICAgICAgICAvLyBDYWxsYmFja0RhdGEgaXMgd2hhdCBpcyBwYXNzZWQgdG8gdGhlIEF1ZGlvVHJhY2sgYXMgdGhlICJ1c2VyIiBkYXRhLgogICAgICAgICAvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gdGFyZ2V0IHRoaXMgdG8gYSBkaWZmZXJlbnQgT3V0cHV0IG9uIHRoZSBmbHksCiAgICAgICAgIC8vIHNvIHdlIGNhbid0IHVzZSB0aGUgT3V0cHV0IGl0c2VsZiBmb3IgdGhpcy4KLSAgICAgICAgY2xhc3MgQ2FsbGJhY2tEYXRhIHsKKyAgICAgICAgY2xhc3MgQ2FsbGJhY2tEYXRhIDogcHVibGljIEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2sgewogICAgICAgICAgICAgZnJpZW5kIEF1ZGlvT3V0cHV0OwogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBleHBsaWNpdCBDYWxsYmFja0RhdGEoQXVkaW9PdXRwdXQgKmNvb2tpZSkgeworICAgICAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tEYXRhKGNvbnN0IHdwPEF1ZGlvT3V0cHV0PiYgY29va2llKSB7CiAgICAgICAgICAgICAgICAgbURhdGEgPSBjb29raWU7CiAgICAgICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9PdXRwdXQgKiAgIGdldE91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0T3V0cHV0KEF1ZGlvT3V0cHV0KiBuZXdjb29raWUpIHsgbURhdGEgPSBuZXdjb29raWU7IH0KKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0PiBnZXRPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtRGF0YS5sb2FkKCkucHJvbW90ZSgpOyB9CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0T3V0cHV0KGNvbnN0IHdwPEF1ZGlvT3V0cHV0PiYgbmV3Y29va2llKSB7IG1EYXRhLnN0b3JlKG5ld2Nvb2tpZSk7IH0KICAgICAgICAgICAgIC8vIGxvY2svdW5sb2NrIGFyZSB1c2VkIGJ5IHRoZSBjYWxsYmFjayBiZWZvcmUgYWNjZXNzaW5nIHRoZSBwYXlsb2FkIG9mIHRoaXMgb2JqZWN0CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbG9jaygpIGNvbnN0IHsgbUxvY2subG9jaygpOyB9CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdW5sb2NrKCkgY29uc3QgeyBtTG9jay51bmxvY2soKTsgfQpAQCAtMjIwLDggKzIyMSwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZvaWQgb25VbmRlcnJ1bigpIG92ZXJyaWRlOworICAgICAgICAgICAgdm9pZCBvblN0cmVhbUVuZCgpIG92ZXJyaWRlOworICAgICAgICAgICAgdm9pZCBvbk5ld0lBdWRpb1RyYWNrKCkgb3ZlcnJpZGU7CiAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBBdWRpb091dHB1dCAqICAgbURhdGE7CisgICAgICAgICAgICBtZWRpYXV0aWxzOjphdG9taWNfd3A8QXVkaW9PdXRwdXQ+IG1EYXRhOwogICAgICAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOyAvLyBhIHJlY3Vyc2l2ZSBtdXRleCBtaWdodCBtYWtlIHRoaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICAgICBib29sICAgICAgICAgICAgbVN3aXRjaGluZzsKICAgICAgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrRGF0YSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggYTkxNDAwNi4uNGFhODBiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtMTI2LDggKzEyNiwxMyBAQAogICAgIH0KIAogICAgIGlmICgoYXMgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCi0gICAgICAgICAgICAmJiAhKGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICAgICAgICAgICYmICEoY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgIHx8IGNhcHR1cmVUdW5lckF1ZGlvSW5wdXRBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSkpKQorICAgICAgICAgICAgfHwgKGFzID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICAgICAgJiYgIShjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpKSkKKyAgICAgICAgICAgIHx8IChhcyA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UKKyAgICAgICAgICAgICAgICAmJiAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpKQogICAgICAgICAgICAgfHwgIXJlY29yZGluZ0FsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlLCAoYXVkaW9fc291cmNlX3QpYXMpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggMmFhYmQ1My4uYjNmN2YyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGRhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CkBAIC0xOTQsMTggKzE5NSw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChtZXRhT25seSkgewotICAgICAgICByZXR1cm4gRnJhbWVEZWNvZGVyOjpnZXRNZXRhZGF0YU9ubHkodHJhY2tNZXRhLCBjb2xvckZvcm1hdCwgdGh1bWJuYWlsKTsKLSAgICB9Ci0KLSAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGkpOwotCi0gICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gaW5zdGFudGlhdGUgaW1hZ2UgdHJhY2suIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQogICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgYm9vbCBpc0hlaWYgPSBmYWxzZTsKICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKICAgICAgICAgQUxPR0UoImltYWdlIHRyYWNrIGhhcyBubyBtaW1lIHR5cGUiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMTUsMjAgKzIwNiw3OSBAQAogICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKICAgICAgICAgdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOwogICAgICAgICB0cmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKKyAgICAgICAgaXNIZWlmID0gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUYpKSB7CiAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19BVjE7CiAgICAgICAgIHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKICAgICAgICAgdHJhY2tNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CiAgICAgfQogCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UodHJhY2tNZXRhLCAmZm9ybWF0KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbWFnZUludGVybmFsOiBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoKSBmYWlsZWQsIHVuYWJsZSB0byBleHRyYWN0IGltYWdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IGJpdERlcHRoID0gODsKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIGlmIChIRVZDUHJvZmlsZU1haW4xMCA9PSBwcm9maWxlIHx8IEhFVkNQcm9maWxlTWFpbjEwSERSMTAgPT0gcHJvZmlsZSB8fAorICAgICAgICAgICAgICAgICAgICBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyA9PSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICBiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpKSB7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICBpZiAoQVYxUHJvZmlsZU1haW4xMCA9PSBwcm9maWxlIHx8IEFWMVByb2ZpbGVNYWluMTBIRFIxMCA9PSBwcm9maWxlIHx8CisgICAgICAgICAgICAgICAgICAgIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXMgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhT25seSkgeworICAgICAgICByZXR1cm4gRnJhbWVEZWNvZGVyOjpnZXRNZXRhZGF0YU9ubHkodHJhY2tNZXRhLCBjb2xvckZvcm1hdCwgdGh1bWJuYWlsLCBiaXREZXB0aCk7CisgICAgfQorCisgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKworICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGluc3RhbnRpYXRlIGltYWdlIHRyYWNrLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCiAgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQudGh1bWJuYWlsLnByZWZlcl9od19jb2RlY3MiLCBmYWxzZSk7CiAgICAgdWludDMyX3QgZmxhZ3MgPSBwcmVmZXJodyA/IDAgOiBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOwogICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKKworICAgIC8vIElmIGRlY29kaW5nIHRodW1ibmFpbCBjaGVjayBkZWNvZGVyIHN1cHBvcnRzIHRodW1ibmFpbCBkaW1lbnNpb25zIGluc3RlYWQKKyAgICBpbnQzMl90IHRodW1iSGVpZ2h0LCB0aHVtYldpZHRoOworICAgIGlmICh0aHVtYm5haWwgJiYgZm9ybWF0ICE9IE5VTEwKKyAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsICZ0aHVtYkhlaWdodCkKKyAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxXaWR0aCwgJnRodW1iV2lkdGgpKSB7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHRodW1iSGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCB0aHVtYldpZHRoKTsKKyAgICB9CisKKyAgICAvLyBJZiBkZWNvZGluZyB0aWxlZCBIRUlGIGNoZWNrIGRlY29kZXIgc3VwcG9ydHMgdGlsZSBkaW1lbnNpb25zIGluc3RlYWQKKyAgICBpZiAoIXRodW1ibmFpbCAmJiBpc0hlaWYgJiYgZm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQ7CisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGlsZVdpZHRoLCAmdGlsZVdpZHRoKSAmJiB0aWxlV2lkdGggPiAwCisgICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRpbGVIZWlnaHQsICZ0aWxlSGVpZ2h0KSAmJiB0aWxlSGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgdGlsZUhlaWdodCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHRpbGVXaWR0aCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAogICAgICAgICAgICAgbWltZSwKICAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCiAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CkBAIC0zNDgsMTEgKzM5OCwxOSBAQAogICAgIGJvb2wgcHJlZmVyaHcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgKICAgICAgICAgICAgICJtZWRpYS5zdGFnZWZyaWdodC50aHVtYm5haWwucHJlZmVyX2h3X2NvZGVjcyIsIGZhbHNlKTsKICAgICB1aW50MzJfdCBmbGFncyA9IHByZWZlcmh3ID8gMCA6IE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3M7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UodHJhY2tNZXRhLCAmZm9ybWF0KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJnZXRGcmFtZUludGVybmFsOiBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoKSBmYWlsZWQsIHVuYWJsZSB0byBleHRyYWN0IGZyYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKICAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAogICAgICAgICAgICAgbWltZSwKICAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCiAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggYmZmZDdiMy4uZWExZmRmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMTYsMTMgKzE2LDE2IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRSZWNvcmRlciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogLy8gVE9ETy93b3JrYXJvdW5kOiBpbmNsdWRpbmcgYmFzZSBsb2dnaW5nIG5vdyBhcyBpdCBjb25mbGljdHMgd2l0aCBBRGVidWcuaAogLy8gYW5kIGl0IG11c3QgYmUgaW5jbHVkZWQgZmlyc3QuCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIldlYm1Xcml0ZXIuaCIKKyNpbmNsdWRlIDx3ZWJtL1dlYm1Xcml0ZXIuaD4KKwogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KQEAgLTY0LDcgKzY3LDcgQEAKIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCi0jaW5jbHVkZSAiQVJUUFdyaXRlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE4NTYsNiArMTg1OSw3IEBACiAvLyBTZXQgdXAgdGhlIGFwcHJvcHJpYXRlIE1lZGlhU291cmNlIGRlcGVuZGluZyBvbiB0aGUgY2hvc2VuIG9wdGlvbgogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNZWRpYVNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKm1lZGlhU291cmNlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCiAgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgewogICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKQEAgLTE5MzYsNiArMTk0MCw3IEBACiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZjYW1lcmFTb3VyY2UsCiAgICAgICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+ICpzb3VyY2UpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHNvdXJjZS0+Y2xlYXIoKTsKIAogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKQEAgLTIxMTQsNiArMjExOSw3IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQXVkaW9FbmNvZGVyKGNvbnN0IHNwPE1lZGlhV3JpdGVyPiYgd3JpdGVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgaWYgKE9LICE9IChzdGF0dXMgPSBjaGVja0F1ZGlvRW5jb2RlckNhcGFiaWxpdGllcygpKSkgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggZDZkZTQ3Zi4uZDc3ODVkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icAppbmRleCAxOWZjMTcyLi5mZWEwMzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAKQEAgLTE5LDcgKzE5LDYgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZmMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcnNlcnZpY2VGdXp6ZXJfZGVmYXVsdHMiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibWVkaWFyZWNvcmRlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhcmVjb3JkZXJfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlRnV6emVyX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgIm1lZGlhX3Blcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImxpYmFuZHJvaWRfbmV0IiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1ldGFkYXRhcmV0cmlldmVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlRnV6emVyX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJwbGF5ZXJzZXJ2aWNlX2RhdGFzb3VyY2UiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibWVkaWFwbGF5ZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYXBsYXllcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2VGdXp6ZXJfZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnBsYXllcnNlcnZpY2VfZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIiwKKyAgICAgICAgImxpYmFuZHJvaWRfbmV0IiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzYzgwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsODMgQEAKKyMgRnV6emVyIGZvciBsaWJtZWRpYXBsYXllcnNlcnZpY2UKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrIFtTdGFnZWZyaWdodE1lZGlhUmVjb3JkZXJdKCNTdGFnZWZyaWdodE1lZGlhUmVjb3JkZXIpCisrIFtTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyXSgjU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcikKKysgW01lZGlhUGxheWVyXSgjTWVkaWFQbGF5ZXIpCisKKyMgPGEgbmFtZT0iU3RhZ2VmcmlnaHRNZWRpYVJlY29yZGVyIj48L2E+IEZ1enplciBmb3IgU3RhZ2VmcmlnaHRNZWRpYVJlY29yZGVyCisKK1N0YWdlZnJpZ2h0TWVkaWFSZWNvcmRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBPdXRwdXQgRm9ybWF0cyAocGFyYW1ldGVyIG5hbWU6IGBzZXRPdXRwdXRGb3JtYXRgKQorMi4gQXVkaW8gRW5jb2RlcnMgKHBhcmFtZXRlciBuYW1lOiBgc2V0QXVkaW9FbmNvZGVyYCkKKzMuIFZpZGVvIEVuY29kZXJzIChwYXJhbWV0ZXIgbmFtZTogYHNldFZpZGVvRW5jb2RlcmApCis0LiBBdWRpbyBTb3VyY2VzIChwYXJhbWV0ZXIgbmFtZTogYHNldEF1ZGlvU291cmNlYCkKKzUuIFZpZGVvIFNvdXJjZXMgKHBhcmFtZXRlciBuYW1lOiBgc2V0VmlkZW9Tb3VyY2VgKQorNi4gTWljcm9waG9uZSBEaXJlY3Rpb24gKHBhcmFtZXRlciBuYW1lOiBgc2V0TWljcm9waG9uZURpcmVjdGlvbmApCisKK1lvdSBjYW4gZmluZCB0aGUgcG9zc2libGUgdmFsdWVzIGluIHRoZSBmdXp6ZXIncyBzb3VyY2UgY29kZS4KKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFyZWNvcmRlcl9mdXp6ZXIKK2BgYAorMi4gUnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21lZGlhcmVjb3JkZXJfZnV6emVyL21lZGlhcmVjb3JkZXJfZnV6emVyCitgYGAKKworIyA8YSBuYW1lPSJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIj48L2E+IEZ1enplciBmb3IgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcgorCitTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGF0YSBzb3VyY2VzOgorMS4gVXJsIChwYXJhbWV0ZXIgbmFtZTogYHVybGApCisyLiBGaWxlIGRlc2NyaXB0b3IgKHBhcmFtZXRlciBuYW1lOiBgZmRgKQorMy4gRGF0YVNvdXJjZSAocGFyYW1ldGVyIG5hbWU6IGBzb3VyY2VgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYHVybGAgfCBVcmwgb2YgZGF0YSBzb3VyY2UgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBmZGAgfCBGaWxlIGRlc2NyaXB0b3IgdmFsdWUgb2YgaW5wdXQgZmlsZSB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHNvdXJjZWAgfCBEYXRhU291cmNlIG9iamVjdCB8IERhdGEgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorMS4gQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIKK2BgYAorMi4gVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21ldGFkYXRhcmV0cmlldmVyX2Z1enplci9tZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIKK2BgYAorCisjIDxhIG5hbWU9Ik1lZGlhUGxheWVyIj48L2E+IEZ1enplciBmb3IgTWVkaWFQbGF5ZXIKKworTWVkaWFQbGF5ZXJTZXJ2aWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGF0YSBzb3VyY2VzOgorMS4gVXJsIChwYXJhbWV0ZXIgbmFtZTogYHVybGApCisyLiBGaWxlIGRlc2NyaXB0b3IgKHBhcmFtZXRlciBuYW1lOiBgZmRgKQorMy4gSVN0cmVhbVNvdXJjZSAgKHBhcmFtZXRlciBuYW1lOiBgc291cmNlYCkKKzQuIElEYXRhU291cmNlIChwYXJhbWV0ZXIgbmFtZTogYHNvdXJjZWApCis1LiBSVFAgUGFyYW1ldGVycyAgKHBhcmFtZXRlciBuYW1lOiBgcnRwUGFyYW1zYCkKKworTWVkaWFQbGF5ZXJTZXJ2aWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIEF1ZGlvIHNlc3Npb25zIChwYXJhbWV0ZXIgbmFtZTogYGF1ZGlvU2Vzc2lvbklkYCkKKzIuIEF1ZGlvIHN0cmV0Y2ggbW9kZXMgKHBhcmFtZXRlciBuYW1lOiBgbVN0cmV0Y2hNb2RlYCkKKzMuIEF1ZGlvIGZhbGxiYWNrIG1vZGVzICAocGFyYW1ldGVyIG5hbWU6IGBtRmFsbGJhY2tNb2RlYCkKKzQuIE1lZGlhIHBhcmFtZXRlciBrZXlzIChwYXJhbWV0ZXIgbmFtZTogYGtleWApCis1LiBBdWRpbyBTdHJlYW0gVHlwZXMgKHBhcmFtZXRlciBuYW1lOiBgc3RyZWFtVHlwZWApCis2LiBNZWRpYSBFdmVudCBUeXBlcyAocGFyYW1ldGVyIG5hbWU6IGBtc2dgKQorNy4gTWVkaWEgSW5mbyBUeXBlcyAocGFyYW1ldGVyIG5hbWU6IGBleHQxYCkKKworWW91IGNhbiBmaW5kIHRoZSBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIGZ1enplcidzIHNvdXJjZSBjb2RlLgorCisjIyMjIFN0ZXBzIHRvIHJ1bgorMS4gQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtZWRpYXBsYXllcl9mdXp6ZXIKK2BgYAorMi4gVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21lZGlhcGxheWVyX2Z1enplci9tZWRpYXBsYXllcl9mdXp6ZXIKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZWRpYXBsYXllcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZWRpYXBsYXllcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTlmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21lZGlhcGxheWVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8TWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgorI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKworY29uc3RleHByIGludDMyX3Qga1V1aWRTaXplID0gMTY7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4U2xlZXBUaW1lSW5NcyA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW5TbGVlcFRpbWVJbk1zID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQbGF5Q291bnRNaW4gPSAxOworY29uc3RleHByIGludDMyX3Qga1BsYXlDb3VudE1heCA9IDEwOworY29uc3RleHByIGludDMyX3Qga01heERpbWVuc2lvbiA9IDgxOTI7Citjb25zdGV4cHIgaW50MzJfdCBrTWluRGltZW5zaW9uID0gMDsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdGV4cHIgYXVkaW9fc2Vzc2lvbl90IGtTdXBwb3J0ZWRBdWRpb1Nlc3Npb25zW10gPSB7CisgICAgQVVESU9fU0VTU0lPTl9ERVZJQ0UsIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFLCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVh9OworCitjb25zdGV4cHIgYXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3Qga0F1ZGlvU3RyZXRjaE1vZGVzW10gPSB7CisgICAgQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9ERUZBVUxULCBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX1ZPSUNFfTsKKworY29uc3RleHByIGF1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdCBrQXVkaW9GYWxsYmFja01vZGVzW10gPSB7CisgICAgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfQ1VUX1JFUEVBVCwgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfREVGQVVMVCwKKyAgICBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19NVVRFLCBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19GQUlMfTsKKworY29uc3RleHByIG1lZGlhX3BhcmFtZXRlcl9rZXlzIGtNZWRpYVBhcmFtS2V5c1tdID0geworICAgIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMsIEtFWV9QQVJBTUVURVJfQVVESU9fQ0hBTk5FTF9DT1VOVCwKKyAgICBLRVlfUEFSQU1FVEVSX1BMQVlCQUNLX1JBVEVfUEVSTUlMTEUsIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywKKyAgICBLRVlfUEFSQU1FVEVSX1JUUF9BVFRSSUJVVEVTfTsKKworY29uc3RleHByIGF1ZGlvX3N0cmVhbV90eXBlX3Qga0F1ZGlvU3RyZWFtVHlwZXNbXSA9IHsKKyAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgICAgQVVESU9fU1RSRUFNX1NZU1RFTSwKKyAgICBBVURJT19TVFJFQU1fUklORywgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsICAgICAgICAgQVVESU9fU1RSRUFNX0FMQVJNLAorICAgIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwKKyAgICBBVURJT19TVFJFQU1fRFRNRiwgICAgICAgICBBVURJT19TVFJFQU1fVFRTLCAgICAgICAgICAgQVVESU9fU1RSRUFNX0FTU0lTVEFOVH07CisKK2NvbnN0ZXhwciBtZWRpYV9ldmVudF90eXBlIGtNZWRpYUV2ZW50VHlwZXNbXSA9IHtNRURJQV9OT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUFJFUEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfQlVGRkVSSU5HX1VQREFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TRUVLX0NPTVBMRVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NUQVJURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUEFVU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NUT1BQRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU0tJUFBFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9OT1RJRllfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9USU1FRF9URVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU1VCVElUTEVfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NRVRBX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRFJNX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfVElNRV9ESVNDT05USU5VSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0lNU19SWF9OT1RJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfQVVESU9fUk9VVElOR19DSEFOR0VEfTsKKworY29uc3RleHByIG1lZGlhX2luZm9fdHlwZSBrTWVkaWFJbmZvVHlwZXNbXSA9IHsKKyAgICBNRURJQV9JTkZPX1VOS05PV04sICAgICAgICAgICBNRURJQV9JTkZPX1NUQVJURURfQVNfTkVYVCwKKyAgICBNRURJQV9JTkZPX1JFTkRFUklOR19TVEFSVCwgICBNRURJQV9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcsCisgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQsICAgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5ELAorICAgIE1FRElBX0lORk9fTkVUV09SS19CQU5EV0lEVEgsIE1FRElBX0lORk9fQkFEX0lOVEVSTEVBVklORywKKyAgICBNRURJQV9JTkZPX05PVF9TRUVLQUJMRSwgICAgICBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSwKKyAgICBNRURJQV9JTkZPX1BMQVlfQVVESU9fRVJST1IsICBNRURJQV9JTkZPX1BMQVlfVklERU9fRVJST1IsCisgICAgTUVESUFfSU5GT19USU1FRF9URVhUX0VSUk9SfTsKKworY29uc3QgY2hhciAqa1VybFByZWZpeFtdID0geyJkYXRhOiIsICJodHRwOi8vIiwgImh0dHBzOi8vIiwgInJ0c3A6Ly8iLCAiY29udGVudDovLyIsICJ0ZXN0Oi8vIn07CisKK3N0cnVjdCBUZXN0U3RyZWFtU291cmNlIDogcHVibGljIElTdHJlYW1Tb3VyY2UgeworICAgIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SVN0cmVhbUxpc3RlbmVyPiAmIC8qbGlzdGVuZXIqLykgb3ZlcnJpZGV7fTsKKyAgICB2b2lkIHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPHNwPElNZW1vcnk+PiAmIC8qYnVmZmVycyovKSBvdmVycmlkZXt9OworICAgIHZvaWQgb25CdWZmZXJBdmFpbGFibGUoc2l6ZV90IC8qaW5kZXgqLykgb3ZlcnJpZGV7fTsKKyAgICBJQmluZGVyICpvbkFzQmluZGVyKCkgeyByZXR1cm4gbnVsbHB0cjsgfTsKK307CisKK2NsYXNzIEJpbmRlckRlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgcHVibGljOgorICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmKSB7IGFib3J0KCk7IH0KK307CisKK2NsYXNzIE1lZGlhUGxheWVyU2VydmljZUZ1enplciB7CisgICBwdWJsaWM6CisgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgICAgICA6IG1GZHAoZGF0YSwgc2l6ZSksIG1EYXRhU291cmNlRmQobWVtZmRfY3JlYXRlKCJJbnB1dEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORykpe307CisgICAgfk1lZGlhUGxheWVyU2VydmljZUZ1enplcigpIHsgY2xvc2UobURhdGFTb3VyY2VGZCk7IH07CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgcHJpdmF0ZToKKyAgICBib29sIHNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlTWVkaWFQbGF5ZXIoKTsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgbUZkcDsKKyAgICBzcDxJTWVkaWFQbGF5ZXI+IG1NZWRpYVBsYXllciA9IG51bGxwdHI7CisgICAgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiBtTWVkaWFQbGF5ZXJDbGllbnQgPSBudWxscHRyOworICAgIGNvbnN0IGludDMyX3QgbURhdGFTb3VyY2VGZDsKK307CisKK2Jvb2wgTWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyOjpzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gLTE7CisgICAgZW51bSBEYXRhU291cmNlVHlwZSB7aHR0cCwgZmQsIHN0cmVhbSwgZmlsZSwgc29ja2V0LCBrTWF4VmFsdWUgPSBzb2NrZXR9OworICAgIHN3aXRjaCAobUZkcC5Db25zdW1lRW51bTxEYXRhU291cmNlVHlwZT4oKSkgeworICAgICAgICBjYXNlIGh0dHA6IHsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgICAgICAgICBoZWFkZXJzLmFkZChTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFCbG9iU2l6ZSA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMCwgc2l6ZSk7CisgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gdXJpU3VmZml4ID0gbUZkcC5Db25zdW1lQnl0ZXM8dWludDhfdD4oZGF0YUJsb2JTaXplKTsKKworICAgICAgICAgICAgc3RyaW5nIHVyaShtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa1VybFByZWZpeCkpOworICAgICAgICAgICAgdXJpICs9ICI7YmFzZTY0LCI7CisgICAgICAgICAgICBBU3RyaW5nIG91dDsKKyAgICAgICAgICAgIGVuY29kZUJhc2U2NCh1cmlTdWZmaXguZGF0YSgpLCB1cmlTdWZmaXguc2l6ZSgpLCAmb3V0KTsKKyAgICAgICAgICAgIHVyaSArPSBvdXQuY19zdHIoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZWRpYVBsYXllci0+c2V0RGF0YVNvdXJjZShudWxscHRyIC8qaHR0cFNlcnZpY2UqLywgdXJpLmNfc3RyKCksICZoZWFkZXJzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgZmQ6IHsKKyAgICAgICAgICAgIHdyaXRlKG1EYXRhU291cmNlRmQsIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBzdGF0dXMgPSBtTWVkaWFQbGF5ZXItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VGZCwgMCwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIHN0cmVhbTogeworICAgICAgICAgICAgc3A8SVN0cmVhbVNvdXJjZT4gc3RyZWFtU291cmNlID0gc3A8VGVzdFN0cmVhbVNvdXJjZT46Om1ha2UoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZWRpYVBsYXllci0+c2V0RGF0YVNvdXJjZShzdHJlYW1Tb3VyY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBmaWxlOiB7CisgICAgICAgICAgICB3cml0ZShtRGF0YVNvdXJjZUZkLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGR1cChtRGF0YVNvdXJjZUZkKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICBzcDxJRGF0YVNvdXJjZT4gaURhdGFTb3VyY2UgPSBSZW1vdGVEYXRhU291cmNlOjp3cmFwKGRhdGFTb3VyY2UpOworICAgICAgICAgICAgaWYgKCFpRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZWRpYVBsYXllci0+c2V0RGF0YVNvdXJjZShpRGF0YVNvdXJjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIHNvY2tldDogeworICAgICAgICAgICAgU3RyaW5nOCBydHBQYXJhbXMgPSBTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGVuZHBvaW50OworICAgICAgICAgICAgZW5kcG9pbnQuc2luX2ZhbWlseSA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVuc2lnbmVkIHNob3J0PigpOworICAgICAgICAgICAgZW5kcG9pbnQuc2luX3BvcnQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci0+c2V0UmV0cmFuc21pdEVuZHBvaW50KCZlbmRwb2ludCk7CisgICAgICAgICAgICBzdGF0dXMgPSBtTWVkaWFQbGF5ZXItPnNldERhdGFTb3VyY2UocnRwUGFyYW1zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyOjppbnZva2VNZWRpYVBsYXllcigpIHsKKyAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKKyAgICBTdHJpbmc4IG5hbWUgPSBTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgIHVpbnQzMl90IHdpZHRoID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluRGltZW5zaW9uLCBrTWF4RGltZW5zaW9uKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5EaW1lbnNpb24sIGtNYXhEaW1lbnNpb24pOworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgc3A8U3VyZmFjZUNvbnRyb2w+IHN1cmZhY2VDb250cm9sID0KKyAgICAgICAgY29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UobmFtZSwgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIGZsYWdzKTsKKyAgICBpZiAoc3VyZmFjZUNvbnRyb2wpIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IHN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7CisgICAgICAgIG1NZWRpYVBsYXllci0+c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpOworICAgIH0KKworICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKKyAgICBidWZmZXJpbmcubUluaXRpYWxNYXJrTXMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1NZWRpYVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworCisgICAgbU1lZGlhUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKKyAgICBzaXplX3QgcGxheUNvdW50ID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa1BsYXlDb3VudE1pbiwga1BsYXlDb3VudE1heCk7CisgICAgZm9yIChzaXplX3QgSWR4ID0gMDsgSWR4IDwgcGxheUNvdW50OyArK0lkeCkgeworICAgICAgICBtTWVkaWFQbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNsZWVwVGltZUluTXMsIGtNYXhTbGVlcFRpbWVJbk1zKSkpOworICAgICAgICBtTWVkaWFQbGF5ZXItPnBhdXNlKCk7CisgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNsZWVwVGltZUluTXMsIGtNYXhTbGVlcFRpbWVJbk1zKSkpOworICAgICAgICBtTWVkaWFQbGF5ZXItPnN0b3AoKTsKKyAgICB9CisgICAgYm9vbCBzdGF0ZTsKKyAgICBtTWVkaWFQbGF5ZXItPmlzUGxheWluZygmc3RhdGUpOworCisgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZTsKKyAgICByYXRlLm1TcGVlZCA9IG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCk7CisgICAgcmF0ZS5tUGl0Y2ggPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIHJhdGUubVN0cmV0Y2hNb2RlID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtBdWRpb1N0cmV0Y2hNb2Rlcyk7CisgICAgcmF0ZS5tRmFsbGJhY2tNb2RlID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtBdWRpb0ZhbGxiYWNrTW9kZXMpOworICAgIG1NZWRpYVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldFBsYXliYWNrU2V0dGluZ3MoJnJhdGUpOworCisgICAgQVZTeW5jU2V0dGluZ3MgKmF2U3luY1NldHRpbmdzID0gbmV3IEFWU3luY1NldHRpbmdzKCk7CisgICAgZmxvYXQgdmlkZW9GcHNIaW50ID0gbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldFN5bmNTZXR0aW5ncygqYXZTeW5jU2V0dGluZ3MsIHZpZGVvRnBzSGludCk7CisgICAgbU1lZGlhUGxheWVyLT5nZXRTeW5jU2V0dGluZ3MoYXZTeW5jU2V0dGluZ3MsICZ2aWRlb0Zwc0hpbnQpOworICAgIGRlbGV0ZSBhdlN5bmNTZXR0aW5nczsKKworICAgIG1NZWRpYVBsYXllci0+c2Vla1RvKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgaW50MzJfdCBtc2VjOworICAgIG1NZWRpYVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldER1cmF0aW9uKCZtc2VjKTsKKyAgICBtTWVkaWFQbGF5ZXItPnJlc2V0KCk7CisKKyAgICBtTWVkaWFQbGF5ZXItPm5vdGlmeUF0KG1GZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworCisgICAgbU1lZGlhUGxheWVyLT5zZXRBdWRpb1N0cmVhbVR5cGUobUZkcC5QaWNrVmFsdWVJbkFycmF5KGtBdWRpb1N0cmVhbVR5cGVzKSk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRMb29waW5nKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIGZsb2F0IGxlZnQgPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIGZsb2F0IHJpZ2h0ID0gbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldFZvbHVtZShsZWZ0LCByaWdodCk7CisKKyAgICBQYXJjZWwgcmVxdWVzdCwgcmVwbHk7CisgICAgcmVxdWVzdC53cml0ZUludDMyKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHJlcXVlc3Quc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1NZWRpYVBsYXllci0+aW52b2tlKHJlcXVlc3QsICZyZXBseSk7CisKKyAgICBQYXJjZWwgZmlsdGVyOworICAgIGZpbHRlci53cml0ZUludDMyKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIGZpbHRlci5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRNZXRhZGF0YUZpbHRlcihmaWx0ZXIpOworCisgICAgYm9vbCB1cGRhdGVPbmx5ID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIGJvb2wgYXBwbHlGaWx0ZXIgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgbU1lZGlhUGxheWVyLT5nZXRNZXRhZGF0YSh1cGRhdGVPbmx5LCBhcHBseUZpbHRlciwgJnJlcGx5KTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICBtTWVkaWFQbGF5ZXItPmF0dGFjaEF1eEVmZmVjdChtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIGludDMyX3Qga2V5ID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtNZWRpYVBhcmFtS2V5cyk7CisgICAgcmVxdWVzdC53cml0ZUludDMyKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHJlcXVlc3Quc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1NZWRpYVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAga2V5ID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtNZWRpYVBhcmFtS2V5cyk7CisgICAgbU1lZGlhUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCAmcmVwbHkpOworCisgICAgc3RydWN0IHNvY2thZGRyX2luIGVuZHBvaW50OworICAgIG1NZWRpYVBsYXllci0+Z2V0UmV0cmFuc21pdEVuZHBvaW50KCZlbmRwb2ludCk7CisKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gbXBTZXJ2aWNlKElNZWRpYURlYXRoTm90aWZpZXI6OmdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKKyAgICBzcDxJTWVkaWFQbGF5ZXI+IG1OZXh0TWVkaWFQbGF5ZXIgPSBtcFNlcnZpY2UtPmNyZWF0ZSgKKyAgICAgICAgbU1lZGlhUGxheWVyQ2xpZW50LCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa1N1cHBvcnRlZEF1ZGlvU2Vzc2lvbnMpLCBhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgbU1lZGlhUGxheWVyLT5zZXROZXh0UGxheWVyKG1OZXh0TWVkaWFQbGF5ZXIpOworCisgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gY29uZmlndXJhdGlvbiA9CisgICAgICAgIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+OjptYWtlKCk7CisgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiBvcGVyYXRpb24gPSBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+OjptYWtlKCk7CisgICAgbU1lZGlhUGxheWVyLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworCisgICAgbU1lZGlhUGxheWVyLT5nZXRWb2x1bWVTaGFwZXJTdGF0ZShtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICB1aW50OF90IHV1aWRba1V1aWRTaXplXTsKKyAgICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGtVdWlkU2l6ZTsgKytpbmRleCkgeworICAgICAgICB1dWlkW2luZGV4XSA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBkcm1TZXNzaW9uSWQ7CisgICAgZHJtU2Vzc2lvbklkLnB1c2hfYmFjayhtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpKTsKKyAgICBtTWVkaWFQbGF5ZXItPnByZXBhcmVEcm0odXVpZCwgZHJtU2Vzc2lvbklkKTsKKyAgICBtTWVkaWFQbGF5ZXItPnJlbGVhc2VEcm0oKTsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1NZWRpYVBsYXllci0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7CisKKyAgICBtTWVkaWFQbGF5ZXItPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobUZkcC5Db25zdW1lQm9vbCgpKTsKKworICAgIHNwPE1lZGlhUGxheWVyPiBtZWRpYVBsYXllciA9IChNZWRpYVBsYXllciAqKW1NZWRpYVBsYXllci5nZXQoKTsKKworICAgIGludDMyX3QgbXNnID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtNZWRpYUV2ZW50VHlwZXMpOworICAgIGludDMyX3QgZXh0MSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShrTWVkaWFJbmZvVHlwZXMpOworICAgIGludDMyX3QgZXh0MiA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgUGFyY2VsIG9iajsKKyAgICBvYmoud3JpdGVJbnQzMihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBvYmouc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1lZGlhUGxheWVyLT5ub3RpZnkobXNnLCBleHQxLCBleHQyLCAmb2JqKTsKKworICAgIGludDMyX3QgbWVkaWFQbGF5ZXJEdW1wRmQgPSBtZW1mZF9jcmVhdGUoIk91dHB1dER1bXBGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBhcmdzLnB1c2hfYmFjayhTdHJpbmcxNihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisgICAgbWVkaWFQbGF5ZXItPmR1bXAobWVkaWFQbGF5ZXJEdW1wRmQsIGFyZ3MpOworICAgIGNsb3NlKG1lZGlhUGxheWVyRHVtcEZkKTsKKworICAgIG1NZWRpYVBsYXllci0+ZGlzY29ubmVjdCgpOworfQorCit2b2lkIE1lZGlhUGxheWVyU2VydmljZUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE1lZGlhUGxheWVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKworICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IG1wU2VydmljZShJTWVkaWFEZWF0aE5vdGlmaWVyOjpnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CisgICAgaWYgKCFtcFNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbWVkaWFDb2RlY0xpc3QgPSBtcFNlcnZpY2UtPmdldENvZGVjTGlzdCgpOworCisgICAgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+IHJlbW90ZURpc3BsYXlDbGllbnQ7CisgICAgc3A8SVJlbW90ZURpc3BsYXk+IHJlbW90ZURpc3BsYXkgPSBtcFNlcnZpY2UtPmxpc3RlbkZvclJlbW90ZURpc3BsYXkoCisgICAgICAgIFN0cmluZzE2KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpIC8qb3BQYWNrYWdlTmFtZSovLCByZW1vdGVEaXNwbGF5Q2xpZW50LAorICAgICAgICBTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpIC8qaWZhY2UqLyk7CisKKyAgICBtcFNlcnZpY2UtPmFkZEJhdHRlcnlEYXRhKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKKyAgICBQYXJjZWwgcmVwbHk7CisgICAgbXBTZXJ2aWNlLT5wdWxsQmF0dGVyeURhdGEoJnJlcGx5KTsKKworICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gbWVkaWFQbGF5ZXJTZXJ2aWNlID0gKE1lZGlhUGxheWVyU2VydmljZSAqKW1wU2VydmljZS5nZXQoKTsKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgbU1lZGlhUGxheWVyID0gbWVkaWFQbGF5ZXJTZXJ2aWNlLT5jcmVhdGUoCisgICAgICAgIG1NZWRpYVBsYXllckNsaWVudCwgbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtTdXBwb3J0ZWRBdWRpb1Nlc3Npb25zKSwgYXR0cmlidXRpb25Tb3VyY2UpOworCisgICAgaW50MzJfdCBtZWRpYVBsYXllclNlcnZpY2VEdW1wRmQgPSBtZW1mZF9jcmVhdGUoIk91dHB1dER1bXBGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBhcmdzLnB1c2hfYmFjayhTdHJpbmcxNihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisgICAgbWVkaWFQbGF5ZXJTZXJ2aWNlLT5kdW1wKG1lZGlhUGxheWVyU2VydmljZUR1bXBGZCwgYXJncyk7CisgICAgY2xvc2UobWVkaWFQbGF5ZXJTZXJ2aWNlRHVtcEZkKTsKKworICAgIGlmICghbU1lZGlhUGxheWVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc2V0RGF0YVNvdXJjZShkYXRhLCBzaXplKSkgeworICAgICAgICBpbnZva2VNZWRpYVBsYXllcigpOworICAgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE1lZGlhUGxheWVyU2VydmljZUZ1enplciBtcHNGdXp6ZXIoZGF0YSwgc2l6ZSk7CisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIG1wc0Z1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWVkaWFyZWNvcmRlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZWRpYXJlY29yZGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwNDBmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWVkaWFyZWNvcmRlcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKworI2luY2x1ZGUgPFN0YWdlZnJpZ2h0UmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTsKKworY29uc3RleHByIHZpZGVvX3NvdXJjZSBrU3VwcG9ydGVkVmlkZW9Tb3VyY2VzW10gPSB7VklERU9fU09VUkNFX0RFRkFVTFQsIFZJREVPX1NPVVJDRV9DQU1FUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT19TT1VSQ0VfU1VSRkFDRX07CisKK2NvbnN0ZXhwciBhdWRpb19zb3VyY2VfdCBrU3VwcG9ydGVkQXVkaW9Tb3VyY2VzW10gPSB7CisgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTkssICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LLAorICAgIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMLCAgICAgICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiwKKyAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYLCAgICAgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VELAorICAgIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSwgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFLAorICAgIEFVRElPX1NPVVJDRV9GTV9UVU5FUiwgICAgICAgICAgQVVESU9fU09VUkNFX0hPVFdPUkR9OworCitjb25zdGV4cHIgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBrU3VwcG9ydGVkTWljcm9waG9uZURpcmVjdGlvbnNbXSA9IHsKKyAgICBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELCBNSUNfRElSRUNUSU9OX0ZST05ULCBNSUNfRElSRUNUSU9OX0JBQ0ssIE1JQ19ESVJFQ1RJT05fRVhURVJOQUx9OworCitzdHJ1Y3QgUmVjb3JkaW5nQ29uZmlnIHsKKyAgICBvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdDsKKyAgICBhdWRpb19lbmNvZGVyIGF1ZGlvRW5jb2RlcjsKKyAgICB2aWRlb19lbmNvZGVyIHZpZGVvRW5jb2RlcjsKK307CisKK2NvbnN0IHN0cnVjdCBSZWNvcmRpbmdDb25maWcga1JlY29yZGluZ0NvbmZpZ0xpc3RbXSA9IHsKKyAgICB7T1VUUFVUX0ZPUk1BVF9BTVJfTkIsIEFVRElPX0VOQ09ERVJfQU1SX05CLCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX0FNUl9XQiwgQVVESU9fRU5DT0RFUl9BTVJfV0IsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfQUFDX0FEVFMsIEFVRElPX0VOQ09ERVJfQUFDLCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX0FBQ19BRFRTLCBBVURJT19FTkNPREVSX0hFX0FBQywgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9BQUNfQURUUywgQVVESU9fRU5DT0RFUl9BQUNfRUxELCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX09HRywgQVVESU9fRU5DT0RFUl9PUFVTLCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX1JUUF9BVlAsIEFVRElPX0VOQ09ERVJfREVGQVVMVCwgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9NUEVHMlRTLCBBVURJT19FTkNPREVSX0FBQywgVklERU9fRU5DT0RFUl9IMjY0fSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9XRUJNLCBBVURJT19FTkNPREVSX1ZPUkJJUywgVklERU9fRU5DT0RFUl9WUDh9LAorICAgIHtPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCwgQVVESU9fRU5DT0RFUl9ERUZBVUxULCBWSURFT19FTkNPREVSX01QRUdfNF9TUH0sCisgICAge09VVFBVVF9GT1JNQVRfTVBFR180LCBBVURJT19FTkNPREVSX0FBQywgVklERU9fRU5DT0RFUl9IMjY0fSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9NUEVHXzQsIEFVRElPX0VOQ09ERVJfREVGQVVMVCwgVklERU9fRU5DT0RFUl9NUEVHXzRfU1B9LAorICAgIHtPVVRQVVRfRk9STUFUX01QRUdfNCwgQVVESU9fRU5DT0RFUl9ERUZBVUxULCBWSURFT19FTkNPREVSX0hFVkN9fTsKKworY29uc3Qgc3RyaW5nIGtQYXJhbWV0ZXJzTGlzdFtdID0geyJtYXgtZHVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtZmlsZXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmxlYXZlLWR1cmF0aW9uLXVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0tbW92aWUtdGltZS1zY2FsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtLWdlb3RhZy1sb25naXR1ZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbS1nZW90YWctbGF0aXR1ZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbS10cmFjay10aW1lLXN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvLXBhcmFtLXNhbXBsaW5nLXJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby1wYXJhbS1lbmNvZGluZy1iaXRyYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8tcGFyYW0tbnVtYmVyLW9mLWNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8tcGFyYW0tdGltZS1zY2FsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLXJvdGF0aW9uLWFuZ2xlLWRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1lbmNvZGluZy1iaXRyYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tYml0cmF0ZS1tb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0taS1mcmFtZXMtaW50ZXJ2YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1lbmNvZGVyLXByb2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1lbmNvZGVyLWxldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tY2FtZXJhLWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tdGltZS1zY2FsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtLXVzZS02NGJpdC1vZmZzZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lLWxhcHNlLWVuYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWUtbGFwc2UtZnBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLWxvY2FsLWlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLWxvY2FsLXBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tcmVtb3RlLXBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tc2VsZi1pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1vcHBvbmVudC1pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1wYXlsb2FkLXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tZXh0LWN2by1leHRtYXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tZXh0LWN2by1kZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tcmVxdWVzdC1pLWZyYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLXNldC1zb2NrZXQtZHNjcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1zZXQtc29ja2V0LW5ldHdvcmsifTsKKworY29uc3RleHByIGludDMyX3Qga01heFNsZWVwVGltZUluTXMgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrTWluU2xlZXBUaW1lSW5NcyA9IDA7Citjb25zdGV4cHIgaW50MzJfdCBrTWluVmlkZW9TaXplID0gMjsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhWaWRlb1NpemUgPSA4MTkyOworY29uc3RleHByIGludDMyX3Qga051bVJlY29yZE1pbiA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrTnVtUmVjb3JkTWF4ID0gMTA7CisKK2NsYXNzIFRlc3RBdWRpb0RldmljZUNhbGxiYWNrIDogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5UZXN0QXVkaW9EZXZpY2VDYWxsYmFjaygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCAvKmF1ZGlvSW8qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAvKmRldmljZUlkKi8pIG92ZXJyaWRle307Cit9OworCitjbGFzcyBUZXN0Q2FtZXJhIDogcHVibGljIElDYW1lcmEgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgflRlc3RDYW1lcmEoKSA9IGRlZmF1bHQ7CisKKyAgICBiaW5kZXI6OlN0YXR1cyBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgeyByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7IH07CisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiAmIC8qY2xpZW50Ki8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3QgbG9jaygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3QgdW5sb2NrKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3VGFyZ2V0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICYgLypidWZmZXJQcm9kdWNlciovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisgICAgdm9pZCBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCAvKmZsYWcqLykgb3ZlcnJpZGV7fTsKKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3Q2FsbGJhY2tUYXJnZXQoCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICYgLypjYWxsYmFja1Byb2R1Y2VyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKyAgICBzdGF0dXNfdCBzdGFydFByZXZpZXcoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHZvaWQgc3RvcFByZXZpZXcoKSBvdmVycmlkZXt9OworICAgIGJvb2wgcHJldmlld0VuYWJsZWQoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9OworICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICB2b2lkIHN0b3BSZWNvcmRpbmcoKSBvdmVycmlkZXt9OworICAgIGJvb2wgcmVjb3JkaW5nRW5hYmxlZCgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH07CisgICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4gJiAvKm1lbSovKSBvdmVycmlkZXt9OworICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCAqIC8qaGFuZGxlKi8pIG92ZXJyaWRle307CisgICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaChjb25zdCB2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+ICYgLypoYW5kbGVzKi8pIG92ZXJyaWRle307CisgICAgc3RhdHVzX3QgYXV0b0ZvY3VzKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCBjYW5jZWxBdXRvRm9jdXMoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IHRha2VQaWN0dXJlKGludCAvKm1zZ1R5cGUqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzggJiAvKnBhcmFtcyovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfTsKKyAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZChpbnQzMl90IC8qY21kKi8sIGludDMyX3QgLyphcmcxKi8sIGludDMyX3QgLyphcmcyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKyAgICBzdGF0dXNfdCBzZXRWaWRlb0J1ZmZlck1vZGUoaW50MzJfdCAvKnZpZGVvQnVmZmVyTW9kZSovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IHNldFZpZGVvVGFyZ2V0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICYgLypidWZmZXJQcm9kdWNlciovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9SZXN0cmljdGlvbihpbnQzMl90IC8qbW9kZSovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIGludDMyX3QgZ2V0R2xvYmFsQXVkaW9SZXN0cmljdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgSUJpbmRlciAqb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SUJpbmRlciAqPih0aGlzKTsgfTsKK307CisKK2NsYXNzIFRlc3RNZWRpYVJlY29yZGVyQ2xpZW50IDogcHVibGljIElNZWRpYVJlY29yZGVyQ2xpZW50IHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5UZXN0TWVkaWFSZWNvcmRlckNsaWVudCgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgbm90aWZ5KGludCAvKm1zZyovLCBpbnQgLypleHQxKi8sIGludCAvKmV4dDIqLykgb3ZlcnJpZGV7fTsKKyAgICBJQmluZGVyICpvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJQmluZGVyICo+KHRoaXMpOyB9OworfTsKKworY2xhc3MgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplciB7CisgICBwdWJsaWM6CisgICAgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgfk1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXIoKSB7IGNsb3NlKG1NZWRpYVJlY29yZGVyT3V0cHV0RmQpOyB9CisgICAgdm9pZCBwcm9jZXNzKCk7CisKKyAgIHByaXZhdGU6CisgICAgdm9pZCBzZXRDb25maWcoKTsKKyAgICB2b2lkIGdldENvbmZpZygpOworICAgIHZvaWQgZHVtcEluZm8oKTsKKworICAgIEZ1enplZERhdGFQcm92aWRlciBtRmRwOworICAgIHVuaXF1ZV9wdHI8TWVkaWFSZWNvcmRlckJhc2U+IG1TdGZSZWNvcmRlciA9IG51bGxwdHI7CisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50IG1Db21wb3NlckNsaWVudDsKKyAgICBzcDxTdXJmYWNlQ29udHJvbD4gbVN1cmZhY2VDb250cm9sID0gbnVsbHB0cjsKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZSA9IG51bGxwdHI7CisgICAgY29uc3QgaW50MzJfdCBtTWVkaWFSZWNvcmRlck91dHB1dEZkOworfTsKKwordm9pZCBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyOjpnZXRDb25maWcoKSB7CisgICAgaW50MzJfdCBtYXg7CisgICAgbVN0ZlJlY29yZGVyLT5nZXRNYXhBbXBsaXR1ZGUoJm1heCk7CisKKyAgICBpbnQzMl90IGRldmljZUlkID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldElucHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICBtU3RmUmVjb3JkZXItPmdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7CisKKyAgICB2ZWN0b3I8YW5kcm9pZDo6bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBhY3RpdmVNaWNyb3Bob25lc3t9OworICAgIG1TdGZSZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoJmFjdGl2ZU1pY3JvcGhvbmVzKTsKKworICAgIGludDMyX3QgcG9ydElkOworICAgIG1TdGZSZWNvcmRlci0+Z2V0UG9ydElkKCZwb3J0SWQpOworCisgICAgdWludDY0X3QgYnl0ZXM7CisgICAgbVN0ZlJlY29yZGVyLT5nZXRSdHBEYXRhVXNhZ2UoJmJ5dGVzKTsKKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgbVN0ZlJlY29yZGVyLT5nZXRNZXRyaWNzKCZwYXJjZWwpOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyID0gbVN0ZlJlY29yZGVyLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXI6OmR1bXBJbmZvKCkgeworICAgIGludDMyX3QgZHVtcEZkID0gbWVtZmRfY3JlYXRlKCJEdW1wRmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgYXJncy5wdXNoX2JhY2soU3RyaW5nMTYobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworICAgIG1TdGZSZWNvcmRlci0+ZHVtcChkdW1wRmQsIGFyZ3MpOworICAgIGNsb3NlKGR1bXBGZCk7Cit9CisKK3ZvaWQgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplcjo6c2V0Q29uZmlnKCkgeworICAgIG1TdGZSZWNvcmRlci0+c2V0T3V0cHV0RmlsZShtTWVkaWFSZWNvcmRlck91dHB1dEZkKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldEF1ZGlvU291cmNlKG1GZHAuUGlja1ZhbHVlSW5BcnJheShrU3VwcG9ydGVkQXVkaW9Tb3VyY2VzKSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRWaWRlb1NvdXJjZShtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa1N1cHBvcnRlZFZpZGVvU291cmNlcykpOworICAgIG1TdGZSZWNvcmRlci0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtTdXBwb3J0ZWRNaWNyb3Bob25lRGlyZWN0aW9ucykpOworICAgIG1TdGZSZWNvcmRlci0+c2V0UHJpdmFjeVNlbnNpdGl2ZShtRmRwLkNvbnN1bWVCb29sKCkpOworICAgIGJvb2wgaXNQcml2YWN5U2Vuc2l0aXZlOworICAgIG1TdGZSZWNvcmRlci0+aXNQcml2YWN5U2Vuc2l0aXZlKCZpc1ByaXZhY3lTZW5zaXRpdmUpOworICAgIG1TdGZSZWNvcmRlci0+c2V0VmlkZW9TaXplKG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluVmlkZW9TaXplLCBrTWF4VmlkZW9TaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblZpZGVvU2l6ZSwga01heFZpZGVvU2l6ZSkpOworICAgIG1TdGZSZWNvcmRlci0+c2V0VmlkZW9GcmFtZVJhdGUobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbVN0ZlJlY29yZGVyLT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKG1GZHAuQ29uc3VtZUJvb2woKSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24obUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRDbGllbnROYW1lKFN0cmluZzE2KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKworICAgIGludDMyX3QgSWR4ID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KDAsIHNpemUoa1JlY29yZGluZ0NvbmZpZ0xpc3QpIC0gMSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRPdXRwdXRGb3JtYXQoa1JlY29yZGluZ0NvbmZpZ0xpc3RbSWR4XS5vdXRwdXRGb3JtYXQpOworICAgIG1TdGZSZWNvcmRlci0+c2V0QXVkaW9FbmNvZGVyKGtSZWNvcmRpbmdDb25maWdMaXN0W0lkeF0uYXVkaW9FbmNvZGVyKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFZpZGVvRW5jb2RlcihrUmVjb3JkaW5nQ29uZmlnTGlzdFtJZHhdLnZpZGVvRW5jb2Rlcik7CisKKyAgICBpbnQzMl90IG5leHRPdXRwdXRGZCA9IG1lbWZkX2NyZWF0ZSgiTmV4dE91dHB1dEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORyk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXROZXh0T3V0cHV0RmlsZShuZXh0T3V0cHV0RmQpOworICAgIGNsb3NlKG5leHRPdXRwdXRGZCk7CisKKyAgICBmb3IgKElkeCA9IDA7IElkeCA8IHNpemUoa1BhcmFtZXRlcnNMaXN0KTsgKytJZHgpIHsKKyAgICAgICAgaWYgKG1GZHAuQ29uc3VtZUJvb2woKSkgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgICAgICBtU3RmUmVjb3JkZXItPnNldFBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgU3RyaW5nOCgoa1BhcmFtZXRlcnNMaXN0W0lkeF0gKyAiPSIgKyB0b19zdHJpbmcodmFsdWUpKS5jX3N0cigpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXI6Ok1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgOiBtRmRwKGRhdGEsIHNpemUpLCBtTWVkaWFSZWNvcmRlck91dHB1dEZkKG1lbWZkX2NyZWF0ZSgiT3V0cHV0RmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKSkgeworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBtU3RmUmVjb3JkZXIgPSBtYWtlX3VuaXF1ZTxTdGFnZWZyaWdodFJlY29yZGVyPihhdHRyaWJ1dGlvblNvdXJjZSk7CisKKyAgICBtU3VyZmFjZUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQuY3JlYXRlU3VyZmFjZSgKKyAgICAgICAgU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSwgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCksCisgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpLCBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLAorICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBpZiAobVN1cmZhY2VDb250cm9sKSB7CisgICAgICAgIG1TdXJmYWNlID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7CisgICAgICAgIG1TdGZSZWNvcmRlci0+c2V0UHJldmlld1N1cmZhY2UobVN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CisgICAgfQorCisgICAgc3A8VGVzdE1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gc3A8VGVzdE1lZGlhUmVjb3JkZXJDbGllbnQ+OjptYWtlKCk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICBzcDxUZXN0Q2FtZXJhPiB0ZXN0Q2FtZXJhID0gc3A8VGVzdENhbWVyYT46Om1ha2UoKTsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IENhbWVyYTo6Y3JlYXRlKHRlc3RDYW1lcmEpOworICAgIG1TdGZSZWNvcmRlci0+c2V0Q2FtZXJhKGNhbWVyYS0+cmVtb3RlKCksIGNhbWVyYS0+Z2V0UmVjb3JkaW5nUHJveHkoKSk7CisKKyAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gcGVyc2lzdGVudFN1cmZhY2UgPSBzcDxQZXJzaXN0ZW50U3VyZmFjZT46Om1ha2UoKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldElucHV0U3VyZmFjZShwZXJzaXN0ZW50U3VyZmFjZSk7CisKKyAgICBzcDxUZXN0QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzcDxUZXN0QXVkaW9EZXZpY2VDYWxsYmFjaz46Om1ha2UoKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2spOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXI6OnByb2Nlc3MoKSB7CisgICAgc2V0Q29uZmlnKCk7CisKKyAgICBtU3RmUmVjb3JkZXItPmluaXQoKTsKKyAgICBtU3RmUmVjb3JkZXItPnByZXBhcmUoKTsKKyAgICBzaXplX3QgbnVtUmVjb3JkID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa051bVJlY29yZE1pbiwga051bVJlY29yZE1heCk7CisgICAgZm9yIChzaXplX3QgSWR4ID0gMDsgSWR4IDwgbnVtUmVjb3JkOyArK0lkeCkgeworICAgICAgICBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNsZWVwVGltZUluTXMsIGtNYXhTbGVlcFRpbWVJbk1zKSkpOworICAgICAgICBtU3RmUmVjb3JkZXItPnBhdXNlKCk7CisgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNsZWVwVGltZUluTXMsIGtNYXhTbGVlcFRpbWVJbk1zKSkpOworICAgICAgICBtU3RmUmVjb3JkZXItPnJlc3VtZSgpOworICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGNocm9ubzo6bWlsbGlzZWNvbmRzKAorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5TbGVlcFRpbWVJbk1zLCBrTWF4U2xlZXBUaW1lSW5NcykpKTsKKyAgICAgICAgbVN0ZlJlY29yZGVyLT5zdG9wKCk7CisgICAgfQorICAgIGR1bXBJbmZvKCk7CisgICAgZ2V0Q29uZmlnKCk7CisKKyAgICBtU3RmUmVjb3JkZXItPmNsb3NlKCk7CisgICAgbVN0ZlJlY29yZGVyLT5yZXNldCgpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplciBtcmNGdXp6ZXIoZGF0YSwgc2l6ZSk7CisgICAgbXJjRnV6emVyLnByb2Nlc3MoKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NiNjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3QgY2hhciAqa01pbWVUeXBlc1tdID0ge01FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcsICAgICAgICAgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcsICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQsICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDMsICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19YVklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01KUEVHLCAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0ksIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSwgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFAsICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLCAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSwgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLCAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMsICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fV01BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNLCAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQsICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRywgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMsICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTLCAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQLCAgICAgICAgICBNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCwgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV83MDgsICAgICAgIE1FRElBX01JTUVUWVBFX0RBVEFfVElNRURfSUQzfTsKKworY2xhc3MgTWV0YWRhdGFSZXRyaWV2ZXJGdXp6ZXIgeworICAgcHVibGljOgorICAgIE1ldGFkYXRhUmV0cmlldmVyRnV6emVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgICAgICA6IG1GZHAoZGF0YSwgc2l6ZSksCisgICAgICAgICAgbU1kUmV0cmlldmVyKG5ldyBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkpLAorICAgICAgICAgIG1EYXRhU291cmNlRmQobWVtZmRfY3JlYXRlKCJJbnB1dEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORykpIHt9CisgICAgfk1ldGFkYXRhUmV0cmlldmVyRnV6emVyKCkgeyBjbG9zZShtRGF0YVNvdXJjZUZkKTsgfQorICAgIGJvb2wgc2V0RGF0YVNvdXJjZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBnZXREYXRhKCk7CisKKyAgIHByaXZhdGU6CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIG1GZHA7CisgICAgc3A8U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcj4gbU1kUmV0cmlldmVyID0gbnVsbHB0cjsKKyAgICBjb25zdCBpbnQzMl90IG1EYXRhU291cmNlRmQ7Cit9OworCit2b2lkIE1ldGFkYXRhUmV0cmlldmVyRnV6emVyOjpnZXREYXRhKCkgeworICAgIGludDY0X3QgdGltZVVzID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICBpbnQzMl90IG9wdGlvbiA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgYm9vbCBtZXRhT25seSA9IG1GZHAuQ29uc3VtZUJvb2woKTsKKyAgICBtTWRSZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworCisgICAgaW50MzJfdCBpbmRleCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgY29sb3JGb3JtYXQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1ldGFPbmx5ID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIGJvb2wgdGh1bWJuYWlsID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIG1NZFJldHJpZXZlci0+Z2V0SW1hZ2VBdEluZGV4KGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCk7CisKKyAgICBpbmRleCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgY29sb3JGb3JtYXQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGludDMyX3QgbGVmdCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgaW50MzJfdCB0b3AgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGludDMyX3QgcmlnaHQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGludDMyX3QgYm90dG9tID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtTWRSZXRyaWV2ZXItPmdldEltYWdlUmVjdEF0SW5kZXgoaW5kZXgsIGNvbG9yRm9ybWF0LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworCisgICAgaW5kZXggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGNvbG9yRm9ybWF0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtZXRhT25seSA9IG1GZHAuQ29uc3VtZUJvb2woKTsKKyAgICBtTWRSZXRyaWV2ZXItPmdldEZyYW1lQXRJbmRleChpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKworICAgIG1NZFJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CisKKyAgICBpbnQzMl90IGtleUNvZGUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1NZFJldHJpZXZlci0+ZXh0cmFjdE1ldGFkYXRhKGtleUNvZGUpOworfQorCitib29sIE1ldGFkYXRhUmV0cmlldmVyRnV6emVyOjpzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gLTE7CisKKyAgICBlbnVtIERhdGFTb3VyY2VDaG9pY2Uge0Zyb21IdHRwLCBGcm9tRmQsIEZyb21GaWxlU291cmNlLCBrTWF4VmFsdWUgPSBGcm9tRmlsZVNvdXJjZX07CisgICAgc3dpdGNoIChtRmRwLkNvbnN1bWVFbnVtPERhdGFTb3VyY2VDaG9pY2U+KCkpIHsKKyAgICAgICAgY2FzZSBGcm9tSHR0cDogeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUhlYWRlcnM7CisgICAgICAgICAgICBtSGVhZGVycy5hZGQoU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKworICAgICAgICAgICAgdWludDMyX3QgZGF0YUJsb2JTaXplID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQxNl90PigwLCBzaXplKTsKKyAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiB1cmlTdWZmaXggPSBtRmRwLkNvbnN1bWVCeXRlczx1aW50OF90PihkYXRhQmxvYlNpemUpOworCisgICAgICAgICAgICBzdHJpbmcgdXJpKCJkYXRhOiIpOworICAgICAgICAgICAgdXJpICs9ICI7YmFzZTY0LCI7CisgICAgICAgICAgICBBU3RyaW5nIG91dDsKKyAgICAgICAgICAgIGVuY29kZUJhc2U2NCh1cmlTdWZmaXguZGF0YSgpLCB1cmlTdWZmaXguc2l6ZSgpLCAmb3V0KTsKKyAgICAgICAgICAgIHVyaSArPSBvdXQuY19zdHIoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZFJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShudWxscHRyIC8qaHR0cFNlcnZpY2UqLywgdXJpLmNfc3RyKCksICZtSGVhZGVycyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb21GZDogeworICAgICAgICAgICAgd3JpdGUobURhdGFTb3VyY2VGZCwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZFJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZUZkLCAwLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbUZpbGVTb3VyY2U6IHsKKyAgICAgICAgICAgIHdyaXRlKG1EYXRhU291cmNlRmQsIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKG1EYXRhU291cmNlRmQpLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZFJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlLCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa01pbWVUeXBlcykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE1ldGFkYXRhUmV0cmlldmVyRnV6emVyIG1ydEZ1enplcihkYXRhLCBzaXplKTsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgaWYgKG1ydEZ1enplci5zZXREYXRhU291cmNlKGRhdGEsIHNpemUpKSB7CisgICAgICAgIG1ydEZ1enplci5nZXREYXRhKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcAppbmRleCBhZjljZjQ1Li5jM2JkMjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcApAQCAtNjIsNyArNjIsOCBAQAogICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKAogICAgICAgICAgICAgICAgICAgICBiaW5kZXIsIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIkFXYWtlTG9jayIpLCBTdHJpbmcxNigibWVkaWEiKSwKLSAgICAgICAgICAgICAgICAgICAge30gLyogd29ya1NvdXJjZSAqLywge30gLyogaGlzdG9yeVRhZyAqLywgLTEgLyogZGlzcGxheUlkICovKTsKKyAgICAgICAgICAgICAgICAgICAge30gLyogd29ya1NvdXJjZSAqLywge30gLyogaGlzdG9yeVRhZyAqLywgLTEgLyogZGlzcGxheUlkICovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGNhbGxiYWNrICovKTsKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgICAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKaW5kZXggNmQzMzhkYi4uNzFhMzE2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKQEAgLTM3LDIwICszNywyMiBAQAogICAgICAgICAiU3RyZWFtaW5nU291cmNlLmNwcCIsCiAgICAgXSwKIAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZS9udXBsYXllciIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCi0gICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC03NCwxMCArNzYsMTIgQEAKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggNDM5ZGJlOC4uMzZlNGQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKICNpbmNsdWRlICJOdVBsYXllckRybS5oIgogCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5Lmg+CkBAIC00NCw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IDc3ZTc4ODUuLjRlNzFlODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMTksOCArMTksNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UuaCIKLQotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJMaXZlRGF0YVNvdXJjZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTMxLDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CiAKIC8vIGRlZmF1bHQgYnVmZmVyIHByZXBhcmUvcmVhZHkvdW5kZXJmbG93IG1hcmtzCiBzdGF0aWMgY29uc3QgaW50IGtSZWFkeU1hcmtNcyAgICAgPSA1MDAwOyAgLy8gNSBzZWNvbmRzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCA5YWU3ZGRiLi45YjRmYzhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTM1LDkgKzM1LDcgQEAKICNpbmNsdWRlICJSVFNQU291cmNlLmgiCiAjaW5jbHVkZSAiU3RyZWFtaW5nU291cmNlLmgiCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgotI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKLQotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorI2luY2x1ZGUgPHRpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCkBAIC01Niw2ICs1NCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KKwogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIApAQCAtMjg5Myw2ICsyODkzLDM4IEBACiAgICAgICAgICAgICBpbi53cml0ZUludDMyKHJlY3ZUaW1lVXMgJiAweEZGRkZGRkZGKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRDUF9SUjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50NjRfdCByZWN2VGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBzZW5kZXJJZDsKKyAgICAgICAgICAgIGludDMyX3Qgc3NyYzsKKyAgICAgICAgICAgIGludDMyX3QgZnJhY3Rpb247CisgICAgICAgICAgICBpbnQzMl90IGxvc3Q7CisgICAgICAgICAgICBpbnQzMl90IGxhc3RTZXE7CisgICAgICAgICAgICBpbnQzMl90IGppdHRlcjsKKyAgICAgICAgICAgIGludDMyX3QgbHNyOworICAgICAgICAgICAgaW50MzJfdCBkbHNyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInJlY3YtdGltZS11cyIsICZyZWN2VGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1yci1zc3JjIiwgJnNlbmRlcklkKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItc3NyYyIsICZzc3JjKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItZnJhY3Rpb24iLCAmZnJhY3Rpb24pKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1sb3N0IiwgJmxvc3QpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1sYXN0U2VxIiwgJmxhc3RTZXEpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1qaXR0ZXIiLCAmaml0dGVyKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItbHNyIiwgJmxzcikpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLWRsc3IiLCAmZGxzcikpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihyZWN2VGltZVVzID4+IDMyKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyAmIDB4RkZGRkZGRkYpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihzZW5kZXJJZCk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHNzcmMpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihmcmFjdGlvbik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGxvc3QpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihsYXN0U2VxKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoaml0dGVyKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIobHNyKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoZGxzcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUQ1BfVFNGQjogICAvLyBSVENQIFRTRkIKICAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVENQX1BTRkI6ICAgLy8gUlRDUCBQU0ZCCiAgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRQX0FVVE9ET1dOOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCAyYzFmMTU4Li41MmIyMDQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtNDAsMTAgKzQwLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBmbG9hdCBrRGlzcGxheVJlZnJlc2hpbmdSYXRlID0gNjAuZjsgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSB0aGUgZGlzcGxheQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKaW5kZXggNzkzMDE0ZS4uY2I5MWZkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCkBAIC0zMCw4ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDRhNjVmNzEuLjI4MjhkNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTE2NzMsMjQgKzE2NzMsMTggQEAKIAogICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwogCi0gICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7Ci0gICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgIGlmICghb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKICAgICAgICAgICAgIC8vIENhbGwgc3RvcCgpIHRvIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGUKICAgICAgICAgICAgIC8vIGludGVybmFsIGJ1ZmZlciBiZWZvcmUgcmVzdW1pbmcgcGxheWJhY2suCiAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBpZ25vcmVkIGFmdGVyIGZsdXNoKCkuCiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOwogICAgICAgICB9CisgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgfQogICAgICAgICBtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgPSAtMTsKICAgICB9IGVsc2UgewogICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCmluZGV4IDRkNmE0ODMuLjZhMTc5NzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCkBAIC0zMzYsNyArMzM2LDcgQEAKICAgICAqZHVyYXRpb25VcyA9IDBsbDsKIAogICAgIGludDY0X3QgYXVkaW9EdXJhdGlvblVzOwotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpICE9IE5VTEwKICAgICAgICAgICAgICYmIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAogICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJmF1ZGlvRHVyYXRpb25VcykKICAgICAgICAgICAgICYmIGF1ZGlvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHZpZGVvRHVyYXRpb25VczsKLSAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAorICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKSAhPSBOVUxMCiAgICAgICAgICAgICAmJiBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZ2aWRlb0R1cmF0aW9uVXMpCiAgICAgICAgICAgICAmJiB2aWRlb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDhlMDVkZTguLjc1Y2VkY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTIwLDEzICsyMCwxMiBAQAogCiAjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgogCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIk15SGFuZGxlci5oIgotI2luY2x1ZGUgIlNEUExvYWRlci5oIgotCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IGJlYzI3ZDMuLjlkNjdjYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC0yMCw4ICsyMCw2IEBACiAKICNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKIAotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJOdVBsYXllclN0cmVhbUxpc3RlbmVyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgpAQCAtMzEsNiArMjksOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvQVdha2VMb2NrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvQVdha2VMb2NrLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IDdhMmFiOGYuLjgwZTA2ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0yMSwxMSArMjEsMTAgQEAKICNpbmNsdWRlICJOdVBsYXllci5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRHJtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRybS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvUlRQU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9SVFBTb3VyY2UuaAppbmRleCAzYjRmOWU5Li43ZDliYjhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvUlRQU291cmNlLmgKQEAgLTIzLDI1ICsyMywyMCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKIAotCi0KLQotCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1JUU1BTb3VyY2UuaAppbmRleCAwM2ZjZTA4Li43NDk3ZTQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1JUU1BTb3VyY2UuaApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKIAotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggOTg2MjZmZC4uOTkyMDJiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCmluZGV4IGM4MWE2NTkuLjJiZWI0N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKQEAgLTYxLDcgKzYxLDExIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCAvKiBwaWQgKi8pIHsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRUcnVzdGVkKGludCAvKiBwaWQgKi8pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzUGlkVWlkVHJ1c3RlZChpbnQgLyogcGlkICovLCBpbnQgLyogdWlkICovKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAKaW5kZXggOTIyMzZlYS4uNmViOGM2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCkBAIC0zMywxMCArMzMsNiBAQAogICAgICAgICAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCmluZGV4IDA0Mjg1MGMuLjkzNzY1MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKQEAgLTEwNiw4ICsxMDYsOCBAQAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrIiwKICAgICAgICAgImxpYnN0YXRzbG9nX21lZGlhIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaAppbmRleCA5MzExZTJlLi5lYTYzZGE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmgKQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QsIG9yIHRoZSBjbGllbnQgaXMgYWxyZWFkeSByZXF1ZXN0aW5nIHRoZQogICAgICAqIHNlc3Npb24uIFJldHVybnMgdHJ1ZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgdmlydHVhbCBib29sIGFkZENsaWVudFVpZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCB1aWRfdCBjbGllbnRVaWQpOworICAgIHZpcnR1YWwgYm9vbCBhZGRDbGllbnRVaWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgY2xpZW50VWlkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgdGhlICh1bnNvcnRlZCkgbGlzdCBvZiBhbGwgY2xpZW50cyByZXF1ZXN0aW5nIHRoZSBzZXNzaW9uIGlkZW50aWZpZWQgYnkKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QuIFJldHVybnMgdHJ1ZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgdmlydHVhbCBib29sIGdldENsaWVudFVpZHMoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X2NsaWVudFVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfY2xpZW50VWlkcykgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+Q29udHJvbGxlckNsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCA2MDM2MTFhLi43YTY5ODBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMSw3ICszMSw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJsaWJtZWRpYXRyYW5zY29kaW5nIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFuc2NvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYW5zY29kZXIuY3BwCmluZGV4IGUyMGY3YWIuLjQxMWI2ZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYW5zY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYW5zY29kZXIuY3BwCkBAIC01NSw4ICs1NSw4IEBACiAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhzcmNGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJnNyY01pbWUpOwogICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyhvcHRpb25zLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZkc3RNaW1lKSB8fAogICAgICAgICBzdHJjbXAoc3JjTWltZSwgZHN0TWltZSkgPT0gMCkgewotICAgICAgICBzcmNQYXJhbXNUb0NvcHkucHVzaF9iYWNrKEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsIFN0cmluZykpOwotICAgICAgICBzcmNQYXJhbXNUb0NvcHkucHVzaF9iYWNrKEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCBTdHJpbmcpKTsKKyAgICAgICAgc3JjUGFyYW1zVG9Db3B5LnB1c2hfYmFjayhFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCBJbnQzMikpOworICAgICAgICBzcmNQYXJhbXNUb0NvcHkucHVzaF9iYWNrKEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCBJbnQzMikpOwogICAgIH0KIAogICAgIC8vIC0tLS0tLS0gRGVmaW5lIHBhcmFtZXRlcnMgdG8gY29weSBmcm9tIHRoZSBjYWxsZXIncyBvcHRpb25zIC0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCmluZGV4IDM0OGI0ZjguLjYzNWY2N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtNDIsMTAgKzQyLDYgQEAKICAgICAvL3ZpcnR1YWwgc2l6ZV90IGZyYW1lc1VuZGVycnVuKCkgY29uc3Q7CiAgICAgLy92aXJ0dWFsIHNpemVfdCB1bmRlcnJ1bnMoKSBjb25zdDsKIAotICAgIC8vIFRoaXMgaXMgYW4gb3Zlci1lc3RpbWF0ZSwgYW5kIGNvdWxkIGR1cGUgdGhlIGNhbGxlciBpbnRvIG1ha2luZyBhIGJsb2NraW5nIHdyaXRlKCkKLSAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGVtcHR5aW5nIHN0YXR1cyB3aGVuIGl0J3MgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1dyaXRlKCkgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyAvIG1GcmFtZVNpemU7IH0KLQogICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDFhYTE4NDguLjUyYzRjMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtNzcsNiArNzcsNyBAQAogbmFtZXNwYWNlIHsKIAogY29uc3RleHByIGNoYXIgVFVOTkVMX1BFRUtfS0VZW10gPSAiYW5kcm9pZC5fdHJpZ2dlci10dW5uZWwtcGVlayI7Citjb25zdGV4cHIgY2hhciBUVU5ORUxfUEVFS19TRVRfTEVHQUNZX0tFWVtdID0gImFuZHJvaWQuX3R1bm5lbC1wZWVrLXNldC1sZWdhY3kiOwogCiB9CiAKQEAgLTIxOTUsNyArMjE5NiwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtbWF4LW91dHB1dC1jaGFubmVsX2NvdW50IiwgJm1heE91dHB1dENoYW5uZWxDb3VudCkpIHsKLSAgICAgICAgICAgICAgICBtYXhPdXRwdXRDaGFubmVsQ291bnQgPSAtMTsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBub24gQUFDLXNwZWNpZmljIGtleQorICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIm1heC1vdXRwdXQtY2hhbm5lbC1jb3VudCIsICZtYXhPdXRwdXRDaGFubmVsQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1heE91dHB1dENoYW5uZWxDb3VudCA9IC0xOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1wY20tbGltaXRlci1lbmFibGUiLCAmcGNtTGltaXRlckVuYWJsZSkpIHsKICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCkBAIC0yNDgwLDE3ICsyNDg0LDM5IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgT01YX0NPTkZJR19CT09MRUFOVFlQRSBjb25maWc7Ci0gICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKLSAgICBjb25maWcuYkVuYWJsZWQgPSAoT01YX0JPT0wpKHR1bm5lbFBlZWsgIT0gMCk7CisgICAgT01YX0NPTkZJR19CT09MRUFOVFlQRSB0dW5uZWxQZWVrQ29uZmlnOworICAgIEluaXRPTVhQYXJhbXMoJnR1bm5lbFBlZWtDb25maWcpOworICAgIHR1bm5lbFBlZWtDb25maWcuYkVuYWJsZWQgPSAoT01YX0JPT0wpKHR1bm5lbFBlZWsgIT0gMCk7CiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRUdW5uZWxQZWVrLAotICAgICAgICAgICAgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgICAgICAgICAgJnR1bm5lbFBlZWtDb25maWcsIHNpemVvZih0dW5uZWxQZWVrQ29uZmlnKSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiZGVjb2RlciBjYW5ub3Qgc2V0ICVzIHRvICVkIChlcnIgJWQpIiwKLSAgICAgICAgICAgICAgVFVOTkVMX1BFRUtfS0VZLCB0dW5uZWxQZWVrLCBlcnIpOworICAgICAgICAgICAgICAgIFRVTk5FTF9QRUVLX0tFWSwgdHVubmVsUGVlaywgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQUNvZGVjOjpzZXRUdW5uZWxQZWVrTGVnYWN5KGludDMyX3QgaXNMZWdhY3kpIHsKKyAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICBBTE9HRSgiZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0ICVzIiwgVFVOTkVMX1BFRUtfU0VUX0xFR0FDWV9LRVkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIW1UdW5uZWxlZCkgeworICAgICAgICBBTE9HRSgiJXMgaXMgb25seSBzdXBwb3J0ZWQgaW4gdHVubmVsIG1vZGUiLCBUVU5ORUxfUEVFS19TRVRfTEVHQUNZX0tFWSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgT01YX0NPTkZJR19CT09MRUFOVFlQRSB0dW5uZWxQZWVrTGVnYWN5TW9kZUNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZ0dW5uZWxQZWVrTGVnYWN5TW9kZUNvbmZpZyk7CisgICAgdHVubmVsUGVla0xlZ2FjeU1vZGVDb25maWcuYkVuYWJsZWQgPSAoT01YX0JPT0wpKGlzTGVnYWN5ICE9IDApOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBbmRyb2lkVHVubmVsUGVla0xlZ2FjeU1vZGUsCisgICAgICAgICAgICAmdHVubmVsUGVla0xlZ2FjeU1vZGVDb25maWcsIHNpemVvZih0dW5uZWxQZWVrTGVnYWN5TW9kZUNvbmZpZykpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImRlY29kZXIgY2Fubm90IHNldCB2aWRlbyBwZWVrIGxlZ2FjeSBtb2RlIHRvICVkIChlcnIgJWQpIiwKKyAgICAgICAgICAgICAgICBpc0xlZ2FjeSwgIGVycik7CisgICAgfQogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTMzMDQsMTAgKzMzMzAsMTIgQEAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oJXApIGZhaWxlZCEgKGVyciAlZCkuIiwKICAgICAgICAgICAgICAgICBzaWRlYmFuZEhhbmRsZSwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzaWRlYmFuZEhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc2lkZWJhbmRIYW5kbGUpOworCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKApAQCAtNTM5NSwyMSArNTQyMywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb24sIHNpemVvZihwcmVzZW50YXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1jdXQtbGV2ZWwiLCBwcmVzZW50YXRpb24ubkRyY0N1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYm9vc3QtbGV2ZWwiLCBwcmVzZW50YXRpb24ubkRyY0Jvb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5IZWF2eUNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLXRhcmdldC1yZWYtbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWVmZmVjdC10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY0VmZmVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWFsYnVtLW1vZGUiLCBwcmVzZW50YXRpb24ubkRyY0FsYnVtTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtb3V0cHV0LWxvdWRuZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY091dHB1dExvdWRuZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWVuY29kZWQtdGFyZ2V0LWxldmVsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWN1dC1sZXZlbCIsIHByZXNlbnRhdGlvbi5uRHJjQ3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWJvb3N0LWxldmVsIiwgcHJlc2VudGF0aW9uLm5EcmNCb29zdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkhlYXZ5Q29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtZWZmZWN0LXR5cGUiLCBwcmVzZW50YXRpb24ubkRyY0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYWxidW0tbW9kZSIsIHByZXNlbnRhdGlvbi5uRHJjQWxidW1Nb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLW91dHB1dC1sb3VkbmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY091dHB1dExvdWRuZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU0MzEsNiArNTQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJiaXRyYXRlIiwgcGFyYW1zLm5CaXRSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBwYXJhbXMuZUFBQ1Byb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc5MjgsMTEgKzc5NTcsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDMyX3QgdHVubmVsUGVlayA9IDA7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKFRVTk5FTF9QRUVLX0tFWSwgJnR1bm5lbFBlZWspKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHNldFR1bm5lbFBlZWsodHVubmVsUGVlayk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgeworICAgICAgICBpbnQzMl90IHR1bm5lbFBlZWsgPSAwOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoVFVOTkVMX1BFRUtfS0VZLCAmdHVubmVsUGVlaykpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldFR1bm5lbFBlZWsodHVubmVsUGVlayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIGludDMyX3QgdHVubmVsUGVla1NldExlZ2FjeSA9IDA7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihUVU5ORUxfUEVFS19TRVRfTEVHQUNZX0tFWSwgJnR1bm5lbFBlZWtTZXRMZWdhY3kpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRUdW5uZWxQZWVrTGVnYWN5KHR1bm5lbFBlZWtTZXRMZWdhY3kpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyMDUsNCArOTI0NSwxOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgeworICAgIGlmICghbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnN1YnNjcmliZVRvUGFyYW1ldGVycyhbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6dW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCBhMDUyYTcwLi4xMGJhZWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTEwOSw2ICsxMDksNyBAQAogCiAgICAgc3JjczogWwogICAgICAgICAiQ29kZWNCYXNlLmNwcCIsCisgICAgICAgICJEYXRhQ29udmVydGVyLmNwcCIsCiAgICAgICAgICJGcmFtZVJlbmRlclRyYWNrZXIuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCIsCiAgICAgICAgICJTa2lwQ3V0QnVmZmVyLmNwcCIsCkBAIC0xMjUsNiArMTI2LDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMjUxLDYgKzI1Myw0MCBAQAogICAgICAgICBdLAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc3VyZmFjZV91dGlscyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTdXJmYWNlVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHQiLAogCkBAIC0yNjYsNyArMzAyLDYgQEAKICAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCIsCi0gICAgICAgICJEYXRhQ29udmVydGVyLmNwcCIsCiAgICAgICAgICJGcmFtZURlY29kZXIuY3BwIiwKICAgICAgICAgIkhldmNVdGlscy5jcHAiLAogICAgICAgICAiSW50ZXJmYWNlVXRpbHMuY3BwIiwKQEAgLTM0MCw2ICszNzUsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggYjZhY2RjOC4uYmZlODUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtMzYsMjEgKzM2LDkgQEAKIAogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAotc3RhdGljIHZvaWQgQXVkaW9SZWNvcmRDYWxsYmFja0Z1bmN0aW9uKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgewotICAgIEF1ZGlvU291cmNlICpzb3VyY2UgPSAoQXVkaW9Tb3VyY2UgKikgdXNlcjsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQXVkaW9SZWNvcmQ6OkVWRU5UX01PUkVfREFUQTogewotICAgICAgICAgICAgc291cmNlLT5kYXRhQ2FsbGJhY2soKigoQXVkaW9SZWNvcmQ6OkJ1ZmZlciAqKSBpbmZvKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEF1ZGlvUmVjb3JkOjpFVkVOVF9PVkVSUlVOOiB7Ci0gICAgICAgICAgICBBTE9HVygiQXVkaW9SZWNvcmQgcmVwb3J0ZWQgb3ZlcnJ1biEiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBkb2VzIG5vdGhpbmcKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKwordm9pZCBBdWRpb1NvdXJjZTo6b25PdmVycnVuKCkgeworICAgIEFMT0dXKCJBdWRpb1JlY29yZCByZXBvcnRlZCBvdmVycnVuISIpOwogfQogCiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCkBAIC0xMjksOCArMTE3LDcgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgIChzaXplX3QpIChidWZDb3VudCAqIGZyYW1lQ291bnQpLAotICAgICAgICBBdWRpb1JlY29yZENhbGxiYWNrRnVuY3Rpb24sCi0gICAgICAgIHRoaXMsCisgICAgICAgIHdwPEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjaz57dGhpc30sCiAgICAgICAgIGZyYW1lQ291bnQgLypub3RpZmljYXRpb25GcmFtZXMqLywKICAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0RFRkFVTFQsCkBAIC0zNTksNyArMzQ2LDcgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXR1c190IEF1ZGlvU291cmNlOjpkYXRhQ2FsbGJhY2soY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYXVkaW9CdWZmZXIpIHsKK3NpemVfdCBBdWRpb1NvdXJjZTo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBhdWRpb0J1ZmZlcikgewogICAgIGludDY0X3QgdGltZVVzLCBwb3NpdGlvbiwgdGltZU5zOwogICAgIEV4dGVuZGVkVGltZXN0YW1wIHRzOwogICAgIEV4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbiBsb2NhdGlvbjsKQEAgLTM4NCwyMSArMzcxLDIxIEBACiAKICAgICBBTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wOiAlIiBQUklkNjQgIiB1cyIsIHRpbWVVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR1coIlNwdXJpb3VzIGNhbGxiYWNrIGZyb20gQXVkaW9SZWNvcmQuIERyb3AgdGhlIGF1ZGlvIGRhdGEuIik7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIGF1ZGlvQnVmZmVyLnNpemUoKTsKICAgICB9CiAKLSAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKICAgICAvLyBEcm9wIHJldHJpZXZlZCBhbmQgcHJldmlvdXNseSBsb3N0IGF1ZGlvIGRhdGEuCiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwICYmIHRpbWVVcyA8IG1TdGFydFRpbWVVcykgewogICAgICAgICAodm9pZCkgbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7Ci0gICAgICAgIGludDY0X3QgcmVjZWlldmVkRnJhbWVzID0gYnVmZmVyU2l6ZSAvIG1SZWNvcmQtPmZyYW1lU2l6ZSgpOworICAgICAgICBpbnQ2NF90IHJlY2VpZXZlZEZyYW1lcyA9IGF1ZGlvQnVmZmVyLnNpemUoKSAvIG1SZWNvcmQtPmZyYW1lU2l6ZSgpOwogICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhKCUiIFBSSWQ2NCAiIGZyYW1lcykgYXQgJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgIHJlY2VpZXZlZEZyYW1lcywgdGltZVVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICBtTnVtRnJhbWVzU2tpcHBlZCArPSByZWNlaWV2ZWRGcmFtZXM7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIGF1ZGlvQnVmZmVyLnNpemUoKTsKICAgICB9CiAKICAgICBpZiAobVN0b3BTeXN0ZW1UaW1lVXMgIT0gLTEgJiYgdGltZVVzID49IG1TdG9wU3lzdGVtVGltZVVzKSB7CkBAIC00MDYsNyArMzkzLDcgQEAKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltU3RvcFN5c3RlbVRpbWVVcyk7CiAgICAgICAgIG1Ob01vcmVGcmFtZXNUb1JlYWQgPSB0cnVlOwogICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIGF1ZGlvQnVmZmVyLnNpemUoKTsKICAgICB9CiAKICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgbVByZXZTYW1wbGVUaW1lVXMgPT0gMCkgewpAQCAtNDI3LDcgKzQxNCw3IEBACiAgICAgfQogCiAgICAgQ0hFQ0tfRVEobnVtTG9zdEJ5dGVzICYgMSwgMHUpOwotICAgIENIRUNLX0VRKGF1ZGlvQnVmZmVyLnNpemUgJiAxLCAwdSk7CisgICAgQ0hFQ0tfRVEoYXVkaW9CdWZmZXIuc2l6ZSgpICYgMSwgMHUpOwogICAgIGlmIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CiAgICAgICAgIC8vIExvc3Mgb2YgYXVkaW8gZnJhbWVzIHNob3VsZCBoYXBwZW4gcmFyZWx5OyB0aHVzIHRoZSBMT0dXIHNob3VsZAogICAgICAgICAvLyBub3QgY2F1c2UgYSBsb2dnaW5nIHNwYW0KQEAgLTQ0OSwxNyArNDM2LDE3IEBACiAgICAgICAgIHF1ZXVlSW5wdXRCdWZmZXJfbChsb3N0QXVkaW9CdWZmZXIsIHRpbWVVcyk7CiAgICAgfQogCi0gICAgaWYgKGF1ZGlvQnVmZmVyLnNpemUgPT0gMCkgeworICAgIGlmIChhdWRpb0J1ZmZlci5zaXplKCkgPT0gMCkgewogICAgICAgICBBTE9HVygiTm90aGluZyBpcyBhdmFpbGFibGUgZnJvbSBBdWRpb1JlY29yZCBjYWxsYmFjayBidWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyU2l6ZSk7CisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihhdWRpb0J1ZmZlci5zaXplKCkpOwogICAgIG1lbWNweSgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgIGF1ZGlvQnVmZmVyLmkxNiwgYXVkaW9CdWZmZXIuc2l6ZSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBhdWRpb0J1ZmZlci5kYXRhKCksIGF1ZGlvQnVmZmVyLnNpemUoKSk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYXVkaW9CdWZmZXIuc2l6ZSgpKTsKICAgICBxdWV1ZUlucHV0QnVmZmVyX2woYnVmZmVyLCB0aW1lVXMpOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogfQogCiB2b2lkIEF1ZGlvU291cmNlOjpxdWV1ZUlucHV0QnVmZmVyX2woTWVkaWFCdWZmZXIgKmJ1ZmZlciwgaW50NjRfdCB0aW1lVXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDk1YWZhNjIuLjk2MDc0MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNTY0LDkgKzU2NCwxMSBAQAogICAgIC8vIFNldCB0aGUgcHJldmlldyBkaXNwbGF5LiBTa2lwIHRoaXMgaWYgbVN1cmZhY2UgaXMgbnVsbCBiZWNhdXNlCiAgICAgLy8gYXBwbGljYXRpb25zIG1heSBhbHJlYWR5IHNldCBhIHN1cmZhY2UgdG8gdGhlIGNhbWVyYS4KICAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBUaGlzIENIRUNLIGlzIGdvb2QsIHNpbmNlIHdlIGp1c3QgcGFzc2VkIHRoZSBsb2NrL3VubG9jawotICAgICAgICAvLyBjaGVjayBlYXJsaWVyIGJ5IGNhbGxpbmcgbUNhbWVyYS0+c2V0UGFyYW1ldGVycygpLgotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1DYW1lcmEtPnNldFByZXZpZXdUYXJnZXQobVN1cmZhY2UpKTsKKyAgICAgICAgLy8gU3VyZmFjZSBtYXkgYmUgc2V0IGluY29ycmVjdGx5IG9yIGNvdWxkIGFscmVhZHkgYmUgdXNlZCBldmVuIGlmIHdlIGp1c3QKKyAgICAgICAgLy8gcGFzc2VkIHRoZSBsb2NrL3VubG9jayBjaGVjayBlYXJsaWVyIGJ5IGNhbGxpbmcgbUNhbWVyYS0+c2V0UGFyYW1ldGVycygpLgorICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmEtPnNldFByZXZpZXdUYXJnZXQobVN1cmZhY2UpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFVzZSBidWZmZXIgcXVldWUgdG8gcmVjZWl2ZSB2aWRlbyBidWZmZXJzIGZyb20gY2FtZXJhCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAppbmRleCBlZmQ0MDcwLi4zZGY4NzY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZUNhcHR1cmVQcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNDksNyArNTAsNyBAQAogCiBzcDxJTWVtb3J5PiBhbGxvY1ZpZGVvRnJhbWUoY29uc3Qgc3A8TWV0YURhdGE+JiB0cmFja01ldGEsCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHRpbGVXaWR0aCwgaW50MzJfdCB0aWxlSGVpZ2h0LAotICAgICAgICBpbnQzMl90IGRzdEJwcCwgYm9vbCBhbGxvY1JvdGF0ZWQsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICAgICAgaW50MzJfdCBkc3RCcHAsIHVpbnQzMl90IGJpdERlcHRoLCBib29sIGFsbG9jUm90YXRlZCwgYm9vbCBtZXRhT25seSkgewogICAgIGludDMyX3Qgcm90YXRpb25BbmdsZTsKICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7CiAgICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOyAgLy8gQnkgZGVmYXVsdCwgbm8gcm90YXRpb24KQEAgLTEwNCw3ICsxMDUsNyBAQAogICAgIH0KIAogICAgIFZpZGVvRnJhbWUgZnJhbWUod2lkdGgsIGhlaWdodCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCByb3RhdGlvbkFuZ2xlLCBkc3RCcHAsICFtZXRhT25seSwgaWNjU2l6ZSk7CisgICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHJvdGF0aW9uQW5nbGUsIGRzdEJwcCwgYml0RGVwdGgsICFtZXRhT25seSwgaWNjU2l6ZSk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLmdldEZsYXR0ZW5lZFNpemUoKTsKICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQiKTsKQEAgLTEyNSwxNSArMTI2LDE1IEBACiAKIHNwPElNZW1vcnk+IGFsbG9jVmlkZW9GcmFtZShjb25zdCBzcDxNZXRhRGF0YT4mIHRyYWNrTWV0YSwKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgdGlsZVdpZHRoLCBpbnQzMl90IHRpbGVIZWlnaHQsCi0gICAgICAgIGludDMyX3QgZHN0QnBwLCBib29sIGFsbG9jUm90YXRlZCA9IGZhbHNlKSB7Ci0gICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZHN0QnBwLAorICAgICAgICBpbnQzMl90IGRzdEJwcCwgdWludDhfdCBiaXREZXB0aCwgYm9vbCBhbGxvY1JvdGF0ZWQgPSBmYWxzZSkgeworICAgIHJldHVybiBhbGxvY1ZpZGVvRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCwgYml0RGVwdGgsCiAgICAgICAgICAgICBhbGxvY1JvdGF0ZWQsIGZhbHNlIC8qbWV0YU9ubHkqLyk7CiB9CiAKIHNwPElNZW1vcnk+IGFsbG9jTWV0YUZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB0aWxlV2lkdGgsIGludDMyX3QgdGlsZUhlaWdodCwKLSAgICAgICAgaW50MzJfdCBkc3RCcHApIHsKLSAgICByZXR1cm4gYWxsb2NWaWRlb0ZyYW1lKHRyYWNrTWV0YSwgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHAsCisgICAgICAgIGludDMyX3QgZHN0QnBwLCB1aW50OF90IGJpdERlcHRoKSB7CisgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZHN0QnBwLCBiaXREZXB0aCwKICAgICAgICAgICAgIGZhbHNlIC8qYWxsb2NSb3RhdGVkKi8sIHRydWUgLyptZXRhT25seSovKTsKIH0KIApAQCAtMTkyLDYgKzE5MywxMyBAQAogICAgICAgICAgICAgKmRzdEJwcCA9IDQ7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOgorICAgICAgICB7CisgICAgICAgICAgICAqZHN0Rm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKUNPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTA7CisgICAgICAgICAgICAqY2FwdHVyZUZvcm1hdCA9IHVpOjpQaXhlbEZvcm1hdDo6UkdCQV8xMDEwMTAyOworICAgICAgICAgICAgKmRzdEJwcCA9IDQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0OiAlZCIsIGNvbG9yRm9ybWF0KTsKQEAgLTIwMyw3ICsyMTEsNyBAQAogCiAvL3N0YXRpYwogc3A8SU1lbW9yeT4gRnJhbWVEZWNvZGVyOjpnZXRNZXRhZGF0YU9ubHkoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgdGh1bWJuYWlsKSB7CisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgdGh1bWJuYWlsLCB1aW50MzJfdCBiaXREZXB0aCkgewogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdDsKICAgICB1aTo6UGl4ZWxGb3JtYXQgY2FwdHVyZUZvcm1hdDsKICAgICBpbnQzMl90IGRzdEJwcDsKQEAgLTIyNyw3ICsyMzUsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8SU1lbW9yeT4gbWV0YU1lbSA9IGFsbG9jTWV0YUZyYW1lKHRyYWNrTWV0YSwgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHApOworICAgIHNwPElNZW1vcnk+IG1ldGFNZW0gPQorICAgICAgICAgICAgYWxsb2NNZXRhRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCwgYml0RGVwdGgpOwogCiAgICAgLy8gdHJ5IHRvIGZpbGwgc2VxdWVuY2UgbWV0YSdzIGR1cmF0aW9uIGJhc2VkIG9uIGF2ZXJhZ2UgZnJhbWUgcmF0ZSwKICAgICAvLyBkZWZhdWx0IHRvIDMzbXMgaWYgZnJhbWUgcmF0ZSBpcyB1bmF2YWlsYWJsZS4KQEAgLTI2MiwxMyArMjcxLDEwIEBACiB9CiAKIGJvb2wgaXNIRFIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKLSAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIHVpbnQzMl90IHN0YW5kYXJkLCB0cmFuc2ZlcjsKICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CiAgICAgICAgIHN0YW5kYXJkID0gMDsKICAgICB9Ci0gICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgewotICAgICAgICByYW5nZSA9IDA7Ci0gICAgfQogICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKICAgICAgICAgdHJhbnNmZXIgPSAwOwogICAgIH0KQEAgLTUyNiw4ICs1MzIsMTEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gVE9ETzogVXNlIEZsZXhpYmxlIGNvbG9yIGluc3RlYWQKLSAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgIGlmIChkc3RGb3JtYXQoKSA9PSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwKSB7CisgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgQ09MT1JfRm9ybWF0WVVWUDAxMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICB9CiAKICAgICAvLyBGb3IgdGhlIHRodW1ibmFpbCBleHRyYWN0aW9uIGNhc2UsIHRyeSB0byBhbGxvY2F0ZSBzaW5nbGUgYnVmZmVyIGluIGJvdGgKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IHBvcnRzLCBpZiBzZWVraW5nIHRvIGEgc3luYyBmcmFtZS4gTk9URTogVGhpcyByZXF1ZXN0IG1heQpAQCAtNjM1LDYgKzY0NCwxNiBAQAogICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CiAgICAgfQogCisgICAgaW50MzJfdCBzbGljZV9oZWlnaHQ7CisgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmc2xpY2VfaGVpZ2h0KSAmJiBzbGljZV9oZWlnaHQgPiAwKSB7CisgICAgICAgIGhlaWdodCA9IHNsaWNlX2hlaWdodDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aCA9IDg7CisgICAgaWYgKENPTE9SX0Zvcm1hdFlVVlAwMTAgPT0gc3JjRm9ybWF0KSB7CisgICAgICAgIGJpdERlcHRoID0gMTA7CisgICAgfQorCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKAogICAgICAgICAgICAgICAgIHRyYWNrTWV0YSgpLApAQCAtNjQzLDYgKzY2Miw3IEBACiAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIGRzdEJwcCgpLAorICAgICAgICAgICAgICAgIGJpdERlcHRoLAogICAgICAgICAgICAgICAgIG1DYXB0dXJlTGF5ZXIgIT0gbnVsbHB0ciAvKmFsbG9jUm90YXRlZCovKTsKICAgICAgICAgaWYgKGZyYW1lTWVtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CkBAIC03OTYsOCArODE2LDE2IEBACiAgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHRpbGVkIGhlaWYKICAgICAgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICAgICAgaW50MzJfdCB3aWR0aENvbHNQcm9kdWN0ID0gMDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHRSb3dzUHJvZHVjdCA9IDA7CiAgICAgICAgIGlmIChmaW5kR3JpZEluZm8odHJhY2tNZXRhKCksICZ0aWxlV2lkdGgsICZ0aWxlSGVpZ2h0LCAmZ3JpZFJvd3MsICZncmlkQ29scykpIHsKLSAgICAgICAgICAgIGlmIChtV2lkdGggPD0gdGlsZVdpZHRoICogZ3JpZENvbHMgJiYgbUhlaWdodCA8PSB0aWxlSGVpZ2h0ICogZ3JpZFJvd3MpIHsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHRpbGVXaWR0aCwgZ3JpZENvbHMsICZ3aWR0aENvbHNQcm9kdWN0KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KHRpbGVIZWlnaHQsIGdyaWRSb3dzLCAmaGVpZ2h0Um93c1Byb2R1Y3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpcGxpY2F0aW9uIG92ZXJmbG93ZWQgR3JpZCBzaXplOiAlZHglZCwgUGljdHVyZSBzaXplOiAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBncmlkQ29scywgZ3JpZFJvd3MsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVdpZHRoIDw9IHdpZHRoQ29sc1Byb2R1Y3QgJiYgbUhlaWdodCA8PSBoZWlnaHRSb3dzUHJvZHVjdCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJncmlkOiAlZHglZCwgdGlsZSBzaXplOiAlZHglZCwgcGljdHVyZSBzaXplOiAlZHglZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBncmlkQ29scywgZ3JpZFJvd3MsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgbVdpZHRoLCBtSGVpZ2h0KTsKIApAQCAtODI2LDggKzg1NCwxMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBUT0RPOiBVc2UgRmxleGlibGUgY29sb3IgaW5zdGVhZAotICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgaWYgKGRzdEZvcm1hdCgpID09IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTApIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDT0xPUl9Gb3JtYXRZVVZQMDEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgIH0KIAogICAgIGlmICgobUdyaWRSb3dzID09IDEpICYmIChtR3JpZENvbHMgPT0gMSkpIHsKICAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0taW5wdXQtYnVmZmVycyIsIDEpOwpAQCAtODgyLDE0ICs5MTMsMzIgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlKSk7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNyY0Zvcm1hdDsKKyAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSA9PSBmYWxzZSkgeworICAgICAgICBBTE9HRSgiTWVkaWFJbWFnZURlY29kZXI6Om9uT3V0cHV0UmVjZWl2ZWQ6d2lkdGggaXMgbWlzc2luZyBpbiBvdXRwdXRGb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSA9PSBmYWxzZSkgeworICAgICAgICBBTE9HRSgiTWVkaWFJbWFnZURlY29kZXI6Om9uT3V0cHV0UmVjZWl2ZWQ6aGVpZ2h0IGlzIG1pc3NpbmcgaW4gb3V0cHV0Rm9ybWF0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhSW1hZ2VEZWNvZGVyOjpvbk91dHB1dFJlY2VpdmVkOnN0cmlkZSBpcyBtaXNzaW5nIGluIG91dHB1dEZvcm1hdCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpID09IGZhbHNlKSB7CisgICAgICAgIEFMT0dFKCJNZWRpYUltYWdlRGVjb2Rlcjo6b25PdXRwdXRSZWNlaXZlZDogY29sb3IgZm9ybWF0IGlzIG1pc3NpbmcgaW4gb3V0cHV0Rm9ybWF0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgYml0RGVwdGggPSA4OworICAgIGlmIChDT0xPUl9Gb3JtYXRZVVZQMDEwID09IHNyY0Zvcm1hdCkgeworICAgICAgICBiaXREZXB0aCA9IDEwOworICAgIH0KIAogICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgewogICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKLSAgICAgICAgICAgICAgICB0cmFja01ldGEoKSwgbVdpZHRoLCBtSGVpZ2h0LCBtVGlsZVdpZHRoLCBtVGlsZUhlaWdodCwgZHN0QnBwKCkpOworICAgICAgICAgICAgICAgIHRyYWNrTWV0YSgpLCBtV2lkdGgsIG1IZWlnaHQsIG1UaWxlV2lkdGgsIG1UaWxlSGVpZ2h0LCBkc3RCcHAoKSwgYml0RGVwdGgpOwogCiAgICAgICAgIGlmIChmcmFtZU1lbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtOTAwLDkgKzk0OSw2IEBACiAgICAgICAgIHNldEZyYW1lKGZyYW1lTWVtKTsKICAgICB9CiAKLSAgICBpbnQzMl90IHNyY0Zvcm1hdDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOwotCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAogICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CkBAIC05MjQsNiArOTcwLDExIEBACiAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKICAgICB9CiAKKyAgICBpbnQzMl90IHNsaWNlX2hlaWdodDsKKyAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZzbGljZV9oZWlnaHQpICYmIHNsaWNlX2hlaWdodCA+IDApIHsKKyAgICAgICAgaGVpZ2h0ID0gc2xpY2VfaGVpZ2h0OworICAgIH0KKwogICAgIGludDMyX3QgY3JvcF93aWR0aCwgY3JvcF9oZWlnaHQ7CiAgICAgY3JvcF93aWR0aCA9IGNyb3BfcmlnaHQgLSBjcm9wX2xlZnQgKyAxOwogICAgIGNyb3BfaGVpZ2h0ID0gY3JvcF9ib3R0b20gLSBjcm9wX3RvcCArIDE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggN2M3ZmNhYy4uNjNkMzE4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtNDQsNiArNDUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KQEAgLTE1Niw3ICsxNTgsNyBAQAogICAgIGJvb2wgaXNIZWljKCkgY29uc3QgeyByZXR1cm4gbUlzSGVpYzsgfQogICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CiAgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KLSAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWM7IH0KKyAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWMgfHwgbUlzRG92aTsgfQogICAgIGJvb2wgaXNFeGlmRGF0YShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0OwogICAgIHZvaWQgYWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwogICAgIHZvaWQgYWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGlzRXhpZik7CkBAIC0xNjQsNiArMTY2LDcgQEAKICAgICBUcmFja0lkJiBnZXRUcmFja0lkKCkgeyByZXR1cm4gbVRyYWNrSWQ7IH0KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldEZvdXJDQ0Zvck1pbWUoY29uc3QgY2hhciAqbWltZSk7CisgICAgY29uc3QgY2hhciAqZ2V0RG92aUZvdXJDQygpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldFRyYWNrVHlwZSgpIGNvbnN0OwogICAgIHZvaWQgcmVzZXRJbnRlcm5hbCgpOwogICAgIGludDY0X3QgdHJhY2tNZXRhRGF0YVNpemUoKTsKQEAgLTMxNiw2ICszMTksNyBAQAogICAgIHZvbGF0aWxlIGJvb2wgbVN0YXJ0ZWQ7CiAgICAgYm9vbCBtSXNBdmM7CiAgICAgYm9vbCBtSXNIZXZjOworICAgIGJvb2wgbUlzRG92aTsKICAgICBib29sIG1Jc0F1ZGlvOwogICAgIGJvb2wgbUlzVmlkZW87CiAgICAgYm9vbCBtSXNIZWljOwpAQCAtMzcwLDYgKzM3NCw4IEBACiAgICAgdWludDhfdCBtUHJvZmlsZUNvbXBhdGlibGU7CiAgICAgdWludDhfdCBtTGV2ZWxJZGM7CiAKKyAgICBpbnQzMl90IG1Eb3ZpUHJvZmlsZTsKKwogICAgIHZvaWQgKm1Db2RlY1NwZWNpZmljRGF0YTsKICAgICBzaXplX3QgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZTsKICAgICBib29sIG1Hb3RBbGxDb2RlY1NwZWNpZmljRGF0YTsKQEAgLTQyMiw2ICs0MjgsOCBAQAogICAgIHN0YXR1c190IHBhcnNlSEVWQ0NvZGVjU3BlY2lmaWNEYXRhKAogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIEhldmNQYXJhbWV0ZXJTZXRzICZwYXJhbVNldHMpOwogCisgICAgc3RhdHVzX3QgZ2V0RG9sYnlWaXNpb25Qcm9maWxlKCk7CisKICAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCiAgICAgdm9pZCB0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CiAgICAgdm9pZCBpbml0VHJhY2tpbmdQcm9ncmVzc1N0YXR1cyhNZXRhRGF0YSAqcGFyYW1zKTsKQEAgLTQ1OSw2ICs0NjcsNyBAQAogICAgIHZvaWQgd3JpdGVQYXNwQm94KCk7CiAgICAgdm9pZCB3cml0ZUF2Y2NCb3goKTsKICAgICB2b2lkIHdyaXRlSHZjY0JveCgpOworICAgIHZvaWQgd3JpdGVEb3ZpQ29uZmlnQm94KCk7CiAgICAgdm9pZCB3cml0ZVVybEJveCgpOwogICAgIHZvaWQgd3JpdGVEcmVmQm94KCk7CiAgICAgdm9pZCB3cml0ZURpbmZCb3goKTsKQEAgLTQ3MCw2ICs0NzksNyBAQAogICAgIHZvaWQgd3JpdGVIZGxyQm94KCk7CiAgICAgdm9pZCB3cml0ZVRraGRCb3godWludDMyX3Qgbm93KTsKICAgICB2b2lkIHdyaXRlQ29sckJveCgpOworICAgIHZvaWQgd3JpdGVNZGN2QW5kQ2xsaUJveGVzKCk7CiAgICAgdm9pZCB3cml0ZU1wNGFFc2RzQm94KCk7CiAgICAgdm9pZCB3cml0ZU1wNHZFc2RzQm94KCk7CiAgICAgdm9pZCB3cml0ZUF1ZGlvRm91ckNDQm94KCk7CkBAIC02MTcsNiArNjI3LDE3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitjb25zdCBjaGFyICpNUEVHNFdyaXRlcjo6VHJhY2s6OmdldERvdmlGb3VyQ0MoKSBjb25zdCB7CisgICAgaWYgKG1Eb3ZpUHJvZmlsZSA9PSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuKSB7CisgICAgICAgIHJldHVybiAiZHZoMSI7CisgICAgfSBlbHNlIGlmIChtRG92aVByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0KSB7CisgICAgICAgIHJldHVybiAiaHZjMSI7CisgICAgfSBlbHNlIGlmIChtRG92aVByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgIHJldHVybiAiYXZjMSI7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCiAvLyBzdGF0aWMKIGNvbnN0IGNoYXIgKk1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0Rm91ckNDRm9yTWltZShjb25zdCBjaGFyICptaW1lKSB7CiAgICAgaWYgKG1pbWUgPT0gTlVMTCkgewpAQCAtNjcxLDcgKzY5MiwxNCBAQAogICAgICAgICBtSXNCYWNrZ3JvdW5kTW9kZSB8PSBpc0JhY2tncm91bmRNb2RlOwogICAgIH0KIAotICAgIGlmIChUcmFjazo6Z2V0Rm91ckNDRm9yTWltZShtaW1lKSA9PSBOVUxMKSB7CisgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSkgeworICAgICAgICAvLyBGb3IgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLAorICAgICAgICAvLyBnZXRGb3VyQ0NGb3JNaW1lKCkgcmVxdWlyZXMgcHJvZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICAvLyB0byBkZWNpZGUgdGhlIGZpbmFsIEZvdXJDQyBjb2Rlcy4KKyAgICAgICAgLy8gU28gd2UgbGV0IHRoZSBjcmVhdGlvbiBvZiB0aGUgbmV3IHRyYWNrIG5vdyBhbmQKKyAgICAgICAgLy8gYXNzaWduIEZvdXJDQyBjb2RlcyBsYXRlciB1c2luZyBnZXREb3ZpRm91ckNDKCkKKyAgICAgICAgQUxPR1YoIkFkZCBzb3VyY2UgbWltZSAnJXMnIiwgbWltZSk7CisgICAgfSBlbHNlIGlmIChUcmFjazo6Z2V0Rm91ckNDRm9yTWltZShtaW1lKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBtaW1lICclcyciLCBtaW1lKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTIxNTAsNiArMjE3OCw3IEBACiAgICAgICBtTWluQ3R0c09mZnNldFRpbWVVcygwKSwKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGlja3MoMCksCiAgICAgICBtTWF4Q3R0c09mZnNldFRpY2tzKDApLAorICAgICAgbURvdmlQcm9maWxlKDApLAogICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhKE5VTEwpLAogICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSgwKSwKICAgICAgIG1Hb3RBbGxDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCkBAIC0yMTc2LDYgKzIyMDUsNyBAQAogICAgIG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBtSXNBdmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwogICAgIG1Jc0hldmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICBtSXNEb3ZpID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKTsKICAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CiAgICAgbUlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOwogICAgIG1Jc0hlaWMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwpAQCAtMjYxMCw3ICsyNjQwLDEyIEBACiAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7CiAgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pKSB7Ci0gICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5RFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSk7CisgICAgICAgIGdldERvbGJ5VmlzaW9uUHJvZmlsZSgpOworICAgICAgICBpZiAoIW1NZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAhbU1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZDogTm8gSFZDQy9BVkNDIGZvciBEb2xieSBWaXNpb24gLi5cbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgfHwKICAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgaWYgKG1NZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKQEAgLTI2NTEsNiArMjY4Niw3IEBACiAgICAgICAgIGZyZWUobUNvZGVjU3BlY2lmaWNEYXRhKTsKICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gTlVMTDsKICAgICB9CisKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmluaXRUcmFja2luZ1Byb2dyZXNzU3RhdHVzKE1ldGFEYXRhICpwYXJhbXMpIHsKQEAgLTMzMjksNiArMzM2NSw0MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXREb2xieVZpc2lvblByb2ZpbGUoKSB7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpkYXRhID0gTlVMTDsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgICBpZiAoIW1NZXRhLT5maW5kRGF0YShrS2V5RFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkgJiYKKyAgICAgICAgIW1NZXRhLT5maW5kRGF0YShrS2V5RFZWQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkgJiYKKyAgICAgICAgIW1NZXRhLT5maW5kRGF0YShrS2V5RFZXQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgZ2V0dGluZyBEb3ZpIGNvbmZpZyBmb3IgRG9sYnkgVmlzaW9uICVkIiwgKGludClzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGRvbGJ5VmlzaW9uUHJvZmlsZU1hcCA9IHsKKyAgICAgICAgezEsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW59LAorICAgICAgICB7MywgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbn0sCisgICAgICAgIHs0LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyfSwKKyAgICAgICAgezUsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG59LAorICAgICAgICB7NiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aH0sCisgICAgICAgIHs3LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRifSwKKyAgICAgICAgezgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdH0sCisgICAgICAgIHs5LCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2V9LAorICAgICAgICB7MTAsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTB9CisgICAgfTsKKworICAgIC8vIERvbGJ5IFZpc2lvbiBwcm9maWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBwZXIKKyAgICAvLyBodHRwczovL2RvbGJ5Lm15LnNhbGVzZm9yY2UuY29tL3NmYy9wLyM3MDAwMDAwMDlZdUcvYS80dTAwMDAwMGw2RkIvMDc2d0hZRW15RWZ6MDltMFYxYm84NV8yNWhsVUpqYWlXVGJ6b3JObVlZNAorICAgIHVpbnQ4X3QgZHZfcHJvZmlsZSA9ICgoKCh1aW50OF90ICopZGF0YSlbMl0gPj4gMSkgJiAweDdmKTsKKworICAgIGlmICghZG9sYnlWaXNpb25Qcm9maWxlTWFwLm1hcChkdl9wcm9maWxlLCAmbURvdmlQcm9maWxlKSkgeworICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgRG9sYnkgUHJvZmlsZSBmcm9tIERWIENvbmZpZyBkYXRhIik7CisgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIC8qCiAgKiBVcGRhdGVzIHRoZSBkcmlmdCB0aW1lIGZyb20gdGhlIGF1ZGlvIHRyYWNrIHNvIHRoYXQKICAqIHRoZSB2aWRlbyB0cmFjayBjYW4gZ2V0IHRoZSB1cGRhdGVkIGRyaWZ0IHRpbWUgaW5mb3JtYXRpb24KQEAgLTM0NzQsOCArMzU0NCwyNyBAQAogICAgICAgICAgICAgICAgICAgICBlcnIgPSBjb3B5Q29kZWNTcGVjaWZpY0RhdGEoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSXNEb3ZpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldERvbGJ5VmlzaW9uUHJvZmlsZSgpOworICAgICAgICAgICAgICAgICAgICBpZihlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURvdmlQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA8IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJEViBQcm9maWxlcyA+IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgZGF0YSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weUNvZGVjU3BlY2lmaWNEYXRhKCh1aW50OF90ICopZGF0YSwgc2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgaWYgKE9LICE9IGVycikgewpAQCAtNDE3Myw2ICs0MjYyLDcgQEAKICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpIHx8CiAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZSkgfHwKICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkgfHwKKyAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLCBtaW1lKSB8fAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsIG1pbWUpKSB7CiAgICAgICAgIGlmICghbUNvZGVjU3BlY2lmaWNEYXRhIHx8CiAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplIDw9IDApIHsKQEAgLTQyOTcsNyArNDM4NywxMyBAQAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgYm9vbCBzdWNjZXNzID0gbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwotICAgIGNvbnN0IGNoYXIgKmZvdXJjYyA9IGdldEZvdXJDQ0Zvck1pbWUobWltZSk7CisgICAgY29uc3QgY2hhciAqZm91cmNjOworICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikpIHsKKyAgICAgICAgZm91cmNjID0gZ2V0RG92aUZvdXJDQygpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvdXJjYyA9IGdldEZvdXJDQ0Zvck1pbWUobWltZSk7CisgICAgfQorCiAgICAgaWYgKGZvdXJjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOwogICAgICAgICBUUkVTUEFTUygpOwpAQCAtNDMzNywxMCArNDQzMywyMCBAQAogICAgICAgICB3cml0ZUF2Y2NCb3goKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpKSB7CiAgICAgICAgIHdyaXRlSHZjY0JveCgpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLCBtaW1lKSkgeworICAgICAgICBpZiAobURvdmlQcm9maWxlIDw9IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCkgeworICAgICAgICAgICAgd3JpdGVIdmNjQm94KCk7CisgICAgICAgIH0gZWxzZSBpZiAobURvdmlQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgeworICAgICAgICAgICAgd3JpdGVBdmNjQm94KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVFJFU1BBU1MoIlVuc3VwcG9ydGVkIERvbGJ5IFZpc2lvbiBwcm9maWxlIik7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVEb3ZpQ29uZmlnQm94KCk7CiAgICAgfQogCiAgICAgd3JpdGVQYXNwQm94KCk7CiAgICAgd3JpdGVDb2xyQm94KCk7CisgICAgd3JpdGVNZGN2QW5kQ2xsaUJveGVzKCk7CiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1wNHYsIHMyNjMgb3IgYXZjMQogfQogCkBAIC00MzQ5LDMwICs0NDU1LDgyIEBACiAgICAgbWVtc2V0KCZhc3BlY3RzLCAwLCBzaXplb2YoYXNwZWN0cykpOwogICAgIC8vIENvbG9yIG1ldGFkYXRhIG1heSBoYXZlIGNoYW5nZWQuCiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICAvLyBUUklDS1k6IHVzaW5nIHwgaW5zdGVhZCBvZiB8fCBiZWNhdXNlIHdlIHdhbnQgdG8gZXhlY3V0ZSBhbGwgZmluZEludDMyLXMKLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclByaW1hcmllcywgKGludDMyX3QqKSZhc3BlY3RzLm1QcmltYXJpZXMpCi0gICAgICAgICAgICB8IG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgKGludDMyX3QqKSZhc3BlY3RzLm1UcmFuc2ZlcikKLSAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlDb2xvck1hdHJpeCwgKGludDMyX3QqKSZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCi0gICAgICAgICAgICB8IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSkpIHsKLSAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnM7Ci0gICAgICAgIGJvb2wgZnVsbFJhbmdlOwotICAgICAgICBBTE9HVigicHJpbWFyaWVzPSVzIHRyYW5zZmVyPSVzIG1hdHJpeD0lcyByYW5nZT0lcyIsCi0gICAgICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tUHJpbWFyaWVzKSwKLSAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1UcmFuc2ZlciksCi0gICAgICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tTWF0cml4Q29lZmZzKSwKLSAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1SYW5nZSkpOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgYXNwZWN0cywgJnByaW1hcmllcywgJnRyYW5zZmVyLCAmY29lZmZzLCAmZnVsbFJhbmdlKTsKLSAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiY29sciIpOwotICAgICAgICBtT3duZXItPndyaXRlRm91cmNjKCJuY2x4Iik7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihwcmltYXJpZXMpOwotICAgICAgICBtT3duZXItPndyaXRlSW50MTYodHJhbnNmZXIpOwotICAgICAgICBtT3duZXItPndyaXRlSW50MTYoY29lZmZzKTsKLSAgICAgICAgbU93bmVyLT53cml0ZUludDgoaW50OF90KGZ1bGxSYW5nZSA/IDB4ODAgOiAweDApKTsKLSAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gY29scgotICAgIH0gZWxzZSB7CisgICAgYm9vbCBmaW5kUHJpbWFyaWVzID0gbWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclByaW1hcmllcywgKGludDMyX3QqKSZhc3BlY3RzLm1QcmltYXJpZXMpOworICAgIGJvb2wgZmluZFRyYW5zZmVyID0gbWV0YS0+ZmluZEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCAoaW50MzJfdCopJmFzcGVjdHMubVRyYW5zZmVyKTsKKyAgICBib29sIGZpbmRNYXRyaXggPSBtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yTWF0cml4LCAoaW50MzJfdCopJmFzcGVjdHMubU1hdHJpeENvZWZmcyk7CisgICAgYm9vbCBmaW5kUmFuZ2UgPSBtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUmFuZ2UsIChpbnQzMl90KikmYXNwZWN0cy5tUmFuZ2UpOworICAgIGlmICghZmluZFByaW1hcmllcyAmJiAhZmluZFRyYW5zZmVyICYmICFmaW5kTWF0cml4ICYmICFmaW5kUmFuZ2UpIHsKICAgICAgICAgQUxPR1YoIm5vIGNvbG9yIGluZm9ybWF0aW9uIik7CisgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBpbnQzMl90IHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmczsKKyAgICBib29sIGZ1bGxSYW5nZTsKKyAgICBBTE9HVigicHJpbWFyaWVzPSVzIHRyYW5zZmVyPSVzIG1hdHJpeD0lcyByYW5nZT0lcyIsCisgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1QcmltYXJpZXMpLAorICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tVHJhbnNmZXIpLAorICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tTWF0cml4Q29lZmZzKSwKKyAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVJhbmdlKSk7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKAorICAgICAgICAgICAgYXNwZWN0cywgJnByaW1hcmllcywgJnRyYW5zZmVyLCAmY29lZmZzLCAmZnVsbFJhbmdlKTsKKyAgICBtT3duZXItPmJlZ2luQm94KCJjb2xyIik7CisgICAgbU93bmVyLT53cml0ZUZvdXJjYygibmNseCIpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihwcmltYXJpZXMpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNih0cmFuc2Zlcik7CisgICAgbU93bmVyLT53cml0ZUludDE2KGNvZWZmcyk7CisgICAgbU93bmVyLT53cml0ZUludDgoaW50OF90KGZ1bGxSYW5nZSA/IDB4ODAgOiAweDApKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAvLyBjb2xyCit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1kY3ZBbmRDbGxpQm94ZXMoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgYm9vbCBmb3VuZCA9CisgICAgICAgICAgICBtZXRhLT5maW5kRGF0YShrS2V5SGRyU3RhdGljSW5mbywgJnR5cGUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCoqPigmZGF0YSksICZzaXplKTsKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBlbmNvZGUuCisgICAgfQorICAgIGlmIChzaXplICE9IDI1KSB7CisgICAgICAgIEFMT0dXKCJJZ25vcmluZyBIRFIgc3RhdGljIGluZm8gd2l0aCB1bmV4cGVjdGVkIHNpemUgJWQiLCAoaW50KXNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQxNl90IGRpc3BsYXlQcmltYXJpZXNSWCA9IFUxNkxFX0FUKCZkYXRhWzFdKTsKKyAgICB1aW50MTZfdCBkaXNwbGF5UHJpbWFyaWVzUlkgPSBVMTZMRV9BVCgmZGF0YVszXSk7CisKKyAgICB1aW50MTZfdCBkaXNwbGF5UHJpbWFyaWVzR1ggPSBVMTZMRV9BVCgmZGF0YVs1XSk7CisgICAgdWludDE2X3QgZGlzcGxheVByaW1hcmllc0dZID0gVTE2TEVfQVQoJmRhdGFbN10pOworCisgICAgdWludDE2X3QgZGlzcGxheVByaW1hcmllc0JYID0gVTE2TEVfQVQoJmRhdGFbOV0pOworICAgIHVpbnQxNl90IGRpc3BsYXlQcmltYXJpZXNCWSA9IFUxNkxFX0FUKCZkYXRhWzExXSk7CisKKyAgICB1aW50MTZfdCB3aGl0ZVBvaW50WCA9IFUxNkxFX0FUKCZkYXRhWzEzXSk7CisgICAgdWludDE2X3Qgd2hpdGVQb2ludFkgPSBVMTZMRV9BVCgmZGF0YVsxNV0pOworCisgICAgdWludDE2X3QgbWF4RGlzcGxheU1hc3RlcmluZ0x1bWluYW5jZSA9IFUxNkxFX0FUKCZkYXRhWzE3XSk7CisgICAgdWludDE2X3QgbWluRGlzcGxheU1hc3RlcmluZ0x1bWluYW5jZSA9IFUxNkxFX0FUKCZkYXRhWzE5XSk7CisKKyAgICB1aW50MTZfdCBtYXhDb250ZW50TGlnaHRMZXZlbCA9IFUxNkxFX0FUKCZkYXRhWzIxXSk7CisgICAgdWludDE2X3QgbWF4UGljQXZlcmFnZUxpZ2h0TGV2ZWwgPSBVMTZMRV9BVCgmZGF0YVsyM10pOworCisgICAgbU93bmVyLT5iZWdpbkJveCgibWRjdiIpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihkaXNwbGF5UHJpbWFyaWVzR1gpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihkaXNwbGF5UHJpbWFyaWVzR1kpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihkaXNwbGF5UHJpbWFyaWVzQlgpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihkaXNwbGF5UHJpbWFyaWVzQlkpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihkaXNwbGF5UHJpbWFyaWVzUlgpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihkaXNwbGF5UHJpbWFyaWVzUlkpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNih3aGl0ZVBvaW50WCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KHdoaXRlUG9pbnRZKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIobWF4RGlzcGxheU1hc3RlcmluZ0x1bWluYW5jZSAqIDEwMDAwKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIobWluRGlzcGxheU1hc3RlcmluZ0x1bWluYW5jZSAqIDEwMDAwKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbWRjdi4KKworICAgIG1Pd25lci0+YmVnaW5Cb3goImNsbGkiKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYobWF4Q29udGVudExpZ2h0TGV2ZWwpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihtYXhQaWNBdmVyYWdlTGlnaHRMZXZlbCk7CisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGNsbGkuCiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUF1ZGlvRm91ckNDQm94KCkgewpAQCAtNDgyOSwxMiArNDk4NywxMSBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBhdmNDCiB9CiAKLQogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlSHZjY0JveCgpIHsKICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGEpOwogICAgIENIRUNLX0dFKG1Db2RlY1NwZWNpZmljRGF0YVNpemUsIDV1KTsKIAotICAgIC8vIFBhdGNoIGF2Y2MncyBsZW5ndGhTaXplIGZpZWxkIHRvIG1hdGNoIHRoZSBudW1iZXIKKyAgICAvLyBQYXRjaCBodmNjJ3MgbGVuZ3RoU2l6ZSBmaWVsZCB0byBtYXRjaCB0aGUgbnVtYmVyCiAgICAgLy8gb2YgYnl0ZXMgd2UgdXNlIHRvIGluZGljYXRlIHRoZSBzaXplIG9mIGEgbmFsIHVuaXQuCiAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKiltQ29kZWNTcGVjaWZpY0RhdGE7CiAgICAgcHRyWzIxXSA9IChwdHJbMjFdICYgMHhmYykgfCAobU93bmVyLT51c2VOYWxMZW5ndGhGb3VyKCkgPyAzIDogMSk7CkBAIC00ODQzLDYgKzUwMDAsMzIgQEAKICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gaHZjQwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEb3ZpQ29uZmlnQm94KCkgeworICAgIENIRUNLX05FKG1Eb3ZpUHJvZmlsZSwgMHUpOworCisgICAgdWludDMyX3QgdHlwZSA9IDA7CisgICAgY29uc3Qgdm9pZCAqZGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIC8vIGNoZWNrIHRvIHNlZSB3aGljaCBrZXkgaGFzIHRoZSBjb25maWd1cmF0aW9uIGJveC4KKyAgICBpZiAobU1ldGEtPmZpbmREYXRhKGtLZXlEVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fAorICAgICAgICBtTWV0YS0+ZmluZERhdGEoa0tleURWVkMsICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8CisgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5RFZXQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKworICAgICAgIC8vIGlmIHRoaXMgYm94IGlzIHByZXNlbnQgd2Ugd3JpdGUgdGhlIGJveCwgb3IKKyAgICAgICAvLyB0aGlzIG1wNCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgYmFja3dhcmQKKyAgICAgICAvLyBjb21wYXRpYmxlIHN0cmVhbS4KKyAgICAgICAgaWYgKG1Eb3ZpUHJvZmlsZSA+IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTApIHsKKyAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImR2d0MiKTsKKyAgICAgICAgfSBlbHNlIGlmIChtRG92aVByb2ZpbGUgPiBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiKSB7CisgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkdnZDIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkdmNDIik7CisgICAgICAgIH0KKyAgICAgICAgbU93bmVyLT53cml0ZShkYXRhLCBzaXplKTsKKyAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGR2d0MvZHZ2Qy9kdmNDCisgICAgfQorfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEMjYzQm94KCkgewogICAgIG1Pd25lci0+YmVnaW5Cb3goImQyNjMiKTsKICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZW5kb3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQXBwZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5jcHAKaW5kZXggNWQ4MGIzMC4uMjFkY2ZhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5jcHAKQEAgLTc1LDEwICs3NSwyMSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIGlmIChzdHJjbXAoIk1QRUc0RXh0cmFjdG9yIiwgbUV4dHJhY3Rvci0+Z2V0TmFtZSgpKSA9PSAwKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZpbGVGb3JtYXQ7CisgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0RmlsZUZvcm1hdCgmZmlsZUZvcm1hdCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgiZXh0cmFjdG9yX2dldEZpbGVGb3JtYXQgZmFpbGVkLCBzdGF0dXMgOiVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBBU3RyaW5nIGZpbGVNaW1lOworICAgIGZpbGVGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmZmlsZU1pbWUpOworICAgIC8vIG9ubHkgY29tcGFyZSB0aGUgZW5kIG9mIHRoZSBmaWxlIE1JTUUgdHlwZSB0byBhbGxvdyBmb3IgdmVuZG9yIGN1c3RvbWl6ZWQgbWltZSB0eXBlCisgICAgaWYgKGZpbGVNaW1lLmVuZHNXaXRoKCJtcDQiKSl7CiAgICAgICAgIG1Gb3JtYXQgPSBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgZm9ybWF0LCBleHRyYWN0b3IgbmFtZTolcyIsIG1FeHRyYWN0b3ItPmdldE5hbWUoKSk7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBmaWxlIGZvcm1hdCwgZXh0cmFjdG9yIG5hbWU6JXMsIGZpbGVmb3JtYXQgJXMiLAorICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5nZXROYW1lKCksIGZpbGVNaW1lLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGMwMzIzNmEuLmU1MDg4MGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0xMDIsNiArMTAyLDggQEAKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tb2RlIjsgICAgLyogYXVkaW8sIHZpZGVvICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZVZpZGVvID0gInZpZGVvIjsgICAgICAgICAgICAvKiB2YWx1ZXMgcmV0dXJuZWQgZm9yIGtDb2RlY01vZGUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlQXVkaW8gPSAiYXVkaW8iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGVJbWFnZSA9ICJpbWFnZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZVVua25vd24gPSAidW5rbm93biI7CiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRW5jb2RlciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZW5jb2RlciI7IC8qIDAsMSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1NlY3VyZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2VjdXJlIjsgICAvKiAwLCAxICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjV2lkdGggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLndpZHRoIjsgICAgIC8qIDAuLm4gKi8KQEAgLTExMiw2ICsxMTQsMTUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDYXB0dXJlUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY2FwdHVyZS1yYXRlIjsKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNPcGVyYXRpbmdSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcGVyYXRpbmctcmF0ZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUHJpb3JpdHkgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByaW9yaXR5IjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDb25maWdDb2xvclN0YW5kYXJkID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb25maWctY29sb3Itc3RhbmRhcmQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0NvbmZpZ0NvbG9yUmFuZ2UgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbmZpZy1jb2xvci1yYW5nZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29uZmlnQ29sb3JUcmFuc2ZlciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29uZmlnLWNvbG9yLXRyYW5zZmVyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNQYXJzZWRDb2xvclN0YW5kYXJkID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wYXJzZWQtY29sb3Itc3RhbmRhcmQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1BhcnNlZENvbG9yUmFuZ2UgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBhcnNlZC1jb2xvci1yYW5nZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUGFyc2VkQ29sb3JUcmFuc2ZlciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGFyc2VkLWNvbG9yLXRyYW5zZmVyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNIRFJTdGF0aWNJbmZvID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZHItc3RhdGljLWluZm8iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0hEUjEwUGx1c0luZm8gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhkcjEwLXBsdXMtaW5mbyI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjSERSRm9ybWF0ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZHItZm9ybWF0IjsKIAogLy8gTWluL01heCBRUCBiZWZvcmUgc2hhcGluZwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY09yaWdpbmFsVmlkZW9RUElNaW4gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm9yaWdpbmFsLXZpZGVvLXFwLWktbWluIjsKQEAgLTE3Nyw5ICsxODgsMTIgQEAKIC8vIFhYWCBzdXBwcmVzcyB1bnRpbCB3ZSBnZXQgb3VyIHJlcHJlc2VudGF0aW9uIHJpZ2h0CiBzdGF0aWMgYm9vbCBrRW1pdEhpc3RvZ3JhbSA9IGZhbHNlOwogCitzdGF0aWMgaW50NjRfdCBnZXRJZChJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNvbnN0ICogY2xpZW50KSB7CisgICAgcmV0dXJuIChpbnQ2NF90KSBjbGllbnQ7Cit9CiAKIHN0YXRpYyBpbnQ2NF90IGdldElkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAmY2xpZW50KSB7Ci0gICAgcmV0dXJuIChpbnQ2NF90KSBjbGllbnQuZ2V0KCk7CisgICAgcmV0dXJuIGdldElkKGNsaWVudC5nZXQoKSk7CiB9CiAKIHN0YXRpYyBib29sIGlzUmVzb3VyY2VFcnJvcihzdGF0dXNfdCBlcnIpIHsKQEAgLTE5NiwxMiArMjEwLDIwIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IDogcHVibGljIEJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKLSAgICBleHBsaWNpdCBSZXNvdXJjZU1hbmFnZXJDbGllbnQoTWVkaWFDb2RlYyogY29kZWMpIDogbU1lZGlhQ29kZWMoY29kZWMpIHt9CisgICAgZXhwbGljaXQgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KE1lZGlhQ29kZWMqIGNvZGVjLCBpbnQzMl90IHBpZCkgOgorICAgICAgICAgICAgbU1lZGlhQ29kZWMoY29kZWMpLCBtUGlkKHBpZCkge30KIAogICAgIFN0YXR1cyByZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CiAgICAgICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbU1lZGlhQ29kZWMucHJvbW90ZSgpOwogICAgICAgICBpZiAoY29kZWMgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gY29kZWMgaXMgYWxyZWFkeSBnb25lLgorICAgICAgICAgICAgLy8gQ29kZWMgaXMgYWxyZWFkeSBnb25lLCBzbyByZW1vdmUgdGhlIHJlc291cmNlcyBhcyB3ZWxsCisgICAgICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoIm1lZGlhLnJlc291cmNlX21hbmFnZXIiKSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJDbGllbnQgdW5hYmxlIHRvIGZpbmQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHRoaXMpKTsKICAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICAgICAgfQpAQCAtMjM4LDYgKzI2MCw3IEBACiAKIHByaXZhdGU6CiAgICAgd3A8TWVkaWFDb2RlYz4gbU1lZGlhQ29kZWM7CisgICAgaW50MzJfdCBtUGlkOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KTsKIH07CkBAIC0yNDcsNyArMjcwLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAmY2xpZW50KTsKICAgICB2aXJ0dWFsIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkoKTsKIAotICAgIHZvaWQgaW5pdCgpOworICAgIHN0YXR1c190IGluaXQoKTsKIAogICAgIC8vIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQKICAgICBzdGF0aWMgdm9pZCBCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKTsKQEAgLTI3Niw2ICsyOTksOSBAQAogICAgICAgICBwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICZjbGllbnQpCiAgICAgICAgIDogbVBpZChwaWQpLCBtVWlkKHVpZCksIG1DbGllbnQoY2xpZW50KSwKICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQoQUlCaW5kZXJfRGVhdGhSZWNpcGllbnRfbmV3KEJpbmRlckRpZWRDYWxsYmFjaykpIHsKKyAgICBpZiAobVVpZCA9PSBNZWRpYUNvZGVjOjprTm9VaWQpIHsKKyAgICAgICAgbVVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKKyAgICB9CiAgICAgaWYgKG1QaWQgPT0gTWVkaWFDb2RlYzo6a05vUGlkKSB7CiAgICAgICAgIG1QaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CiAgICAgfQpAQCAtMjk0LDEyICszMjAsMjYgQEAKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlYzo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5Ojppbml0KCkgeworc3RhdHVzX3QgTWVkaWFDb2RlYzo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5Ojppbml0KCkgewogICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgibWVkaWEucmVzb3VyY2VfbWFuYWdlciIpKTsKICAgICBtU2VydmljZSA9IElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CiAgICAgaWYgKG1TZXJ2aWNlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGludCBjYWxsZXJQaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxlclVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKKyAgICBpZiAobVBpZCAhPSBjYWxsZXJQaWQgfHwgbVVpZCAhPSBjYWxsZXJVaWQpIHsKKyAgICAgICAgLy8gTWVkaWEgcHJvY2Vzc2VzIGRvbid0IG5lZWQgc3BlY2lhbCBwZXJtaXNzaW9ucyB0byBhY3Qgb24gYmVoYWxmIG9mIG90aGVyIHByb2Nlc3Nlcy4KKyAgICAgICAgaWYgKGNhbGxlclVpZCAhPSBBSURfTUVESUEpIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBwZXJtaXNzaW9uID0gImFuZHJvaWQucGVybWlzc2lvbi5NRURJQV9SRVNPVVJDRV9PVkVSUklERV9QSUQiOworICAgICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KHBlcm1pc3Npb24pKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyByZXF1aXJlZCB0byBvdmVycmlkZSB0aGUgY2FsbGVyJ3MgUElEIGZvciBtZWRpYSByZXNvdXJjZSBtYW5hZ2VtZW50LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBLaWxsIGNsaWVudHMgcGVuZGluZyByZW1vdmFsLgpAQCAtMzEwLDYgKzM1MCw3IEBACiAKICAgICAvLyBhZnRlciB0aGlzLCByZXF1aXJlIG1Mb2NrIHdoZW5ldmVyIHVzaW5nIG1TZXJ2aWNlCiAgICAgQUlCaW5kZXJfbGlua1RvRGVhdGgobVNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwgdGhpcyk7CisgICAgcmV0dXJuIE9LOwogfQogCiAvL3N0YXRpYwpAQCAtNjQ5LDYgKzY5MCwyNCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCitzdGF0aWMgTWVkaWFSZXNvdXJjZVN1YlR5cGUgdG9NZWRpYVJlc291cmNlU3ViVHlwZShNZWRpYUNvZGVjOjpEb21haW4gZG9tYWluKSB7CisgICAgc3dpdGNoIChkb21haW4pIHsKKyAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpET01BSU5fVklERU86IHJldHVybiBNZWRpYVJlc291cmNlU3ViVHlwZTo6a1ZpZGVvQ29kZWM7CisgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6RE9NQUlOX0FVRElPOiByZXR1cm4gTWVkaWFSZXNvdXJjZVN1YlR5cGU6OmtBdWRpb0NvZGVjOworICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkRPTUFJTl9JTUFHRTogcmV0dXJuIE1lZGlhUmVzb3VyY2VTdWJUeXBlOjprSW1hZ2VDb2RlYzsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlU3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogdG9Db2RlY01vZGUoTWVkaWFDb2RlYzo6RG9tYWluIGRvbWFpbikgeworICAgIHN3aXRjaCAoZG9tYWluKSB7CisgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6RE9NQUlOX1ZJREVPOiByZXR1cm4ga0NvZGVjTW9kZVZpZGVvOworICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkRPTUFJTl9BVURJTzogcmV0dXJuIGtDb2RlY01vZGVBdWRpbzsKKyAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpET01BSU5fSU1BR0U6IHJldHVybiBrQ29kZWNNb2RlSW1hZ2U7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga0NvZGVjTW9kZVVua25vd247CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTc0NCwxMCArODAzLDEzIEBACiAgICAgICBtRmxhZ3MoMCksCiAgICAgICBtU3RpY2t5RXJyb3IoT0spLAogICAgICAgbVNvZnRSZW5kZXJlcihOVUxMKSwKLSAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKLSAgICAgIG1WaWRlb1dpZHRoKDApLAotICAgICAgbVZpZGVvSGVpZ2h0KDApLAorICAgICAgbURvbWFpbihET01BSU5fVU5LTk9XTiksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApLAogICAgICAgbVJvdGF0aW9uRGVncmVlcygwKSwKKyAgICAgIG1Db25maWdDb2xvclRyYW5zZmVyKC0xKSwKKyAgICAgIG1IRFJTdGF0aWNJbmZvKGZhbHNlKSwKKyAgICAgIG1IRFIxMFBsdXNJbmZvKGZhbHNlKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEKDApLAogICAgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKQEAgLTc1NSw3ICs4MTcsNyBAQAogICAgICAgbVR1bm5lbGVkSW5wdXRXaWR0aCgwKSwKICAgICAgIG1UdW5uZWxlZElucHV0SGVpZ2h0KDApLAogICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKLSAgICAgIG1UdW5uZWxQZWVrU3RhdGUoVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyKSwKKyAgICAgIG1UdW5uZWxQZWVrU3RhdGUoVHVubmVsUGVla1N0YXRlOjprTGVnYWN5TW9kZSksCiAgICAgICBtSGF2ZUlucHV0U3VyZmFjZShmYWxzZSksCiAgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgbUNwdUJvb3N0UmVxdWVzdGVkKGZhbHNlKSwKQEAgLTc3MywxMyArODM1LDggQEAKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50ZXIoMCksCiAgICAgICBtR2V0Q29kZWNCYXNlKGdldENvZGVjQmFzZSksCiAgICAgICBtR2V0Q29kZWNJbmZvKGdldENvZGVjSW5mbykgewotICAgIGlmICh1aWQgPT0ga05vVWlkKSB7Ci0gICAgICAgIG1VaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVVpZCA9IHVpZDsKLSAgICB9Ci0gICAgbVJlc291cmNlTWFuYWdlclByb3h5ID0gbmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWQsIG1VaWQsCi0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KHRoaXMpKTsKKyAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHkgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZCwgdWlkLAorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pih0aGlzLCBwaWQpKTsKICAgICBpZiAoIW1HZXRDb2RlY0Jhc2UpIHsKICAgICAgICAgbUdldENvZGVjQmFzZSA9IFtdKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKSB7CiAgICAgICAgICAgICByZXR1cm4gR2V0Q29kZWNCYXNlKG5hbWUsIG93bmVyKTsKQEAgLTgwNyw3ICs4NjQsNiBAQAogICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogICAgICAgICB9OwogICAgIH0KLQogICAgIGluaXRNZWRpYW1ldHJpY3MoKTsKIH0KIApAQCAtODk4LDEyICs5NTQsNzIgQEAKICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNGaXJzdEZyYW1lSW5kZXhMb3dMYXRlbmN5TW9kZU9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4T2ZGaXJzdEZyYW1lV2hlbkxvd0xhdGVuY3lPbik7CiAgICAgfQorCisgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNIRFJTdGF0aWNJbmZvLCBtSERSU3RhdGljSW5mbyA/IDEgOiAwKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hEUjEwUGx1c0luZm8sIG1IRFIxMFBsdXNJbmZvID8gMSA6IDApOwogI2lmIDAKICAgICAvLyBlbmFibGUgZm9yIHNob3J0IHRlcm0sIG9ubHkgd2hpbGUgZGVidWdnaW5nCiAgICAgdXBkYXRlRXBoZW1lcmFsTWVkaWFtZXRyaWNzKG1NZXRyaWNzSGFuZGxlKTsKICNlbmRpZgogfQogCit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpIHsKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9QUk9GSUxFLCAmcHJvZmlsZSkKKyAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWVkaWFUeXBlKSkgeworICAgICAgICBoZHJfZm9ybWF0IGhkckZvcm1hdCA9IGdldEhEUkZvcm1hdChwcm9maWxlLCBtQ29uZmlnQ29sb3JUcmFuc2ZlciwgbWVkaWFUeXBlKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNIRFJGb3JtYXQsIHN0YXRpY19jYXN0PGludD4oaGRyRm9ybWF0KSk7CisgICAgfQorfQorCitoZHJfZm9ybWF0IE1lZGlhQ29kZWM6OmdldEhEUkZvcm1hdChjb25zdCBpbnQzMl90IHByb2ZpbGUsIGNvbnN0IGludDMyX3QgdHJhbnNmZXIsCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSkgeworICAgIHN3aXRjaCAodHJhbnNmZXIpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9UUkFOU0ZFUl9TVDIwODQ6CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9IRFIxMFBMVVM7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9OT05FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hEUjEwOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9IRFIxMFBMVVM7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9OT05FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9IRFIxMFBMVVM7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9OT05FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBDT0xPUl9UUkFOU0ZFUl9ITEc6CisgICAgICAgICAgICBpZiAoIW1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9ITEc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IERPTEJZIGZvcm1hdAorICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9OT05FOworICAgIH0KK30KKworCiB2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUVwaGVtZXJhbE1lZGlhbWV0cmljcyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbSkgewogICAgIEFMT0dEKCJNZWRpYUNvZGVjOjp1cGRhdGVFcGhlbWVyYWxNZWRpYW1ldHJpY3MoKSIpOwogCkBAIC05NzEsNiArMTA4Nyw4IEBACiAKIGNvbnN0ZXhwciBjb25zdCBjaGFyICpNZWRpYUNvZGVjOjphc1N0cmluZyhUdW5uZWxQZWVrU3RhdGUgc3RhdGUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfc3RyaW5nKXsKICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtMZWdhY3lNb2RlOgorICAgICAgICAgICAgcmV0dXJuICJMZWdhY3lNb2RlIjsKICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI6CiAgICAgICAgICAgICByZXR1cm4gIkVuYWJsZWROb0J1ZmZlciI7CiAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRGlzYWJsZWROb0J1ZmZlcjoKQEAgLTk5Nyw2ICsxMTE1LDkgQEAKICAgICBUdW5uZWxQZWVrU3RhdGUgcHJldmlvdXNTdGF0ZSA9IG1UdW5uZWxQZWVrU3RhdGU7CiAgICAgaWYodHVubmVsUGVlayA9PSAwKXsKICAgICAgICAgc3dpdGNoIChtVHVubmVsUGVla1N0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0xlZ2FjeU1vZGU6CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fdHVubmVsLXBlZWstc2V0LWxlZ2FjeSIsIDApOworICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKICAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyOgogICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZE5vQnVmZmVyOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAwOSw2ICsxMTMwLDkgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHN3aXRjaCAobVR1bm5lbFBlZWtTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtMZWdhY3lNb2RlOgorICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX3R1bm5lbC1wZWVrLXNldC1sZWdhY3kiLCAwKTsKKyAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CiAgICAgICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0Rpc2FibGVkTm9CdWZmZXI6CiAgICAgICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcjsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNTUsNyArMTI3OSw3IEBACiAgICAgICAgIH0pOwogICAgIH0KIAotICAgIGlmIChtSXNWaWRlbyAmJiAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpKSB7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPICYmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikpIHsKICAgICAgICAgbUJ5dGVzSW5wdXQgKz0gYnVmZmVyLT5zaXplKCk7CiAgICAgICAgIG1GcmFtZXNJbnB1dCsrOwogICAgIH0KQEAgLTExODQsNyArMTMwOCw3IEBACiAKICAgICBDSEVDS19ORShtU3RhdGUsIFVOSU5JVElBTElaRUQpOwogCi0gICAgaWYgKG1Jc1ZpZGVvICYmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikpIHsKKyAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8gJiYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSkgewogICAgICAgICBpbnQzMl90IGZsYWdzID0gMDsKICAgICAgICAgKHZvaWQpIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKTsKIApAQCAtMTM2Myw3ICsxNDg3LDExIEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSkgewotICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+aW5pdCgpOworICAgIHN0YXR1c190IGVyciA9IG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+aW5pdCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUNvZGVjID0gTlVMTDsgLy8gcmVtb3ZlIHRoZSBjb2RlYworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KIAogICAgIC8vIHNhdmUgaW5pdCBwYXJhbWV0ZXJzIGZvciByZXNldAogICAgIG1Jbml0TmFtZSA9IG5hbWU7CkBAIC0xMzc4LDcgKzE1MDYsNyBAQAogICAgIGJvb2wgc2VjdXJlQ29kZWMgPSBmYWxzZTsKICAgICBjb25zdCBjaGFyICpvd25lciA9ICIiOwogICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJhbmRyb2lkLmZpbHRlci4iKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR2V0Q29kZWNJbmZvKG5hbWUsICZtQ29kZWNJbmZvKTsKKyAgICAgICAgZXJyID0gbUdldENvZGVjSW5mbyhuYW1lLCAmbUNvZGVjSW5mbyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIG1Db2RlYyA9IE5VTEw7ICAvLyByZW1vdmUgdGhlIGNvZGVjLgogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTEzOTIsNyArMTUyMCwxMyBAQAogICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRG9tYWluID0gRE9NQUlOX1ZJREVPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CisgICAgICAgICAgICAgICAgbURvbWFpbiA9IERPTUFJTl9BVURJTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgeworICAgICAgICAgICAgICAgIG1Eb21haW4gPSBET01BSU5fSU1BR0U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE0MDUsMTIgKzE1MzksMTcgQEAKICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogICAgIH0KIAotICAgIGlmIChtSXNWaWRlbykgeworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTykgewogICAgICAgICAvLyB2aWRlbyBjb2RlYyBuZWVkcyBkZWRpY2F0ZWQgbG9vcGVyCiAgICAgICAgIGlmIChtQ29kZWNMb29wZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKICAgICAgICAgICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiQ29kZWNMb29wZXIiKTsKLSAgICAgICAgICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICAgICAgICAgIGVyciA9IG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICAgICAgICAgIGlmIChPSyAhPSBlcnIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgTG9vcGVyIGZhaWxlZCB0byBzdGFydCIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtQ29kZWNMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29kZWMpOwpAQCAtMTQzOCwxNyArMTU3NywxNSBAQAogCiAgICAgaWYgKG1NZXRyaWNzSGFuZGxlICE9IDApIHsKICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NvZGVjLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyBrQ29kZWNNb2RlVmlkZW8gOiBrQ29kZWNNb2RlQXVkaW8pOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjTW9kZSwgdG9Db2RlY01vZGUobURvbWFpbikpOwogICAgIH0KIAotICAgIGlmIChtSXNWaWRlbykgeworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTykgewogICAgICAgICBtQmF0dGVyeUNoZWNrZXIgPSBuZXcgQmF0dGVyeUNoZWNrZXIobmV3IEFNZXNzYWdlKGtXaGF0Q2hlY2tCYXR0ZXJ5U3RhdHMsIHRoaXMpKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnI7CiAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwotICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShzZWN1cmVDb2RlYywgbUlzVmlkZW8pKTsKKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2Uoc2VjdXJlQ29kZWMsIHRvTWVkaWFSZXNvdXJjZVN1YlR5cGUobURvbWFpbikpKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBrTWF4UmV0cnk7ICsraSkgewogICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byByZWNsYWltIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZS4KQEAgLTE1MTEsNiArMTY0OCw5IEBACiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgdGhpcyk7CiAKKyAgICAvLyBUT0RPOiB2YWxpZGl0eSBjaGVjayBsb2ctc2Vzc2lvbi1pZDogaXQgc2hvdWxkIGJlIGEgMzItaGV4LWRpZ2l0LgorICAgIGZvcm1hdC0+ZmluZFN0cmluZygibG9nLXNlc3Npb24taWQiLCAmbUxvZ1Nlc3Npb25JZCk7CisKICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgewogICAgICAgICBpbnQzMl90IHByb2ZpbGUgPSAwOwogICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKQEAgLTE1MjIsMjEgKzE2NjIsMjAgQEAKICAgICAgICAgfQogICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0VuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBDT05GSUdVUkVfRkxBR19FTkNPREUpID8gMSA6IDApOworCisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNMb2dTZXNzaW9uSWQsIG1Mb2dTZXNzaW9uSWQuY19zdHIoKSk7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvKSB7Ci0gICAgICAgIC8vIFRPRE86IHZhbGlkaXR5IGNoZWNrIGxvZy1zZXNzaW9uLWlkOiBpdCBzaG91bGQgYmUgYSAzMi1oZXgtZGlnaXQuCi0gICAgICAgIGZvcm1hdC0+ZmluZFN0cmluZygibG9nLXNlc3Npb24taWQiLCAmbUxvZ1Nlc3Npb25JZCk7Ci0gICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZtVmlkZW9XaWR0aCk7Ci0gICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmbVZpZGVvSGVpZ2h0KTsKKyAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8gfHwgbURvbWFpbiA9PSBET01BSU5fSU1BR0UpIHsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJm1XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmbUhlaWdodCk7CiAgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmbVJvdGF0aW9uRGVncmVlcykpIHsKICAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1NZXRyaWNzSGFuZGxlICE9IDApIHsKLSAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNMb2dTZXNzaW9uSWQsIG1Mb2dTZXNzaW9uSWQuY19zdHIoKSk7Ci0gICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1dpZHRoLCBtVmlkZW9XaWR0aCk7Ci0gICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hlaWdodCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjV2lkdGgsIG1XaWR0aCk7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hlaWdodCwgbUhlaWdodCk7CiAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1JvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwOwogICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpKSB7CkBAIC0xNTUwLDI4ICsxNjg5LDQ4IEBACiAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAtMS4wOwotICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAtMS4wOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0ZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgY2FwdHVyZVJhdGUgPSAtMS4wOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgiY2FwdHVyZS1yYXRlIiwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDYXB0dXJlUmF0ZSwgY2FwdHVyZVJhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbG9hdCBvcGVyYXRpbmdSYXRlID0gLTEuMDsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJm9wZXJhdGluZ1JhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY09wZXJhdGluZ1JhdGUsIG9wZXJhdGluZ1JhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJwcmlvcml0eSIsICZwcmlvcml0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQcmlvcml0eSwgcHJpb3JpdHkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGNhcHR1cmVSYXRlID0gLTEuMDsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgiY2FwdHVyZS1yYXRlIiwgJmNhcHR1cmVSYXRlKSkgewotICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NhcHR1cmVSYXRlLCBjYXB0dXJlUmF0ZSk7CisgICAgICAgICAgICBpbnQzMl90IGNvbG9yU3RhbmRhcmQgPSAtMTsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZjb2xvclN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29uZmlnQ29sb3JTdGFuZGFyZCwgY29sb3JTdGFuZGFyZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBvcGVyYXRpbmdSYXRlID0gLTEuMDsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCAmb3BlcmF0aW5nUmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNPcGVyYXRpbmdSYXRlLCBvcGVyYXRpbmdSYXRlKTsKKyAgICAgICAgICAgIGludDMyX3QgY29sb3JSYW5nZSA9IC0xOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9SQU5HRSwgJmNvbG9yUmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDb25maWdDb2xvclJhbmdlLCBjb2xvclJhbmdlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJpb3JpdHkiLCAmcHJpb3JpdHkpKSB7Ci0gICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQcmlvcml0eSwgcHJpb3JpdHkpOworICAgICAgICAgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCAmY29sb3JUcmFuc2ZlcikpIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnQ29sb3JUcmFuc2ZlciA9IGNvbG9yVHJhbnNmZXI7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDb25maWdDb2xvclRyYW5zZmVyLCBjb2xvclRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbzsKKyAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZpbmZvKQorICAgICAgICAgICAgICAgICAgICAmJiBDb2xvclV0aWxzOjppc0hEUlN0YXRpY0luZm9WYWxpZCgmaW5mbykpIHsKKyAgICAgICAgICAgICAgICBtSERSU3RhdGljSW5mbyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgotICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDAgfHwKLSAgICAgICAgICAgICAgICh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplKHMpLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIGlmIChtV2lkdGggPCAwIHx8IG1IZWlnaHQgPCAwIHx8CisgICAgICAgICAgICAgICAodWludDY0X3QpbVdpZHRoICogbUhlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplKHMpLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtMTYwNCw3ICsxNzYzLDcgQEAKICAgICB9CiAKICAgICAvLyBwdXNoIG1pbi9tYXggUVAgdG8gTWVkaWFNZXRyaWNzIGFmdGVyIHNoYXBpbmcKLSAgICBpZiAobUlzVmlkZW8gJiYgbU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTyAmJiBtTWV0cmljc0hhbmRsZSAhPSAwKSB7CiAgICAgICAgIGludDMyX3QgcXBJTWluID0gLTE7CiAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigidmlkZW8tcXAtaS1taW4iLCAmcXBJTWluKSkgewogICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNSZXF1ZXN0ZWRWaWRlb1FQSU1pbiwgcXBJTWluKTsKQEAgLTE2NTcsNyArMTgxNiw4IEBACiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwotICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlLCBtSXNWaWRlbykpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlLAorICAgICAgICAgICAgdG9NZWRpYVJlc291cmNlU3ViVHlwZShtRG9tYWluKSkpOwogICAgIC8vIERvbid0IGtub3cgdGhlIGJ1ZmZlciBzaXplIGF0IHRoaXMgcG9pbnQsIGJ1dCBpdCdzIGZpbmUgdG8gdXNlIDEgYmVjYXVzZQogICAgIC8vIHRoZSByZWNsYWltUmVzb3VyY2UgY2FsbCBkb2Vzbid0IGNvbnNpZGVyIHRoZSByZXF1ZXN0ZXIncyBidWZmZXIgc2l6ZSBmb3Igbm93LgogICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6R3JhcGhpY01lbW9yeVJlc291cmNlKDEpKTsKQEAgLTIwNzksNyArMjIzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlKSB7CiAgICAgQVN0cmluZyBtZWRpYVR5cGU7CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWVkaWFUeXBlKSkgewotICAgICAgICBBTE9HVygibWFwRm9ybWF0OiBubyBtZWRpYVR5cGUgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgQUxPR1YoIm1hcEZvcm1hdDogbm8gbWVkaWFUeXBlIGluZm9ybWF0aW9uIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoIm1hcEZvcm1hdDogY29kZWMgJXMgbWVkaWF0eXBlICVzIGtpbmQgJXMgcmV2ZXJzZSAlZCIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKQEAgLTIyMzgsNyArMjM5OCw3IEBACiB9CiAKIHVpbnQ2NF90IE1lZGlhQ29kZWM6OmdldEdyYXBoaWNCdWZmZXJTaXplKCkgewotICAgIGlmICghbUlzVmlkZW8pIHsKKyAgICBpZiAobURvbWFpbiAhPSBET01BSU5fVklERU8gJiYgbURvbWFpbiAhPSBET01BSU5fSU1BR0UpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yMjQ2LDcgKzI0MDYsNyBAQAogICAgIHNpemVfdCBwb3J0TnVtID0gc2l6ZW9mKG1Qb3J0QnVmZmVycykgLyBzaXplb2YoKG1Qb3J0QnVmZmVycylbMF0pOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9ydE51bTsgKytpKSB7CiAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMganVzdCBhbiBlc3RpbWF0aW9uLCB3ZSBzaG91bGQgZ2V0IHRoZSByZWFsIGJ1ZmZlciBzaXplIGZyb20gQUNvZGVjLgotICAgICAgICBzaXplICs9IG1Qb3J0QnVmZmVyc1tpXS5zaXplKCkgKiBtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgLyAyOworICAgICAgICBzaXplICs9IG1Qb3J0QnVmZmVyc1tpXS5zaXplKCkgKiBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CiAgICAgfQogICAgIHJldHVybiBzaXplOwogfQpAQCAtMjI1OCw3ICsyNDE4LDggQEAKIAogICAgIHN0YXR1c190IGVycjsKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7Ci0gICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIG1Jc1ZpZGVvKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsCisgICAgICAgICAgICB0b01lZGlhUmVzb3VyY2VTdWJUeXBlKG1Eb21haW4pKSk7CiAgICAgLy8gRG9uJ3Qga25vdyB0aGUgYnVmZmVyIHNpemUgYXQgdGhpcyBwb2ludCwgYnV0IGl0J3MgZmluZSB0byB1c2UgMSBiZWNhdXNlCiAgICAgLy8gdGhlIHJlY2xhaW1SZXNvdXJjZSBjYWxsIGRvZXNuJ3QgY29uc2lkZXIgdGhlIHJlcXVlc3RlcidzIGJ1ZmZlciBzaXplIGZvciBub3cuCiAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpHcmFwaGljTWVtb3J5UmVzb3VyY2UoMSkpOwpAQCAtMjQ2MSw3ICsyNjIyLDkgQEAKICAgICBtc2ctPnNldE9iamVjdCgiYzJidWZmZXIiLCBvYmopOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHByZXNlbnRhdGlvblRpbWVVcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7Ci0gICAgbXNnLT5zZXRNZXNzYWdlKCJ0dW5pbmdzIiwgdHVuaW5ncyk7CisgICAgaWYgKHR1bmluZ3MgJiYgdHVuaW5ncy0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgidHVuaW5ncyIsIHR1bmluZ3MpOworICAgIH0KICAgICBtc2ctPnNldFBvaW50ZXIoImVycm9yRGV0YWlsTXNnIiwgZXJyb3JEZXRhaWxNc2cpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjUwMyw3ICsyNjY2LDkgQEAKICAgICBtc2ctPnNldEludDMyKCJza2lwQmxvY2tzIiwgcGF0dGVybi5tU2tpcEJsb2Nrcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgcHJlc2VudGF0aW9uVGltZVVzKTsKICAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKLSAgICBtc2ctPnNldE1lc3NhZ2UoInR1bmluZ3MiLCB0dW5pbmdzKTsKKyAgICBpZiAodHVuaW5ncyAmJiB0dW5pbmdzLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJ0dW5pbmdzIiwgdHVuaW5ncyk7CisgICAgfQogICAgIG1zZy0+c2V0UG9pbnRlcigiZXJyb3JEZXRhaWxNc2ciLCBlcnJvckRldGFpbE1zZyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yOTc1LDggKzMxNDAsOSBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWN0aW9uQ29kZSIsICZhY3Rpb25Db2RlKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVyciAlI3gsIGFjdGlvbkNvZGUgJWQsIHdoaWxlIGluIHN0YXRlICVkLyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIG1TdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVyciAlI3gvJXMsIGFjdGlvbkNvZGUgJWQsIHdoaWxlIGluIHN0YXRlICVkLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIFN0ck1lZGlhRXJyb3IoZXJyKS5jX3N0cigpLCBhY3Rpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CkBAIC0zMDMyLDEwICszMTk4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RPUFBJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb3N0UGVuZGluZ1JlcGxpZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyAmJiAhbVJlcGx5SUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJSZWxlYXNpbmcgYXN5bmNocm9ub3VzbHksIHNvIG5vdGhpbmcgdG8gcmVwbHkgaGVyZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU2VydmVyIGRpZWQsIHRoZXJlIGRlZmluaXRlbHkgd29uJ3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgYSBzaHV0ZG93biBjb21wbGV0ZSBub3RpZmljYXRpb24gYWZ0ZXIKQEAgLTMwNDgsOCArMzIxMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zdFBlbmRpbmdSZXBsaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVwbHlJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhvcmlnaW4gKyAiOmRlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJubyBwZW5kaW5nIHJlcGxpZXM6ICVzOmRlYWQgZm9sbG93aW5nICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbi5jX3N0cigpLCBtTGFzdFJlcGx5T3JpZ2luLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVJlcGx5SUQpIHsKQEAgLTMxODUsMTAgKzMzNTIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjU2VjdXJlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gY29kZWMgaXMgY3VycmVudGx5IGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHktPmFkZFJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIG1Jc1ZpZGVvKSk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzIGF0dHIgPSBtQ29kZWNJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtQ29kZWNJbmZvLT5nZXRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIShhdHRyICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb2Z0d2FyZSBjb2RlYyBpcyBjdXJyZW50bHkgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+YWRkUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlLCB0b01lZGlhUmVzb3VyY2VTdWJUeXBlKG1Eb21haW4pKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdENvbXBvbmVudEFsbG9jYXRlZCIpOwpAQCAtMzIxMiw2ICszMzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgJm1JbnB1dEZvcm1hdCkpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgJm1PdXRwdXRGb3JtYXQpKTsKIAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVIRFJGb3JtYXRNZXRyaWMoKTsKKwogICAgICAgICAgICAgICAgICAgICAvLyBsaW1pdCB0byBjb25maXJtaW5nIHRoZSBvcHQtaW4gYmVoYXZpb3IgdG8gbWluaW1pemUgYW55IGJlaGF2aW9yYWwgY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBudWxscHRyICYmICFtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgZnJhbWUgZHJvcHBpbmcgbW9kZSBpbiB0aGUgaW5wdXQgZm9ybWF0IGFzIHRoaXMgbWF5IGFsc28gYmUKQEAgLTMyOTMsNiArMzQ2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIRFJGb3JtYXRNZXRyaWMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG9iaiAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRPYmplY3QoImlucHV0LXN1cmZhY2UiLCBvYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVJbnB1dFN1cmZhY2UgPSB0cnVlOwpAQCAtMzMxNyw2ICszNDkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsICZtSW5wdXRGb3JtYXQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCAmbU91dHB1dEZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSERSRm9ybWF0TWV0cmljKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CkBAIC0zMzU0LDcgKzM1MjgsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFSVElORyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgICAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8gfHwgbURvbWFpbiA9PSBET01BSU5fSU1BR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+YWRkUmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkdyYXBoaWNNZW1vcnlSZXNvdXJjZShnZXRHcmFwaGljQnVmZmVyU2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMzNzcsMTAgKzM1NTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0J1ZmZlclJlbmRlcmVkOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHByZXZpb3VzU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJSZW5kZXJlZCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobVR1bm5lbFBlZWtTdGF0ZSAhPSBUdW5uZWxQZWVrU3RhdGU6OmtMZWdhY3lNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprQnVmZmVyUmVuZGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHByZXZpb3VzU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJSZW5kZXJlZCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrRHVyYXRpb24obXNnKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGEgbm90aWZpY2F0aW9uIHNldAogICAgICAgICAgICAgICAgICAgICBpZiAobU9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbiAhPSBOVUxMKSB7CkBAIC0zNTAyLDYgKzM2NzgsMjAgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXREcmFpblRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIGtGbGFnVXNlQmxvY2tNb2RlbCkgPT0gMCAmJiBtVHVubmVsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0J1ZmZlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGFzeW5jaHJvbm91cyBtb2RlLCBvdXRwdXQgZm9ybWF0IGNoYW5nZSBpcyBwcm9jZXNzZWQgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlSWZOZWVkZWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNoYW5uZWwtPmRpc2NhcmRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZV90IGluZGV4ID0gKi91cGRhdGVCdWZmZXJzKGtQb3J0SW5kZXhPdXRwdXQsIG1zZyk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSElORwpAQCAtMzc4Myw2ICszOTczLDE0IEBACiAgICAgICAgICAgICAgICAgbVR1bm5lbGVkID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIElmIG1UdW5uZWxQZWVrU3RhdGUgaXMgc3RpbGwgaW4ga0xlZ2FjeU1vZGUgYXQgdGhpcyBwb2ludCwKKyAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgY29kZWMgaW4gbGVnYWN5IG1vZGUKKyAgICAgICAgICAgIGlmIChtVHVubmVsZWQgJiYgKG1UdW5uZWxQZWVrU3RhdGUgPT0gVHVubmVsUGVla1N0YXRlOjprTGVnYWN5TW9kZSkpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImFuZHJvaWQuX3R1bm5lbC1wZWVrLXNldC1sZWdhY3kiLCAxKTsKKyAgICAgICAgICAgICAgICBvblNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50MzJfdCBiYWNrZ3JvdW5kID0gMDsKICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fYmFja2dyb3VuZC1tb2RlIiwgJmJhY2tncm91bmQpICYmIGJhY2tncm91bmQpIHsKICAgICAgICAgICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoZ2V0dGlkKCksIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CkBAIC0zOTAxLDEwICs0MDk5LDEyIEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKLSAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI7Ci0gICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCi0gICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKLSAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcikpOworICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT0gVHVubmVsUGVla1N0YXRlOjprTGVnYWN5TW9kZSkgeworICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI7CisgICAgICAgICAgICAgICAgQUxPR1YoIlR1bm5lbFBlZWtTdGF0ZTogJXMgLT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXIpKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRJTkcpOwpAQCAtNDA0NiwyNiArNDI0NiwyOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVJlbGVhc2VTdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UtPmdldENvbnN1bWVyVXNhZ2UoJnVzYWdlKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlU3VyZmFjZS5yZXNldChuZXcgUmVsZWFzZVN1cmZhY2UodXNhZ2UpKTsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VTeW5jID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0ciAmJiBtU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUmVsZWFzZVN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UtPmdldENvbnN1bWVyVXNhZ2UoJnVzYWdlKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgPSAwOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdFRvU3VyZmFjZShtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBjb25uZWN0aW5nIHRvIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAhKG1GbGFncyAmIGtGbGFnVXNlc1NvZnR3YXJlUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5zZXRTdXJmYWNlKG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBzZXR0aW5nIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWRpc2Nvbm5lY3RGcm9tU3VyZmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlID0gbVJlbGVhc2VTdXJmYWNlLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlU3VyZmFjZS5yZXNldChuZXcgUmVsZWFzZVN1cmZhY2UodXNhZ2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RUb1N1cmZhY2UobVJlbGVhc2VTdXJmYWNlLT5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBjb25uZWN0aW5nIHRvIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmICEobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+c2V0U3VyZmFjZShtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBzZXR0aW5nIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWRpc2Nvbm5lY3RGcm9tU3VyZmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UgPSBtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdlcmUgbm90IGFibGUgdG8gc3dpdGNoIHRoZSBzdXJmYWNlLCBzbyBmb3JjZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luY2hyb25vdXMgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlU3luYyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MDg5LDggKzQyOTIsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGFzeW5jTm90aWZ5ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHktPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbCgpOwotICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0UmVsZWFzZTphc3luYyIpOworICAgICAgICAgICAgICAgIGlmICghZm9yY2VTeW5jKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0UmVsZWFzZTphc3luYyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhc3luY05vdGlmeVBvc3QuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtQXN5bmNSZWxlYXNlQ29tcGxldGVOb3RpZmljYXRpb24gPSBhc3luY05vdGlmeTsKICAgICAgICAgICAgIH0KQEAgLTQzNDAsMTAgKzQ1NDUsMTIgQEAKICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRmx1c2goKTsKICAgICAgICAgICAgIHJldHVybkJ1ZmZlcnNUb0NvZGVjKCk7CiAgICAgICAgICAgICBUdW5uZWxQZWVrU3RhdGUgcHJldmlvdXNTdGF0ZSA9IG1UdW5uZWxQZWVrU3RhdGU7Ci0gICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyOwotICAgICAgICAgICAgQUxPR1YoIlR1bm5lbFBlZWtTdGF0ZTogJXMgLT4gJXMiLAotICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksCi0gICAgICAgICAgICAgICAgICBhc1N0cmluZyhUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICE9IFR1bm5lbFBlZWtTdGF0ZTo6a0xlZ2FjeU1vZGUpIHsKKyAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyOworICAgICAgICAgICAgICAgIEFMT0dWKCJUdW5uZWxQZWVrU3RhdGU6ICVzIC0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHByZXZpb3VzU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00NDc0LDYgKzQ2ODEsNyBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0T2JqZWN0KCJjaGFuZ2VkS2V5cyIsIGNoYW5nZWRLZXlzKTsKICAgICB9CiAgICAgbU91dHB1dEZvcm1hdCA9IGZvcm1hdDsKKyAgICB1cGRhdGVIRFJGb3JtYXRNZXRyaWMoKTsKICAgICBtYXBGb3JtYXQobUNvbXBvbmVudE5hbWUsIGZvcm1hdCwgbnVsbHB0ciwgdHJ1ZSk7CiAgICAgQUxPR1YoIlslc10gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvOiAlcyIsCiAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKQEAgLTQ0OTksNiArNDcwNyw5IEBACiAgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIGluZm87CiAgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobU91dHB1dEZvcm1hdCwgJmluZm8pKSB7CiAgICAgICAgICAgICAgICAgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksICZpbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6aXNIRFJTdGF0aWNJbmZvVmFsaWQoJmluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgIG1IRFJTdGF0aWNJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDUwNyw2ICs0NzE4LDcgQEAKICAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgewogICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAogICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICBtSERSMTBQbHVzSW5mbyA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKQEAgLTQ1NTEsNiArNDc2MywyMSBAQAogICAgICAgICAgICAgbUNyeXB0by0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChtTWV0cmljc0hhbmRsZSAhPSAwKSB7CisgICAgICAgIGludDMyX3QgY29sb3JTdGFuZGFyZCA9IC0xOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmY29sb3JTdGFuZGFyZCkpIHsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjUGFyc2VkQ29sb3JTdGFuZGFyZCwgY29sb3JTdGFuZGFyZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBjb2xvclJhbmdlID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMiggS0VZX0NPTE9SX1JBTkdFLCAmY29sb3JSYW5nZSkpIHsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjUGFyc2VkQ29sb3JSYW5nZSwgY29sb3JSYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZjb2xvclRyYW5zZmVyKSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQYXJzZWRDb2xvclRyYW5zZmVyLCBjb2xvclRyYW5zZmVyKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpleHRyYWN0Q1NEKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CkBAIC00NTgwLDcgKzQ4MDcsNiBAQAogICAgIG1DU0QuZXJhc2UobUNTRC5iZWdpbigpKTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyOwogICAgIHNwPGhhcmR3YXJlOjpIaWRsTWVtb3J5PiBtZW1vcnk7Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7CiAKICAgICBpZiAobUZsYWdzICYga0ZsYWdVc2VCbG9ja01vZGVsKSB7CiAgICAgICAgIGlmIChoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkpIHsKQEAgLTQ2MDEsNyArNDgyNyw2IEBACiAgICAgICAgICAgICBtZW1jcHkobWVtLT51bnNlY3VyZVBvaW50ZXIoKSwgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKICAgICAgICAgICAgIHNzaXplX3QgaGVhcE9mZnNldDsKICAgICAgICAgICAgIG1lbW9yeSA9IGhhcmR3YXJlOjpmcm9tSGVhcChtZW0tPmdldE1lbW9yeSgmaGVhcE9mZnNldCwgbnVsbHB0cikpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IGhlYXBPZmZzZXQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPQogICAgICAgICAgICAgICAgIEZldGNoTGluZWFyQmxvY2soY3NkLT5zaXplKCksIHtzdGQ6OnN0cmluZ3ttQ29tcG9uZW50TmFtZS5jX3N0cigpfX0pOwpAQCAtNDY0MywxMiArNDg2OCwxMCBAQAogICAgICAgICBzcDxXcmFwcGVyT2JqZWN0PHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+PiBvYmp7CiAgICAgICAgICAgICBuZXcgV3JhcHBlck9iamVjdDxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PntjMkJ1ZmZlcn19OwogICAgICAgICBtc2ctPnNldE9iamVjdCgiYzJidWZmZXIiLCBvYmopOwotICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInR1bmluZ3MiLCBuZXcgQU1lc3NhZ2UpOwogICAgIH0gZWxzZSBpZiAobWVtb3J5KSB7CiAgICAgICAgIHNwPFdyYXBwZXJPYmplY3Q8c3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+Pj4gb2JqewogICAgICAgICAgICAgbmV3IFdyYXBwZXJPYmplY3Q8c3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+PnttZW1vcnl9fTsKICAgICAgICAgbXNnLT5zZXRPYmplY3QoIm1lbW9yeSIsIG9iaik7Ci0gICAgICAgIG1zZy0+c2V0TWVzc2FnZSgidHVuaW5ncyIsIG5ldyBBTWVzc2FnZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIG9uUXVldWVJbnB1dEJ1ZmZlcihtc2cpOwpAQCAtNDc3NSw4ICs0OTk4LDggQEAKICAgICB9CiAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXM7CiAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXM7Ci0gICAgY29uc3QgdWludDhfdCAqa2V5OwotICAgIGNvbnN0IHVpbnQ4X3QgKml2OworICAgIGNvbnN0IHVpbnQ4X3QgKmtleSA9IE5VTEw7CisgICAgY29uc3QgdWludDhfdCAqaXYgPSBOVUxMOwogICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDsKIAogICAgIC8vIFdlIGFsbG93IHRoZSBzaW1wbGVyIHF1ZXVlSW5wdXRCdWZmZXIgQVBJIHRvIGJlIHVzZWQgZXZlbiBpbgpAQCAtNDc5MSw4ICs1MDE0LDYgQEAKIAogICAgICAgICAgICAgc3ViU2FtcGxlcyA9ICZzczsKICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMgPSAxOwotICAgICAgICAgICAga2V5ID0gTlVMTDsKLSAgICAgICAgICAgIGl2ID0gTlVMTDsKICAgICAgICAgICAgIHBhdHRlcm4ubUVuY3J5cHRCbG9ja3MgPSAwOwogICAgICAgICAgICAgcGF0dGVybi5tU2tpcEJsb2NrcyA9IDA7CiAgICAgICAgIH0KQEAgLTQ4MzAsOSArNTA1MSwxMCBAQAogICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IGluZm8tPm1EYXRhOwogCiAgICAgaWYgKGMyQnVmZmVyIHx8IG1lbW9yeSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gdHVuaW5nczsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgidHVuaW5ncyIsICZ0dW5pbmdzKSk7Ci0gICAgICAgIG9uU2V0UGFyYW1ldGVycyh0dW5pbmdzKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHR1bmluZ3MgPSBOVUxMOworICAgICAgICBpZiAobXNnLT5maW5kTWVzc2FnZSgidHVuaW5ncyIsICZ0dW5pbmdzKSAmJiB0dW5pbmdzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyh0dW5pbmdzKTsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICAgICBpZiAoYzJCdWZmZXIpIHsKQEAgLTQ4NjQsNiArNTA4Niw4IEBACiAgICAgICAgIG9mZnNldCA9IGJ1ZmZlci0+b2Zmc2V0KCk7CiAgICAgICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0koImJsb2NrIG1vZGVsIGJ1ZmZlciBhdHRhY2ggZmFpbGVkOiBlcnIgPSAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIFN0ck1lZGlhRXJyb3IoZXJyKS5jX3N0cigpLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCA2MjQzODI4Li5hMzA0MGY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0xOCw4ICsxOCw2IEBACiAjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNMaXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCIKLQogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgpAQCAtMzQsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjMkluZm9CdWlsZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgpAQCAtNTA5LDYgKzUwOCwyOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgbGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJsZXZlbCIsICZsZXZlbCk7CisgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIGNhcGFiaWxpdGllcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICBhdXRvIGl0ID0gcHJvZmlsZUxldmVscy5iZWdpbigpOworICAgICAgICAgICAgZm9yICg7IGl0ICE9IHByb2ZpbGVMZXZlbHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSBpdC0+bVByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IC0xICYmIGxldmVsID4gaXQtPm1MZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpdCA9PSBwcm9maWxlTGV2ZWxzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNvZGVjIGRvZXMgbm90IHN1cHBvcnQgcHJvZmlsZSAlZCB3aXRoIGxldmVsICVkIiwgcHJvZmlsZSwgbGV2ZWwpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIGhhdmVuJ3QgZm91bmQgYSByZWFzb24gdG8gZGlzY2FyZCB0aGlzIG9uZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCmluZGV4IDRhMTY3ZDEuLjkzMDRlNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKQEAgLTE4LDggKzE4LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgotCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KQEAgLTMwLDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCmluZGV4IDAxMDdjMzIuLmIwN2Y4ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC05NDMsMTAgKzk0MywxNyBAQAogCiAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRidWY7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmb3V0YnVmKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgb3V0YnVmID09IE5VTEwgfHwgb3V0YnVmLT5kYXRhKCkgPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8IG91dGJ1Zi0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgb3V0YnVmID09IE5VTEwgfHwgb3V0YnVmLT5kYXRhKCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNpZ25hbEVPUygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRidWYtPnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gWmVybyBsZW5ndGggQ1NEIGJ1ZmZlcnMgYXJlIG5vdCB0cmVhdGVkIGFzIGFuIGVycm9yCisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVuY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVPUygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKG91dGJ1Zi0+c2l6ZSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCmluZGV4IDBiYzU5NzYuLjBmNWU5NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApAQCAtNjcsNyArNjcsMTEgQEAKICAgICAgICAgbUZkID0gLTE7CiAgICAgfQogCi0gICAgZnJlZShtT3MpOworICAgIGlmIChtT3MgIT0gbnVsbHB0cikgeworICAgICAgICBvZ2dfc3RyZWFtX2NsZWFyKG1Pcyk7CisgICAgICAgIGZyZWUobU9zKTsKKyAgICAgICAgbU9zID0gbnVsbHB0cjsKKyAgICB9CiB9CiAKIHN0YXR1c190IE9nZ1dyaXRlcjo6aW5pdENoZWNrKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcAppbmRleCBlZTkwMTZkLi5kZTkxNTMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcApAQCAtMTQ1LDcgKzE0NSwxOSBAQAogICAgIGlmIChhdmFpbGFibGUgPCBudW0pIHsKICAgICAgICAgaW50MzJfdCBuZXdjYXBhY2l0eSA9IG1DYXBhY2l0eSArIChudW0gLSBhdmFpbGFibGUpOwogICAgICAgICBjaGFyICogbmV3YnVmZmVyID0gbmV3IGNoYXJbbmV3Y2FwYWNpdHldOwotICAgICAgICBtZW1jcHkobmV3YnVmZmVyLCBtQ3V0QnVmZmVyLCBtQ2FwYWNpdHkpOworICAgICAgICBpZiAobVdyaXRlSGVhZCA8IG1SZWFkSGVhZCkgeworICAgICAgICAgICAgLy8gZGF0YSBpc24ndCBjb250aW51b3VzLCBuZWVkIHRvIG1lbWNweSB0d2ljZQorICAgICAgICAgICAgLy8gdG8gbW92ZSBwcmV2aW91cyBkYXRhIHRvIG5ldyBidWZmZXIuCisgICAgICAgICAgICBzaXplX3QgY29weUxlZnQgPSBtQ2FwYWNpdHkgLSBtUmVhZEhlYWQ7CisgICAgICAgICAgICBtZW1jcHkobmV3YnVmZmVyLCBtQ3V0QnVmZmVyICsgbVJlYWRIZWFkLCBjb3B5TGVmdCk7CisgICAgICAgICAgICBtZW1jcHkobmV3YnVmZmVyICsgY29weUxlZnQsIG1DdXRCdWZmZXIsIG1Xcml0ZUhlYWQpOworICAgICAgICAgICAgbVJlYWRIZWFkID0gMDsKKyAgICAgICAgICAgIG1Xcml0ZUhlYWQgKz0gY29weUxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobmV3YnVmZmVyLCBtQ3V0QnVmZmVyICsgbVJlYWRIZWFkLCBtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICAgICAgICAgIG1Xcml0ZUhlYWQgLT0gbVJlYWRIZWFkOworICAgICAgICAgICAgbVJlYWRIZWFkID0gMDsKKyAgICAgICAgfQogICAgICAgICBkZWxldGUgW10gbUN1dEJ1ZmZlcjsKICAgICAgICAgbUNhcGFjaXR5ID0gbmV3Y2FwYWNpdHk7CiAgICAgICAgIG1DdXRCdWZmZXIgPSBuZXdidWZmZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKaW5kZXggN2NlMjk2OC4uMjI4ODVjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMTMsNyArMTMsMTggQEAKIAogICAicHJlc3VibWl0LWxhcmdlIjogWwogICAgIHsKLSAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJuYW1lIjogIkN0c01lZGlhTWlzY1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUF1ZGlvVGVzdENhc2VzIiwKICAgICAgICJvcHRpb25zIjogWwogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgpAQCAtMjMsMTAgKzM0LDU0IEBACiAgICAgICAgIH0sCiAgICAgICAgIC8vIFRPRE86IGIvMTQ5MzE0NDE5CiAgICAgICAgIHsKLSAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuQXVkaW9QbGF5YmFja0NhcHR1cmVUZXN0IgorICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuQXVkaW9SZWNvcmRUZXN0IgorICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhRGVjb2RlclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUVuY29kZXJUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFDb2RlY1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYVBsYXllclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgogICAgICAgICB9CiAgICAgICBdCiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDRjMThmODcuLmE0NDNlZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTI4LDkgKzI4LDYgQEAKICNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTcsNiArNTQsMTQgQEAKICNkZWZpbmUgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9DT01QQVRJQkxFX1NFVFMgXAogICAibXBlZ2gtY29tcGF0aWJsZS1zZXRzIgogCituYW1lc3BhY2UgeworICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIHBvc3NpYmx5IGJlIGhhbmRsZWQgaW4gYW4gZWxzZQorICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50MzJfdCBBQUNPYmplY3ROdWxsID0gMDsKKworICAgIC8vIFRPRE86IGRlY2lkZSBpZiB3ZSBzaG91bGQganVzdCBub3QgdHJhbnNtaXQgdGhlIGxldmVsIGluIHRoaXMgY2FzZQorICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVW5rbm93biA9IDA7Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIHN0YXR1c190IGNvcHlOQUxVVG9BQnVmZmVyKHNwPEFCdWZmZXI+ICpidWZmZXIsIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IGxlbmd0aCkgewpAQCAtMTIxLDE0ICsxMjYsMTAgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBib29sIGlzSGRyKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7Ci0gICAgLy8gaWYgQ1NEIHNwZWNpZmllcyBIRFIgdHJhbnNmZXIocyksIHdlIGFzc3VtZSBIRFIuIE90aGVyd2lzZSwgaWYgaXQgc3BlY2lmaWVzIG5vbi1IRFIKLSAgICAvLyB0cmFuc2ZlcnMsIHdlIG11c3QgYXNzdW1lIG5vbi1IRFIuIFRoaXMgaXMgYmVjYXVzZSBDU0QgdHJ1bXBzIGFueSBjb2xvci10cmFuc2ZlciBrZXkKLSAgICAvLyBpbiB0aGUgZm9ybWF0LgotICAgIGludDMyX3QgaXNIZHI7Ci0gICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9pcy1oZHIiLCAmaXNIZHIpKSB7Ci0gICAgICAgIHJldHVybiBpc0hkcjsKLSAgICB9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiwgYW5kIG9ubHkgaWYsIHRoZSBnaXZlbiBmb3JtYXQgY29ycmVzcG9uZHMgdG8gSERSMTAgb3IgSERSMTArLgorICovCitzdGF0aWMgYm9vbCBpc0hkcjEwb3IxMFBsdXMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKIAogICAgIC8vIGlmIHVzZXIvY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIHRydWUKICAgICBpZiAoKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpIHx8IGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKQpAQCAtMTM4LDggKzEzOSw3IEBACiAgICAgLy8gb3RoZXJ3aXNlLCB2ZXJpZnkgdGhhdCBhbiBIRFIgdHJhbnNmZXIgZnVuY3Rpb24gaXMgc2V0CiAgICAgaW50MzJfdCB0cmFuc2ZlcjsKICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgJnRyYW5zZmVyKSkgewotICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT0gQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQKLSAgICAgICAgICAgICAgICB8fCB0cmFuc2ZlciA9PSBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckhMRzsKKyAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09IENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyU1QyMDg0OwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CkBAIC0xNTYsMjEgKzE1NiwyMiBAQAogICAgICAgICBhdWRpb09iamVjdFR5cGUgPj49IDExOwogICAgIH0KIAotICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQxNl90LCBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgeyAxLCAgT01YX0FVRElPX0FBQ09iamVjdE1haW4gICAgIH0sCi0gICAgICAgIHsgMiwgIE9NWF9BVURJT19BQUNPYmplY3RMQyAgICAgICB9LAotICAgICAgICB7IDMsICBPTVhfQVVESU9fQUFDT2JqZWN0U1NSICAgICAgfSwKLSAgICAgICAgeyA0LCAgT01YX0FVRElPX0FBQ09iamVjdExUUCAgICAgIH0sCi0gICAgICAgIHsgNSwgIE9NWF9BVURJT19BQUNPYmplY3RIRSAgICAgICB9LAotICAgICAgICB7IDYsICBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUgfSwKLSAgICAgICAgeyAxNywgT01YX0FVRElPX0FBQ09iamVjdEVSTEMgICAgIH0sCi0gICAgICAgIHsgMjMsIE9NWF9BVURJT19BQUNPYmplY3RMRCAgICAgICB9LAotICAgICAgICB7IDI5LCBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMgICAgfSwKLSAgICAgICAgeyAzOSwgT01YX0FVRElPX0FBQ09iamVjdEVMRCAgICAgIH0sCi0gICAgICAgIHsgNDIsIE9NWF9BVURJT19BQUNPYmplY3RYSEUgICAgICB9LAorCisgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDE2X3QsIGludDMyX3Q+IHByb2ZpbGVzIHsKKyAgICAgICAgeyAxLCAgQUFDT2JqZWN0TWFpbiAgICAgfSwKKyAgICAgICAgeyAyLCAgQUFDT2JqZWN0TEMgICAgICAgfSwKKyAgICAgICAgeyAzLCAgQUFDT2JqZWN0U1NSICAgICAgfSwKKyAgICAgICAgeyA0LCAgQUFDT2JqZWN0TFRQICAgICAgfSwKKyAgICAgICAgeyA1LCAgQUFDT2JqZWN0SEUgICAgICAgfSwKKyAgICAgICAgeyA2LCAgQUFDT2JqZWN0U2NhbGFibGUgfSwKKyAgICAgICAgeyAxNywgQUFDT2JqZWN0RVJMQyAgICAgfSwKKyAgICAgICAgeyAyMywgQUFDT2JqZWN0TEQgICAgICAgfSwKKyAgICAgICAgeyAyOSwgQUFDT2JqZWN0SEVfUFMgICAgfSwKKyAgICAgICAgeyAzOSwgQUFDT2JqZWN0RUxEICAgICAgfSwKKyAgICAgICAgeyA0MiwgQUFDT2JqZWN0WEhFICAgICAgfSwKICAgICB9OwogCi0gICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIHByb2ZpbGU7CisgICAgaW50MzJfdCBwcm9maWxlOwogICAgIGlmIChwcm9maWxlcy5tYXAoYXVkaW9PYmplY3RUeXBlLCAmcHJvZmlsZSkpIHsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGUpOwogICAgIH0KQEAgLTE4NCw1OSArMTg1LDkyIEBACiAgICAgY29uc3QgdWludDhfdCBjb25zdHJhaW50cyA9IHB0clsyXTsKICAgICBjb25zdCB1aW50OF90IGxldmVsID0gcHRyWzNdOwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgeyAgOSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwgLy8gdGVjaG5pY2FsbHksIDkgaXMgb25seSB1c2VkIGZvciBIaWdoKyBwcm9maWxlcwotICAgICAgICB7IDEwLCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAotICAgICAgICB7IDExLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LCAvLyBwcmVmZXIgbGV2ZWwgMS4xIGZvciB0aGUgdmFsdWUgMTEKLSAgICAgICAgeyAxMSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKLSAgICAgICAgeyAxMiwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICAgICAgeyAxMywgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKLSAgICAgICAgeyAyMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICAgICAgeyAyMSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICAgICAgeyAyMiwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKLSAgICAgICAgeyAzMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICAgICAgeyAzMSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICAgICAgeyAzMiwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKLSAgICAgICAgeyA0MCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICAgICAgeyA0MSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICAgICAgeyA0MiwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKLSAgICAgICAgeyA1MCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKLSAgICAgICAgeyA1MSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKLSAgICAgICAgeyA1MiwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKLSAgICAgICAgeyA2MCwgT01YX1ZJREVPX0FWQ0xldmVsNiAgfSwKLSAgICAgICAgeyA2MSwgT01YX1ZJREVPX0FWQ0xldmVsNjEgfSwKLSAgICAgICAgeyA2MiwgT01YX1ZJREVPX0FWQ0xldmVsNjIgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7ICA5LCBBVkNMZXZlbDFiIH0sIC8vIHRlY2huaWNhbGx5LCA5IGlzIG9ubHkgdXNlZCBmb3IgSGlnaCsgcHJvZmlsZXMKKyAgICAgICAgeyAxMCwgQVZDTGV2ZWwxICB9LAorICAgICAgICB7IDExLCBBVkNMZXZlbDExIH0sIC8vIHByZWZlciBsZXZlbCAxLjEgZm9yIHRoZSB2YWx1ZSAxMQorICAgICAgICB7IDExLCBBVkNMZXZlbDFiIH0sCisgICAgICAgIHsgMTIsIEFWQ0xldmVsMTIgfSwKKyAgICAgICAgeyAxMywgQVZDTGV2ZWwxMyB9LAorICAgICAgICB7IDIwLCBBVkNMZXZlbDIgIH0sCisgICAgICAgIHsgMjEsIEFWQ0xldmVsMjEgfSwKKyAgICAgICAgeyAyMiwgQVZDTGV2ZWwyMiB9LAorICAgICAgICB7IDMwLCBBVkNMZXZlbDMgIH0sCisgICAgICAgIHsgMzEsIEFWQ0xldmVsMzEgfSwKKyAgICAgICAgeyAzMiwgQVZDTGV2ZWwzMiB9LAorICAgICAgICB7IDQwLCBBVkNMZXZlbDQgIH0sCisgICAgICAgIHsgNDEsIEFWQ0xldmVsNDEgfSwKKyAgICAgICAgeyA0MiwgQVZDTGV2ZWw0MiB9LAorICAgICAgICB7IDUwLCBBVkNMZXZlbDUgIH0sCisgICAgICAgIHsgNTEsIEFWQ0xldmVsNTEgfSwKKyAgICAgICAgeyA1MiwgQVZDTGV2ZWw1MiB9LAorICAgICAgICB7IDYwLCBBVkNMZXZlbDYgIH0sCisgICAgICAgIHsgNjEsIEFWQ0xldmVsNjEgfSwKKyAgICAgICAgeyA2MiwgQVZDTGV2ZWw2MiB9LAogICAgIH07Ci0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7Ci0gICAgICAgIHsgNjYsIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUgfSwKLSAgICAgICAgeyA3NywgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluICAgICB9LAotICAgICAgICB7IDg4LCBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkIH0sCi0gICAgICAgIHsgMTAwLCBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2ggICAgfSwKLSAgICAgICAgeyAxMTAsIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICB9LAotICAgICAgICB7IDEyMiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyIH0sCi0gICAgICAgIHsgMjQ0LCBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgNjYsIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgICAgICB7IDc3LCBBVkNQcm9maWxlTWFpbiAgICAgfSwKKyAgICAgICAgeyA4OCwgQVZDUHJvZmlsZUV4dGVuZGVkIH0sCisgICAgICAgIHsgMTAwLCBBVkNQcm9maWxlSGlnaCAgICB9LAorICAgICAgICB7IDExMCwgQVZDUHJvZmlsZUhpZ2gxMCAgfSwKKyAgICAgICAgeyAxMjIsIEFWQ1Byb2ZpbGVIaWdoNDIyIH0sCisgICAgICAgIHsgMjQ0LCBBVkNQcm9maWxlSGlnaDQ0NCB9LAogICAgIH07CiAKICAgICAvLyBzZXQgcHJvZmlsZSAmIGxldmVsIGlmIHRoZXkgYXJlIHJlY29nbml6ZWQKLSAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgY29kZWNQcm9maWxlOwotICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgY29kZWNMZXZlbDsKKyAgICBpbnQzMl90IGNvZGVjUHJvZmlsZTsKKyAgICBpbnQzMl90IGNvZGVjTGV2ZWw7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBpZiAocHJvZmlsZSA9PSA2NiAmJiAoY29uc3RyYWludHMgJiAweDQwKSkgewotICAgICAgICAgICAgY29kZWNQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmU7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBBVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTsKICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IDEwMCAmJiAoY29uc3RyYWludHMgJiAweDBDKSA9PSAweDBDKSB7Ci0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaDsKICAgICAgICAgfQogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKICAgICAgICAgaWYgKGxldmVscy5tYXAobGV2ZWwsICZjb2RlY0xldmVsKSkgewogICAgICAgICAgICAgLy8gZm9yIDkgJiYgMTEgZGVjaWRlIGxldmVsIGJhc2VkIG9uIHByb2ZpbGUgYW5kIGNvbnN0cmFpbnRfc2V0MyBmbGFnCiAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMTEgJiYgKHByb2ZpbGUgPT0gNjYgfHwgcHJvZmlsZSA9PSA3NyB8fCBwcm9maWxlID09IDg4KSkgewotICAgICAgICAgICAgICAgIGNvZGVjTGV2ZWwgPSAoY29uc3RyYWludHMgJiAweDEwKSA/IE9NWF9WSURFT19BVkNMZXZlbDFiIDogT01YX1ZJREVPX0FWQ0xldmVsMTE7CisgICAgICAgICAgICAgICAgY29kZWNMZXZlbCA9IChjb25zdHJhaW50cyAmIDB4MTApID8gQVZDTGV2ZWwxYiA6IEFWQ0xldmVsMTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIGNvZGVjTGV2ZWwpOwogICAgICAgICB9CiAgICAgfQogfQogCitzdGF0aWMgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiYgIGdldERvbGJ5VmlzaW9uUHJvZmlsZVRhYmxlKCkgeworICAgIHN0YXRpYyBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IHByb2ZpbGVUYWJsZSA9IHsKKyAgICAgICAgezEsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW59LAorICAgICAgICB7MywgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbn0sCisgICAgICAgIHs0LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyfSwKKyAgICAgICAgezUsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG59LAorICAgICAgICB7NiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aH0sCisgICAgICAgIHs3LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRifSwKKyAgICAgICAgezgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdH0sCisgICAgICAgIHs5LCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2V9LAorICAgICAgICB7MTAsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTB9LAorICAgIH07CisgICAgcmV0dXJuIHByb2ZpbGVUYWJsZTsKK30KKworc3RhdGljIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4mICBnZXREb2xieVZpc2lvbkxldmVsc1RhYmxlKCkgeworICAgIHN0YXRpYyBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVsc1RhYmxlID0geworICAgICAgICB7MCwgRG9sYnlWaXNpb25MZXZlbFVua25vd259LAorICAgICAgICB7MSwgRG9sYnlWaXNpb25MZXZlbEhkMjR9LAorICAgICAgICB7MiwgRG9sYnlWaXNpb25MZXZlbEhkMzB9LAorICAgICAgICB7MywgRG9sYnlWaXNpb25MZXZlbEZoZDI0fSwKKyAgICAgICAgezQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMH0sCisgICAgICAgIHs1LCBEb2xieVZpc2lvbkxldmVsRmhkNjB9LAorICAgICAgICB7NiwgRG9sYnlWaXNpb25MZXZlbFVoZDI0fSwKKyAgICAgICAgezcsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMH0sCisgICAgICAgIHs4LCBEb2xieVZpc2lvbkxldmVsVWhkNDh9LAorICAgICAgICB7OSwgRG9sYnlWaXNpb25MZXZlbFVoZDYwfSwKKyAgICAgICAgezEwLCBEb2xieVZpc2lvbkxldmVsVWhkMTIwfSwKKyAgICAgICAgezExLCBEb2xieVZpc2lvbkxldmVsOGszMH0sCisgICAgICAgIHsxMiwgRG9sYnlWaXNpb25MZXZlbDhrNjB9LAorICAgIH07CisgICAgcmV0dXJuIGxldmVsc1RhYmxlOworfQogc3RhdGljIHZvaWQgcGFyc2VEb2xieVZpc2lvblByb2ZpbGVMZXZlbEZyb21EdmNjKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CiAgICAgLy8gZHZfbWFqb3IuZHZfbWlub3IgU2hvdWxkIGJlIDEuMCBvciAyLjEKICAgICBpZiAoc2l6ZSAhPSAyNCB8fCAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSkgewpAQCAtMjU2LDQxICsyOTAsMjAgQEAKIAogICAgIC8vIEFsbCBEb2xieSBQcm9maWxlcyB3aWxsIGhhdmUgcHJvZmlsZSBhbmQgbGV2ZWwgaW5mbyBpbiBNZWRpYUZvcm1hdAogICAgIC8vIFByb2ZpbGUgOCBhbmQgOSB3aWxsIGhhdmUgYmxfY29tcGF0aWJpbGl0eV9pZCB0b28uCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0RPTEJZVklTSU9OUFJPRklMRVRZUEU+IHByb2ZpbGVzewotICAgICAgICB7MSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW59LAotICAgICAgICB7MywgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW59LAotICAgICAgICB7NCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHJ9LAotICAgICAgICB7NSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG59LAotICAgICAgICB7NiwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGh9LAotICAgICAgICB7NywgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGJ9LAotICAgICAgICB7OCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdH0sCi0gICAgICAgIHs5LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlfSwKLSAgICAgICAgezEwLCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMH0sCi0gICAgfTsKKyAgICBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+ICZwcm9maWxlcyA9IGdldERvbGJ5VmlzaW9uUHJvZmlsZVRhYmxlKCk7CisgICAgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiAmbGV2ZWxzID0gZ2V0RG9sYnlWaXNpb25MZXZlbHNUYWJsZSgpOwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0RPTEJZVklTSU9OTEVWRUxUWVBFPiBsZXZlbHN7Ci0gICAgICAgIHswLCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVua25vd259LAotICAgICAgICB7MSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxIZDI0fSwKLSAgICAgICAgezIsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsSGQzMH0sCi0gICAgICAgIHszLCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbEZoZDI0fSwKLSAgICAgICAgezQsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsRmhkMzB9LAotICAgICAgICB7NSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxGaGQ2MH0sCi0gICAgICAgIHs2LCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVoZDI0fSwKLSAgICAgICAgezcsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsVWhkMzB9LAotICAgICAgICB7OCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxVaGQ0OH0sCi0gICAgICAgIHs5LCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVoZDYwfSwKLSAgICB9OwogICAgIC8vIHNldCBycHVBc3NvYwogICAgIGlmIChycHVfcHJlc2VudF9mbGFnICYmIGVsX3ByZXNlbnRfZmxhZyAmJiAhYmxfcHJlc2VudF9mbGFnKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInJwdUFzc29jIiwgMSk7CiAgICAgfQogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZAotICAgIE9NWF9WSURFT19ET0xCWVZJU0lPTlBST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKLSAgICBPTVhfVklERU9fRE9MQllWSVNJT05MRVZFTFRZUEUgY29kZWNMZXZlbDsKKyAgICBpbnQzMl90IGNvZGVjUHJvZmlsZTsKKyAgICBpbnQzMl90IGNvZGVjTGV2ZWw7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKLSAgICAgICAgaWYgKGNvZGVjUHJvZmlsZSA9PSBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0IHx8Ci0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPT0gT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgeworICAgICAgICBpZiAoY29kZWNQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCB8fAorICAgICAgICAgICAgY29kZWNQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYmxfY29tcGF0aWJpbGl0eV9pZCIsIGJsX2NvbXBhdGliaWxpdHlfaWQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChsZXZlbHMubWFwKGxldmVsLCAmY29kZWNMZXZlbCkpIHsKQEAgLTMwNywzMiArMzIwLDMyIEBACiAgICAgY29uc3QgdWludDhfdCBwcm9maWxlID0gcHRyWzZdOwogICAgIGNvbnN0IHVpbnQ4X3QgbGV2ZWwgPSBwdHJbNV07CiAKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7Ci0gICAgICAgIHsgMCwgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUgfSwKLSAgICAgICAgeyAxLCBPTVhfVklERU9fSDI2M1Byb2ZpbGVIMzIwQ29kaW5nIH0sCi0gICAgICAgIHsgMiwgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCi0gICAgICAgIHsgMywgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIgfSwKLSAgICAgICAgeyA0LCBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMyB9LAotICAgICAgICB7IDUsIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAotICAgICAgICB7IDYsIE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0IH0sCi0gICAgICAgIHsgNywgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJsYWNlIH0sCi0gICAgICAgIHsgOCwgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgMCwgSDI2M1Byb2ZpbGVCYXNlbGluZSB9LAorICAgICAgICB7IDEsIEgyNjNQcm9maWxlSDMyMENvZGluZyB9LAorICAgICAgICB7IDIsIEgyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCisgICAgICAgIHsgMywgSDI2M1Byb2ZpbGVJU1dWMiB9LAorICAgICAgICB7IDQsIEgyNjNQcm9maWxlSVNXVjMgfSwKKyAgICAgICAgeyA1LCBIMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAorICAgICAgICB7IDYsIEgyNjNQcm9maWxlSW50ZXJuZXQgfSwKKyAgICAgICAgeyA3LCBIMjYzUHJvZmlsZUludGVybGFjZSB9LAorICAgICAgICB7IDgsIEgyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKICAgICB9OwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEU+IGxldmVscyB7Ci0gICAgICAgIHsgMTAsIE9NWF9WSURFT19IMjYzTGV2ZWwxMCB9LAotICAgICAgICB7IDIwLCBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKLSAgICAgICAgeyAzMCwgT01YX1ZJREVPX0gyNjNMZXZlbDMwIH0sCi0gICAgICAgIHsgNDAsIE9NWF9WSURFT19IMjYzTGV2ZWw0MCB9LAotICAgICAgICB7IDQ1LCBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKLSAgICAgICAgeyA1MCwgT01YX1ZJREVPX0gyNjNMZXZlbDUwIH0sCi0gICAgICAgIHsgNjAsIE9NWF9WSURFT19IMjYzTGV2ZWw2MCB9LAotICAgICAgICB7IDcwLCBPTVhfVklERU9fSDI2M0xldmVsNzAgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7IDEwLCBIMjYzTGV2ZWwxMCB9LAorICAgICAgICB7IDIwLCBIMjYzTGV2ZWwyMCB9LAorICAgICAgICB7IDMwLCBIMjYzTGV2ZWwzMCB9LAorICAgICAgICB7IDQwLCBIMjYzTGV2ZWw0MCB9LAorICAgICAgICB7IDQ1LCBIMjYzTGV2ZWw0NSB9LAorICAgICAgICB7IDUwLCBIMjYzTGV2ZWw1MCB9LAorICAgICAgICB7IDYwLCBIMjYzTGV2ZWw2MCB9LAorICAgICAgICB7IDcwLCBIMjYzTGV2ZWw3MCB9LAogICAgIH07CiAKICAgICAvLyBzZXQgcHJvZmlsZSAmIGxldmVsIGlmIHRoZXkgYXJlIHJlY29nbml6ZWQKLSAgICBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKLSAgICBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSBjb2RlY0xldmVsOworICAgIGludDMyX3QgY29kZWNQcm9maWxlOworICAgIGludDMyX3QgY29kZWNMZXZlbDsKICAgICBpZiAocHJvZmlsZXMubWFwKHByb2ZpbGUsICZjb2RlY1Byb2ZpbGUpKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBjb2RlY1Byb2ZpbGUpOwogICAgICAgICBpZiAobGV2ZWxzLm1hcChsZXZlbCwgJmNvZGVjTGV2ZWwpKSB7CkBAIC0zNTAsNTkgKzM2Myw2MyBAQAogICAgIGNvbnN0IHVpbnQ4X3QgdGllciA9IChwdHJbMV0gJiAweDIwKSA+PiA1OwogICAgIGNvbnN0IHVpbnQ4X3QgbGV2ZWwgPSBwdHJbMTJdOwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8c3RkOjpwYWlyPHVpbnQ4X3QsIHVpbnQ4X3Q+LCBPTVhfVklERU9fSEVWQ0xFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgeyB7IDAsIDMwICB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwxICB9LAotICAgICAgICB7IHsgMCwgNjAgIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIgIH0sCi0gICAgICAgIHsgeyAwLCA2MyAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMjEgfSwKLSAgICAgICAgeyB7IDAsIDkwICB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzICB9LAotICAgICAgICB7IHsgMCwgOTMgIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxIH0sCi0gICAgICAgIHsgeyAwLCAxMjAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNCAgfSwKLSAgICAgICAgeyB7IDAsIDEyMyB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAotICAgICAgICB7IHsgMCwgMTUwIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUgIH0sCi0gICAgICAgIHsgeyAwLCAxNTMgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgfSwKLSAgICAgICAgeyB7IDAsIDE1NiB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MiB9LAotICAgICAgICB7IHsgMCwgMTgwIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDYgIH0sCi0gICAgICAgIHsgeyAwLCAxODMgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNjEgfSwKLSAgICAgICAgeyB7IDAsIDE4NiB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MiB9LAotICAgICAgICB7IHsgMSwgMzAgIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDEgIH0sCi0gICAgICAgIHsgeyAxLCA2MCAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMiAgfSwKLSAgICAgICAgeyB7IDEsIDYzICB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwyMSB9LAotICAgICAgICB7IHsgMSwgOTAgIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDMgIH0sCi0gICAgICAgIHsgeyAxLCA5MyAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMzEgfSwKLSAgICAgICAgeyB7IDEsIDEyMCB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw0ICB9LAotICAgICAgICB7IHsgMSwgMTIzIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDQxIH0sCi0gICAgICAgIHsgeyAxLCAxNTAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNSAgfSwKLSAgICAgICAgeyB7IDEsIDE1MyB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1MSB9LAotICAgICAgICB7IHsgMSwgMTU2IH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDUyIH0sCi0gICAgICAgIHsgeyAxLCAxODAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNiAgfSwKLSAgICAgICAgeyB7IDEsIDE4MyB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2MSB9LAotICAgICAgICB7IHsgMSwgMTg2IH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDYyIH0sCisgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8c3RkOjpwYWlyPHVpbnQ4X3QsIHVpbnQ4X3Q+LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7IHsgMCwgMzAgIH0sIEhFVkNNYWluVGllckxldmVsMSAgfSwKKyAgICAgICAgeyB7IDAsIDYwICB9LCBIRVZDTWFpblRpZXJMZXZlbDIgIH0sCisgICAgICAgIHsgeyAwLCA2MyAgfSwgSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgICAgICB7IHsgMCwgOTAgIH0sIEhFVkNNYWluVGllckxldmVsMyAgfSwKKyAgICAgICAgeyB7IDAsIDkzICB9LCBIRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgICAgIHsgeyAwLCAxMjAgfSwgSEVWQ01haW5UaWVyTGV2ZWw0ICB9LAorICAgICAgICB7IHsgMCwgMTIzIH0sIEhFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICAgICAgeyB7IDAsIDE1MCB9LCBIRVZDTWFpblRpZXJMZXZlbDUgIH0sCisgICAgICAgIHsgeyAwLCAxNTMgfSwgSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorICAgICAgICB7IHsgMCwgMTU2IH0sIEhFVkNNYWluVGllckxldmVsNTIgfSwKKyAgICAgICAgeyB7IDAsIDE4MCB9LCBIRVZDTWFpblRpZXJMZXZlbDYgIH0sCisgICAgICAgIHsgeyAwLCAxODMgfSwgSEVWQ01haW5UaWVyTGV2ZWw2MSB9LAorICAgICAgICB7IHsgMCwgMTg2IH0sIEhFVkNNYWluVGllckxldmVsNjIgfSwKKyAgICAgICAgeyB7IDEsIDMwICB9LCBIRVZDSGlnaFRpZXJMZXZlbDEgIH0sCisgICAgICAgIHsgeyAxLCA2MCAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWwyICB9LAorICAgICAgICB7IHsgMSwgNjMgIH0sIEhFVkNIaWdoVGllckxldmVsMjEgfSwKKyAgICAgICAgeyB7IDEsIDkwICB9LCBIRVZDSGlnaFRpZXJMZXZlbDMgIH0sCisgICAgICAgIHsgeyAxLCA5MyAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWwzMSB9LAorICAgICAgICB7IHsgMSwgMTIwIH0sIEhFVkNIaWdoVGllckxldmVsNCAgfSwKKyAgICAgICAgeyB7IDEsIDEyMyB9LCBIRVZDSGlnaFRpZXJMZXZlbDQxIH0sCisgICAgICAgIHsgeyAxLCAxNTAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw1ICB9LAorICAgICAgICB7IHsgMSwgMTUzIH0sIEhFVkNIaWdoVGllckxldmVsNTEgfSwKKyAgICAgICAgeyB7IDEsIDE1NiB9LCBIRVZDSGlnaFRpZXJMZXZlbDUyIH0sCisgICAgICAgIHsgeyAxLCAxODAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw2ICB9LAorICAgICAgICB7IHsgMSwgMTgzIH0sIEhFVkNIaWdoVGllckxldmVsNjEgfSwKKyAgICAgICAgeyB7IDEsIDE4NiB9LCBIRVZDSGlnaFRpZXJMZXZlbDYyIH0sCiAgICAgfTsKIAotICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19IRVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgeyAxLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluICAgfSwKLSAgICAgICAgeyAyLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgMSwgSEVWQ1Byb2ZpbGVNYWluICAgfSwKKyAgICAgICAgeyAyLCBIRVZDUHJvZmlsZU1haW4xMCB9LAogICAgICAgICAvLyB1c2UgTWFpbiBmb3IgTWFpbiBTdGlsbCBQaWN0dXJlIGRlY29kaW5nCi0gICAgICAgIHsgMywgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiB9LAorICAgICAgICB7IDMsIEhFVkNQcm9maWxlTWFpbiB9LAogICAgIH07CiAKICAgICAvLyBzZXQgcHJvZmlsZSAmIGxldmVsIGlmIHRoZXkgYXJlIHJlY29nbml6ZWQKLSAgICBPTVhfVklERU9fSEVWQ1BST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKLSAgICBPTVhfVklERU9fSEVWQ0xFVkVMVFlQRSBjb2RlY0xldmVsOworICAgIGludDMyX3QgY29kZWNQcm9maWxlOworICAgIGludDMyX3QgY29kZWNMZXZlbDsKICAgICBpZiAoIXByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBpZiAocHRyWzJdICYgMHg0MCAvKiBnZW5lcmFsIGNvbXBhdGliaWxpdHkgZmxhZyAxICovKSB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYXNlIGNvdmVycyBNYWluIFN0aWxsIFBpY3R1cmUgdG9vCi0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluOworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gSEVWQ1Byb2ZpbGVNYWluOwogICAgICAgICB9IGVsc2UgaWYgKHB0clsyXSAmIDB4MjAgLyogZ2VuZXJhbCBjb21wYXRpYmlsaXR5IGZsYWcgMiAqLykgewotICAgICAgICAgICAgY29kZWNQcm9maWxlID0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwOworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gSEVWQ1Byb2ZpbGVNYWluMTA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBidW1wIHRvIEhEUiBwcm9maWxlCi0gICAgaWYgKGlzSGRyKGZvcm1hdCkgJiYgY29kZWNQcm9maWxlID09IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMCkgewotICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDsKKyAgICBpZiAoaXNIZHIxMG9yMTBQbHVzKGZvcm1hdCkgJiYgY29kZWNQcm9maWxlID09IEhFVkNQcm9maWxlTWFpbjEwKSB7CisgICAgICAgIGlmIChmb3JtYXQtPmNvbnRhaW5zKCJoZHIxMC1wbHVzLWluZm8iKSkgeworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwOworICAgICAgICB9CiAgICAgfQogCiAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIGNvZGVjUHJvZmlsZSk7CkBAIC00MjIsMzYgKzQzOSwzNiBAQAogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgaW5kaWNhdGlvbiA9ICgoc2VxWzRdICYgMHhGKSA8PCA0KSB8ICgoc2VxWzVdICYgMHhGMCkgPj4gNCk7CiAKLSAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgICAgIHsgMHg1MCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSAgfSwKLSAgICAgICAgICAgIHsgMHg0MCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4gICAgfSwKLSAgICAgICAgICAgIHsgMHgzMCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNOUiAgICAgfSwKLSAgICAgICAgICAgIHsgMHgyMCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNwYXRpYWwgfSwKLSAgICAgICAgICAgIHsgMHgxMCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZUhpZ2ggICAgfSwKKyAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gcHJvZmlsZXMgeworICAgICAgICAgICAgeyAweDUwLCBNUEVHMlByb2ZpbGVTaW1wbGUgIH0sCisgICAgICAgICAgICB7IDB4NDAsIE1QRUcyUHJvZmlsZU1haW4gICAgfSwKKyAgICAgICAgICAgIHsgMHgzMCwgTVBFRzJQcm9maWxlU05SICAgICB9LAorICAgICAgICAgICAgeyAweDIwLCBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgICAgICAgICB7IDB4MTAsIE1QRUcyUHJvZmlsZUhpZ2ggICAgfSwKICAgICAgICAgfTsKIAotICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEU+IGxldmVscyB7Ci0gICAgICAgICAgICB7IDB4MEEsIE9NWF9WSURFT19NUEVHMkxldmVsTEwgIH0sCi0gICAgICAgICAgICB7IDB4MDgsIE9NWF9WSURFT19NUEVHMkxldmVsTUwgIH0sCi0gICAgICAgICAgICB7IDB4MDYsIE9NWF9WSURFT19NUEVHMkxldmVsSDE0IH0sCi0gICAgICAgICAgICB7IDB4MDQsIE9NWF9WSURFT19NUEVHMkxldmVsSEwgIH0sCi0gICAgICAgICAgICB7IDB4MDIsIE9NWF9WSURFT19NUEVHMkxldmVsSFAgIH0sCisgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVscyB7CisgICAgICAgICAgICB7IDB4MEEsIE1QRUcyTGV2ZWxMTCAgfSwKKyAgICAgICAgICAgIHsgMHgwOCwgTVBFRzJMZXZlbE1MICB9LAorICAgICAgICAgICAgeyAweDA2LCBNUEVHMkxldmVsSDE0IH0sCisgICAgICAgICAgICB7IDB4MDQsIE1QRUcyTGV2ZWxITCAgfSwKKyAgICAgICAgICAgIHsgMHgwMiwgTVBFRzJMZXZlbEhQICB9LAogICAgICAgICB9OwogCiAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsCi0gICAgICAgICAgICAgICAgc3RkOjpwYWlyPE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFLCBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEU+PiBlc2NhcGVzIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGVzY2FwZXMgewogICAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgIHsgMHg4RSwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBPTVhfVklERU9fTVBFRzJMZXZlbExMICB9IH0sCi0gICAgICAgICAgICB7IDB4OEQsIHsgWFhYX01QRUcyUHJvZmlsZU11bHRpVmlldywgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCAgfSB9LAotICAgICAgICAgICAgeyAweDhCLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE9NWF9WSURFT19NUEVHMkxldmVsSDE0IH0gfSwKLSAgICAgICAgICAgIHsgMHg4QSwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBPTVhfVklERU9fTVBFRzJMZXZlbEhMICB9IH0sICovCi0gICAgICAgICAgICB7IDB4ODUsIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZTQyMiwgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCAgfSB9LAotICAgICAgICAgICAgeyAweDgyLCB7IE9NWF9WSURFT19NUEVHMlByb2ZpbGU0MjIsIE9NWF9WSURFT19NUEVHMkxldmVsSEwgIH0gfSwKKyAgICAgICAgICAgIHsgMHg4RSwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBNUEVHMkxldmVsTEwgIH0gfSwKKyAgICAgICAgICAgIHsgMHg4RCwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBNUEVHMkxldmVsTUwgIH0gfSwKKyAgICAgICAgICAgIHsgMHg4QiwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBNUEVHMkxldmVsSDE0IH0gfSwKKyAgICAgICAgICAgIHsgMHg4QSwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBNUEVHMkxldmVsSEwgIH0gfSwgKi8KKyAgICAgICAgICAgIHsgMHg4NSwgeyBNUEVHMlByb2ZpbGU0MjIsIE1QRUcyTGV2ZWxNTCAgfSB9LAorICAgICAgICAgICAgeyAweDgyLCB7IE1QRUcyUHJvZmlsZTQyMiwgTVBFRzJMZXZlbEhMICB9IH0sCiAgICAgICAgIH07CiAKLSAgICAgICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgcHJvZmlsZTsKLSAgICAgICAgT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIGxldmVsOwotICAgICAgICBzdGQ6OnBhaXI8T01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUsIE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRT4gcHJvZmlsZUxldmVsOworICAgICAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgICAgIGludDMyX3QgbGV2ZWw7CisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBwcm9maWxlTGV2ZWw7CiAgICAgICAgIGlmIChlc2NhcGVzLm1hcChpbmRpY2F0aW9uLCAmcHJvZmlsZUxldmVsKSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGVMZXZlbC5maXJzdCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIHByb2ZpbGVMZXZlbC5zZWNvbmQpOwpAQCAtNDY4LDE2ICs0ODUsMTYgQEAKICAgICAvLyBlc2RzIHNlZW1zIHRvIG9ubHkgY29udGFpbiB0aGUgcHJvZmlsZSBmb3IgTVBFRy0yCiAgICAgdWludDhfdCBvYmpUeXBlOwogICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmpUeXBlKSA9PSBPSykgewotICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRT4gcHJvZmlsZXN7Ci0gICAgICAgICAgICB7IDB4NjAsIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUgIH0sCi0gICAgICAgICAgICB7IDB4NjEsIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluICAgIH0sCi0gICAgICAgICAgICB7IDB4NjIsIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTTlIgICAgIH0sCi0gICAgICAgICAgICB7IDB4NjMsIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTcGF0aWFsIH0sCi0gICAgICAgICAgICB7IDB4NjQsIE9NWF9WSURFT19NUEVHMlByb2ZpbGVIaWdoICAgIH0sCi0gICAgICAgICAgICB7IDB4NjUsIE9NWF9WSURFT19NUEVHMlByb2ZpbGU0MjIgICAgIH0sCisgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IHByb2ZpbGVzeworICAgICAgICAgICAgeyAweDYwLCBNUEVHMlByb2ZpbGVTaW1wbGUgIH0sCisgICAgICAgICAgICB7IDB4NjEsIE1QRUcyUHJvZmlsZU1haW4gICAgfSwKKyAgICAgICAgICAgIHsgMHg2MiwgTVBFRzJQcm9maWxlU05SICAgICB9LAorICAgICAgICAgICAgeyAweDYzLCBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgICAgICAgICB7IDB4NjQsIE1QRUcyUHJvZmlsZUhpZ2ggICAgfSwKKyAgICAgICAgICAgIHsgMHg2NSwgTVBFRzJQcm9maWxlNDIyICAgICB9LAogICAgICAgICB9OwogCi0gICAgICAgIE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFIHByb2ZpbGU7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKICAgICAgICAgaWYgKHByb2ZpbGVzLm1hcChvYmpUeXBlLCAmcHJvZmlsZSkpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBwcm9maWxlKTsKICAgICAgICAgfQpAQCAtNDkyLDgyICs1MDksODIgQEAKICAgICAgICAgY29uc3QgdWludDhfdCBpbmRpY2F0aW9uID0gc2VxWzRdOwogCiAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsCi0gICAgICAgICAgICAgICAgc3RkOjpwYWlyPE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFLCBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU+PiB0YWJsZSB7Ci0gICAgICAgICAgICB7IDBiMDAwMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMDAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDRhIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMDEwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNSAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAwMTEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw2ICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMDEwMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMTAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMGIgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDEwMDAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAxMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gdGFibGUgeworICAgICAgICAgICAgeyAwYjAwMDAwMDAxLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAwMDEwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAwMDExLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAwMTAwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsNGEgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAwMTAxLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsNSAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAwMTEwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsNiAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAxMDAwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsMCAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDAxMDAxLCB7IE1QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBNUEVHNExldmVsMGIgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDEwMDAwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLCAgICBNUEVHNExldmVsMCAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDEwMDAxLCB7IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLCAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDEwMDEwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLCAgICBNUEVHNExldmVsMiAgfSB9LAogICAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgIHsgMGIwMDAxMTEwMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGVFUiwgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMCAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDExMTEwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZUVSLCAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMTExMTEsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlRVIsICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwgKi8KLSAgICAgICAgICAgIHsgMGIwMDEwMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSwgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMTAwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAxMTAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDExMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMTEwMTAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTExMDEsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlRVIsICAgICAgICBNUEVHNExldmVsMCAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDExMTEwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZUVSLCAgICAgICAgTVBFRzRMZXZlbDEgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDAxMTExMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGVFUiwgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sICovCisgICAgICAgICAgICB7IDBiMDAxMDAwMDEsIHsgTVBFRzRQcm9maWxlQ29yZSwgICAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDAxMDAwMTAsIHsgTVBFRzRQcm9maWxlQ29yZSwgICAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDAxMTAwMTAsIHsgTVBFRzRQcm9maWxlTWFpbiwgICAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDAxMTAwMTEsIHsgTVBFRzRQcm9maWxlTWFpbiwgICAgICAgICAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMDAxMTAxMDAsIHsgTVBFRzRQcm9maWxlTWFpbiwgICAgICAgICAgICAgIE1QRUc0TGV2ZWw0ICB9IH0sCiAgICAgICAgICAgICAvKiBkZXByZWNhdGVkCi0gICAgICAgICAgICB7IDBiMDEwMDAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQsICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwgKi8KLSAgICAgICAgICAgIHsgMGIwMTAxMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlLCAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAxMTAwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDExMDAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UsICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMTEwMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRkJBLCAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAxMTAwMTAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEsICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMDExMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMTExMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMDAwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAwMDAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDAxMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMDEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAwMTAwMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDAxMDEwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE9NWF9WSURFT19NUEVHNExldmVsNCAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTAwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUsICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMDAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDEwMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTEwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMTAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDExMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTEwMTAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTEwMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSwgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTAwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMDEwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTEwMTAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTAxMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMDAwMDEwLCB7IE1QRUc0UHJvZmlsZU5iaXQsICAgICAgICAgICAgICBNUEVHNExldmVsMiAgfSB9LCAqLworICAgICAgICAgICAgeyAwYjAxMDEwMDAxLCB7IE1QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSwgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMTAwMDAxLCB7IE1QRUc0UHJvZmlsZVNpbXBsZUZhY2UsICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMTAwMDEwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZUZhY2UsICAgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMTAwMDExLCB7IE1QRUc0UHJvZmlsZVNpbXBsZUZCQSwgICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMTAwMTAwLCB7IE1QRUc0UHJvZmlsZVNpbXBsZUZCQSwgICAgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMTEwMDAxLCB7IE1QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAxMTEwMDEwLCB7IE1QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMDAwMDAxLCB7IE1QRUc0UHJvZmlsZUh5YnJpZCwgICAgICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMDAwMDEwLCB7IE1QRUc0UHJvZmlsZUh5YnJpZCwgICAgICAgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMDEwMDAxLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMDEwMDEwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMDEwMDExLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMDEwMTAwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBNUEVHNExldmVsNCAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTAwMDAxLCB7IE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTAwMDEwLCB7IE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTAwMDExLCB7IE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgICAgICBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTEwMDAxLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTEwMDEwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTEwMDExLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjEwMTEwMTAwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBNUEVHNExldmVsNCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMDAwMDAxLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSwgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMDAwMDEwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSwgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjExMDEwMDAxLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMDEwMDEwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjExMDEwMDExLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsICBNUEVHNExldmVsMyAgfSB9LAogICAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgIHsgMGIxMTEwMDAwMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAwMDEwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDAwMTEsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMDEwMCwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAwMTAxLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDAxMTAsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMDExMSwgeyBYWFhfTVBFRzRQcm9maWxlQ29yZVN0dWRpbywgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAxMDAwLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDEwMTEsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDUgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMTEwMCwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNiAgfSB9LCAqLwotICAgICAgICAgICAgeyAwYjExMTEwMDAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMDEwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsNSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTEwMTExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzYiB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAwMDEsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAwMDEwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDAxMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAxMDAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBNUEVHNExldmVsNCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAwMTAxLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDEgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDExMCwgeyBYWFhfTVBFRzRQcm9maWxlQ29yZVN0dWRpbywgICAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAxMTEsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAxMDAwLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDQgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMTAxMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWw1ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDExMDAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBNUEVHNExldmVsNiAgfSB9LCAqLworICAgICAgICAgICAgeyAwYjExMTEwMDAwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsMCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTEwMDAxLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTEwMDEwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTEwMDExLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTEwMTAwLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsNCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTEwMTAxLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsNSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTEwMTExLCB7IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBNUEVHNExldmVsM2IgfSB9LAogICAgICAgICAgICAgLyogZGVwcmVjYXRlZAotICAgICAgICAgICAgeyAwYjExMTExMDAwLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTEwMDEsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMTAxMCwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTExMDExLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTExMDAsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMTEwMSwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsNSAgfSB9LCAqLworICAgICAgICAgICAgeyAwYjExMTExMDAwLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgTVBFRzRMZXZlbDAgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTExMTAwMSwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTEwMTAsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTExMDExLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgTVBFRzRMZXZlbDMgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTExMTEwMCwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTExMDEsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBNUEVHNExldmVsNSAgfSB9LCAqLwogICAgICAgICB9OwogCi0gICAgICAgIHN0ZDo6cGFpcjxPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSwgT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFPiBwcm9maWxlTGV2ZWw7CisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBwcm9maWxlTGV2ZWw7CiAgICAgICAgIGlmICh0YWJsZS5tYXAoaW5kaWNhdGlvbiwgJnByb2ZpbGVMZXZlbCkpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBwcm9maWxlTGV2ZWwuZmlyc3QpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigibGV2ZWwiLCBwcm9maWxlTGV2ZWwuc2Vjb25kKTsKQEAgLTU5MCwyMyArNjA3LDMyIEBACiAgICAgICAgIHN3aXRjaCAoaWQpIHsKICAgICAgICAgICAgIGNhc2UgMSAvKiBwcm9maWxlSWQgKi86CiAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19WUDlQUk9GSUxFVFlQRT4gcHJvZmlsZXMgewotICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCBPTVhfVklERU9fVlA5UHJvZmlsZTAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMSwgT01YX1ZJREVPX1ZQOVByb2ZpbGUxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDIsIE9NWF9WSURFT19WUDlQcm9maWxlMiB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAzLCBPTVhfVklERU9fVlA5UHJvZmlsZTMgfSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gcHJvZmlsZXMgeworICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCBWUDlQcm9maWxlMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCBWUDlQcm9maWxlMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAyLCBWUDlQcm9maWxlMiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAzLCBWUDlQcm9maWxlMyB9LAogICAgICAgICAgICAgICAgICAgICB9OwogCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPE9NWF9WSURFT19WUDlQUk9GSUxFVFlQRSwgT01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFPiB0b0hkciB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMywgT01YX1ZJREVPX1ZQOVByb2ZpbGUzSERSIH0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPGludDMyX3QsIGludDMyX3Q+IHRvSGRyMTAgeworICAgICAgICAgICAgICAgICAgICAgICAgeyBWUDlQcm9maWxlMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgVlA5UHJvZmlsZTMsIFZQOVByb2ZpbGUzSERSIH0sCiAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFIHByb2ZpbGU7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPGludDMyX3QsIGludDMyX3Q+IHRvSGRyMTBQbHVzIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgVlA5UHJvZmlsZTIsIFZQOVByb2ZpbGUySERSMTBQbHVzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IFZQOVByb2ZpbGUzLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVzLm1hcChkYXRhWzBdLCAmcHJvZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gSERSIHByb2ZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hkcihmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IZHIubG9va3VwKHByb2ZpbGUsICZwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hkcjEwb3IxMFBsdXMoZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmNvbnRhaW5zKCJoZHIxMC1wbHVzLWluZm8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hkcjEwUGx1cy5sb29rdXAocHJvZmlsZSwgJnByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvSGRyMTAubG9va3VwKHByb2ZpbGUsICZwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBwcm9maWxlKTsKQEAgLTYxNSwyNCArNjQxLDI0IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDIgLyogbGV2ZWxJZCAqLzoKICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX1ZQOUxFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMTAsIE9NWF9WSURFT19WUDlMZXZlbDEgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDExLCBPTVhfVklERU9fVlA5TGV2ZWwxMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAyMCwgT01YX1ZJREVPX1ZQOUxldmVsMiAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMjEsIE9NWF9WSURFT19WUDlMZXZlbDIxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDMwLCBPTVhfVklERU9fVlA5TGV2ZWwzICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAzMSwgT01YX1ZJREVPX1ZQOUxldmVsMzEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNDAsIE9NWF9WSURFT19WUDlMZXZlbDQgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDQxLCBPTVhfVklERU9fVlA5TGV2ZWw0MSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA1MCwgT01YX1ZJREVPX1ZQOUxldmVsNSAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNTEsIE9NWF9WSURFT19WUDlMZXZlbDUxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDUyLCBPTVhfVklERU9fVlA5TGV2ZWw1MiB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA2MCwgT01YX1ZJREVPX1ZQOUxldmVsNiAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNjEsIE9NWF9WSURFT19WUDlMZXZlbDYxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDYyLCBPTVhfVklERU9fVlA5TGV2ZWw2MiB9LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICAgICAgICAgICAgICAgICAgeyAxMCwgVlA5TGV2ZWwxICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAxMSwgVlA5TGV2ZWwxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAyMCwgVlA5TGV2ZWwyICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAyMSwgVlA5TGV2ZWwyMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAzMCwgVlA5TGV2ZWwzICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAzMSwgVlA5TGV2ZWwzMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA0MCwgVlA5TGV2ZWw0ICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA0MSwgVlA5TGV2ZWw0MSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA1MCwgVlA5TGV2ZWw1ICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA1MSwgVlA5TGV2ZWw1MSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA1MiwgVlA5TGV2ZWw1MiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA2MCwgVlA5TGV2ZWw2ICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA2MSwgVlA5TGV2ZWw2MSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyA2MiwgVlA5TGV2ZWw2MiB9LAogICAgICAgICAgICAgICAgICAgICB9OwogCi0gICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WUDlMRVZFTFRZUEUgbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbHMubWFwKGRhdGFbMF0sICZsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgbGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NjYsNyArNjkyLDcgQEAKICAgICBpbnQzMl90IHByb2ZpbGU7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChzdGQ6Om1ha2VfcGFpcihoaWdoQml0RGVwdGgsIHByb2ZpbGVEYXRhKSwgJnByb2ZpbGUpKSB7CiAgICAgICAgIC8vIGJ1bXAgdG8gSERSIHByb2ZpbGUKLSAgICAgICAgaWYgKGlzSGRyKGZvcm1hdCkgJiYgcHJvZmlsZSA9PSBBVjFQcm9maWxlTWFpbjEwKSB7CisgICAgICAgIGlmIChpc0hkcjEwb3IxMFBsdXMoZm9ybWF0KSAmJiBwcm9maWxlID09IEFWMVByb2ZpbGVNYWluMTApIHsKICAgICAgICAgICAgIGlmIChmb3JtYXQtPmNvbnRhaW5zKCJoZHIxMC1wbHVzLWluZm8iKSkgewogICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE1MDQsMTAgKzE1MzAsMjEgQEAKICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9CiAKLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleURWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgfHwgbWV0YS0+ZmluZERhdGEoa0tleURWVkMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICB8fCBtZXRhLT5maW5kRGF0YShrS2V5RFZXQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogICAgICAgICBBTE9HVigiRFY6IGNhbGxpbmcgcGFyc2VEb2xieVZpc2lvblByb2ZpbGVMZXZlbEZyb21EdmNjIHdpdGggZGF0YSBzaXplICV6dSIsIHNpemUpOwogICAgICAgICBwYXJzZURvbGJ5VmlzaW9uUHJvZmlsZUxldmVsRnJvbUR2Y2MocHRyLCBzaXplLCBtc2cpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IGJ1ZmZlci0+YmFzZSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTIiLCBidWZmZXIpOwogICAgIH0KIAogICAgICpmb3JtYXQgPSBtc2c7CkBAIC0xNzU5LDI0ICsxNzk2LDM5IEBACiAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikgfHwgbWltZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgewogICAgICAgICBpbnQzMl90IHdpZHRoOwogICAgICAgICBpbnQzMl90IGhlaWdodDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fCAhbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CiAgICAgICAgICAgICBBTE9HVigiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIHdpZHRoOiAlZCBhbmQvb3IgaGVpZ2h0OiAlZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKIAotICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7Ci0gICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQotICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkpIHsKKyAgICAgICAgaW50MzJfdCBzYXJXaWR0aCA9IC0xLCBzYXJIZWlnaHQgPSAtMTsKKyAgICAgICAgYm9vbCBmb3VuZFdpZHRoLCBmb3VuZEhlaWdodDsKKyAgICAgICAgZm91bmRXaWR0aCA9IG1zZy0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpOworICAgICAgICBmb3VuZEhlaWdodCA9IG1zZy0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCk7CisgICAgICAgIGlmIChmb3VuZFdpZHRoIHx8IGZvdW5kSGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc2FyV2lkdGggPD0gMCB8fCBzYXJIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIHNhcldpZHRoOiAlZCBhbmQvb3Igc2FySGVpZ2h0OiAlZCIsIHNhcldpZHRoLCBzYXJIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U0FSV2lkdGgsIHNhcldpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJIZWlnaHQsIHNhckhlaWdodCk7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJkaXNwbGF5LXdpZHRoIiwgJmRpc3BsYXlXaWR0aCkKLSAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmZGlzcGxheUhlaWdodCkpIHsKKyAgICAgICAgaW50MzJfdCBkaXNwbGF5V2lkdGggPSAtMSwgZGlzcGxheUhlaWdodCA9IC0xOworICAgICAgICBmb3VuZFdpZHRoID0gbXNnLT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmZGlzcGxheVdpZHRoKTsKKyAgICAgICAgZm91bmRIZWlnaHQgPSBtc2ctPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmZGlzcGxheUhlaWdodCk7CisgICAgICAgIGlmIChmb3VuZFdpZHRoIHx8IGZvdW5kSGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheVdpZHRoIDw9IDAgfHwgZGlzcGxheUhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2YgZGlzcGxheVdpZHRoOiAlZCBhbmQvb3IgZGlzcGxheUhlaWdodDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgZGlzcGxheVdpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKICAgICAgICAgfQpAQCAtMTc4NiwxNyArMTgzOCwyOSBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJpcy1kZWZhdWx0IiwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KSB7CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3QgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbGUtd2lkdGgiLCAmdGlsZVdpZHRoKSkgeworICAgICAgICAgICAgaW50MzJfdCB0aWxlV2lkdGggPSAtMSwgdGlsZUhlaWdodCA9IC0xOworICAgICAgICAgICAgZm91bmRXaWR0aCA9IG1zZy0+ZmluZEludDMyKCJ0aWxlLXdpZHRoIiwgJnRpbGVXaWR0aCk7CisgICAgICAgICAgICBmb3VuZEhlaWdodCA9IG1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChmb3VuZFdpZHRoIHx8IGZvdW5kSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbGVXaWR0aCA8PSAwIHx8IHRpbGVIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiB0aWxlV2lkdGg6ICVkIGFuZC9vciB0aWxlSGVpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbGVXaWR0aCwgdGlsZVdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGlsZS1oZWlnaHQiLCAmdGlsZUhlaWdodCkpIHsKICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZUhlaWdodCwgdGlsZUhlaWdodCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImdyaWQtcm93cyIsICZncmlkUm93cykpIHsKKyAgICAgICAgICAgIGludDMyX3QgZ3JpZFJvd3MgPSAtMSwgZ3JpZENvbHMgPSAtMTsKKyAgICAgICAgICAgIGJvb2wgZm91bmRSb3dzLCBmb3VuZENvbHM7CisgICAgICAgICAgICBmb3VuZFJvd3MgPSBtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKTsKKyAgICAgICAgICAgIGZvdW5kQ29scyA9IG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpOworICAgICAgICAgICAgaWYgKGZvdW5kUm93cyB8fCBmb3VuZENvbHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3JpZFJvd3MgPD0gMCB8fCBncmlkQ29scyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIGdyaWRSb3dzOiAlZCBhbmQvb3IgZ3JpZENvbHM6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkUm93cywgZ3JpZENvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZFJvd3MsIGdyaWRSb3dzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ3JpZC1jb2xzIiwgJmdyaWRDb2xzKSkgewogICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkQ29scywgZ3JpZENvbHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xODEyLDYgKzE4NzYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wQm90dG9tKSkgeworICAgICAgICAgICAgaWYgKGNyb3BMZWZ0IDwgMCB8fCBjcm9wTGVmdCA+IGNyb3BSaWdodCB8fCBjcm9wUmlnaHQgPj0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBjcm9wTGVmdDogJWQgYW5kL29yIGNyb3BSaWdodDogJWQiLCBjcm9wTGVmdCwgY3JvcFJpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNyb3BUb3AgPCAwIHx8IGNyb3BUb3AgPiBjcm9wQm90dG9tIHx8IGNyb3BCb3R0b20gPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2YgY3JvcFRvcDogJWQgYW5kL29yIGNyb3BCb3R0b206ICVkIiwgY3JvcFRvcCwgY3JvcEJvdHRvbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKICAgICAgICAgfQogCkBAIC0xODU1LDkgKzE5MjcsMTYgQEAKICAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgY2hhbm5lbC1jb3VudCBhbmQvb3Igc2FtcGxlLXJhdGUiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgLy8gY2hhbm5lbCBjb3VudCBjYW4gYmUgemVybyBpbiBzb21lIGNhc2VzIGxpa2UgbXBlZyBoCisgICAgICAgIGlmIChzYW1wbGVSYXRlIDw9IDAgfHwgbnVtQ2hhbm5lbHMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBjaGFubmVsLWNvdW50OiAlZCBhbmQvb3Igc2FtcGxlLXJhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIC8vIFRPRE86KGIvMjA0NDMwOTUyKSBhZGQgYXBwcm9wcmlhdGUgYm91bmQgY2hlY2sgZm9yIGJpdHNQZXJTYW1wbGUKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKICAgICAgICAgfQpAQCAtMTk2NywzMCArMjA0NiwxNDcgQEAKICAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUYpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWMUMsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikgewotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTIiLCAmY3NkMikpIHsKLSAgICAgICAgICAgICAgICAvL2R2Y2Mgc2hvdWxkIGJlIDI0Ci0gICAgICAgICAgICAgICAgaWYgKGNzZDItPnNpemUoKSA9PSAyNCkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlEVkNDLCBrVHlwZURWQ0MsIGNzZDItPmRhdGEoKSwgY3NkMi0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHZjYyA9IGNzZDItPmRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBwcm9maWxlID0gZHZjY1syXSA+PiAxOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSA+IDEgJiYgcHJvZmlsZSA8IDkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTAgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYy5kYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywgYXZjYy5kYXRhKCksIG91dHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICAgICAgICAgIHVpbnQ4X3QgYmxDb21wYXRpYmlsaXR5SWQgPSAtMTsKKyAgICAgICAgICAgIGludDMyX3QgbGV2ZWwgPSAwOworICAgICAgICAgICAgdWludDhfdCBwcm9maWxlVmFsID0gLTE7CisgICAgICAgICAgICB1aW50OF90IHByb2ZpbGVWYWwxID0gLTE7CisgICAgICAgICAgICB1aW50OF90IHByb2ZpbGVWYWwyID0gLTE7CisgICAgICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGR2Y2NTaXplID0gMjQ7CisKKyAgICAgICAgICAgIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gJnByb2ZpbGVzID0KKyAgICAgICAgICAgICAgICBnZXREb2xieVZpc2lvblByb2ZpbGVUYWJsZSgpOworICAgICAgICAgICAgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiAmbGV2ZWxzID0KKyAgICAgICAgICAgICAgICBnZXREb2xieVZpc2lvbkxldmVsc1RhYmxlKCk7CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kQnVmZmVyKCJjc2QtMiIsICZjc2QyKSkgeworICAgICAgICAgICAgICAgIC8vIE1QNCBleHRyYWN0b3JzIGFyZSBleHBlY3RlZCB0byBnZW5lcmF0ZSBjc2QgYnVmZmVyCisgICAgICAgICAgICAgICAgLy8gc29tZSBlbmNvZGVycyBtaWdodCBub3QgYmUgZ2VuZXJhdGluZyBpdCwgaW4gd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBjYXNlIHdlIHBvcHVsYXRlIHRoZSB0cmFjayBtZXRhZGF0YSBkdiAoY2N8dmN8d2MpCisgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgJ3Byb2ZpbGUnIGFuZCAnbGV2ZWwnIGluZm8uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGFjY29yZGluZyB0byBEb2xieSBWaXNpb24gSVNPQk1GRiBzcGVjCisKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEb2xieSBWaXNpb24gcHJvZmlsZSBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0LCAmcHJvZmlsZVZhbCkpIHsgLy8gZHZoZS4wOAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRvbGJ5IFZpc2lvbiBwcm9maWxlIGxvb2t1cCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBibENvbXBhdGliaWxpdHlJZCA9IDQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlLCAmcHJvZmlsZVZhbCkpIHsgLy8gZHZhdi4wOQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRvbGJ5IFZpc2lvbiBwcm9maWxlIGxvb2t1cCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBibENvbXBhdGliaWxpdHlJZCA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRvbGJ5IFZpc2lvbiBwcm9maWxlIGxvb2sgdXAgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9maWxlID0gKGludDMyX3QpIHByb2ZpbGVWYWw7CisKKyAgICAgICAgICAgICAgICB1aW50OF90IGxldmVsX3ZhbCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFsZXZlbHMubWFwKGxldmVsLCAmbGV2ZWxfdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIGxldmVsIGxvb2t1cCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGR2Y2MoZHZjY1NpemUpOworCisgICAgICAgICAgICAgICAgZHZjY1swXSA9IDE7IC8vIG1ham9yIHZlcnNpb24KKyAgICAgICAgICAgICAgICBkdmNjWzFdID0gMDsgLy8gbWlub3IgdmVyc2lvbgorICAgICAgICAgICAgICAgIGR2Y2NbMl0gPSAodWludDhfdCkoKHByb2ZpbGUgJiAweDdmKSA8PCAxKTsgLy8gZG9sYnkgdmlzaW9uIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBkdmNjWzJdID0gKHVpbnQ4X3QpKChkdmNjWzJdIHwgKHVpbnQ4X3QpKChsZXZlbF92YWwgPj4gNSkgJiAweDEpKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIGR2Y2NbM10gPSAodWludDhfdCkoKGxldmVsX3ZhbCAmIDB4MWYpIDw8IDMpOyAvLyBkb2xieSB2aXNpb24gbGV2ZWwKKyAgICAgICAgICAgICAgICBkdmNjWzNdID0gKHVpbnQ4X3QpKGR2Y2NbM10gfCAoMSA8PCAyKSk7IC8vIHJwdV9wcmVzZW50X2ZsYWcKKyAgICAgICAgICAgICAgICBkdmNjWzNdID0gKHVpbnQ4X3QpKGR2Y2NbM10gfCAoMSkpOyAvLyBibF9wcmVzZW50X2ZsYWcKKyAgICAgICAgICAgICAgICBkdmNjWzRdID0gKHVpbnQ4X3QpKGJsQ29tcGF0aWJpbGl0eUlkIDw8IDQpOyAvLyBibF9jb21wYXRpYmlsaXR5IGlkCisKKyAgICAgICAgICAgICAgICBwcm9maWxlcy5ybG9va3VwKERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTAsICZwcm9maWxlVmFsKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlcy5ybG9va3VwKERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGIsICZwcm9maWxlVmFsMSk7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbCkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlEVldDLCBrVHlwZURWV0MsIGR2Y2MuZGF0YSgpLCBkdmNjU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID4gKGludDMyX3QpIHByb2ZpbGVWYWwxKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWVkMsIGtUeXBlRFZWQywgZHZjYy5kYXRhKCksIGR2Y2NTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlEVkNDLCBrVHlwZURWQ0MsIGR2Y2MuZGF0YSgpLCBkdmNjU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJXZSBuZWVkIGNzZC0yISEuICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBjc2QtMiwganVzdCB1c2UgdGhhdCB0byBwb3B1bGF0ZSBkdmNjCisgICAgICAgICAgICAgICAgaWYgKGNzZDItPnNpemUoKSA9PSBkdmNjU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkdmNjID0gY3NkMi0+ZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gZHZjY1syXSA+PiAxOworCisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCwgJnByb2ZpbGVWYWwpOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5ybG9va3VwKERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGIsICZwcm9maWxlVmFsMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID4gKGludDMyX3QpIHByb2ZpbGVWYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWV0MsIGtUeXBlRFZXQywgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWVkMsIGtUeXBlRFZWQywgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWQ0MsIGtUeXBlRFZDQywgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29udmVydCBNZXNzYWdlVG9NZXRhZGF0YSBjc2QtMiBpcyBwcmVzZW50IGJ1dCBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9maWxlcy5ybG9va3VwKERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4sICZwcm9maWxlVmFsKTsKKyAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlLCAmcHJvZmlsZVZhbDEpOworICAgICAgICAgICAgcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2MTEwLCAmcHJvZmlsZVZhbDIpOworICAgICAgICAgICAgaWYgKChwcm9maWxlID4gKGludDMyX3QpIHByb2ZpbGVWYWwpICYmIChwcm9maWxlIDwgKGludDMyX3QpIHByb2ZpbGVWYWwxKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVIVkNDKGNzZDAsIGh2Y2MuZGF0YSgpLCBodmNjLnNpemUoKSwgNCk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gKGludDMyX3QpIHByb2ZpbGVWYWwyKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QxOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGF2Y2MoY3NkMHNpemUgKyBjc2QxLT5zaXplKCkgKyAxMDI0KTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywgYXZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRvbGJ5IHZpc2lvbiBhdmMsIGNzZDAgYWxzbyBob2xkcyBjc2QxCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNzZDByZWFsc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBmaW5kTmV4dE5hbFN0YXJ0Q29kZShjc2QwLT5kYXRhKCkgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzZDAtPnNpemUoKSAtIGkpIC0gY3NkMC0+ZGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NkMHJlYWxzaXplID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShpIDwgY3NkMC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyMCAtPiBjc2QwCisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjAgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihjc2QwcmVhbHNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyMC5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlcjAtPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIwLT5kYXRhKCksIGNzZDAtPmRhdGEoKSwgY3NkMHJlYWxzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyMSAtPiBjc2QxCisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjEgPSBuZXcgKHN0ZDo6bm90aHJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyKGNzZDAtPnNpemUoKSAtIGNzZDByZWFsc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIxLmdldCgpID09IE5VTEwgfHwgYnVmZmVyMS0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlcjEtPmRhdGEoKSwgY3NkMC0+ZGF0YSgpK2NzZDByZWFsc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NkMC0+c2l6ZSgpIC0gY3NkMHJlYWxzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDAtPnNpemUoKSArIDEwMjQpOworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVBVkNDKGJ1ZmZlcjAsIGJ1ZmZlcjEsIGF2Y2MuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKQEAgLTIxMzEsMjkgKzIzMjcsMjkgQEAKIH0KIAogc3RydWN0IGFhY19mb3JtYXRfY29udl90IHsKLSAgICBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUgZUFhY1Byb2ZpbGVUeXBlOworICAgIGludDMyX3QgZUFhY1Byb2ZpbGVUeXBlOwogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgcHJvZmlsZUxvb2t1cFtdID0gewotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdE1haW4sICAgICAgICBBVURJT19GT1JNQVRfQUFDX01BSU59LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExDLCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xDfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RTU1IsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19TU1J9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExUUCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xUUH0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0SEUsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjF9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNjYWxhYmxlLCAgICBBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RFUkxDLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FUkxDfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RMRCwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MRH0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMsICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjJ9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVMRCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VMRH0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0WEhFLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3ROdWxsLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ30sCisgICAgeyBBQUNPYmplY3RNYWluLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ19NQUlOfSwKKyAgICB7IEFBQ09iamVjdExDLCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xDfSwKKyAgICB7IEFBQ09iamVjdFNTUiwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUn0sCisgICAgeyBBQUNPYmplY3RMVFAsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MVFB9LAorICAgIHsgQUFDT2JqZWN0SEUsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjF9LAorICAgIHsgQUFDT2JqZWN0U2NhbGFibGUsICAgIEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEV9LAorICAgIHsgQUFDT2JqZWN0RVJMQywgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRVJMQ30sCisgICAgeyBBQUNPYmplY3RMRCwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MRH0sCisgICAgeyBBQUNPYmplY3RIRV9QUywgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMn0sCisgICAgeyBBQUNPYmplY3RFTEQsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FTER9LAorICAgIHsgQUFDT2JqZWN0WEhFLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFfSwKKyAgICB7IEFBQ09iamVjdE51bGwsICAgICAgICBBVURJT19GT1JNQVRfQUFDfSwKIH07CiAKIHZvaWQgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsIHVpbnQ2NF90IGVBYWNQcm9maWxlKQogewotY29uc3Qgc3RydWN0IGFhY19mb3JtYXRfY29udl90KiBwID0gJnByb2ZpbGVMb29rdXBbMF07Ci0gICAgd2hpbGUgKHAtPmVBYWNQcm9maWxlVHlwZSAhPSBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCkgeworICAgIGNvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCogcCA9ICZwcm9maWxlTG9va3VwWzBdOworICAgIHdoaWxlIChwLT5lQWFjUHJvZmlsZVR5cGUgIT0gQUFDT2JqZWN0TnVsbCkgewogICAgICAgICBpZiAoZUFhY1Byb2ZpbGUgPT0gcC0+ZUFhY1Byb2ZpbGVUeXBlKSB7CiAgICAgICAgICAgICBmb3JtYXQgPSBwLT5mb3JtYXQ7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0yMTkzLDcgKzIzODksNyBAQAogICAgIC8vIE9mZmxvYWRpbmcgZGVwZW5kcyBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLgogICAgIGludDMyX3QgYWFjYW90ID0gLTE7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgewotICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LCBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKaW5kZXggNGU1YjVlMi4uZGU4ZTQyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTIyLDggKzIyLDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0jaW5jbHVkZSA8dWkvRGlzcGxheVN0YXRJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9ndWkvSVN1cmZhY2VDb21wb3Nlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZ3VpL0Rpc3BsYXlTdGF0SW5mby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgpAQCAtMzksMjEgKzM5LDIyIEBACiAgICAgbVZzeW5jVGltZSA9IDA7CiAgICAgbVZzeW5jUGVyaW9kID0gMDsKIAorICAgIC8vIFRPRE8oYi8yMjAwMjEyNTUpOiB3cmFwIHRoaXMgaW50byBTdXJmYWNlQ29tcG9zZXJDbGllbnQKICAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKLSAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKKyAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXJBSURMIik7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgbUNvbXBvc2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VDb21wb3Nlcj4oc20tPmNoZWNrU2VydmljZShuYW1lKSk7CisgICAgICAgIG1Db21wb3NlciA9IGludGVyZmFjZV9jYXN0PGd1aTo6SVN1cmZhY2VDb21wb3Nlcj4oc20tPmNoZWNrU2VydmljZShuYW1lKSk7CiAgICAgfQogICAgIGlmIChtQ29tcG9zZXIgIT0gTlVMTCkgewotICAgICAgICBEaXNwbGF5U3RhdEluZm8gc3RhdHM7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IG1Db21wb3Nlci0+Z2V0RGlzcGxheVN0YXRzKE5VTEwgLyogZGlzcGxheSAqLywgJnN0YXRzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBndWk6OkRpc3BsYXlTdGF0SW5mbyBzdGF0czsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gbUNvbXBvc2VyLT5nZXREaXNwbGF5U3RhdHMobnVsbHB0ci8qIGRpc3BsYXkgKi8sICZzdGF0cyk7CisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgICAgICBBTE9HVigidnN5bmMgdGltZTolbGxkIHBlcmlvZDolbGxkIiwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGF0cy52c3luY1RpbWUsIChsb25nIGxvbmcpc3RhdHMudnN5bmNQZXJpb2QpOwogICAgICAgICAgICAgbVZzeW5jVGltZSA9IHN0YXRzLnZzeW5jVGltZTsKICAgICAgICAgICAgIG1Wc3luY1BlcmlvZCA9IHN0YXRzLnZzeW5jUGVyaW9kOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImdldERpc3BsYXlTdGF0cyByZXR1cm5lZCAlZCIsIHJlcyk7CisgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheVN0YXRzIHJldHVybmVkICVkIiwgc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCBzdXJmYWNlIG1Db21wb3NlciBzZXJ2aWNlIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggMDg2OTFlNy4uYWZmYzgzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icApAQCAtMjEsNiArMjEsMTAgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAogICAgIHNyY3M6IFsiY21uTWVtb3J5LmMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggZmI2YzRlMi4uYmIxY2IwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC0zNTQsNyArMzU0LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1wZWc0dHlwZS0+ZVByb2ZpbGUgIT0gT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUgfHwKLSAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPmVMZXZlbCAhPSBPTVhfVklERU9fTVBFRzRMZXZlbDIgfHwKKyAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPmVMZXZlbCA+IE9NWF9WSURFT19NUEVHNExldmVsMiB8fAogICAgICAgICAgICAgICAgIChtcGVnNHR5cGUtPm5BbGxvd2VkUGljdHVyZVR5cGVzICYgT01YX1ZJREVPX1BpY3R1cmVUeXBlQikgfHwKICAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPm5CRnJhbWVzICE9IDAgfHwKICAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPm5JRENWTENUaHJlc2hvbGQgIT0gMCB8fApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icAppbmRleCAwNmNlYmQzLi43ZmY5YjEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icApAQCAtMjUsMTAgKzI1LDYgQEAKICAgICAgICAgIlNvZnR3YXJlUmVuZGVyZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKQEAgLTM3LDYgKzMzLDcgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJ5dXZfc3RhdGljIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCBjN2RjNDE1Li40YjRmNjVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiAjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfZnJvbS5oIgpAQCAtNTEsMzUgKzUyLDE4MyBAQAogc3RhdGljIGJvb2wgaXNSR0IoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQpIHsKICAgICByZXR1cm4gY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CiAgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAotICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4OAorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDsKIH0KIAotYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNCdDcwOSgpIHsKLSAgICByZXR1cm4gKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNzA5KTsKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQyMDIwKCkgY29uc3QgeworICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwKTsKIH0KIAorYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNINDIwKCkgY29uc3QgeworICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDkpCisgICAgICAgICAgICAmJiAobVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlTGltaXRlZCk7Cit9CiAKLWJvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzSnBlZygpIHsKKy8vIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIGFyZSB0aGUgc2FtZSBmb3IgYm90aCA2MDEuNjI1IGFuZCA2MDEuNTI1IHN0YW5kYXJkcworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNJNDIwKCkgY29uc3QgeworICAgIHJldHVybiAoKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSkKKyAgICAgICAgICAgIHx8IChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUpKQorICAgICAgICAgICAgJiYgKG1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUxpbWl0ZWQpOworfQorCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0o0MjAoKSBjb25zdCB7CiAgICAgcmV0dXJuICgobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1KQogICAgICAgICAgICAgfHwgKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSkpCiAgICAgICAgICAgICAmJiAobVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlRnVsbCk7CiB9CiAKKy8qKgorICogVGhpcyBjbGFzcyBhcHByb3hpbWF0ZXMgdGhlIHN0YW5kYXJkIFlVViB0byBSR0IgY29udmVyc2lvbnMgYnkgZmFjdG9yaW5nIHRoZSBtYXRyaXgKKyAqIGNvZWZmaWNpZW50cyB0byAxLzI1NnRoLXMgKGFzIGRpdmlkaW5nIGJ5IDI1NiBpcyBlYXN5IHRvIGRvIHdpdGggcmlnaHQgc2hpZnQpLiBUaGUgY2hvc2VuIHZhbHVlCisgKiBvZiAyNTYgaXMgc29tZXdoYXQgYXJiaXRyYXJ5IGFuZCB3YXMgbm90IGRlcGVuZGVudCBvbiB0aGUgYml0LWRlcHRoLCBidXQgaXQgZG9lcyBsaW1pdCB0aGUKKyAqIHByZWNpc2lvbiBvZiB0aGUgbWF0cml4IGNvZWZmaWNpZW50cyAoS1IgJiBLQikuCisgKgorICogVGhlIG1heGltdW0gY29sb3IgZXJyb3IgYWZ0ZXIgY2xpcHBpbmcgZnJvbSB1c2luZyAyNTYgaXMgYSBkaXN0YW5jZSBvZjoKKyAqICAgMC40ICg4LWJpdCkgLyAxLjQgKDEwLWJpdCkgZm9yIGdyZWVucyBpbiBCVC42MDEKKyAqICAgMC41ICg4LWJpdCkgLyAxLjkgKDEwLWJpdCkgZm9yIGN5YW5zIGluIEJULjcwOSwgYW5kCisgKiAgIDAuMyAoOC1iaXQpIC8gMS4zICgxMC1iaXQpIGZvciB2aW9sZXRzIGluIEJULjIwMjAgKGl0IGlzIDAuNCBmb3IgMTAtYml0IEJULjIwMjAgbGltaXRlZCkKKyAqCisgKiBOb3RlIGZvciByZWZlcmVuY2U6IGxpYnl1diBpcyB1c2luZyBhIGRpdmlzb3Igb2YgNjQgaW5zdGVhZCBvZiAyNTYgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGluCisgKiAxNi1iaXQgbWF0aC4gVGhlIG1heGltdW0gY29sb3IgZXJyb3IgZm9yIGxpYnl1diBpcyAzLjUgLyAxNC4KKyAqCisgKiBUaGUgY2xhbXBpbmcgaXMgZG9uZSB1c2luZyBhIGxvb2t1cCB2ZWN0b3Igd2hlcmUgbmVnYXRpdmUgaW5kaWNlcyBhcmUgbWFwcGVkIHRvIDAKKyAqIGFuZCBpbmRpY2VzID4gMjU1IGFyZSBtYXBwZWQgdG8gMjU1LiAoRm9yIDEwLWJpdCB0aGVzZSBhcmUgY2xhbXBlZCB0byAwIHRvIDEwMjMpCisgKgorICogVGhlIG1hdHJpY2VzIGFyZSBhc3N1bWVkIHRvIGJlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0IChub3RlIHRoZSBzaWduIG9uIHRoZSAybmQgcm93KToKKyAqCisgKiBbIFIgXSAgICAgWyBfeSAgICAgMCAgICBfcl92IF0gICBbIFkgLSAgQzE2IF0KKyAqIFsgRyBdICA9ICBbIF95ICAtX2dfdSAgLV9nX3YgXSAqIFsgVSAtIEMxMjggXQorICogWyBCIF0gICAgIFsgX3kgICBfYl91ICAgICAwICBdICAgWyBWIC0gQzEyOCBdCisgKgorICogQzE2IGlzIDEgPDwgKGJpdGRlcHRoIC0gNCkgZm9yIGxpbWl0ZWQgcmFuZ2UsIGFuZCAwIGZvciBmdWxsIHJhbmdlCisgKiBDMTI4IGlzIDEgPDwgKGJpdGRlcHRoIC0gMSkKKyAqIEMyNTUgaXMgKDEgPDwgYml0ZGVwdGgpIC0gMQorICoKKyAqIFRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgZnJvbSB0aGVzZSBlcXVhdGlvbnMgZGV0ZXJtaW5lIHRoZSBjbGlwIHJhbmdlIG5lZWRlZCBmb3IgY2xhbXBpbmc6CisgKgorICogbWluID0gLSAoX3kgKiBDMTYgKyBtYXgoKF9nX3UgKyBfZ192KSAqIChDMjU1LUMxMjgpLCBtYXgoX3JfdiwgX2JfdSkgKiBDMTI4KSkgLyAyNTYKKyAqIG1heCA9IChfeSAqIChDMjU1IC0gQzE2KSArIG1heCgoX2dfdSArIF9nX3YpICogQzEyOCwgbWF4KF9yX3YsIF9iX3UpICogKEMyNTUtQzEyOCkpICsgMTI4KSAvIDI1NgorICovCisKK3N0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzIHsKKyAgICBpbnQzMl90IF95OworICAgIGludDMyX3QgX3JfdjsKKyAgICBpbnQzMl90IF9nX3U7CisgICAgaW50MzJfdCBfZ192OworICAgIGludDMyX3QgX2JfdTsKK307CisKKy8qCisKK0NvbG9yIGNvbnZlcnNpb24gcnVsZXMgYXJlIGRpY3RhdGVkIGJ5IElTTyAoZS5nLiBJU086SUVDIDIzMDA4OjIpCisKK0xpbWl0ZWQgcmFuZ2UgbWVhbnMgWSBpcyBpbiBbMTYsIDIzNV0sIFUgYW5kIFYgYXJlIGluIFsxNiwgMjI0XSBjb3JyZXNwb25kaW5nIHRvIFstMC41IHRvIDAuNV0uCisKK0Z1bGwgcmFuZ2UgbWVhbnMgWSBpcyBpbiBbMCwgMjU1XSwgVSBhbmQgViBhcmUgaW4gWzAuNSwgMjU1LjVdIGNvcnJlc3BvbmRpbmcgdG8gWy0wLjUgdG8gLjVdLgorCitSR0IgaXMgYWx3YXlzIGluIGZ1bGwgcmFuZ2UgKFswLCAyNTVdKQorCitUaGUgY29sb3IgcHJpbWFyaWVzIGRldGVybWluZSB0aGUgS1IgYW5kIEtCIHZhbHVlczoKKworCitGb3IgZnVsbCByYW5nZSAoYXNzdW1pbmcgOC1iaXRzKSBJU08gZGVmaW5lczoKKworKCAgIFkgICApICAgKCAgS1IgICAgICAxLUtSLUtCICAgICAgIEtCICApCisoICAgICAgICkgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAoUikKKyggICAgICAgKSAgICgtS1IvMiAgIC0oMS1LUi1LQikvMiAgICAgICAgKSAgICggKQorKFUgLSAxMjgpID0gKC0tLS0tICAgLS0tLS0tLS0tLS0tICAgIDAuNSApICogKEcpCisoICAgICAgICkgICAoKDEtS0IpICAgICAoMS1LQikgICAgICAgICAgICkgICAoICkKKyggICAgICAgKSAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgIChCKQorKCAgICAgICApICAgKCAgICAgICAgLSgxLUtSLUtCKS8yICAtS0IvMiApCisoViAtIDEyOCkgICAoIDAuNSAgICAtLS0tLS0tLS0tLS0gIC0tLS0tICkKKyAgICAgICAgICAgICggICAgICAgICAgICgxLUtSKSAgICAgKDEtS1IpKQorCisodGhlIG1hdGggaXMgcm91bmRlZCwgMTI4IGlzICgxIDw8IChiaXRkZXB0aCAtIDEpKSApCisKK0Zyb20gdGhpcworCisoUikgICAgICAoIDEgICAgICAgMCAgICAgICAgMiooMS1LUikgICApICAgKCAgIFkgICApCisoICkgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgKCAgICAgICApCisoICkgICAgICAoICAgIDIqS0IqKEtCLTEpICAyKktSKihLUi0xKSApICAgKCAgICAgICApCisoRykgID0gICAoIDEgIC0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLSApICogKFUgLSAxMjgpCisoICkgICAgICAoICAgICAgMS1LUi1LQiAgICAgIDEtS1ItS0IgICApICAgKCAgICAgICApCisoICkgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgKCAgICAgICApCisoQikgICAgICAoIDEgICAyKigxLUtCKSAgICAgICAgIDAgICAgICApICAgKFYgLSAxMjgpCisKK0ZvciBsaW1pdGVkIHJhbmdlLCB0aGlzIGJlY29tZXMKKworKFIpICAgICAgKCAxICAgICAgIDAgICAgICAgIDIqKDEtS1IpICAgKSAgICgyNTUvMjE5ICAwICAwKSAgIChZIC0gIDE2KQorKCApICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICggICAgICAgICAgICAgKSAgICggICAgICAgKQorKCApICAgICAgKCAgICAyKktCKihLQi0xKSAgMipLUiooS1ItMSkgKSAgICggICAgICAgICAgICAgKSAgICggICAgICAgKQorKEcpICA9ICAgKCAxICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0gKSAqICgwICAyNTUvMjI0ICAwKSAqIChVIC0gMTI4KQorKCApICAgICAgKCAgICAgIDEtS1ItS0IgICAgICAxLUtSLUtCICAgKSAgICggICAgICAgICAgICAgKSAgICggICAgICAgKQorKCApICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICggICAgICAgICAgICAgKSAgICggICAgICAgKQorKEIpICAgICAgKCAxICAgMiooMS1LQikgICAgICAgICAwICAgICAgKSAgICgwICAwICAyNTUvMjI0KSAgIChWIC0gMTI4KQorCisoIEZvciBub24tOC1iaXQsIDE2IGlzICgxIDw8IChiaXRkZXB0aCAtIDQpKSwgMTI4IGlzICgxIDw8IChiaXRkZXB0aCAtIDEpKSwKKyAgMjU1IGlzICgoMSA8PCBiaXRkZXB0aCkgLSAxKSwgMjE5IGlzICgyMTkgPDwgKGJpdGRlcHRoIC0gOCkpIGFuZAorICAyMjQgaXMgKDIyNCA8PCAoYml0ZGVwdGggLSA4KSksIHNvIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIHNsaWdodGx5IGNoYW5nZS4gKQorCisqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEJULjYwMTogIEtfUiA9IDAuMjk5OyAgS19CID0gMC4xMTQKKyAqCisgKiBjbGlwIHJhbmdlIDgtYml0OiBbLTI3NywgNTM1XSwgMTAtYml0OiBbLTExMTEsIDIxNTVdCisgKi8KK2NvbnN0IHN0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzIEJUNjAxX0ZVTEwgICAgICA9IHsgMjU2LCAzNTksICA4OCwgMTgzLCA0NTQgfTsKK2NvbnN0IHN0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzIEJUNjAxX0xJTUlURUQgICA9IHsgMjk4LCA0MDksIDEwMCwgMjA4LCA1MTYgfTsKK2NvbnN0IHN0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzIEJUNjAxX0xURF8xMEJJVCA9IHsgMjk5LCA0MTAsIDEwMSwgMjA5LCA1MTggfTsKKworLyoqCisgKiBCVC43MDk6ICBLX1IgPSAwLjIxMjY7IEtfQiA9IDAuMDcyMgorICoKKyAqIGNsaXAgcmFuZ2UgOC1iaXQ6IFstMjg5LCA1NDddLCAxMC1iaXQ6IFstMTE1OSwgMjIwMl0KKyAqLworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQ3MDlfRlVMTCAgICAgID0geyAyNTYsIDQwMywgIDQ4LCAxMjAsIDQ3NSB9OworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQ3MDlfTElNSVRFRCAgID0geyAyOTgsIDQ1OSwgIDU1LCAxMzYsIDU0MSB9OworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQ3MDlfTFREXzEwQklUID0geyAyOTAsIDQ2MCwgIDU1LCAxMzcsIDU0MiB9OworCisvKioKKyAqIEJULjIwMjA6ICBLX1IgPSAwLjI2Mjc7IEtfQiA9IDAuMDU5MworICoKKyAqIGNsaXAgcmFuZ2UgOC1iaXQ6IFstMjk0LCA1NTJdLCAxMC1iaXQ6IFstMTE3NSwgMjIxOF0KKyAqCisgKiBUaGlzIGlzIHRoZSBsYXJnZXN0IGNsaXAgcmFuZ2UuCisgKi8KK2NvbnN0IHN0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzIEJUMjAyMF9GVUxMICAgICAgPSB7IDI1NiwgMzc3LCAgNDIsIDE0NiwgNDgyIH07Citjb25zdCBzdHJ1Y3QgQ29sb3JDb252ZXJ0ZXI6OkNvZWZmcyBCVDIwMjBfTElNSVRFRCAgID0geyAyOTgsIDQzMCwgIDQ4LCAxNjcsIDU0OCB9OworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQyMDIwX0xURF8xMEJJVCA9IHsgMjk5LCA0MzEsICA0OCwgMTY3LCA1NTAgfTsKKworY29uc3RleHByIGludCBDTElQX1JBTkdFX01JTl84QklUID0gLTI5NDsKK2NvbnN0ZXhwciBpbnQgQ0xJUF9SQU5HRV9NQVhfOEJJVCA9IDU1MjsKKworY29uc3RleHByIGludCBDTElQX1JBTkdFX01JTl8xMEJJVCA9IC0xMTc1OworY29uc3RleHByIGludCBDTElQX1JBTkdFX01BWF8xMEJJVCA9IDIyMTg7CisKK30KKwogQ29sb3JDb252ZXJ0ZXI6OkNvbG9yQ29udmVydGVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmcm9tLCBPTVhfQ09MT1JfRk9STUFUVFlQRSB0bykKICAgICA6IG1TcmNGb3JtYXQoZnJvbSksCiAgICAgICBtRHN0Rm9ybWF0KHRvKSwKICAgICAgIG1TcmNDb2xvclNwYWNlKHswLCAwLCAwfSksCi0gICAgICBtQ2xpcChOVUxMKSB7CisgICAgICBtQ2xpcChOVUxMKSwKKyAgICAgIG1DbGlwMTBCaXQoTlVMTCkgewogfQogCiBDb2xvckNvbnZlcnRlcjo6fkNvbG9yQ29udmVydGVyKCkgewogICAgIGRlbGV0ZVtdIG1DbGlwOwogICAgIG1DbGlwID0gTlVMTDsKKyAgICBkZWxldGVbXSBtQ2xpcDEwQml0OworICAgIG1DbGlwMTBCaXQgPSBOVUxMOwogfQogCiBib29sIENvbG9yQ29udmVydGVyOjppc1ZhbGlkKCkgY29uc3QgewotICAgIHN3aXRjaCAobVNyY0Zvcm1hdCkgeworICAgIHN3aXRjaCAoKGludDMyX3QpbVNyY0Zvcm1hdCkgewogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKICAgICAgICAgICAgIGlmIChtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRZNDEwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC05OCwxMCArMjQ3LDEzIEBACiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAjaWZkZWYgVVNFX0xJQllVVgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1Ci0gICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKICNlbHNlCiAgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CiAjZW5kaWYKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVZQMDEwOgorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQzLDkgKzI5NSwxMCBAQAogICAgICAgbUNyb3BUb3AoY3JvcFRvcCksCiAgICAgICBtQ3JvcFJpZ2h0KGNyb3BSaWdodCksCiAgICAgICBtQ3JvcEJvdHRvbShjcm9wQm90dG9tKSB7Ci0gICAgc3dpdGNoKG1Db2xvckZvcm1hdCkgeworICAgIHN3aXRjaCgoaW50MzJfdCltQ29sb3JGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBtQnBwID0gMjsKICAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7CkBAIC0xNTMsNiArMzA2LDcgQEAKIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTA6CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDQ0WTQxMDoKICAgICAgICAgbUJwcCA9IDQ7CiAgICAgICAgIG1TdHJpZGUgPSA0ICogbVdpZHRoOwpAQCAtMjEzLDcgKzM2Nyw3IEBACiAKICAgICBzdGF0dXNfdCBlcnI7CiAKLSAgICBzd2l0Y2ggKG1TcmNGb3JtYXQpIHsKKyAgICBzd2l0Y2ggKChpbnQzMl90KW1TcmNGb3JtYXQpIHsKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogI2lmZGVmIFVTRV9MSUJZVVYKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoc3JjLCBkc3QpOwpAQCAtMjM1LDYgKzM4OSwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgIHsKKyNpZiBQRVJGX1BST0ZJTElORworICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisjZW5kaWYKKyAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVZQMDEwKHNyYywgZHN0KTsKKyNpZiBQRVJGX1BST0ZJTElORworICAgICAgICAgICAgaW50NjRfdCBlbmRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAgICAgQUxPR0QoImNvbnZlcnRZVVZQMDEwIHRvb2sgJWxsZCB1cyIsIChsb25nIGxvbmcpIChlbmRUaW1lVXMgLSBzdGFydFRpbWVVcykpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRDYllDclkoc3JjLCBkc3QpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNjUsMTAgKzQzMiw1MyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK2NvbnN0IHN0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzICpDb2xvckNvbnZlcnRlcjo6Z2V0TWF0cml4KCkgY29uc3QgeworICAgIGNvbnN0IGJvb2wgaXNGdWxsUmFuZ2UgPSBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsOworICAgIGNvbnN0IGJvb2wgaXMxMEJpdCA9IChtU3JjRm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVlAwMTAKKyAgICAgICAgICAgIHx8IG1TcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KTsKKworICAgIHN3aXRjaCAobVNyY0NvbG9yU3BhY2UubVN0YW5kYXJkKSB7CisgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNToKKyAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1OgorICAgICAgICByZXR1cm4gKGlzRnVsbFJhbmdlID8gJkJUNjAxX0ZVTEwgOgorICAgICAgICAgICAgICAgIGlzMTBCaXQgPyAmQlQ2MDFfTFREXzEwQklUIDogJkJUNjAxX0xJTUlURUQpOworCisgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNzA5OgorICAgICAgICByZXR1cm4gKGlzRnVsbFJhbmdlID8gJkJUNzA5X0ZVTEwgOgorICAgICAgICAgICAgICAgIGlzMTBCaXQgPyAmQlQ3MDlfTFREXzEwQklUIDogJkJUNzA5X0xJTUlURUQpOworCisgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUMjAyMDoKKyAgICAgICAgcmV0dXJuIChpc0Z1bGxSYW5nZSA/ICZCVDIwMjBfRlVMTCA6CisgICAgICAgICAgICAgICAgaXMxMEJpdCA/ICZCVDIwMjBfTFREXzEwQklUIDogJkJUMjAyMF9MSU1JVEVEKTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIGZvciBub3cgdXNlIHRoZSBkZWZhdWx0IG1hdHJpY2VzIGZvciB1bmhhbmRsZWQgY29sb3Igc3BhY2VzCisgICAgICAgIC8vIFRPRE86IGZhaWw/CisgICAgICAgIC8vIHJldHVybiBudWxscHRyOworICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisKKyAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQ6CisgICAgICAgIHJldHVybiBpczEwQml0ID8gJkJUMjAyMF9MVERfMTBCSVQgOiAmQlQ2MDFfTElNSVRFRDsKKworICAgIH0KK30KKwogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRDYllDclkoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIC8vIFhYWCBVbnRlc3RlZAogCisgICAgY29uc3Qgc3RydWN0IENvZWZmcyAqbWF0cml4ID0gZ2V0TWF0cml4KCk7CisgICAgaWYgKCFtYXRyaXgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHNpZ25lZCBfYl91ID0gbWF0cml4LT5fYl91OworICAgIHNpZ25lZCBfbmVnX2dfdSA9IC1tYXRyaXgtPl9nX3U7CisgICAgc2lnbmVkIF9uZWdfZ192ID0gLW1hdHJpeC0+X2dfdjsKKyAgICBzaWduZWQgX3JfdiA9IG1hdHJpeC0+X3JfdjsKKyAgICBzaWduZWQgX3kgPSBtYXRyaXgtPl95OworICAgIHNpZ25lZCBfYzE2ID0gbVNyY0NvbG9yU3BhY2UubVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlTGltaXRlZCA/IDE2IDogMDsKKwogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCiAgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKQEAgLTI3OSwyMiArNDg5LDIyIEBACiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7Ci0gICAgICAgICAgICBzaWduZWQgeTEgPSAoc2lnbmVkKXNyY19wdHJbMiAqIHggKyAxXSAtIDE2OwotICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfcHRyWzIgKiB4ICsgM10gLSAxNjsKKyAgICAgICAgICAgIHNpZ25lZCB5MSA9IChzaWduZWQpc3JjX3B0clsyICogeCArIDFdIC0gX2MxNjsKKyAgICAgICAgICAgIHNpZ25lZCB5MiA9IChzaWduZWQpc3JjX3B0clsyICogeCArIDNdIC0gX2MxNjsKICAgICAgICAgICAgIHNpZ25lZCB1ID0gKHNpZ25lZClzcmNfcHRyWzIgKiB4XSAtIDEyODsKICAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfcHRyWzIgKiB4ICsgMl0gLSAxMjg7CiAKLSAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwotICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwotICAgICAgICAgICAgc2lnbmVkIHZfZyA9IC12ICogMjA4OwotICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiA0MDk7CisgICAgICAgICAgICBzaWduZWQgdV9iID0gdSAqIF9iX3U7CisgICAgICAgICAgICBzaWduZWQgdV9nID0gdSAqIF9uZWdfZ191OworICAgICAgICAgICAgc2lnbmVkIHZfZyA9IHYgKiBfbmVnX2dfdjsKKyAgICAgICAgICAgIHNpZ25lZCB2X3IgPSB2ICogX3JfdjsKIAotICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCB0bXAxID0geTEgKiBfeSArIDEyODsKICAgICAgICAgICAgIHNpZ25lZCBiMSA9ICh0bXAxICsgdV9iKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCBnMSA9ICh0bXAxICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMSA9ICh0bXAxICsgdl9yKSAvIDI1NjsKIAotICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiBfeSArIDEyODsKICAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKQEAgLTMyMywxNSArNTMzLDMyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvKgorICAgIGxpYnl1diBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbG9yIHNwYWNlczoKKworICAgIEk0MjA6IEJULjYwMSBsaW1pdGVkIHJhbmdlCisgICAgSjQyMDogQlQuNjAxIGZ1bGwgcmFuZ2UgKGpwZWcpCisgICAgSDQyMDogQlQuNzA5IGxpbWl0ZWQgcmFuZ2UKKworKi8KKwogI2RlZmluZSBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIHJnYikgaW50ICgqZnVuYykoICAgICBcCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqLCBpbnQsIGNvbnN0IHVpbnQ4X3QqLCBpbnQsICAgICAgICAgICBcCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqLCBpbnQsIHVpbnQ4X3QqLCBpbnQsIGludCwgaW50KSAgICAgICBcCi0gICAgICAgID0gbVNyY0NvbG9yU3BhY2UuaXNCdDcwOSgpID8gbGlieXV2OjpINDIwVG8jI3JnYiBcCi0gICAgICAgIDogbVNyY0NvbG9yU3BhY2UuaXNKcGVnKCkgPyBsaWJ5dXY6Oko0MjBUbyMjcmdiICBcCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqLCBpbnQsIGNvbnN0IHVpbnQ4X3QqLCBpbnQsICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCosIGludCwgdWludDhfdCosIGludCwgaW50LCBpbnQpICAgXAorICAgICAgICA9IG1TcmNDb2xvclNwYWNlLmlzSDQyMCgpID8gbGlieXV2OjpINDIwVG8jI3JnYiBcCisgICAgICAgIDogbVNyY0NvbG9yU3BhY2UuaXNKNDIwKCkgPyBsaWJ5dXY6Oko0MjBUbyMjcmdiIFwKICAgICAgICAgOiBsaWJ5dXY6Okk0MjBUbyMjcmdiCiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyVXNlTGliWVVWKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICAvLyBGYWxsIGJhY2sgdG8gb3VyIGNvbnZlcnNpb24gaWYgbGlieXV2IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbG9yIHNwYWNlLgorICAgIC8vIEk0MjAgKEJULjYwMSBsaW1pdGVkKSBpcyBkZWZhdWx0LCBzbyBkb24ndCBmYWxsIGJhY2sgaWYgd2UgZW5kIHVwIHVzaW5nIGl0IGFueXdheS4KKyAgICBpZiAoIW1TcmNDb2xvclNwYWNlLmlzSDQyMCgpICYmICFtU3JjQ29sb3JTcGFjZS5pc0o0MjAoKQorICAgICAgICAgICAgLy8gJiYgIW1TcmNDb2xvclNwYWNlLmlzSTQyMCgpIC8qIHNhbWUgYXMgbGluZSBiZWxvdyAqLworICAgICAgICAgICAgJiYgZ2V0TWF0cml4KCkgIT0gJkJUNjAxX0xJTUlURUQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBQbGFuYXIoc3JjLCBkc3QpOworICAgIH0KKwogICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cwogICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOwogCkBAIC0zNzksNiArNjA2LDEzIEBACiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgLy8gRmFsbCBiYWNrIHRvIG91ciBjb252ZXJzaW9uIGlmIGxpYnl1diBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjb2xvciBzcGFjZS4KKyAgICAvLyBsaWJ5dXYgb25seSBzdXBwb3J0cyBCVC42MDEgbGltaXRlZCByYW5nZSBOVjEyLiBEb24ndCBmYWxsIGJhY2sgaWYgd2UgZW5kIHVwIHVzaW5nIGl0IGFueXdheS4KKyAgICBpZiAoLy8gIW1TcmNDb2xvclNwYWNlLmlzSTQyMCgpICYmIC8qIHNhbWUgYXMgYmVsb3cgKi8KKyAgICAgICAgZ2V0TWF0cml4KCkgIT0gJkJUNjAxX0xJTUlURUQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKHNyYywgZHN0KTsKKyAgICB9CisKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKICAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKIApAQCAtNDE5LDE2ICs2NTMsMTYgQEAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CiAgICAgICAgIHJldHVybiBbXSh2b2lkICpzcmNfeSwgdm9pZCAqc3JjX3UsIHZvaWQgKnNyY192LCBzaXplX3QgeCwKICAgICAgICAgICAgICAgICAgIHNpZ25lZCAqeTEsIHNpZ25lZCAqeTIsIHNpZ25lZCAqdSwgc2lnbmVkICp2KSB7Ci0gICAgICAgICAgICAqeTEgPSAoKHVpbnQ4X3QqKXNyY195KVt4XSAtIDE2OwotICAgICAgICAgICAgKnkyID0gKCh1aW50OF90KilzcmNfeSlbeCArIDFdIC0gMTY7CisgICAgICAgICAgICAqeTEgPSAoKHVpbnQ4X3QqKXNyY195KVt4XTsKKyAgICAgICAgICAgICp5MiA9ICgodWludDhfdCopc3JjX3kpW3ggKyAxXTsKICAgICAgICAgICAgICp1ID0gKCh1aW50OF90KilzcmNfdSlbeCAvIDJdIC0gMTI4OwogICAgICAgICAgICAgKnYgPSAoKHVpbnQ4X3QqKXNyY192KVt4IC8gMl0gLSAxMjg7CiAgICAgICAgIH07CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6CiAgICAgICAgIHJldHVybiBbXSh2b2lkICpzcmNfeSwgdm9pZCAqc3JjX3UsIHZvaWQgKnNyY192LCBzaXplX3QgeCwKICAgICAgICAgICAgICAgICBzaWduZWQgKnkxLCBzaWduZWQgKnkyLCBzaWduZWQgKnUsIHNpZ25lZCAqdikgewotICAgICAgICAgICAgKnkxID0gKHNpZ25lZCkoKCh1aW50MTZfdCopc3JjX3kpW3hdID4+IDIpIC0gMTY7Ci0gICAgICAgICAgICAqeTIgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfeSlbeCArIDFdID4+IDIpIC0gMTY7CisgICAgICAgICAgICAqeTEgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfeSlbeF0gPj4gMik7CisgICAgICAgICAgICAqeTIgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfeSlbeCArIDFdID4+IDIpOwogICAgICAgICAgICAgKnUgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfdSlbeCAvIDJdID4+IDIpIC0gMTI4OwogICAgICAgICAgICAgKnYgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfdilbeCAvIDJdID4+IDIpIC0gMTI4OwogICAgICAgICB9OwpAQCAtNDM4LDI0ICs2NzIsMjYgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAorLy8gVFJJQ0tZOiB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIFJHQkFfMTAxMDEwMiBvdXRwdXQgZm9yIDEwLWJpdCBzb3VyY2VzLCBhbmQgYWxsIG90aGVyIG91dHB1dHMKKy8vIGZvciA4LWJpdCBzb3VyY2VzIGFzIHRoZSB0eXBlIG9mIGtBZGp1c3RlZENsaXAgaXMgaGFyZGNvZGVkIGJhc2VkIG9uIG91dHB1dCwgbm90IGlucHV0Lgogc3RkOjpmdW5jdGlvbjx2b2lkICh2b2lkICosIGJvb2wsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQpPgotZ2V0V3JpdGVUb0RzdChPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQsIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXApIHsKLSAgICBzd2l0Y2ggKGRzdEZvcm1hdCkgeworZ2V0V3JpdGVUb0RzdChPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQsIHZvaWQgKmtBZGp1c3RlZENsaXApIHsKKyAgICBzd2l0Y2ggKChpbnQpZHN0Rm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CiAgICAgewogICAgICAgICByZXR1cm4gW2tBZGp1c3RlZENsaXBdKHZvaWQgKmRzdF9wdHIsIGJvb2wgdW5jcm9wcGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMikgewogICAgICAgICAgICAgdWludDMyX3QgcmdiMSA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IxXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMV0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKTsKKyAgICAgICAgICAgICAgICAoKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW3IxXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICB8ICgoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbZzFdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbYjFdID4+IDMpOwogCiAgICAgICAgICAgICBpZiAodW5jcm9wcGVkKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9Ci0gICAgICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtyMl0gPj4gMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtyMl0gPj4gMykgPDwgMTEpCisgICAgICAgICAgICAgICAgICAgIHwgKCgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtnMl0gPj4gMikgPDwgNSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbYjJdID4+IDMpOwogCiAgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKWRzdF9wdHIgPSAocmdiMiA8PCAxNikgfCByZ2IxOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ2OSwxNiArNzA1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjIsIHNpZ25lZCBnMiwgc2lnbmVkIGIyKSB7CiAgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQotICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMV0pCi0gICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbcjFdKQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbYjFdIDw8IDE2KQogICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKIAogICAgICAgICAgICAgaWYgKHVuY3JvcHBlZCkgewogICAgICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMl0pCi0gICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbcjJdKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtiMl0gPDwgMTYpCiAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKQEAgLTQ4OSwyMCArNzI1LDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjIsIHNpZ25lZCBnMiwgc2lnbmVkIGIyKSB7CiAgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQotICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtiMV0pCi0gICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbcjFdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbYjFdKQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbcjFdIDw8IDE2KQogICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKIAogICAgICAgICAgICAgaWYgKHVuY3JvcHBlZCkgewogICAgICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtiMl0pCi0gICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMl0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbYjJdKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtyMl0gPDwgMTYpCiAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CisgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOgorICAgIHsKKyAgICAgICAgcmV0dXJuIFtrQWRqdXN0ZWRDbGlwXSh2b2lkICpkc3RfcHRyLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9CisgICAgICAgICAgICAgICAgICAgICgoKHVpbnQxNl90ICopa0FkanVzdGVkQ2xpcClbcjFdKQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQxNl90ICopa0FkanVzdGVkQ2xpcClbZzFdIDw8IDEwKQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQxNl90ICopa0FkanVzdGVkQ2xpcClbYjFdIDw8IDIwKQorICAgICAgICAgICAgICAgICAgICB8ICgzIDw8IDMwKTsKKworICAgICAgICAgICAgaWYgKHVuY3JvcHBlZCkgeworICAgICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MTZfdCAqKWtBZGp1c3RlZENsaXApW3IyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDE2X3QgKilrQWRqdXN0ZWRDbGlwKVtnMl0gPDwgMTApCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQxNl90ICopa0FkanVzdGVkQ2xpcClbYjJdIDw8IDIwKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoMyA8PCAzMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCiAgICAgZGVmYXVsdDoKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CkBAIC01MTEsMTAgKzc2OCwyMiBAQAogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hcigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgY29uc3Qgc3RydWN0IENvZWZmcyAqbWF0cml4ID0gZ2V0TWF0cml4KCk7CisgICAgaWYgKCFtYXRyaXgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHNpZ25lZCBfYl91ID0gbWF0cml4LT5fYl91OworICAgIHNpZ25lZCBfbmVnX2dfdSA9IC1tYXRyaXgtPl9nX3U7CisgICAgc2lnbmVkIF9uZWdfZ192ID0gLW1hdHJpeC0+X2dfdjsKKyAgICBzaWduZWQgX3JfdiA9IG1hdHJpeC0+X3JfdjsKKyAgICBzaWduZWQgX3kgPSBtYXRyaXgtPl95OworICAgIHNpZ25lZCBfYzE2ID0gbVNyY0NvbG9yU3BhY2UubVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlTGltaXRlZCA/IDE2IDogMDsKKwogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCiAgICAgYXV0byByZWFkRnJvbVNyYyA9IGdldFJlYWRGcm9tU3JjKG1TcmNGb3JtYXQpOwotICAgIGF1dG8gd3JpdGVUb0RzdCA9IGdldFdyaXRlVG9Ec3QobURzdEZvcm1hdCwga0FkanVzdGVkQ2xpcCk7CisgICAgYXV0byB3cml0ZVRvRHN0ID0gZ2V0V3JpdGVUb0RzdChtRHN0Rm9ybWF0LCAodm9pZCAqKWtBZGp1c3RlZENsaXApOwogCiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCiAgICAgICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOwpAQCAtNTI5LDM4ICs3OTgsMjAgQEAKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKLSAgICAgICAgICAgIC8vIEIgPSAxLjE2NCAqIChZIC0gMTYpICsgMi4wMTggKiAoVSAtIDEyOCkKLSAgICAgICAgICAgIC8vIEcgPSAxLjE2NCAqIChZIC0gMTYpIC0gMC44MTMgKiAoViAtIDEyOCkgLSAwLjM5MSAqIChVIC0gMTI4KQotICAgICAgICAgICAgLy8gUiA9IDEuMTY0ICogKFkgLSAxNikgKyAxLjU5NiAqIChWIC0gMTI4KQotCi0gICAgICAgICAgICAvLyBCID0gMjk4LzI1NiAqIChZIC0gMTYpICsgNTE3LzI1NiAqIChVIC0gMTI4KQotICAgICAgICAgICAgLy8gRyA9IC4uLi4uLi4uLi4uLi4uLi4uLiAtIDIwOC8yNTYgKiAoViAtIDEyOCkgLSAxMDAvMjU2ICogKFUgLSAxMjgpCi0gICAgICAgICAgICAvLyBSID0gLi4uLi4uLi4uLi4uLi4uLi4uICsgNDA5LzI1NiAqIChWIC0gMTI4KQotCi0gICAgICAgICAgICAvLyBtaW5fQiA9ICgyOTggKiAoLSAxNikgKyA1MTcgKiAoLSAxMjgpKSAvIDI1NiA9IC0yNzcKLSAgICAgICAgICAgIC8vIG1pbl9HID0gKDI5OCAqICgtIDE2KSAtIDIwOCAqICgyNTUgLSAxMjgpIC0gMTAwICogKDI1NSAtIDEyOCkpIC8gMjU2ID0gLTE3MgotICAgICAgICAgICAgLy8gbWluX1IgPSAoMjk4ICogKC0gMTYpICsgNDA5ICogKC0gMTI4KSkgLyAyNTYgPSAtMjIzCi0KLSAgICAgICAgICAgIC8vIG1heF9CID0gKDI5OCAqICgyNTUgLSAxNikgKyA1MTcgKiAoMjU1IC0gMTI4KSkgLyAyNTYgPSA1MzQKLSAgICAgICAgICAgIC8vIG1heF9HID0gKDI5OCAqICgyNTUgLSAxNikgLSAyMDggKiAoLSAxMjgpIC0gMTAwICogKC0gMTI4KSkgLyAyNTYgPSA0MzIKLSAgICAgICAgICAgIC8vIG1heF9SID0gKDI5OCAqICgyNTUgLSAxNikgKyA0MDkgKiAoMjU1IC0gMTI4KSkgLyAyNTYgPSA0ODEKLQotICAgICAgICAgICAgLy8gY2xpcCByYW5nZSAtMjc4IC4uIDUzNQotCiAgICAgICAgICAgICBzaWduZWQgeTEsIHkyLCB1LCB2OwogICAgICAgICAgICAgcmVhZEZyb21TcmMoc3JjX3ksIHNyY191LCBzcmNfdiwgeCwgJnkxLCAmeTIsICZ1LCAmdik7CiAKLSAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwotICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwotICAgICAgICAgICAgc2lnbmVkIHZfZyA9IC12ICogMjA4OwotICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiA0MDk7CisgICAgICAgICAgICBzaWduZWQgdV9iID0gdSAqIF9iX3U7CisgICAgICAgICAgICBzaWduZWQgdV9nID0gdSAqIF9uZWdfZ191OworICAgICAgICAgICAgc2lnbmVkIHZfZyA9IHYgKiBfbmVnX2dfdjsKKyAgICAgICAgICAgIHNpZ25lZCB2X3IgPSB2ICogX3JfdjsKIAotICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCB0bXAxID0gKHkxIC0gX2MxNikgKiBfeSArIDEyODsKICAgICAgICAgICAgIHNpZ25lZCBiMSA9ICh0bXAxICsgdV9iKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCBnMSA9ICh0bXAxICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMSA9ICh0bXAxICsgdl9yKSAvIDI1NjsKIAotICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCB0bXAyID0gKHkyIC0gX2MxNikgKiBfeSArIDEyODsKICAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKQEAgLTU5MSwzNCArODQyLDg0IEBACiAgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBQbGFuYXIoc3JjLCBkc3QpOwogfQogCi0vKgotICogUGFjayAxMC1iaXQgWVVWIGludG8gUkdCQV8xMDEwMTAyLgotICoKLSAqIE1lZGlhIHNlbmRzIDEwLWJpdCBZVVYgaW4gYSBSR0JBXzEwMTAxMDIgZm9ybWF0IGJ1ZmZlci4gU0Ygd2lsbCBoYW5kbGUKLSAqIHRoZSBjb252ZXJzaW9uIHRvIFJHQiB1c2luZyBSZW5kZXJFbmdpbmUgZmFsbGJhY2suCi0gKgotICogV2UgZG8gbm90IHBlcmZvcm0gYSBZVVYtPlJHQiBjb252ZXJzaW9uIGhlcmUsIGhvd2V2ZXIgdGhlIGNvbnZlcnNpb24gd2l0aAotICogQlQyMDIwIHRvIEZ1bGwgcmFuZ2UgaXMgYmVsb3cgZm9yIHJlZmVyZW5jZToKLSAqCi0gKiAgIEIgPSAxLjE2OCAgKihZIC0gNjQpICsgMi4xNDggICooVSAtIDUxMikKLSAqICAgRyA9IDEuMTY4ICAqKFkgLSA2NCkgLSAwLjY1MiAgKihWIC0gNTEyKSAtIDAuMTg4ICAqKFUgLSA1MTIpCi0gKiAgIFIgPSAxLjE2OCAgKihZIC0gNjQpICsgMS42ODMgICooViAtIDUxMikKLSAqCi0gKiAgIEIgPSAxMTk2LzEwMjQgICooWSAtIDY0KSArIDIyMDAvMTAyNCAgKihVIC0gNTEyKQotICogICBHID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gLSAgNjY4LzEwMjQgICooViAtIDUxMikgLSAxOTIvMTAyNCAgKihVIC0gNTEyKQotICogICBSID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gKyAxNzIzLzEwMjQgICooViAtIDUxMikKLSAqCi0gKiAgIG1pbl9CID0gKDExOTYgICooLSA2NCkgKyAyMjAwICAqKC0gNTEyKSkgLyAxMDI0ID0gLTExNzUKLSAqICAgbWluX0cgPSAoMTE5NiAgKigtIDY0KSAtIDY2OCAgKigxMDIzIC0gNTEyKSAtIDE5MiAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gLTUwNAotICogICBtaW5fUiA9ICgxMTk2ICAqKC0gNjQpICsgMTcyMyAgKigtIDUxMikpIC8gMTAyNCA9IC05MzcKLSAqCi0gKiAgIG1heF9CID0gKDExOTYgICooMTAyMyAtIDY0KSArIDIyMDAgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IDIyMTgKLSAqICAgbWF4X0cgPSAoMTE5NiAgKigxMDIzIC0gNjQpIC0gNjY4ICAqKC0gNTEyKSAtIDE5MiAgKigtIDUxMikpIC8gMTAyNCA9IDE1NTEKLSAqICAgbWF4X1IgPSAoMTE5NiAgKigxMDIzIC0gNjQpICsgMTcyMyAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gMTk4MAotICoKLSAqICAgY2xpcCByYW5nZSAtMTE3NSAuLiAyMjE4Ci0gKgotICovCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVlAwMTAoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIGlmIChtRHN0Rm9ybWF0ID09IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTApIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRZVVZQMDEwVG9SR0JBMTAxMDEwMihzcmMsIGRzdCk7CisgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVlAwMTBUb1JHQkExMDEwMTAyKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICBjb25zdCBzdHJ1Y3QgQ29lZmZzICptYXRyaXggPSBnZXRNYXRyaXgoKTsKKyAgICBpZiAoIW1hdHJpeCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc2lnbmVkIF9iX3UgPSBtYXRyaXgtPl9iX3U7CisgICAgc2lnbmVkIF9uZWdfZ191ID0gLW1hdHJpeC0+X2dfdTsKKyAgICBzaWduZWQgX25lZ19nX3YgPSAtbWF0cml4LT5fZ192OworICAgIHNpZ25lZCBfcl92ID0gbWF0cml4LT5fcl92OworICAgIHNpZ25lZCBfeSA9IG1hdHJpeC0+X3k7CisgICAgc2lnbmVkIF9jMTYgPSBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VMaW1pdGVkID8gNjQgOiAwOworCisgICAgdWludDE2X3QgKmtBZGp1c3RlZENsaXAxMGJpdCA9IGluaXRDbGlwMTBCaXQoKTsKKworLy8gICAgYXV0byByZWFkRnJvbVNyYyA9IGdldFJlYWRGcm9tU3JjKG1TcmNGb3JtYXQpOworICAgIGF1dG8gd3JpdGVUb0RzdCA9IGdldFdyaXRlVG9Ec3QobURzdEZvcm1hdCwgKHZvaWQgKilrQWRqdXN0ZWRDbGlwMTBiaXQpOworCisgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOworCisgICAgdWludDE2X3QgKnNyY195ID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopc3JjLm1CaXRzCisgICAgICAgICAgICArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdCAqIHNyYy5tQnBwKTsKKworICAgIHVpbnQxNl90ICpzcmNfdXYgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKilzcmMubUJpdHMKKyAgICAgICAgICAgICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICAgICAgKyAoc3JjLm1Dcm9wVG9wIC8gMikgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQgKiBzcmMubUJwcCk7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CisgICAgICAgICAgICBzaWduZWQgeTEsIHkyLCB1LCB2OworICAgICAgICAgICAgeTEgPSAoc3JjX3lbeF0gPj4gNikgLSBfYzE2OworICAgICAgICAgICAgeTIgPSAoc3JjX3lbeCArIDFdID4+IDYpIC0gX2MxNjsKKyAgICAgICAgICAgIHUgPSBpbnQoc3JjX3V2W3hdID4+IDYpIC0gNTEyOworICAgICAgICAgICAgdiA9IGludChzcmNfdXZbeCArIDFdID4+IDYpIC0gNTEyOworCisgICAgICAgICAgICBzaWduZWQgdV9iID0gdSAqIF9iX3U7CisgICAgICAgICAgICBzaWduZWQgdV9nID0gdSAqIF9uZWdfZ191OworICAgICAgICAgICAgc2lnbmVkIHZfZyA9IHYgKiBfbmVnX2dfdjsKKyAgICAgICAgICAgIHNpZ25lZCB2X3IgPSB2ICogX3JfdjsKKworICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIF95ICsgMTI4OworICAgICAgICAgICAgc2lnbmVkIGIxID0gKHRtcDEgKyB1X2IpIC8gMjU2OworICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMjU2OworICAgICAgICAgICAgc2lnbmVkIHIxID0gKHRtcDEgKyB2X3IpIC8gMjU2OworCisgICAgICAgICAgICBzaWduZWQgdG1wMiA9IHkyICogX3kgKyAxMjg7CisgICAgICAgICAgICBzaWduZWQgYjIgPSAodG1wMiArIHVfYikgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgZzIgPSAodG1wMiArIHZfZyArIHVfZykgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgcjIgPSAodG1wMiArIHZfcikgLyAyNTY7CisKKyAgICAgICAgICAgIGJvb2wgdW5jcm9wcGVkID0geCArIDEgPCBzcmMuY3JvcFdpZHRoKCk7CisKKyAgICAgICAgICAgIHdyaXRlVG9Ec3QoZHN0X3B0ciArIHggKiBkc3QubUJwcCwgdW5jcm9wcGVkLCByMSwgZzEsIGIxLCByMiwgZzIsIGIyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlIC8gMjsKKworICAgICAgICBpZiAoeSAmIDEpIHsKKyAgICAgICAgICAgIHNyY191diArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgIH0KKworICAgICAgICBkc3RfcHRyICs9IGRzdC5tU3RyaWRlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogCiAjaWYgIVVTRV9ORU9OX1k0MTAKIApAQCAtODIxLDExICsxMTIyLDYgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRRQ09NWVVWNDIwU2VtaVBsYW5hcigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7Ci0gICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7Ci0KLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OwotCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OwogCkBAIC04MzMsNjcgKzExMjksMjUgQEAKICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiBzcmMubUhlaWdodAogICAgICAgICArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OwogCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewotICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfeVt4XSAtIDE2OwotICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfeVt4ICsgMV0gLSAxNjsKKyAgICAvKiBRQ09NWVVWNDIwU2VtaVBsYW5hciBpcyBOVjIxLCB3aGlsZSBNZWRpYUNvZGVjIHVzZXMgTlYxMiAqLworICAgIHJldHVybiBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hckJhc2UoCisgICAgICAgICAgICBzcmMsIGRzdCwgc3JjX3ksIHNyY191LCBzcmMubVdpZHRoIC8qIHJvd19pbmMgKi8sIHRydWUgLyogaXNOVjIxICovKTsKK30KIAotICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY191W3ggJiB+MV0gLSAxMjg7Ci0gICAgICAgICAgICBzaWduZWQgdiA9IChzaWduZWQpc3JjX3VbKHggJiB+MSkgKyAxXSAtIDEyODsKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0VElZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CiAKLSAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwotICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwotICAgICAgICAgICAgc2lnbmVkIHZfZyA9IC12ICogMjA4OwotICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiA0MDk7CisgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIChzcmMubUhlaWdodCAtIHNyYy5tQ3JvcFRvcCAvIDIpOwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogMjk4OwotICAgICAgICAgICAgc2lnbmVkIGIxID0gKHRtcDEgKyB1X2IpIC8gMjU2OwotICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMjU2OwotICAgICAgICAgICAgc2lnbmVkIHIxID0gKHRtcDEgKyB2X3IpIC8gMjU2OwotCi0gICAgICAgICAgICBzaWduZWQgdG1wMiA9IHkyICogMjk4OwotICAgICAgICAgICAgc2lnbmVkIGIyID0gKHRtcDIgKyB1X2IpIC8gMjU2OwotICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OwotICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OwotCi0gICAgICAgICAgICB1aW50MzJfdCByZ2IxID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbYjFdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cxXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpOwotCi0gICAgICAgICAgICBpZiAoeCArIDEgPCBzcmMuY3JvcFdpZHRoKCkpIHsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopKCZkc3RfcHRyW3hdKSA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRzdF9wdHJbeF0gPSByZ2IxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3JjX3kgKz0gc3JjLm1XaWR0aDsKLQotICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBkc3RfcHRyICs9IGRzdC5tV2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hckJhc2UoCisgICAgICAgICAgICBzcmMsIGRzdCwgc3JjX3ksIHNyY191LCBzcmMubVdpZHRoIC8qIHJvd19pbmMgKi8pOwogfQogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFNlbWlQbGFuYXIoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewotICAgIC8vIFhYWCBVbnRlc3RlZAotCi0gICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7Ci0KLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKQotICAgICAgICAgICAgZHN0Lm1CaXRzICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHApOwotCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIApAQCAtOTAxLDkwICsxMTU1LDQ5IEBACiAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1IZWlnaHQgKiBzcmMubVN0cmlkZSArCiAgICAgICAgIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAotICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKLSAgICAgICAgICAgIHNpZ25lZCB5MSA9IChzaWduZWQpc3JjX3lbeF0gLSAxNjsKLSAgICAgICAgICAgIHNpZ25lZCB5MiA9IChzaWduZWQpc3JjX3lbeCArIDFdIC0gMTY7Ci0KLSAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfdVt4ICYgfjFdIC0gMTI4OwotICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY191Wyh4ICYgfjEpICsgMV0gLSAxMjg7Ci0KLSAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwotICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwotICAgICAgICAgICAgc2lnbmVkIHZfZyA9IC12ICogMjA4OwotICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiA0MDk7Ci0KLSAgICAgICAgICAgIHNpZ25lZCB0bXAxID0geTEgKiAyOTg7Ci0gICAgICAgICAgICBzaWduZWQgYjEgPSAodG1wMSArIHVfYikgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgZzEgPSAodG1wMSArIHZfZyArIHVfZykgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgcjEgPSAodG1wMSArIHZfcikgLyAyNTY7Ci0KLSAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiAyOTg7Ci0gICAgICAgICAgICBzaWduZWQgYjIgPSAodG1wMiArIHVfYikgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgZzIgPSAodG1wMiArIHZfZyArIHVfZykgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgcjIgPSAodG1wMiArIHZfcikgLyAyNTY7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJnYjEgPQotICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPj4gMyk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJnYjIgPQotICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtiMl0gPj4gMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMl0gPj4gMyk7Ci0KLSAgICAgICAgICAgIGlmICh4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKSkgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKikoJmRzdF9wdHJbeF0pID0gKHJnYjIgPDwgMTYpIHwgcmdiMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHN0X3B0clt4XSA9IHJnYjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKLQotICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gY29udmVydFlVVjQyMFNlbWlQbGFuYXJCYXNlKAorICAgICAgICAgICAgc3JjLCBkc3QsIHNyY195LCBzcmNfdSwgc3JjLm1TdHJpZGUgLyogcm93X2luYyAqLyk7CiB9CiAKLXN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0VElZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKAotICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwU2VtaVBsYW5hckJhc2UoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3ksIGNvbnN0IHVpbnQ4X3QgKnNyY191LCBzaXplX3Qgcm93X2luYywgYm9vbCBpc05WMjEpIHsKKyAgICBjb25zdCBzdHJ1Y3QgQ29lZmZzICptYXRyaXggPSBnZXRNYXRyaXgoKTsKKyAgICBpZiAoIW1hdHJpeCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc2lnbmVkIF9iX3UgPSBtYXRyaXgtPl9iX3U7CisgICAgc2lnbmVkIF9uZWdfZ191ID0gLW1hdHJpeC0+X2dfdTsKKyAgICBzaWduZWQgX25lZ19nX3YgPSAtbWF0cml4LT5fZ192OworICAgIHNpZ25lZCBfcl92ID0gbWF0cml4LT5fcl92OworICAgIHNpZ25lZCBfeSA9IG1hdHJpeC0+X3k7CisgICAgc2lnbmVkIF9jMTYgPSBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VMaW1pdGVkID8gMTYgOiAwOworCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OwotCi0gICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OwotCi0gICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIChzcmMubUhlaWdodCAtIHNyYy5tQ3JvcFRvcCAvIDIpOworICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopCisgICAgICAgICAgICBkc3QubUJpdHMgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcCk7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7Ci0gICAgICAgICAgICBzaWduZWQgeTEgPSAoc2lnbmVkKXNyY195W3hdIC0gMTY7Ci0gICAgICAgICAgICBzaWduZWQgeTIgPSAoc2lnbmVkKXNyY195W3ggKyAxXSAtIDE2OworICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfeVt4XSAtIF9jMTY7CisgICAgICAgICAgICBzaWduZWQgeTIgPSAoc2lnbmVkKXNyY195W3ggKyAxXSAtIF9jMTY7CiAKLSAgICAgICAgICAgIHNpZ25lZCB1ID0gKHNpZ25lZClzcmNfdVt4ICYgfjFdIC0gMTI4OwotICAgICAgICAgICAgc2lnbmVkIHYgPSAoc2lnbmVkKXNyY191Wyh4ICYgfjEpICsgMV0gLSAxMjg7CisgICAgICAgICAgICBzaWduZWQgdSA9IChzaWduZWQpc3JjX3VbKHggJiB+MSkgKyBpc05WMjFdIC0gMTI4OworICAgICAgICAgICAgc2lnbmVkIHYgPSAoc2lnbmVkKXNyY191Wyh4ICYgfjEpICsgIWlzTlYyMV0gLSAxMjg7CiAKLSAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwotICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwotICAgICAgICAgICAgc2lnbmVkIHZfZyA9IC12ICogMjA4OwotICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiA0MDk7CisgICAgICAgICAgICBzaWduZWQgdV9iID0gdSAqIF9iX3U7CisgICAgICAgICAgICBzaWduZWQgdV9nID0gdSAqIF9uZWdfZ191OworICAgICAgICAgICAgc2lnbmVkIHZfZyA9IHYgKiBfbmVnX2dfdjsKKyAgICAgICAgICAgIHNpZ25lZCB2X3IgPSB2ICogX3JfdjsKIAotICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCB0bXAxID0geTEgKiBfeSArIDEyODsKICAgICAgICAgICAgIHNpZ25lZCBiMSA9ICh0bXAxICsgdV9iKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCBnMSA9ICh0bXAxICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMSA9ICh0bXAxICsgdl9yKSAvIDI1NjsKIAotICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiBfeSArIDEyODsKICAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKQEAgLTEwMDYsMzEgKzEyMTksNDAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CisgICAgICAgIHNyY195ICs9IHJvd19pbmM7CiAKICAgICAgICAgaWYgKHkgJiAxKSB7Ci0gICAgICAgICAgICBzcmNfdSArPSBzcmMubVdpZHRoOworICAgICAgICAgICAgc3JjX3UgKz0gcm93X2luYzsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAogdWludDhfdCAqQ29sb3JDb252ZXJ0ZXI6OmluaXRDbGlwKCkgewotICAgIHN0YXRpYyBjb25zdCBzaWduZWQga0NsaXBNaW4gPSAtMjc4OwotICAgIHN0YXRpYyBjb25zdCBzaWduZWQga0NsaXBNYXggPSA1MzU7Ci0KICAgICBpZiAobUNsaXAgPT0gTlVMTCkgewotICAgICAgICBtQ2xpcCA9IG5ldyB1aW50OF90W2tDbGlwTWF4IC0ga0NsaXBNaW4gKyAxXTsKKyAgICAgICAgbUNsaXAgPSBuZXcgdWludDhfdFtDTElQX1JBTkdFX01BWF84QklUIC0gQ0xJUF9SQU5HRV9NSU5fOEJJVCArIDFdOwogCi0gICAgICAgIGZvciAoc2lnbmVkIGkgPSBrQ2xpcE1pbjsgaSA8PSBrQ2xpcE1heDsgKytpKSB7Ci0gICAgICAgICAgICBtQ2xpcFtpIC0ga0NsaXBNaW5dID0gKGkgPCAwKSA/IDAgOiAoaSA+IDI1NSkgPyAyNTUgOiAodWludDhfdClpOworICAgICAgICBmb3IgKHNpZ25lZCBpID0gQ0xJUF9SQU5HRV9NSU5fOEJJVDsgaSA8PSBDTElQX1JBTkdFX01BWF84QklUOyArK2kpIHsKKyAgICAgICAgICAgIG1DbGlwW2kgLSBDTElQX1JBTkdFX01JTl84QklUXSA9IChpIDwgMCkgPyAwIDogKGkgPiAyNTUpID8gMjU1IDogKHVpbnQ4X3QpaTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAmbUNsaXBbLWtDbGlwTWluXTsKKyAgICByZXR1cm4gJm1DbGlwWy1DTElQX1JBTkdFX01JTl84QklUXTsKK30KKwordWludDE2X3QgKkNvbG9yQ29udmVydGVyOjppbml0Q2xpcDEwQml0KCkgeworICAgIGlmIChtQ2xpcDEwQml0ID09IE5VTEwpIHsKKyAgICAgICAgbUNsaXAxMEJpdCA9IG5ldyB1aW50MTZfdFtDTElQX1JBTkdFX01BWF8xMEJJVCAtIENMSVBfUkFOR0VfTUlOXzEwQklUICsgMV07CisKKyAgICAgICAgZm9yIChzaWduZWQgaSA9IENMSVBfUkFOR0VfTUlOXzEwQklUOyBpIDw9IENMSVBfUkFOR0VfTUFYXzEwQklUOyArK2kpIHsKKyAgICAgICAgICAgIG1DbGlwMTBCaXRbaSAtIENMSVBfUkFOR0VfTUlOXzEwQklUXSA9IChpIDwgMCkgPyAwIDogKGkgPiAxMDIzKSA/IDEwMjMgOiAodWludDE2X3QpaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAmbUNsaXAxMEJpdFstQ0xJUF9SQU5HRV9NSU5fMTBCSVRdOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCmluZGV4IGFjYzllODcuLmU2ZDU5YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKQEAgLTIyLDggKzIyLDEyIEBACiAgICAgICAgICJaZXJvRmlsdGVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlL2ZpbHRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9Db2xvckNvbnZlcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9SU0ZpbHRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1JTRmlsdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2F0dXJhdGlvbkZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvU2F0dXJhdGlvbkZpbHRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvU2F0dXJhdGlvbkZpbHRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1plcm9GaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1plcm9GaWx0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1plcm9GaWx0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNjY1YWFlMS4uODNmY2MwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSwxMiBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAppbmRleCAwYTRlNTk4Li40MzM0ZjFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSAiQUxvb3BlclJvc3Rlci5oIgogCiAjaW5jbHVkZSAiQURlYnVnLmgiCkBAIC0xNDIsNyArMTQ0LDcgQEAKICAgICAgICAgICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyID0gaW5mby5tSGFuZGxlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlci0+bVZlcmJvc2VTdGF0cyA9IHZlcmJvc2VTdGF0czsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiOiAldSBtZXNzYWdlcyBwcm9jZXNzZWQiLCBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIpOworICAgICAgICAgICAgICAgIHMuYXBwZW5kRm9ybWF0KCI6ICUiIFBSSXU2NCAiIG1lc3NhZ2VzIHByb2Nlc3NlZCIsIGhhbmRsZXItPm1NZXNzYWdlQ291bnRlcik7CiAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2VTdGF0cykgewogICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGhhbmRsZXItPm1NZXNzYWdlcy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3VyY2NbMTVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAppbmRleCBjMjExNGIzLi41Yzk5Y2M5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcApAQCAtMzMsNyArMzMsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTY1OSw3ICs2NTksNyBAQAogICAgIHJldHVybiBzOwogfQogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogLy8gc3RhdGljCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwsIHNpemVfdCBtYXhOZXN0aW5nTGV2ZWwpIHsKICAgICBpbnQzMl90IHdoYXQgPSBwYXJjZWwucmVhZEludDMyKCk7CkBAIC04MjUsNyArODI1LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLSNlbmRpZiAgLy8gIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNlbmRpZiAgLy8gZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIAogc3A8QU1lc3NhZ2U+IEFNZXNzYWdlOjpjaGFuZ2VzRnJvbShjb25zdCBzcDxjb25zdCBBTWVzc2FnZT4gJm90aGVyLCBib29sIGRlZXApIGNvbnN0IHsKICAgICBpZiAob3RoZXIgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggYjFlZDA3Ny4uYTVlMGZmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC0zNjUsNyArMzY1LDcgQEAKICAgICByZXR1cm4gIXN0cmNhc2VjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIC8vIHN0YXRpYwogQVN0cmluZyBBU3RyaW5nOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CkBAIC0zODAsNyArMzgwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KLSNlbmRpZiAvLyAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2VuZGlmIC8vIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAKIEFTdHJpbmcgQVN0cmluZ1ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgewogICAgIHZhX2xpc3QgYXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggZGQyYzY2Zi4uY2ExNzExNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMjMsNiArMjMsMTEgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogfQogCiBjY19kZWZhdWx0cyB7CkBAIC0zMywxOCArMzgsMTMgQEAKICAgICB9LAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2xpYnMvYXJlY3QvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9saWJzL25hdGl2ZWJhc2UvaW5jbHVkZSIsCi0gICAgXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwogICAgICAgICAiaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImF2LWhlYWRlcnMiLAogICAgICAgICAvLyB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgdmVuZG9yIHZhcmlhbnQgdGhhdCByZW1vdmVzIGxpYmJpbmRlciwgYnV0IHZlbmRvcgogICAgICAgICAvLyB0YXJnZXQgYmVsb3cgZG9lcyBub3QgYWxsb3cgYWRkaW5nIGhlYWRlcl9saWJzLgogICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLApAQCAtMTIwLDggKzEyMCw2IEBACiAgICAgICAgIH0sCiAgICAgfSwKIAotICAgIGNsYW5nOiB0cnVlLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTEzNSwxMiArMTMzLDE5IEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAorCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKQEAgLTE2NSw3ICsxNzAsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsICAgICAgICAgICAgIC8vIGZvciBzcDw+CisgICAgICAgICJsaWJ1dGlscyIsIC8vIGZvciBzcDw+CiAgICAgICAgIC8vIGFjdHVhbGx5IGludm9rZXMgdGhpcywgYnV0IGNhbGxlZCBmcm9tIGZvbGtzIHdobyBhbHJlYWR5IGxvYWQgaXQKICAgICAgICAgLy8gImxpYm1lZGlhbmRrIiwKICAgICBdLApAQCAtMTkzLDggKzE5OCw2IEBACiAgICAgICAgICJDb2xvclV0aWxzX2ZpbGwuY3BwIiwKICAgICBdLAogCi0gICAgY2xhbmc6IHRydWUsCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMjExLDQgKzIxNCwzIEBACiAgICAgXSwKIAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAppbmRleCBmYTcyMmI1Li42ZGM4MTU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKQEAgLTU5MCw5ICs1OTAsMTAgQEAKICAgICB1aW50MzJfdCBnZnhSYW5nZSA9IHJhbmdlOwogICAgIHVpbnQzMl90IGdmeFN0YW5kYXJkID0gc3RhbmRhcmQ7CiAgICAgdWludDMyX3QgZ2Z4VHJhbnNmZXIgPSB0cmFuc2ZlcjsKLSAgICAvLyBUUklDS1k6IHVzZSAmIHRvIGVuc3VyZSBhbGwgdGhyZWUgbWFwcGluZ3MgYXJlIGNvbXBsZXRlZAotICAgIGlmICghKHNHZnhSYW5nZXMubWFwKHJhbmdlLCAmZ2Z4UmFuZ2UpICYgc0dmeFN0YW5kYXJkcy5tYXAoc3RhbmRhcmQsICZnZnhTdGFuZGFyZCkKLSAgICAgICAgICAgICYgc0dmeFRyYW5zZmVycy5tYXAodHJhbnNmZXIsICZnZnhUcmFuc2ZlcikpKSB7CisgICAgYm9vbCBtYXBwZWRSYW5nZSA9IHNHZnhSYW5nZXMubWFwKHJhbmdlLCAmZ2Z4UmFuZ2UpOworICAgIGJvb2wgbWFwcGVkU3RhbmRhcmQgPSBzR2Z4U3RhbmRhcmRzLm1hcChzdGFuZGFyZCwgJmdmeFN0YW5kYXJkKTsKKyAgICBib29sIG1hcHBlZFRyYW5zZmVyID0gc0dmeFRyYW5zZmVycy5tYXAodHJhbnNmZXIsICZnZnhUcmFuc2Zlcik7CisgICAgaWYgKCEgKG1hcHBlZFJhbmdlICYmIG1hcHBlZFN0YW5kYXJkICYmIG1hcHBlZFRyYW5zZmVyKSkgewogICAgICAgICBBTE9HVygiY291bGQgbm90IHNhZmVseSBtYXAgcGxhdGZvcm0gY29sb3IgYXNwZWN0cyAoUjoldSglcykgUzoldSglcykgVDoldSglcykgdG8gIgogICAgICAgICAgICAgICAiZ3JhcGhpY3MgZGF0YXNwYWNlIChSOiV1IFM6JXUgVDoldSkiLAogICAgICAgICAgICAgICByYW5nZSwgYXNTdHJpbmcocmFuZ2UpLCBzdGFuZGFyZCwgYXNTdHJpbmcoc3RhbmRhcmQpLCB0cmFuc2ZlciwgYXNTdHJpbmcodHJhbnNmZXIpLApAQCAtNjI2LDkgKzYyNywxMCBAQAogICAgIENVOjpDb2xvclJhbmdlICAgIGN1UmFuZ2UgICAgPSBDVTo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZDsKICAgICBDVTo6Q29sb3JTdGFuZGFyZCBjdVN0YW5kYXJkID0gQ1U6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQ7CiAgICAgQ1U6OkNvbG9yVHJhbnNmZXIgY3VUcmFuc2ZlciA9IENVOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkOwotICAgIC8vIFRSSUNLWTogdXNlICYgdG8gZW5zdXJlIGFsbCB0aHJlZSBtYXBwaW5ncyBhcmUgY29tcGxldGVkCi0gICAgaWYgKCEoc0dmeFJhbmdlcy5tYXAoZ2Z4UmFuZ2UsICZjdVJhbmdlKSAmIHNHZnhTdGFuZGFyZHMubWFwKGdmeFN0YW5kYXJkLCAmY3VTdGFuZGFyZCkKLSAgICAgICAgICAgICYgc0dmeFRyYW5zZmVycy5tYXAoZ2Z4VHJhbnNmZXIsICZjdVRyYW5zZmVyKSkpIHsKKyAgICBib29sIG1hcHBlZFJhbmdlID0gc0dmeFJhbmdlcy5tYXAoZ2Z4UmFuZ2UsICZjdVJhbmdlKTsKKyAgICBib29sIG1hcHBlZFN0YW5kYXJkID0gc0dmeFN0YW5kYXJkcy5tYXAoZ2Z4U3RhbmRhcmQsICZjdVN0YW5kYXJkKTsKKyAgICBib29sIG1hcHBlZFRyYW5zZmVyID0gc0dmeFRyYW5zZmVycy5tYXAoZ2Z4VHJhbnNmZXIsICZjdVRyYW5zZmVyKTsKKyAgICBpZiAoISAobWFwcGVkUmFuZ2UgJiYgbWFwcGVkU3RhbmRhcmQgJiYgbWFwcGVkVHJhbnNmZXIpKSB7CiAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgc2FmZWx5IG1hcCBncmFwaGljcyBkYXRhc3BhY2UgKFI6JXUgUzoldSBUOiV1KSB0byAiCiAgICAgICAgICAgICAgICJwbGF0Zm9ybSBjb2xvciBhc3BlY3RzIChSOiV1KCVzKSBTOiV1KCVzKSBUOiV1KCVzKSIsCiAgICAgICAgICAgICAgIGdmeFJhbmdlLCBnZnhTdGFuZGFyZCwgZ2Z4VHJhbnNmZXIsCkBAIC03ODEsNSArNzgzLDE0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIHN0YXRpYworYm9vbCBDb2xvclV0aWxzOjppc0hEUlN0YXRpY0luZm9WYWxpZChIRFJTdGF0aWNJbmZvICppbmZvKSB7CisgICAgaWYgKGluZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA+IDAuMGYKKyAgICAgICAgJiYgaW5mby0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID4gMC4wZikgIHJldHVybiB0cnVlOworICAgIGlmIChpbmZvLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID4gMC4wZgorICAgICAgICAmJiBpbmZvLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPiAwLjBmKSAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggYWRhNWQ4MS4uNWM0ZWMxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtNjAsMTIgKzYwLDY2IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzQgPSAiYXVkaW8vYWM0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01IQTEgPSAiYXVkaW8vbWhhMSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSE0xID0gImF1ZGlvL21obTEiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDMgPSAiYXVkaW8vbWhtMS4wMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9CTF9MNCA9ICJhdWRpby9taG0xLjA0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0xDX0wzID0gImF1ZGlvL21obTEuMGQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTENfTDQgPSAiYXVkaW8vbWhtMS4wZSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUEgPSAiYXVkaW8veC1tcy13bWEiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ00gPSAiYXVkaW8veC1hZHBjbS1tcyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNID0gImF1ZGlvL3gtYWRwY20tZHZpLWltYSI7Ci0KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUUyA9ICJhdWRpby92bmQuZHRzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUU19IRCA9ICJhdWRpby92bmQuZHRzLmhkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUU19VSEQgPSAiYXVkaW8vdm5kLmR0cy51aGQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQyA9ICJhdWRpby9ldnJjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNCID0gImF1ZGlvL2V2cmNiIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNXQiA9ICJhdWRpby9ldnJjd2IiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ05XID0gImF1ZGlvL2V2cmNudyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0JfUExVUyA9ICJhdWRpby9hbXItd2IrIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FQVFggPSAiYXVkaW8vYXB0eCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EUkEgPSAiYXVkaW8vdm5kLmRyYSI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVQgPSAiYXVkaW8vdm5kLmRvbGJ5Lm1hdCI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVRfMV8wID0gImF1ZGlvL3ZuZC5kb2xieS5tYXQuMS4wIjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVF8yXzAgPSAiYXVkaW8vdm5kLmRvbGJ5Lm1hdC4yLjAiOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUXzJfMSA9ICJhdWRpby92bmQuZG9sYnkubWF0LjIuMSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9UUlVFSEQgPSAiYXVkaW8vdm5kLmRvbGJ5Lm1scCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTVA0ID0gImF1ZGlvL21wNGEuNDAiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX01BSU4gPSAiYXVkaW8vbXA0YS40MC4wMSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEMgPSAiYXVkaW8vbXA0YS40MC4wMiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfU1NSID0gImF1ZGlvL21wNGEuNDAuMDMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xUUCA9ICJhdWRpby9tcDRhLjQwLjA0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19IRV9WMSA9ICJhdWRpby9tcDRhLjQwLjA1IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TQ0FMQUJMRSA9ICJhdWRpby9tcDRhLjQwLjA2IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FUkxDID0gImF1ZGlvL21wNGEuNDAuMTciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xEID0gImF1ZGlvL21wNGEuNDAuMjMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YyID0gImF1ZGlvL21wNGEuNDAuMjkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0VMRCA9ICJhdWRpby9tcDRhLjQwLjM5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19YSEUgPSAiYXVkaW8vbXA0YS40MC40MiI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURJRiA9ICJhdWRpby9hYWMtYWRpZiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19NQUlOID0gImF1ZGlvL2FhYy1hZHRzLjAxIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xDID0gImF1ZGlvL2FhYy1hZHRzLjAyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1NTUiA9ICJhdWRpby9hYWMtYWR0cy4wMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MVFAgPSAiYXVkaW8vYWFjLWFkdHMuMDQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjEgPSAiYXVkaW8vYWFjLWFkdHMuMDUiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU0NBTEFCTEUgPSAiYXVkaW8vYWFjLWFkdHMuMDYiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRVJMQyA9ICJhdWRpby9hYWMtYWR0cy4xNyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MRCA9ICJhdWRpby9hYWMtYWR0cy4yMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19IRV9WMiA9ICJhdWRpby9hYWMtYWR0cy4yOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19FTEQgPSAiYXVkaW8vYWFjLWFkdHMuMzkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfWEhFID0gImF1ZGlvL2FhYy1hZHRzLjQyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0xDID0gImF1ZGlvL21wNGEtbGF0bS4wMiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9IRV9WMSA9ICJhdWRpby9tcDRhLWxhdG0uMDUiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjIgPSAiYXVkaW8vbXA0YS1sYXRtLjI5IjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYxOTM3ID0gImF1ZGlvL3gtaWVjNjE5MzciOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fSUVDNjA5NTggPSAiYXVkaW8veC1pZWM2MDk1OCI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcDQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViA9ICJhdWRpby94LXdhdiI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCmluZGV4IDdmNDhjZmQuLjc3OTEzZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjZW5kaWYKIApAQCAtNDgsNyArNDgsNyBAQAogTWV0YURhdGE6On5NZXRhRGF0YSgpIHsKIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIC8qIHN0YXRpYyAqLwogc3A8TWV0YURhdGE+IE1ldGFEYXRhOjpjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcAppbmRleCAzZjA1MGVhLi4zMzcwNzQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTQ1Miw3ICs0NTIsNyBAQAogICAgIH0KIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIHN0YXR1c190IE1ldGFEYXRhQmFzZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCkgewogICAgIHN0YXR1c190IHJldDsKICAgICBzaXplX3QgbnVtSXRlbXMgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuc2l6ZSgpOwpAQCAtNTIxLDkgKzUyMSw2NCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgYmxvYi5kYXRhKCksIHNpemUpOwogICAgICAgICAgICAgICAgIGJsb2IucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFRZUEVfQ19TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGRhdGEgZGlyZWN0bHkgZnJvbSBQYXJjZWwgc3RvcmFnZSwgdGhlbiBhZHZhbmNlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgLy8gTkI6IHJlYWRJbnBsYWNlKCkgYnVtcHMgcG9zaXRpb24sIGl0IGlzIE5PVCBpZGVtcG90ZW50LgorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyYyA9IHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKTsKKyAgICAgICAgICAgICAgICBjaGFyICpzdHIgPSAoY2hhciAqKSBzcmM7CisgICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNpemUgPT0gMCB8fCBzdHJbc2l6ZS0xXSAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2NLZXlbNV07CisgICAgICAgICAgICAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoa2V5LCBjY0tleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGtleSAnJXMnIHN0cmluZyB3aXRoIG5vIGRhdGEgKGV4cGVjdGVkICVkKSIsIGNjS2V5LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBrZXkgJyVzJzogdW50ZXJtaW5hdGVkIHN0cmluZyBvZiAlZCBieXRlcyIsIGNjS2V5LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBzcmMsIHNpemUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gY29weSBkYXRhIGRpcmVjdGx5IGZyb20gUGFyY2VsIHN0b3JhZ2UsIHRoZW4gYWR2YW5jZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSksIHNpemUpOworICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZWNlaXZlZCBzaXplIGlzIGVub3VnaAorICAgICAgICAgICAgICAgIHVpbnQzMl90IG5lZWRlZCA9IDA7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBzaXplb2YoaW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5COiB0aGlzIHJlamVjdHMgcGFzc2luZyBiZXR3ZWVuIDMyLWJpdCBhbmQgNjQtYml0IHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gc2l6ZW9mKHZvaWQqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfUkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IHNpemVvZihSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN0YW5kYXJkIGVudGl0aWVzIGNhbiBiZSBhbnkgc2l6ZSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyYyA9IHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgKG5lZWRlZCAhPSAwICYmIHNpemUgIT0gbmVlZGVkKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNjS2V5WzVdOworICAgICAgICAgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGtleSwgY2NLZXkpOworICAgICAgICAgICAgICAgICAgICBjaGFyIGNjVHlwZVs1XTsKKyAgICAgICAgICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyh0eXBlLCBjY1R5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBrZXkgJyVzJyB0eXBlICclcycgbWlzc2luZyBkYXRhIChleHBlY3RlZCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NLZXksIGNjVHlwZSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3Jpbmcga2V5ICclcyc6IHR5cGUgJyVzJyBieXRlczogZXhwZWN0ZWQgJWQgIT0gJWQgcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjS2V5LCBjY1R5cGUsIG5lZWRlZCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgc3JjLCBzaXplKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAKQEAgLTUzMiw3ICs1ODcsNyBAQAogICAgIEFMT0dXKCJubyBtZXRhZGF0YSBpbiBwYXJjZWwiKTsKICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KLSNlbmRpZiAvLyAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2VuZGlmIC8vIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCmluZGV4IDUzZDhhOWIuLjMzNzQ2MGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaApAQCAtNjYsNyArNjYsNyBAQAogICAgIH0KIAogICAgIGJvb2wgbVZlcmJvc2VTdGF0czsKLSAgICB1aW50MzJfdCBtTWVzc2FnZUNvdW50ZXI7CisgICAgdWludDY0X3QgbU1lc3NhZ2VDb3VudGVyOwogICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gbU1lc3NhZ2VzOwogCiAgICAgdm9pZCBkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKaW5kZXggYTJiNmM0Zi4uNzJjODA3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaApAQCAtMTkzLDYgKzE5Myw5IEBACiAgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOwogICAgIC8vIChpbnRlcm5hbCkgdXNlZCBieSB0aGUgc2V0SERSU3RhdGljSW5mb0luZm8qIHJvdXRpbmVzCiAgICAgc3RhdGljIHZvaWQgZmlsbEhkclN0YXRpY0luZm9CdWZmZXIoIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIHVpbnQ4X3QgKmRhdGEpOworCisgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgSERSIHN0YXRpYyBpbmZvIGlzIHZhbGlkCisgICAgc3RhdGljIGJvb2wgaXNIRFJTdGF0aWNJbmZvVmFsaWQoSERSU3RhdGljSW5mbyAqaW5mbyk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKGFuZHJvaWQ6OkNvbG9yVXRpbHM6OkNvbG9yU3RhbmRhcmQgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAppbmRleCBmNWNlY2VmLi5mYjhjMjk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaApAQCAtNjIsMTIgKzYyLDU5IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01IQTE7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhNMTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9CTF9MMzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9CTF9MNDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MMzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUE7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ007CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTTsKLQorZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfSEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTX1VIRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNCOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNXQjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDTlc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCX1BMVVM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQVBUWDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EUkE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVF8xXzA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUXzJfMDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVRfMl8xOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX1RSVUVIRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTVA0OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NQUlOOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfU1NSOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MVFA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YxOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TQ0FMQUJMRTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfRVJMQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YyOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FTEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1hIRTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURJRjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19NQUlOOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1NTUjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MVFA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU0NBTEFCTEU7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRVJMQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19IRV9WMjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19FTEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfWEhFOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0xDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0hFX1YxOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0hFX1YyOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYxOTM3OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYwOTU4OwogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAKaW5kZXggNTk0ZGE1Ni4uZWU3ZGIyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icApAQCAtNDMsMTAgKzQzLDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZTUwNzQyZS4uZTcyY2U0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icApAQCAtMTgsMTAgKzE4LDYgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCmluZGV4IGY0ZDZkOTkuLmYyNTMxOGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKQEAgLTEyLDEwICsxMiw4IEBACiAKICAgICBzcmNzOiBbIkhUVFBIZWxwZXIuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKaW5kZXggMGIwYWNiZi4uN2UyNmJkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCkBAIC0yOCwxMSArMjgsNiBAQAogICAgICAgICAiUGxheWxpc3RGZXRjaGVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApAQCAtNjUsNiArNjAsOCBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtNzQsMyArNzEsOCBAQAogICAgIF0sCiAKIH0KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggM2JhZDAxNS4uMDljYTFjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIk0zVVBhcnNlci5oIgogI2luY2x1ZGUgIlBsYXlsaXN0RmV0Y2hlci5oIgogCi0jaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCmluZGV4IDdhNmQ0ODcuLmVkMzhhMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCi0jaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IGIyM2FhOGEuLmIzMzlmZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgIkhUVFBEb3dubG9hZGVyLmgiCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgotI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIm1wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmgiCisjaW5jbHVkZSA8SUQzLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuaD4KIAogI2luY2x1ZGUgPGRhdGFzb3VyY2UvRGF0YVVSSVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCA1ZDNmOWMxLi43MTZkZjYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogCi0jaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmZDhiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9odHRwbGl2ZV9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiaHR0cGxpdmVfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJodHRwbGl2ZV9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfaGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgXSwKKyAgICBjb3JwdXM6IFsiY29ycHVzLyoiXSwKKyAgICBkaWN0aW9uYXJ5OiAiaHR0cGxpdmVfZnV6emVyLmRpY3QiLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjRlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTYgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9odHRwbGl2ZQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGxpYnJhcnkgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuQWxzbywgc2V2ZXJhbCAubTN1OCBmaWxlcyBhcmUgaGFuZC1jcmFmdGVkIGFuZCBhZGRlZCB0byB0aGUgY29ycHVzIGRpcmVjdG9yeSB0byBpbmNyZWFzZSB0aGUgY29kZSBjb3ZlcmFnZS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBGaW5hbCBSZXN1bHQgKHBhcmFtZXRlciBuYW1lOiBgZmluYWxSZXN1bHRgKQorMi4gRmxhZ3MgKHBhcmFtZXRlciBuYW1lOiBgZmxhZ3NgKQorMy4gVGltZSBVcyAocGFyYW1ldGVyIG5hbWU6IGB0aW1lVXNgKQorNC4gVHJhY2sgSW5kZXggKHBhcmFtZXRlciBuYW1lOiBgdHJhY2tJbmRleGApCis1LiBJbmRleCAocGFyYW1ldGVyIG5hbWU6IGBpbmRleGApCis2LiBTZWxlY3QgKHBhcmFtZXRlciBuYW1lOiBgc2VsZWN0YCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBmaW5hbFJlc3VsdGAgfCBgLTM0YCB0byBgLTFgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBmbGFnc2AgfCBgMGAgdG8gYDFgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGB0aW1lVXNgIHwgYDBgIHRvIGAxMDAwMDAwMGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHRyYWNrSW5kZXhgIHwgYFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgaW5kZXhgIHwgYFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgc2VsZWN0YCB8IGBUcnVlYCB0byBgRmFsc2VgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgaHR0cGxpdmUgbW9kdWxlLgorVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBodHRwbGl2ZV9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGh0dHBsaXZlX2Z1enplcgorYGBgCisjIyMjIFN0ZXBzIHRvIHJ1bgorVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHB1c2ggJEFORFJPSURfUFJPRFVDVF9PVVQvZGF0YS9mdXp6LyQoVEFSR0VUX0FSQ0gpL2xpYiAvZGF0YS9mdXp6LyQoVEFSR0VUX0FSQ0gpL2xpYgorICAkIGFkYiBwdXNoICRBTkRST0lEX1BST0RVQ1RfT1VUL2RhdGEvZnV6ei8kKFRBUkdFVF9BUkNIKS9odHRwbGl2ZV9mdXp6ZXIgL2RhdGEvZnV6ei8kKFRBUkdFVF9BUkNIKS9odHRwbGl2ZV9mdXp6ZXIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei8ke1RBUkdFVF9BUkNIfS9odHRwbGl2ZV9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyIC9kYXRhL2Z1enovJHtUQVJHRVRfQVJDSH0vaHR0cGxpdmVfZnV6emVyL2NvcnB1cworYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9jcnlwdC5rZXkgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2NyeXB0LmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ1ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9jcnlwdC5rZXkKQEAgLTAsMCArMSwyIEBACivbCiuBz4z80DXQiV9470jOMwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9lbmNyeXB0ZWQubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvZW5jcnlwdGVkLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMGVhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvZW5jcnlwdGVkLm0zdTgKQEAgLTAsMCArMSwxMiBAQAorI0VYVE0zVQorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjEwCisjRVhULVgtQUxMT1ctQ0FDSEU6WUVTCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFQtWC1WRVJTSU9OOjMKKyNFWFQtWC1NRURJQS1TRVFVRU5DRToxCisjRVhULVgtS0VZOk1FVEhPRD1BRVMtMTI4LFVSST0iLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvY29ycHVzL2NyeXB0LmtleSIKKyNFWFRJTkY6MTAuMDAwLAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjUuMDkyLAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9obHMubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaGxzLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzOGUwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaGxzLm0zdTgKQEAgLTAsMCArMSw4IEBACisjRVhUTTNVCisjRVhULVgtVEFSR0VURFVSQVRJT046MTAKKyNFWFQtWC1NRURJQS1TRVFVRU5DRTowCisjRVhUSU5GOjEwLCBubyBkZXNjCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6MTAsIG5vIGRlc2MKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgxLm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4MS5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWZmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4MS5tM3U4CkBAIC0wLDAgKzEsMTQgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1OT05FCisjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMC50cworI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UyLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDIubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgyLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMDE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgyLm0zdTgKQEAgLTAsMCArMSw2IEBACisjRVhUTTNVCisjRVhULVgtSU5ERVBFTkRFTlQtU0VHTUVOVFMKKyNFWFQtWC1TVFJFQU0tSU5GOkNMT1NFRC1DQVBUSU9OUz1OT05FLEJBTkRXSURUSD0xNjUzNDAsUkVTT0xVVElPTj0yNTZ4MTQ0LENPREVDUz0ibXA0YS40MC41LGF2YzEuNDJjMDBiIgoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9wcm9nX2luZGV4Lm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkNMT1NFRC1DQVBUSU9OUz1OT05FLEJBTkRXSURUSD0zNDQzODgsUkVTT0xVVElPTj00MjZ4MjQwLENPREVDUz0ibXA0YS40MC41LGF2YzEuNGQ0MDE1IgoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9wcm9nX2luZGV4MS5tM3U4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4My5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDMubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdmNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDMubTN1OApAQCAtMCwwICsxLDEzIEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo0CisjRVhULVgtVEFSR0VURFVSQVRJT046NQorI0VYVC1YLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9Imh0dHBzOi8vZGVtby51bmlmaWVkLXN0cmVhbWluZy5jb20vdmlkZW8vdGVhcnMtb2Ytc3RlZWwvYWVzLmtleSIsSVY9MFg5OWI3NDAwN2I2MjU0ZTRiZDFjNmUwMzYzMWNhZDE1YgorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMy50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg0Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NC5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmEzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NC5tM3U4CkBAIC0wLDAgKzEsMTUgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsYTRjZDk5OTVhMWFhOTFlMSIsSVY9MFg5OWI3NDAwN2I2MjU0ZTRiZDFjNmUwMzYzMWNhZDE1YgorI0VYVC1YLURJU0NPTlRJTlVJVFktU0VRVUVOQ0U6MAorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhULVgtRElTQ09OVElOVUlUWQorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UwLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NS5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDUubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIwZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDUubTN1OApAQCAtMCwwICsxLDE0IEBACisjRVhUTTNVCisjRVhULVgtVEFSR0VURFVSQVRJT046MTEKKyNFWFQtWC1LRVk6TUVUSE9EPU5PTkUKKyNFWFQtWC1NRURJQS1TRVFVRU5DRTowCisjRVhULVgtVkVSU0lPTjo0CisjRVhUSU5GOjEwLjAsCisjRVhULVgtQllURVJBTkdFOjEwQDAKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjoxMC4wLAorI0VYVC1YLUJZVEVSQU5HRToyMEAxMAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjEwLjAsCisjRVhULVgtQllURVJBTkdFOjgwCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg2Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ni5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ODM2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ni5tM3U4CkBAIC0wLDAgKzEsMTIgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1BRVMtMTI4LFVSST0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsYTRjZDk5OTVhMWFhOTFlMSIsSVY9MHgzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMAorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UzLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDcubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg3Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5OTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg3Lm0zdTgKQEAgLTAsMCArMSw0NiBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NAorIyMgQ3JlYXRlZCB3aXRoIFVuaWZpZWQgU3RyZWFtaW5nIFBsYXRmb3JtICAodmVyc2lvbj0xLjExLjMtMjQ0MzgpCisjRVhULVgtU0VTU0lPTi1LRVk6TUVUSE9EPUFFUy0xMjgsVVJJPSJodHRwczovL2RlbW8udW5pZmllZC1zdHJlYW1pbmcuY29tL3ZpZGVvL3RlYXJzLW9mLXN0ZWVsL2Flcy5rZXkiCisKKyMgQVVESU8gZ3JvdXBzCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8tYWFjbC02NCIsTEFOR1VBR0U9ImVuIixOQU1FPSJFbmdsaXNoIixERUZBVUxUPVlFUyxBVVRPU0VMRUNUPVlFUyxDSEFOTkVMUz0iMiIKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpby1hYWNsLTEyOCIsTEFOR1VBR0U9ImVuIixOQU1FPSJFbmdsaXNoIixERUZBVUxUPVlFUyxBVVRPU0VMRUNUPVlFUyxDSEFOTkVMUz0iMiIKKworIyBTVUJUSVRMRVMgZ3JvdXBzCisjRVhULVgtTUVESUE6VFlQRT1TVUJUSVRMRVMsR1JPVVAtSUQ9InRleHRzdHJlYW0iLExBTkdVQUdFPSJlbiIsTkFNRT0iRW5nbGlzaCIsREVGQVVMVD1ZRVMsQVVUT1NFTEVDVD1ZRVMsVVJJPSJ0ZWFycy1vZi1zdGVlbC1hZXMtdGV4dHN0cmVhbV9lbmc9MTAwMC5tM3U4IgorI0VYVC1YLU1FRElBOlRZUEU9U1VCVElUTEVTLEdST1VQLUlEPSJ0ZXh0c3RyZWFtIixMQU5HVUFHRT0icnUiLE5BTUU9IlJ1c3NpYW4iLEFVVE9TRUxFQ1Q9WUVTLFVSST0idGVhcnMtb2Ytc3RlZWwtYWVzLXRleHRzdHJlYW1fcnVzPTEwMDAubTN1OCIKKworIyB2YXJpYW50cworI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTQ5NDAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjQyQzAwRCIsUkVTT0xVVElPTj0yMjR4MTAwLEZSQU1FLVJBVEU9MjQsQVVESU89ImF1ZGlvLWFhY2wtNjQiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9NjQwMDgtdmlkZW9fZW5nPTQwMTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9OTMzMDAwLENPREVDUz0ibXA0YS40MC4yLGF2YzEuNDJDMDE2IixSRVNPTFVUSU9OPTQ0OHgyMDAsRlJBTUUtUkFURT0yNCxBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZz03NTEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTExOTgwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS40RDQwMUYiLFJFU09MVVRJT049Nzg0eDM1MCxGUkFNRS1SQVRFPTI0LEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nPTEwMDEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTE3MjgwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS42NDAwMjgiLFJFU09MVVRJT049MTY4MHg3NTAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmc9MTUwMTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MjQ2OTAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjY0MDAyOCIsUkVTT0xVVElPTj0xNjgweDc1MCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZz0yMjAwMDAwLm0zdTgKKworIyB2YXJpYW50cworI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEwMjUwMDAsQ09ERUNTPSJtcDRhLjQwLjIsaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0xNjgweDc1MCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC02NCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz02NDAwOC12aWRlb19lbmdfMT05MDIwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEzNjgwMDAsQ09ERUNTPSJtcDRhLjQwLjIsaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0yNTc2eDExNTAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmdfMT0xMTYxMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xODE1MDAwLENPREVDUz0ibXA0YS40MC4yLGh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MzM2MHgxNTAwLEZSQU1FLVJBVEU9MjQsVklERU8tUkFOR0U9U0RSLEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nXzE9MTU4MzAwMC5tM3U4CisKKyMgdmFyaWFudHMKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD02OTAwMCxDT0RFQ1M9Im1wNGEuNDAuMiIsQVVESU89ImF1ZGlvLWFhY2wtNjQiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9NjQwMDgubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEzNzAwMCxDT0RFQ1M9Im1wNGEuNDAuMiIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi5tM3U4CisKKyMga2V5ZnJhbWVzCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD01NDAwMCxDT0RFQ1M9ImF2YzEuNDJDMDBEIixSRVNPTFVUSU9OPTIyNHgxMDAsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZz00MDEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEwMDAwMCxDT0RFQ1M9ImF2YzEuNDJDMDE2IixSRVNPTFVUSU9OPTQ0OHgyMDAsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZz03NTEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEzMzAwMCxDT0RFQ1M9ImF2YzEuNEQ0MDFGIixSRVNPTFVUSU9OPTc4NHgzNTAsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZz0xMDAxMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMjAwMDAsQ09ERUNTPSJodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTE2ODB4NzUwLFZJREVPLVJBTkdFPVNEUixVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nXzE9OTAyMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0xNTQwMDAsQ09ERUNTPSJodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTI1NzZ4MTE1MCxWSURFTy1SQU5HRT1TRFIsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZ18xPTExNjEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTIxMDAwMCxDT0RFQ1M9Imh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MzM2MHgxNTAwLFZJREVPLVJBTkdFPVNEUixVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nXzE9MTU4MzAwMC5tM3U4IgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDgubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg4Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzZDU4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg4Lm0zdTgKQEAgLTAsMCArMSwxMyBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NQorCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLE5BTUU9IkVuZ2xpc2ggc3RlcmVvIixMQU5HVUFHRT0iZW4iLEFVVE9TRUxFQ1Q9WUVTLFVSST0iLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvaW5kZXgxLm0zdTgiCisKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD02MjgwMDAsQ09ERUNTPSJhdmMxLjQyYzAwZCxtcDRhLjQwLjIiLFJFU09MVVRJT049MzIweDE4MCxBVURJTz0iYXVkaW8iCisuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9pbmRleDEubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTkyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj00ODB4MjcwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4Mi5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTcyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj02NDB4MzYwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4My5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MjUyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj05NjB4NTQwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4MS5tM3U4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL3Byb2dfaW5kZXgubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvcHJvZ19pbmRleC5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODg0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL3Byb2dfaW5kZXgubTN1OApAQCAtMCwwICsxLDE3IEBACisjRVhUTTNVCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLExBTkdVQUdFPSJlbmciLE5BTUU9IkVuZ2xpc2giLEFVVE9TRUxFQ1Q9WUVTLERFRkFVTFQ9WUVTLFVSST0iY29ycHVzL2luZGV4MS5tM3U4IgorI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvIixMQU5HVUFHRT0iZnJlIixOQU1FPSJGcmFuw6dhaXMiLEFVVE9TRUxFQ1Q9WUVTLERFRkFVTFQ9Tk8sVVJJPSJjb3JwdXMvaW5kZXgxLm0zdTgiCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLExBTkdVQUdFPSJzcCIsTkFNRT0iRXNwYW5vbCIsQVVUT1NFTEVDVD1ZRVMsREVGQVVMVD1OTyxVUkk9ImNvcnB1cy9pbmRleDEubTN1OCIKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1OT05FCisjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc3N2IzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5jcHAKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8TGl2ZURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxMaXZlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdGV4cHIgY2hhciBrRmlsZU5hbWVQcmVmaXhbXSA9ICIvZGF0YS9sb2NhbC90bXAvaHR0cGxpdmUtIjsKK2NvbnN0ZXhwciBjaGFyIGtGaWxlTmFtZVN1ZmZpeFtdID0gIi5tM3U4IjsKK2NvbnN0ZXhwciBjaGFyIGtGaWxlVXJsUHJlZml4W10gPSAiZmlsZTovLyI7Citjb25zdGV4cHIgaW50NjRfdCBrT2ZmU2V0ID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSZWFkeU1hcmtNcyA9IDUwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUHJlcGFyZU1hcmtNcyA9IDE1MDA7Citjb25zdGV4cHIgaW50MzJfdCBrRXJyb3JOb01heCA9IC0xOworY29uc3RleHByIGludDMyX3Qga0Vycm9yTm9NaW4gPSAtMzQ7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4VGltZVVzID0gMTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TdHJpbmdMZW5ndGggPSA2NDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5nZU1pbiA9IDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZ2VNYXggPSAxMDAwOworCitjb25zdGV4cHIgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUga1ZhbGlkU3RyZWFtVHlwZVtdID0geworICAgIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKKyAgICBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMsIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBfTsKKworY29uc3RleHByIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUga1ZhbGlkU2Vla01vZGVbXSA9IHsKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19ORVhUX1NZTkMsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19DTE9TRVNUX1NZTkMsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19DTE9TRVNULAorICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU6OlNFRUtfRlJBTUVfSU5ERVh9OworCitjb25zdGV4cHIgbWVkaWFfdHJhY2tfdHlwZSBrVmFsaWRNZWRpYVRyYWNrVHlwZVtdID0geworICAgIE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiwgIE1FRElBX1RSQUNLX1RZUEVfVklERU8sCisgICAgTUVESUFfVFJBQ0tfVFlQRV9BVURJTywgICAgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSwgTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQX07CisKK3N0cnVjdCBUZXN0QUhhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworcHVibGljOgorICBUZXN0QUhhbmRsZXIoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNpZ25hbEVvc0Z1bmN0aW9uKQorICAgICAgOiBtU2lnbmFsRW9zRnVuY3Rpb24oc2lnbmFsRW9zRnVuY3Rpb24pIHt9CisgIHZpcnR1YWwgflRlc3RBSGFuZGxlcigpIHt9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGUgeworICAgIGludDMyX3Qgd2hhdCA9IC0xOworICAgIG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpOworICAgIHN3aXRjaCAod2hhdCkgeworICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0RXJyb3I6CisgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRQcmVwYXJlZDoKKyAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFByZXBhcmF0aW9uRmFpbGVkOiB7CisgICAgICBtU2lnbmFsRW9zRnVuY3Rpb24oKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBtU2lnbmFsRW9zRnVuY3Rpb247Cit9OworCitzdHJ1Y3QgVGVzdE1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgTWVkaWFIVFRQQ29ubmVjdGlvbiB7CitwdWJsaWM6CisgIFRlc3RNZWRpYUhUVFBDb25uZWN0aW9uKCkge30KKyAgdmlydHVhbCB+VGVzdE1lZGlhSFRUUENvbm5lY3Rpb24oKSB7fQorCisgIHZpcnR1YWwgYm9vbCBjb25uZWN0KGNvbnN0IGNoYXIgKiAvKnVyaSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqIC8qaGVhZGVycyovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHsgcmV0dXJuOyB9CisKKyAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IC8qb2Zmc2V0Ki8sIHZvaWQgKiAvKmRhdGEqLywgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKiAvKm1pbWVUeXBlKi8pIHsgcmV0dXJuIE5PX0VSUk9SOyB9CisgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKiAvKnVyaSovKSB7IHJldHVybiBOT19FUlJPUjsgfQorCitwcml2YXRlOgorICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0TWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCitzdHJ1Y3QgVGVzdE1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgTWVkaWFIVFRQU2VydmljZSB7CitwdWJsaWM6CisgIFRlc3RNZWRpYUhUVFBTZXJ2aWNlKCkge30KKyAgflRlc3RNZWRpYUhUVFBTZXJ2aWNlKCl7fTsKKworICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICBtZWRpYUhUVFBDb25uZWN0aW9uID0gc3A8VGVzdE1lZGlhSFRUUENvbm5lY3Rpb24+OjptYWtlKCk7CisgICAgcmV0dXJuIG1lZGlhSFRUUENvbm5lY3Rpb247CisgIH0KKworcHJpdmF0ZToKKyAgc3A8VGVzdE1lZGlhSFRUUENvbm5lY3Rpb24+IG1lZGlhSFRUUENvbm5lY3Rpb24gPSBudWxscHRyOworICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0TWVkaWFIVFRQU2VydmljZSk7Cit9OworCitjbGFzcyBIdHRwTGl2ZUZ1enplciB7CitwdWJsaWM6CisgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0TGl2ZVNlc3Npb24oKTsKKyAgfkh0dHBMaXZlRnV6emVyKCkgeyBkZUluaXRMaXZlU2Vzc2lvbigpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW52b2tlTGl2ZURhdGFTb3VyY2UoKTsKKyAgdm9pZCBjcmVhdGVNM1U4RmlsZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgaW5pdExpdmVEYXRhU291cmNlKCk7CisgIHZvaWQgaW52b2tlTGl2ZVNlc3Npb24oKTsKKyAgdm9pZCBpbml0TGl2ZVNlc3Npb24oKTsKKyAgdm9pZCBpbnZva2VEZXF1ZXVlQWNjZXNzVW5pdCgpOworICB2b2lkIGludm9rZUNvbm5lY3RBc3luYygpOworICB2b2lkIGludm9rZVNlZWtUbygpOworICB2b2lkIGludm9rZUdldENvbmZpZygpOworICB2b2lkIHNpZ25hbEVvcygpOworICBzdHJpbmcgZ2VuZXJhdGVGaWxlTmFtZSgpOworICBzcDxMaXZlRGF0YVNvdXJjZT4gbUxpdmVEYXRhU291cmNlID0gbnVsbHB0cjsKKyAgc3A8TGl2ZVNlc3Npb24+IG1MaXZlU2Vzc2lvbiA9IG51bGxwdHI7CisgIHNwPEFMb29wZXI+IG1MaXZlTG9vcGVyID0gbnVsbHB0cjsKKyAgc3A8VGVzdE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gbnVsbHB0cjsKKyAgc3A8VGVzdEFIYW5kbGVyPiBtSGFuZGxlciA9IG51bGxwdHI7CisgIEZ1enplZERhdGFQcm92aWRlciAqbUZEUCA9IG51bGxwdHI7CisgIGJvb2wgbUVvc1JlYWNoZWQgPSBmYWxzZTsKKyAgc3RkOjptdXRleCBtRG93bmxvYWRDb21wbGV0ZU11dGV4OworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uYWxWYXJpYWJsZTsKK307CisKK3N0cmluZyBIdHRwTGl2ZUZ1enplcjo6Z2VuZXJhdGVGaWxlTmFtZSgpIHsKKyAgcmV0dXJuIGtGaWxlTmFtZVByZWZpeCArIHRvX3N0cmluZyhnZXRwaWQoKSkgKyBrRmlsZU5hbWVTdWZmaXg7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmNyZWF0ZU0zVThGaWxlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIG9mc3RyZWFtIG0zdThGaWxlOworICBzdHJpbmcgY3VycmVudEZpbGVOYW1lID0gZ2VuZXJhdGVGaWxlTmFtZSgpOworICBtM3U4RmlsZS5vcGVuKGN1cnJlbnRGaWxlTmFtZSwgaW9zOjpvdXQgfCBpb3M6OmJpbmFyeSk7CisgIG0zdThGaWxlLndyaXRlKChjaGFyICopZGF0YSwgc2l6ZSk7CisgIG0zdThGaWxlLmNsb3NlKCk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmluaXRMaXZlRGF0YVNvdXJjZSgpIHsKKyAgbUxpdmVEYXRhU291cmNlID0gc3A8TGl2ZURhdGFTb3VyY2U+OjptYWtlKCk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZUxpdmVEYXRhU291cmNlKCkgeworICBpbml0TGl2ZURhdGFTb3VyY2UoKTsKKyAgc2l6ZV90IHNpemUgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa1JhbmdlTWluLCBrUmFuZ2VNYXgpOworICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgbUxpdmVEYXRhU291cmNlLT5xdWV1ZUJ1ZmZlcihidWZmZXIpOworICB1aW50OF90ICpkYXRhID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisgIG1MaXZlRGF0YVNvdXJjZS0+cmVhZEF0Tm9uQmxvY2tpbmcoa09mZlNldCwgZGF0YSwgc2l6ZSk7CisgIGludDMyX3QgZmluYWxSZXN1bHQgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlKGtFcnJvck5vTWluLCBrRXJyb3JOb01heCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+cXVldWVFT1MoZmluYWxSZXN1bHQpOworICBtTGl2ZURhdGFTb3VyY2UtPnJlc2V0KCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+Y291bnRRdWV1ZWRCdWZmZXJzKCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+aW5pdENoZWNrKCk7CisgIGRlbGV0ZVtdIGRhdGE7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmluaXRMaXZlU2Vzc2lvbigpIHsKKyAgQUxvb3BlclJvc3RlciBsb29wZXJSb3N0ZXI7CisgIG1IYW5kbGVyID0KKyAgICAgIHNwPFRlc3RBSGFuZGxlcj46Om1ha2Uoc3RkOjpiaW5kKCZIdHRwTGl2ZUZ1enplcjo6c2lnbmFsRW9zLCB0aGlzKSk7CisgIG1MaXZlTG9vcGVyID0gc3A8QUxvb3Blcj46Om1ha2UoKTsKKyAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOworICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKyAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHNwPEFNZXNzYWdlPjo6bWFrZSgwLCBtSGFuZGxlcik7CisgIGh0dHBTZXJ2aWNlID0gbmV3IFRlc3RNZWRpYUhUVFBTZXJ2aWNlKCk7CisgIHVpbnQzMl90IGZsYWdzID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBtTGl2ZVNlc3Npb24gPSBzcDxMaXZlU2Vzc2lvbj46Om1ha2Uobm90aWZ5LCBmbGFncywgaHR0cFNlcnZpY2UpOworICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbik7CisgIGxvb3BlclJvc3Rlci5yZWdpc3RlckhhbmRsZXIobUxpdmVMb29wZXIsIG1IYW5kbGVyKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlRGVxdWV1ZUFjY2Vzc1VuaXQoKSB7CisgIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbSA9IG1GRFAtPlBpY2tWYWx1ZUluQXJyYXkoa1ZhbGlkU3RyZWFtVHlwZSk7CisgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgbUxpdmVTZXNzaW9uLT5kZXF1ZXVlQWNjZXNzVW5pdChzdHJlYW0sICZidWZmZXIpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VTZWVrVG8oKSB7CisgIGludDY0X3QgdGltZVVzID0gbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PigwLCBrTWF4VGltZVVzKTsKKyAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KKyAgICAgIG1GRFAtPlBpY2tWYWx1ZUluQXJyYXkoa1ZhbGlkU2Vla01vZGUpOworICBtTGl2ZVNlc3Npb24tPnNlZWtUbyh0aW1lVXMsIG1vZGUpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VHZXRDb25maWcoKSB7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpOworICBzaXplX3QgdHJhY2tJbmRleCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICBtZWRpYV90cmFja190eXBlIHR5cGUgPSBtRkRQLT5QaWNrVmFsdWVJbkFycmF5KGtWYWxpZE1lZGlhVHJhY2tUeXBlKTsKKyAgbUxpdmVTZXNzaW9uLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgc3RyZWFtID0gbUZEUC0+UGlja1ZhbHVlSW5BcnJheShrVmFsaWRTdHJlYW1UeXBlKTsKKyAgbUxpdmVTZXNzaW9uLT5nZXRTdHJlYW1Gb3JtYXRNZXRhKHN0cmVhbSwgJm1ldGEpOworICBtTGl2ZVNlc3Npb24tPmdldEtleUZvclN0cmVhbShzdHJlYW0pOworICBpZiAoc3RyZWFtICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgIG1MaXZlU2Vzc2lvbi0+Z2V0U291cmNlVHlwZUZvclN0cmVhbShzdHJlYW0pOworICB9Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZUNvbm5lY3RBc3luYygpIHsKKyAgc3RyaW5nIGN1cnJlbnRGaWxlTmFtZSA9IGdlbmVyYXRlRmlsZU5hbWUoKTsKKyAgc3RyaW5nIHVybCA9IGtGaWxlVXJsUHJlZml4ICsgY3VycmVudEZpbGVOYW1lOworICBzdHJpbmcgc3RyXzEgPSBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtSYW5kb21TdHJpbmdMZW5ndGgpOworICBzdHJpbmcgc3RyXzIgPSBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtSYW5kb21TdHJpbmdMZW5ndGgpOworCisgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgIGhlYWRlcnMuYWRkKFN0cmluZzgoc3RyXzEuY19zdHIoKSksIFN0cmluZzgoc3RyXzIuY19zdHIoKSkpOworICBtTGl2ZVNlc3Npb24tPmNvbm5lY3RBc3luYyh1cmwuY19zdHIoKSwgJmhlYWRlcnMpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VMaXZlU2Vzc2lvbigpIHsKKyAgaW5pdExpdmVTZXNzaW9uKCk7CisgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZ1NldHRpbmdzOworICBidWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtQcmVwYXJlTWFya01zOworICBidWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVhZHlNYXJrTXM7CisgIG1MaXZlU2Vzc2lvbi0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nU2V0dGluZ3MpOworICBpbnZva2VDb25uZWN0QXN5bmMoKTsKKyAgc3RkOjp1bmlxdWVfbG9jayB3YWl0Rm9yRG93bmxvYWRDb21wbGV0ZShtRG93bmxvYWRDb21wbGV0ZU11dGV4KTsKKyAgbUNvbmRpdGlvbmFsVmFyaWFibGUud2FpdCh3YWl0Rm9yRG93bmxvYWRDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyByZXR1cm4gbUVvc1JlYWNoZWQ7IH0pOworICBpZiAobUxpdmVTZXNzaW9uLT5pc1NlZWthYmxlKCkpIHsKKyAgICBpbnZva2VTZWVrVG8oKTsKKyAgfQorICBpbnZva2VEZXF1ZXVlQWNjZXNzVW5pdCgpOworICBzaXplX3QgaW5kZXggPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOworICBib29sIHNlbGVjdCA9IG1GRFAtPkNvbnN1bWVCb29sKCk7CisgIG1MaXZlU2Vzc2lvbi0+c2VsZWN0VHJhY2soaW5kZXgsIHNlbGVjdCk7CisgIG1MaXZlU2Vzc2lvbi0+aGFzRHluYW1pY0R1cmF0aW9uKCk7CisgIGludDY0X3QgZmlyc3RUaW1lVXMgPQorICAgICAgbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrUmFuZ2VNaW4sIGtSYW5nZU1heCk7CisgIGludDY0X3QgdGltZVVzID0gbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrUmFuZ2VNaW4sIGtSYW5nZU1heCk7CisgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICBtTGl2ZVNlc3Npb24tPmNhbGN1bGF0ZU1lZGlhVGltZVVzKGZpcnN0VGltZVVzLCB0aW1lVXMsIGRpc2NvbnRpbnVpdHlTZXEpOworICBpbnZva2VHZXRDb25maWcoKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBtRkRQID0gbmV3IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgY3JlYXRlTTNVOEZpbGUoZGF0YSwgc2l6ZSk7CisgIGludm9rZUxpdmVEYXRhU291cmNlKCk7CisgIGludm9rZUxpdmVTZXNzaW9uKCk7CisgIGRlbGV0ZSBtRkRQOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjpkZUluaXRMaXZlU2Vzc2lvbigpIHsKKyAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgbUxpdmVTZXNzaW9uLT5kaXNjb25uZWN0KCk7CisgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbi0+aWQoKSk7CisgICAgbUxpdmVMb29wZXItPnN0b3AoKTsKKyAgfQorICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKKyAgbUxpdmVMb29wZXIuY2xlYXIoKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6c2lnbmFsRW9zKCkgeworICBtRW9zUmVhY2hlZCA9IHRydWU7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gd2FpdEZvckRvd25sb2FkQ29tcGxldGUobURvd25sb2FkQ29tcGxldGVNdXRleCk7CisgIH0KKyAgbUNvbmRpdGlvbmFsVmFyaWFibGUubm90aWZ5X29uZSgpOworICByZXR1cm47Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgSHR0cExpdmVGdXp6ZXIgaHR0cGxpdmVGdXp6ZXI7CisgIGh0dHBsaXZlRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5kaWN0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwM2NjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwxNSBAQAorI20zdTgtVGFncwora3cxPSIjRVhUTTNVIgora3cyPSIjRVhULVgtVkVSU0lPTjoiCitrdzM9IiNFWFQtWC1UQVJHRVREVVJBVElPTjoiCitrdzQ9IiNFWFQtWC1QTEFZTElTVC1UWVBFOiIKK2t3NT0iI0VYVElORjoiCitrdzY9IiNFWFQtWC1FTkRMSVNUIgora3c3PSIjRVhULVgtTUVESUEtU0VRVUVOQ0U6Igora3c4PSIjRVhULVgtS0VZOk1FVEhPRD1OT05FIgora3c5PSIjRVhULVgtRElTQ09OVElOVUlUWToiCitrdzEwPSIjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowIgora3cxMT0iI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPSIKK2t3MTI9IiNFWFQtWC1TVFJFQU0tSU5GOkNPREVDUz0iCitrdzEzPSIjRVhULVgtQllURVJBTkdFOiIKK2t3MTQ9IiNFWFQtWC1NRURJQSIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggM2Y1YmE0Ny4uYmVhM2UzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTIwLDYgKzIwLDExIEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAorCiAKICAgICBzcmNzOiBbIklEMy5jcHAiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcKaW5kZXggZDgyZDI2ZS4uNjEwNjkwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvVEVTVF9NQVBQSU5HCkBAIC05LDE0ICs5LDE1IEBACiAKICAgInByZXN1Ym1pdC1sYXJnZSI6IFsKICAgICAvLyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBydW4gYW55IHRlc3RzLgotICAgIC8vIGJ1dDogY3RzLXRyYWRlZmVkIHJ1biAtbSBDdHNNZWRpYVRlc3RDYXNlcyAtdCBhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdAorICAgIC8vIGJ1dDogY3RzLXRyYWRlZmVkIHJ1biAtbSBDdHNNZWRpYU1pc2NUZXN0Q2FzZXMgLXQgXAorICAgIC8vIGFuZHJvaWQubWVkaWEubWlzYy5jdHMuTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QKICAgICAvLyBkb2VzIHJ1biBoZSAzMiBhbmQgNjQgYml0IHRlc3RzLCBidXQgbm90IHRoZSBpbnN0YW50IHRlc3RzCiAgICAgLy8gYnV0IGFsbCBJIGtub3cgaXMgdGhhdCB3aXRoICdhdGVzdCcsIGl0J3Mgbm90IHJ1bm5pbmcKICAgICB7Ci0gICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAibmFtZSI6ICJDdHNNZWRpYU1pc2NUZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgewotICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0IgorICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEubWlzYy5jdHMuTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QiCiAgICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCmluZGV4IGQ1OWU0ZjUuLmU0MTczMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaApAQCAtNTAsNyArNTAsOCBAQAogICAgIHNwPElNZW1vcnk+IGV4dHJhY3RGcmFtZShGcmFtZVJlY3QgKnJlY3QgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBzcDxJTWVtb3J5PiBnZXRNZXRhZGF0YU9ubHkoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwgaW50IGNvbG9yRm9ybWF0LCBib29sIHRodW1ibmFpbCA9IGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQgY29sb3JGb3JtYXQsCisgICAgICAgICAgICBib29sIHRodW1ibmFpbCA9IGZhbHNlLCB1aW50MzJfdCBiaXREZXB0aCA9IDApOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RnJhbWVEZWNvZGVyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCBjODRjYzEwLi41YTIxNzU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTcxLDYgKzcxLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1YnNjcmliZVRvUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVuc3Vic2NyaWJlRnJvbVBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLCBjb25zdCBjaGFyKiBuYW1lLApAQCAtNTE5LDYgKzUyMiw3IEBACiAgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeSh1aW50MzJfdCBsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBzZXRUdW5uZWxQZWVrKGludDMyX3QgdHVubmVsUGVlayk7CisgICAgc3RhdHVzX3Qgc2V0VHVubmVsUGVla0xlZ2FjeShpbnQzMl90IGlzTGVnYWN5KTsKICAgICBzdGF0dXNfdCBzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCk7CiAgICAgc3RhdHVzX3Qgc2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbyk7CiAgICAgc3RhdHVzX3QgZ2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90ICppbnRyYVJlZnJlc2hQZXJpb2QpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDQzZDUwZjEuLjVlODQ5NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTM1LDcgKzM1LDkgQEAKIAogY2xhc3MgQXVkaW9SZWNvcmQ7CiAKLXN0cnVjdCBBdWRpb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSwgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworc3RydWN0IEF1ZGlvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrIHsKICAgICAvLyBOb3RlIHRoYXQgdGhlICJjaGFubmVscyIgcGFyYW1ldGVyIF9pc18gdGhlIG51bWJlciBvZiBjaGFubmVscywKICAgICAvLyBfbm90XyBhIGJpdG1hc2sgb2YgYXVkaW9fY2hhbm5lbHNfdCBjb25zdGFudHMuCiAgICAgQXVkaW9Tb3VyY2UoCkBAIC03NCw3ICs3Niw2IEBACiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcyk7CiAKLSAgICBzdGF0dXNfdCBkYXRhQ2FsbGJhY2soY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYnVmZmVyKTsKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogCiAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CkBAIC0xNDIsNiArMTQzLDEwIEBACiAgICAgdm9pZCB3YWl0T3V0c3RhbmRpbmdFbmNvZGluZ0ZyYW1lc19sKCk7CiAgICAgc3RhdHVzX3QgcmVzZXQoKTsKIAorICAgIC8vIElBdWRpb1JlY29yZENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYpIG92ZXJyaWRlOworICAgIHZvaWQgb25PdmVycnVuKCkgb3ZlcnJpZGU7CisKICAgICBBdWRpb1NvdXJjZShjb25zdCBBdWRpb1NvdXJjZSAmKTsKICAgICBBdWRpb1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEF1ZGlvU291cmNlICYpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKaW5kZXggNzViMGQ4ZS4uN2EwNWYwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaApAQCAtNDcsMTQgKzQ3LDIwIEBACiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pOwogCisgICAgc3RydWN0IENvZWZmczsgLy8gbWF0cml4IGNvZWZmaWNpZW50cworCiBwcml2YXRlOgogICAgIHN0cnVjdCBDb2xvclNwYWNlIHsKICAgICAgICAgdWludDMyX3QgbVN0YW5kYXJkOwogICAgICAgICB1aW50MzJfdCBtUmFuZ2U7CiAgICAgICAgIHVpbnQzMl90IG1UcmFuc2ZlcjsKIAotICAgICAgICBib29sIGlzQnQ3MDkoKTsKLSAgICAgICAgYm9vbCBpc0pwZWcoKTsKKyAgICAgICAgYm9vbCBpc0J0MjAyMCgpIGNvbnN0OworCisgICAgICAgIC8vIGxpYnl1diBoZWxwZXIgbWV0aG9kcworICAgICAgICBib29sIGlzSDQyMCgpIGNvbnN0OworICAgICAgICBib29sIGlzSTQyMCgpIGNvbnN0OworICAgICAgICBib29sIGlzSjQyMCgpIGNvbnN0OwogICAgIH07CiAKICAgICBzdHJ1Y3QgQml0bWFwUGFyYW1zIHsKQEAgLTc4LDggKzg0LDEzIEBACiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdDsKICAgICBDb2xvclNwYWNlIG1TcmNDb2xvclNwYWNlOwogICAgIHVpbnQ4X3QgKm1DbGlwOworICAgIHVpbnQxNl90ICptQ2xpcDEwQml0OwogCiAgICAgdWludDhfdCAqaW5pdENsaXAoKTsKKyAgICB1aW50MTZfdCAqaW5pdENsaXAxMEJpdCgpOworCisgICAgLy8gcmV0dXJucyB0aGUgWVVWMlJHQiBtYXRyaXggY29lZmZpY2llbnRzIGFjY29yZGluZyB0byB0aGUgY29sb3IgYXNwZWN0cyBhbmQgYml0IGRlcHRoCisgICAgY29uc3Qgc3RydWN0IENvZWZmcyAqZ2V0TWF0cml4KCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBjb252ZXJ0Q2JZQ3JZKAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKQEAgLTEwOCw5ICsxMTksMTkgQEAKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hcigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hckJhc2UoCisgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSwgY29uc3QgdWludDhfdCAqc3JjX3UsIHNpemVfdCByb3dfaW5jLCBib29sIGlzTlYyMSA9IGZhbHNlKTsKKwogICAgIHN0YXR1c190IGNvbnZlcnRUSVlVVjQyMFBhY2tlZFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgc3RhdHVzX3QgY29udmVydFlVVlAwMTAoCisgICAgICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKKworICAgIHN0YXR1c190IGNvbnZlcnRZVVZQMDEwVG9SR0JBMTAxMDEwMigKKyAgICAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOworCiAgICAgQ29sb3JDb252ZXJ0ZXIoY29uc3QgQ29sb3JDb252ZXJ0ZXIgJik7CiAgICAgQ29sb3JDb252ZXJ0ZXIgJm9wZXJhdG9yPShjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKaW5kZXggMmMwM2YyNy4uZjA3MGFhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtMTA1LDcgKzEwNSw2IEBACiAgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+dW5zZWN1cmVQb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7CiAgICAgICAgIGludDMyX3QgcmVtb3RlUmVmY291bnQgPQogICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT51bnNlY3VyZVBvaW50ZXIoKSktPmdldFJlbW90ZVJlZmNvdW50KCk7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjayBzbyB0aGF0IHJlbW90ZVJlZkNvdW50KCkgaXMgbm9uLW5lZ2F0aXZlLgogICAgICAgICByZXR1cm4gcmVtb3RlUmVmY291bnQgPj0gMCA/IHJlbW90ZVJlZmNvdW50IDogMDsgLy8gZG8gbm90IGFsbG93IGNvcnJ1cHRlZCBkYXRhLgogI2Vsc2UKICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IGQzNzIxNDAuLjFkMmQ3MTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtNzAsNiArNzEsMTMgQEAKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYVJlc291cmNlUGFyY2VsOwogCiBzdHJ1Y3QgTWVkaWFDb2RlYyA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSBEb21haW4geworICAgICAgICBET01BSU5fVU5LTk9XTiA9IDAsCisgICAgICAgIERPTUFJTl9WSURFTyA9IDEsCisgICAgICAgIERPTUFJTl9BVURJTyA9IDIsCisgICAgICAgIERPTUFJTl9JTUFHRSA9IDMKKyAgICB9OworCiAgICAgZW51bSBDb25maWd1cmVGbGFncyB7CiAgICAgICAgIENPTkZJR1VSRV9GTEFHX0VOQ09ERSAgICAgICAgICAgPSAxLAogICAgICAgICBDT05GSUdVUkVfRkxBR19VU0VfQkxPQ0tfTU9ERUwgID0gMiwKQEAgLTM5MCw2ICszOTgsNyBAQAogICAgIC8vIDxhbGwgc3RhdGVzPiAgICAgLT4gRW5hYmxlZE5vQnVmZmVyICB3aGVuIGZsdXNoCiAgICAgLy8gPGFsbCBzdGF0ZXM+ICAgICAtPiBFbmFibGVkTm9CdWZmZXIgIHdoZW4gc3RvcCB0aGVuIGNvbmZpZ3VyZSB0aGVuIHN0YXJ0CiAgICAgZW51bSBzdHJ1Y3QgVHVubmVsUGVla1N0YXRlIHsKKyAgICAgICAga0xlZ2FjeU1vZGUsCiAgICAgICAgIGtEaXNhYmxlZE5vQnVmZmVyLAogICAgICAgICBrRW5hYmxlZE5vQnVmZmVyLAogICAgICAgICBrRGlzYWJsZWRRdWV1ZWQsCkBAIC00MDEsNyArNDEwLDYgQEAKICAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5OwogCiAgICAgU3RhdGUgbVN0YXRlOwotICAgIHVpZF90IG1VaWQ7CiAgICAgYm9vbCBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcjsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKQEAgLTQzOCwxMyArNDQ2LDIwIEBACiAKICAgICBzcDxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk+IG1SZXNvdXJjZU1hbmFnZXJQcm94eTsKIAotICAgIGJvb2wgbUlzVmlkZW87CisgICAgRG9tYWluIG1Eb21haW47CiAgICAgQVN0cmluZyBtTG9nU2Vzc2lvbklkOwotICAgIGludDMyX3QgbVZpZGVvV2lkdGg7Ci0gICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKICAgICBpbnQzMl90IG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2U7CiAKKyAgICBpbnQzMl90IG1Db25maWdDb2xvclRyYW5zZmVyOworICAgIGJvb2wgbUhEUlN0YXRpY0luZm87CisgICAgYm9vbCBtSERSMTBQbHVzSW5mbzsKKyAgICB2b2lkIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOworICAgIGhkcl9mb3JtYXQgZ2V0SERSRm9ybWF0KGNvbnN0IGludDMyX3QgcHJvZmlsZSwgY29uc3QgaW50MzJfdCB0cmFuc2ZlciwKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSk7CisKICAgICAvLyBpbml0aWFsIGNyZWF0ZSBwYXJhbWV0ZXJzCiAgICAgQVN0cmluZyBtSW5pdE5hbWU7CiAKQEAgLTQ5Niw3ICs1MTEsNyBAQAogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBtQnVmZmVyQ2hhbm5lbDsKIAotICAgIFBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvciAqIG1QbGF5YmFja0R1cmF0aW9uQWNjdW11bGF0b3I7CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcj4gbVBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcjsKICAgICBib29sIG1Jc1N1cmZhY2VUb1NjcmVlbjsKIAogICAgIE1lZGlhQ29kZWMoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDQyMzdlOGMuLjc4NzkyYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zNjQsNyArMzY0LDcgQEAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjg6ICAgICAgICAgICByZXR1cm4gIk1haW44IjsKLSAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwOiAgICAgICAgICByZXR1cm4gIk1haW4xMEhEUiI7CisgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMDogICAgICAgICAgcmV0dXJuICJNYWluMTAiOwogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMDogICAgIHJldHVybiAiTWFpbjEwSERSMTAiOwogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXM6IHJldHVybiAiTWFpbjEwSERSUGx1cyI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKQEAgLTU0MCw2ICs1NDAsOSBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDMwICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDQ4ICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDYwICAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQxMjAgID0gMHgyMDA7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsOGszMCAgICA9IDB4NDAwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbDhrNjAgICAgPSAweDgwMDsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvbkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewogICAgIHN3aXRjaCAoaSkgewpAQCAtNTUyLDYgKzU1NSw5IEBACiAgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDMwOiByZXR1cm4gIlVoZDMwIjsKICAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNDg6IHJldHVybiAiVWhkNDgiOwogICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MDogcmV0dXJuICJVaGQ2MCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDEyMDogcmV0dXJuICJVaGQxMjAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWw4azMwOiAgcmV0dXJuICI4azMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsOGs2MDogIHJldHVybiAiOGs2MCI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwogICAgIH0KIH0KQEAgLTU4Niw5ICs1OTIsMTEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4ICAgICAgICAgICAgID0gMTI7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCAgICAgICAgICAgICA9IDExOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4OCAgICAgICAgICAgPSAxNDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTAgICAgICAgID0gMHg3RjAwQUFBMjsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODggICAgICAgICAgID0gMHg3RjAwQTAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODggICAgICAgICAgID0gMTY7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4ICAgICAgICAgICA9IDE1OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0NjRiaXRBQkdSRmxvYXQgICAgICAgICAgPSAweDdGMDAwRjE2OwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiAgICAgICAgICAgICAgPSAyOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0Q2JZQ3JZICAgICAgICAgICAgICAgICAgPSAyNzsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdENyWUNiWSAgICAgICAgICAgICAgICAgID0gMjg7CkBAIC02NDIsOSArNjUwLDExIEBACiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6ICAgICAgICAgICAgICAgcmV0dXJuICIyNGJpdEJHUjg4OCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6ICAgICAgICAgICAgICAgcmV0dXJuICIyNGJpdFJHQjg4OCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4ODogICAgICAgICAgICAgcmV0dXJuICIyNWJpdEFSR0IxODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOiAgICAgICAgICByZXR1cm4gIjMyYml0QUJHUjIxMDEwMTAiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRBQkdSODg4OCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFSR0I4ODg4IjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QkdSQTg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDY0Yml0QUJHUkZsb2F0OiAgICAgICAgICAgIHJldHVybiAiNjRiaXRBQkdSRmxvYXQiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDhiaXRSR0IzMzI6ICAgICAgICAgICAgICAgIHJldHVybiAiOGJpdFJHQjMzMiI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q2JZQ3JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDYllDclkiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdENyWUNiWTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ3JZQ2JZIjsKQEAgLTY3Nyw2ICs2ODcsNyBAQAogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIyU2VtaVBsYW5hciI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0RmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0NDRGbGV4aWJsZSI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQ6ICAgICAgICAgcmV0dXJuICJZVVY0NDRJbnRlcmxlYXZlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJZVVZQMDEwIjsKICAgICAgICAgY2FzZSBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICByZXR1cm4gIlFDT01fWVVWNDIwU2VtaVBsYW5hciI7CiAgICAgICAgIGNhc2UgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjogcmV0dXJuICJUSV9ZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwpAQCAtNjg0LDYgKzY5NSw3IEBACiB9CiAKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKK2NvbnN0ZXhwciBjaGFyIEZFQVRVUkVfRW5jb2RpbmdTdGF0aXN0aWNzW10gICAgID0gImVuY29kaW5nLXN0YXRpc3RpY3MiOwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9JbnRyYVJlZnJlc2hbXSA9ICJpbnRyYS1yZWZyZXNoIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfUGFydGlhbEZyYW1lW10gPSAicGFydGlhbC1mcmFtZSI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1FwQm91bmRzW10gPSAicXAtYm91bmRzIjsKQEAgLTczNyw2ICs3NDksMTQgQEAKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyA9IDM7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9UUkFOU0ZFUl9TVDIwODQgPSA2OwogCitjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfSSA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfUCA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfQiA9IDM7Citjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfVU5LTk9XTiA9IDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IFZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxfMSA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBWSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMX05PTkUgPSAwOworCiBjb25zdGV4cHIgY2hhciBLRVlfQUFDX0RSQ19BTEJVTV9NT0RFW10gPSAiYWFjLWRyYy1hbGJ1bS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUltdID0gImFhYy1kcmMtY3V0LWxldmVsIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUltdID0gImFhYy1kcmMtYm9vc3QtbGV2ZWwiOwpAQCAtNzg5LDEyICs4MDksMTQgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfRlBTX1RPX0VOQ09ERVJbXSA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlRbXSA9ICJtYXgtb3V0cHV0LWNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVJbXSA9ICJtYXgtcHRzLWdhcC10by1lbmNvZGVyIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfV0lEVEhbXSA9ICJtYXgtd2lkdGgiOwogY29uc3RleHByIGNoYXIgS0VZX01JTUVbXSA9ICJtaW1lIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9PUEVSQVRJTkdfUkFURVtdID0gIm9wZXJhdGluZy1yYXRlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSFtdID0gIm91dHB1dC1yZW9yZGVyLWRlcHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QQ01fRU5DT0RJTkdbXSA9ICJwY20tZW5jb2RpbmciOworY29uc3RleHByIGNoYXIgS0VZX1BJQ1RVUkVfVFlQRVtdID0gInBpY3R1cmUtdHlwZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfUElYRUxfQVNQRUNUX1JBVElPX0hFSUdIVFtdID0gInNhci1oZWlnaHQiOwogY29uc3RleHByIGNoYXIgS0VZX1BJWEVMX0FTUEVDVF9SQVRJT19XSURUSFtdID0gInNhci13aWR0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfUFJFUEVORF9IRUFERVJfVE9fU1lOQ19GUkFNRVNbXSA9ICJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyI7CkBAIC04MTEsNiArODMzLDggQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9USUxFX0hFSUdIVFtdID0gInRpbGUtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9USUxFX1dJRFRIW10gPSAidGlsZS13aWR0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfVFJBQ0tfSURbXSA9ICJ0cmFjay1pZCI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTFtdID0gInZpZGVvLWVuY29kaW5nLXN0YXRpc3RpY3MtbGV2ZWwiOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0FWRVJBR0VbXSA9ICJ2aWRlby1xcC1hdmVyYWdlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9CX01BWFtdID0gInZpZGVvLXFwLWItbWF4IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9CX01JTltdID0gInZpZGVvLXFwLWItbWluIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9JX01BWFtdID0gInZpZGVvLXFwLWktbWF4IjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IGQxZGYyY2EuLmI5MWM4NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTE2MywxMSArMTYzLDI4IEBACiAgICAgICAgICAgICB8fCAoRVJST1JfRFJNX1ZFTkRPUl9NSU4gPD0gZXJyICYmIGVyciA8PSBFUlJPUl9EUk1fVkVORE9SX01BWCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgU3RyQ3J5cHRvRXJyb3Ioc3RhdHVzX3QgZXJyKSB7CiAjZGVmaW5lIFNUQVRVU19DQVNFKFNUQVRVUykgXAogICAgIGNhc2UgU1RBVFVTOiAgICAgICAgICAgIFwKICAgICAgICAgcmV0dXJuICNTVEFUVVMKIAorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBTdHJNZWRpYUVycm9yKHN0YXR1c190IGVycikgeworICAgIHN3aXRjaChlcnIpIHsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfQUxSRUFEWV9DT05ORUNURUQpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9OT1RfQ09OTkVDVEVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfVU5LTk9XTl9IT1NUKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfQ0FOTk9UX0NPTk5FQ1QpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9JTyk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0NPTk5FQ1RJT05fTE9TVCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX01BTEZPUk1FRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX09VVF9PRl9SQU5HRSk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9VTlNVUFBPUlRFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzVG9TdHJpbmcoZXJyKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBTdHJDcnlwdG9FcnJvcihzdGF0dXNfdCBlcnIpIHsKICAgICBzd2l0Y2ggKGVycikgewogICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fVU5LTk9XTik7CiAgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9OT19MSUNFTlNFKTsKQEAgLTIwOSwxMCArMjI2LDEwIEBACiAgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9TVE9SQUdFX1JFQUQpOwogICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fU1RPUkFHRV9XUklURSk7CiAgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9aRVJPX1NVQlNBTVBMRVMpOwotI3VuZGVmIFNUQVRVU19DQVNFCiAgICAgfQogICAgIHJldHVybiBzdGF0dXNUb1N0cmluZyhlcnIpOwogfQorI3VuZGVmIFNUQVRVU19DQVNFCiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmluZGV4IGM4MDAxMmUuLjg4YzFmM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApAQCAtNjAsNiArNjAsOCBAQAogICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5RFZDQyAgICAgICAgICAgICAgPSAnZHZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlEVlZDICAgICAgICAgICAgICA9ICdkdnZjJywgIC8vIHJhdyBkYXRhCisgICAga0tleURWV0MgICAgICAgICAgICAgID0gJ2R2d2MnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QVYxQyAgICAgICAgICAgICAgPSAnYXYxYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVRodW1ibmFpbEFWMUMgICAgID0gJ3RhdjEnLCAgLy8gcmF3IGRhdGEKQEAgLTI4Myw2ICsyODUsOCBAQAogICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCiAgICAga1R5cGVBVjFDICAgICAgICA9ICdhdjFjJywKICAgICBrVHlwZURWQ0MgICAgICAgID0gJ2R2Y2MnLAorICAgIGtUeXBlRFZWQyAgICAgICAgPSAnZHZ2YycsCisgICAga1R5cGVEVldDICAgICAgICA9ICdkdndjJywKICAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAogICAgIGtUeXBlSENPUyAgICAgICAgPSAnaGNvcycsCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oCmluZGV4IGI4YTNjMTAuLjA2YjljOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmgKQEAgLTMwLDcgKzMwLDggQEAKICAgICBQcm9jZXNzSW5mbygpOwogCiAgICAgdmlydHVhbCBib29sIGdldFByaW9yaXR5KGludCBwaWQsIGludCogcHJpb3JpdHkpOwotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCBwaWQpOworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFRydXN0ZWQoaW50IHBpZCk7CisgICAgdmlydHVhbCBib29sIGlzUGlkVWlkVHJ1c3RlZChpbnQgcGlkLCBpbnQgdWlkKTsKICAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKaW5kZXggOTI2MDE4MS4uYjdmYzg1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaApAQCAtMjMsNyArMjMsOCBAQAogCiBzdHJ1Y3QgUHJvY2Vzc0luZm9JbnRlcmZhY2UgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgdmlydHVhbCBib29sIGdldFByaW9yaXR5KGludCBwaWQsIGludCogcHJpb3JpdHkpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgcGlkKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzUGlkVHJ1c3RlZChpbnQgcGlkKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzUGlkVWlkVHJ1c3RlZChpbnQgcGlkLCBpbnQgdWlkKSA9IDA7CiAgICAgdmlydHVhbCBib29sIG92ZXJyaWRlUHJvY2Vzc0luZm8oaW50IHBpZCwgaW50IHByb2NTdGF0ZSwgaW50IG9vbVNjb3JlKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShpbnQgcGlkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaAppbmRleCBmY2ZjYmVjLi5hNGY1MTJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaApAQCAtMjEsNyArMjEsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CituYW1lc3BhY2UgZ3VpIHsKKyAgICBjbGFzcyBJU3VyZmFjZUNvbXBvc2VyOworfQogCiBzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CiAgICAgVmlkZW9GcmFtZVNjaGVkdWxlcigpOwpAQCAtMzIsNyArMzQsNyBAQAogCiBwcml2YXRlOgogICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7CisgICAgc3A8Z3VpOjpJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGZiZmE4Y2MuLjI4M2RmMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTU0LDE2ICs1NCwyMSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZS9tcGVnMnRzIl0sCiAKICAgICB3aG9sZV9zdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCiAgICAgXSwKIAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9zZGtfZGVmYXVsdHMiLAorCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KICAgICB0YXJnZXQ6IHsKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKQEAgLTcxLDEwICs3NiwxOSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9oZWFkZXJzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ERU5BQkxFX0NSWVBUTyIsCkBAIC05MSw2ICsxMDUsNyBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfbm9jcnlwdG8iLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCiAgICAgXSwKICAgICBhcGV4X2F2YWlsYWJsZTogWwogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0FUU1BhcnNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9BVFNQYXJzZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvQ2FzTWFuYWdlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvQ2FzTWFuYWdlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0VTUXVldWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0VTUXVldWUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9TYW1wbGVEZWNyeXB0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL1NhbXBsZURlY3J5cHRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL1NhbXBsZURlY3J5cHRvci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9TYW1wbGVEZWNyeXB0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icAppbmRleCA0NjRiMDM5Li4zNGE4ZDNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icApAQCAtNTcsMTEgKzU3LDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcAppbmRleCA3OWMyMzNiLi45ZTI0YTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcApAQCAtMjYsOSArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0KLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgotI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKICNpbmNsdWRlICJNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcAppbmRleCBlOGZlZTQyLi40ODI3ZDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpbmNsdWRlIDxzc3RyZWFtPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE9NWFN0b3JlOjpPTVhTdG9yZSgpIHsKQEAgLTk5LDkgKzEwMSwzNSBAQAogICAgIH0KIH0KIAorc3RhdGljIGludCBnZXRGaXJzdEFwaUxldmVsKCkgeworICAgIGludCBib2FyZEFwaUxldmVsID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCIsIDApOworICAgIGlmIChib2FyZEFwaUxldmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGJvYXJkQXBpTGV2ZWw7CisgICAgfQorCisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIF9fQU5EUk9JRF9BUElfVF9fKTsKK30KKworc3RhdGljIGJvb2wgaXNUVigpIHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBrSXNUdiA9IFtdKCkgeworICAgICAgICBzdGQ6OnN0cmluZyBjaGFyYWN0ZXJpc3RpY3MgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8uYnVpbGQuY2hhcmFjdGVyaXN0aWNzIiwgIiIpOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nIGl0ZW07IHN0ZDo6Z2V0bGluZShzcywgaXRlbSwgJywnKTsgKSB7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSAidHYiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0oKTsKKyAgICByZXR1cm4ga0lzVHY7Cit9CisKIHZvaWQgT01YU3RvcmU6OmFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCisgICAgYm9vbCB0eXBlVFYgPSBpc1RWKCk7CisgICAgaW50IGZpcnN0QXBpTGV2ZWwgPSBnZXRGaXJzdEFwaUxldmVsKCk7CisKICAgICBPTVhfVTMyIGluZGV4ID0gMDsKIAogICAgIGNoYXIgbmFtZVsxMjhdOwpAQCAtMTEwLDYgKzEzOCwzMiBAQAogICAgICAgICAgICAgICAgICAgICBuYW1lLCBzaXplb2YobmFtZSksIGluZGV4KyspKSA9PSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIFN0cmluZzggbmFtZTgobmFtZSk7CiAKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+IHJvbGVzOworICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IHBsdWdpbi0+Z2V0Um9sZXNPZkNvbXBvbmVudChuYW1lLCAmcm9sZXMpOworICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChTdHJpbmc4IHJvbGUgOiByb2xlcykgeworICAgICAgICAgICAgICAgIGlmIChyb2xlLmZpbmQoInZpZGVvX2RlY29kZXIiKSAhPSAtMSB8fCByb2xlLmZpbmQoInZpZGVvX2VuY29kZXIiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RBcGlMZXZlbCA+PSBfX0FORFJPSURfQVBJX1RfXykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdHlwZVRWICYmIGZpcnN0QXBpTGV2ZWwgPj0gX19BTkRST0lEX0FQSV9TX18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJvbGUuZmluZCgiYXVkaW9fZGVjb2RlciIpICE9IC0xIHx8IHJvbGUuZmluZCgiYXVkaW9fZW5jb2RlciIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEFwaUxldmVsID49IF9fQU5EUk9JRF9BUElfVF9fKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkobmFtZTgpID49IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJBIGNvbXBvbmVudCBvZiBuYW1lICclcycgYWxyZWFkeSBleGlzdHMsIGlnbm9yaW5nIHRoaXMgb25lLiIsCiAgICAgICAgICAgICAgICAgIG5hbWU4LnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggODNjYzgwZS4uMTU5ZmQxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTQzLDcgKzQzLDYgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKLSAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDlhN2JhZDkuLjNjMDBhMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCi0gICAgY2xhbmc6IHRydWUsCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdlcnJvcj1mb3JtYXQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKaW5kZXggYmIyYTIzOC4uZTc3MzAzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuY3BwCkBAIC0xOCw5ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIkFBTVJBc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCi0KLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKaW5kZXggMzBjZGJjOS4uMmY1MTZkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAjZGVmaW5lIExPR19UQUcgIkFBVkNBc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBQVZDQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcAppbmRleCAzNDM2ZTk1Li41ODRiNGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcApAQCAtMTcsOSArMTcsOSBAQAogI2RlZmluZSBMT0dfVEFHICJBSDI2M0Fzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFIMjYzQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKaW5kZXggYjI0MDMzOS4uYmI0MmQxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKQEAgLTE4LDE0ICsxOCwxNCBAQAogI2RlZmluZSBMT0dfVEFHICJBSEVWQ0Fzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFIRVZDQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgogCisjaW5jbHVkZSA8SGV2Y1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9IZXZjVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAppbmRleCAwOTg4Nzc0Li4yMTAxZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcApAQCAtMTgsMTAgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIkFNUEVHMlRTQXNzZW1ibGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQU1QRUcyVFNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggNDMwMmFlZS4uMGZjMDNhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTE3LDkgKzE3LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQU1QRUc0QXVkaW9Bc3NlbWJsZXIiCiAKLSNpbmNsdWRlICJBTVBFRzRBdWRpb0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKaW5kZXggN2JkMzNjMS4uMWM4ZWVmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCkBAIC0xOCwxMCArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTIwNCw3ICsyMDQsNyBAQAogfTsKIAogYm9vbCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjppbml0Q2hlY2soKSB7Ci0gICAgaWYobVNpemVMZW5ndGggPT0gMCB8fCBtSW5kZXhMZW5ndGggPT0gMCB8fCBtSW5kZXhEZWx0YUxlbmd0aCA9PSAwKSB7CisgICAgaWYobUlzR2VuZXJpYyAmJiAobVNpemVMZW5ndGggPT0gMCB8fCBtSW5kZXhMZW5ndGggPT0gMCB8fCBtSW5kZXhEZWx0YUxlbmd0aCA9PSAwKSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyNDc3NzUzNyIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggMTY5ZGY0Ni4uZGI2MzE4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0xOCwxMCArMTgsOSBAQAogI2RlZmluZSBMT0dfVEFHICJBUGFja2V0U291cmNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgotCi0jaW5jbHVkZSAiQVJhd0F1ZGlvQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAKICNpbmNsdWRlIDxjdHlwZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcAppbmRleCA1MmFhM2EwLi5iOTg2OWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjZGVmaW5lIExPR19UQUcgIkFSVFBBc3NlbWJsZXIiCi0jaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggMGJkMzQyYS4uYTYxZjQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTE4LDkgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBDb25uZWN0aW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MSw2ICs0MiwxMCBAQAogICAgIHJldHVybiBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOwogfQogCitzdGF0aWMgdWludDMyX3QgdTI0YXQoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiB1MTZhdChkYXRhKSA8PCAxNiB8IGRhdGFbMl07Cit9CisKIHN0YXRpYyB1aW50MzJfdCB1MzJhdChjb25zdCB1aW50OF90ICpkYXRhKSB7CiAgICAgcmV0dXJuIHUxNmF0KGRhdGEpIDw8IDE2IHwgdTE2YXQoJmRhdGFbMl0pOwogfQpAQCAtNTU4LDYgKzU2Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG4gIT0gKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzZW5kIFJUQ1AgcmVjZWl2ZXIgcmVwb3J0ICglcykuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID49IDAgPyAiY29ubmVjdGlvbiBnb25lIiA6IHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgICsraXQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtODc2LDExICs4ODIsMTUgQEAKICAgICAgICAgc3dpdGNoIChkYXRhWzFdKSB7CiAgICAgICAgICAgICBjYXNlIDIwMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJzZVNSKHMsIGRhdGEsIGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgcGFyc2VTZW5kZXJSZXBvcnQocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSAyMDE6ICAvLyBSUgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnNlUmVjZWl2ZXJSZXBvcnQocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgMjAyOiAgLy8gU0RFUwogICAgICAgICAgICAgY2FzZSAyMDQ6ICAvLyBBUFAKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTkzOSwxOCArOTQ5LDQ0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VTUigKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVNlbmRlclJlcG9ydCgKICAgICAgICAgU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBzaXplX3QgUkMgPSBkYXRhWzBdICYgMHgxZjsKLQotICAgIGlmIChzaXplIDwgKDcgKyBSQyAqIDYpICogNCkgewotICAgICAgICAvLyBQYWNrZXQgdG9vIHNob3J0IGZvciB0aGUgbWluaW1hbCBTUiBoZWFkZXIuCisgICAgQUxPR19BU1NFUlQoc2l6ZSA+PSAxLCAicGFyc2VTZW5kZXJSZXBvcnQ6IGludmFsaWQgcGFja2V0IHNpemUuIik7CisgICAgc2l6ZV90IHJlY2VwdGlvblJlcG9ydENvdW50ID0gZGF0YVswXSAmIDB4MWY7CisgICAgaWYgKHNpemUgPCAoNyArIChyZWNlcHRpb25SZXBvcnRDb3VudCAqIDYpKSAqIDQpIHsKKyAgICAgICAgLy8gUGFja2V0IHRvbyBzaG9ydCBmb3IgdGhlIG1pbmltYWwgc2VuZGVyIHJlcG9ydCBoZWFkZXIuCiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKyAgICBpbnQ2NF90IHJlY3ZUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIHVpbnQzMl90IHNlbmRlcklkID0gdTMyYXQoJmRhdGFbNF0pOwogICAgIHVpbnQ2NF90IG50cFRpbWUgPSB1NjRhdCgmZGF0YVs4XSk7CiAgICAgdWludDMyX3QgcnRwVGltZSA9IHUzMmF0KCZkYXRhWzE2XSk7CisgICAgdWludDMyX3QgcGt0Q291bnQgPSB1MzJhdCgmZGF0YVsyMF0pOworICAgIHVpbnQzMl90IG9jdENvdW50ID0gdTMyYXQoJmRhdGFbMjRdKTsKKworICAgIEFMT0dEKCJTUiByZWNlaXZlZDogc3NyYz0weCUwOHgsIHJ0cFRpbWUldSA9PSBudHBUaW1lICVsbHUsIHBrdD0ldSwgb2N0PSV1IiwKKyAgICAgICAgICAgIHNlbmRlcklkLCBydHBUaW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW50cFRpbWUsIHBrdENvdW50LCBvY3RDb3VudCk7CisKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIHNlbmRlcklkKTsKKyAgICBzb3VyY2UtPnRpbWVVcGRhdGUocmVjdlRpbWVVcywgcnRwVGltZSwgbnRwVGltZSk7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZWNlcHRpb25SZXBvcnRDb3VudDsgaSsrKSB7CisgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMjggKyAoaSAqIDI0KTsKKyAgICAgICAgcGFyc2VSZWNlcHRpb25SZXBvcnRCbG9jayhzLCByZWN2VGltZVVzLCBzZW5kZXJJZCwgZGF0YSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVJlY2VpdmVyUmVwb3J0KAorICAgICAgICBTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dfQVNTRVJUKHNpemUgPj0gMSwgInBhcnNlUmVjZWl2ZXJSZXBvcnQ6IGludmFsaWQgcGFja2V0IHNpemUuIik7CisgICAgc2l6ZV90IHJlY2VwdGlvblJlcG9ydENvdW50ID0gZGF0YVswXSAmIDB4MWY7CisgICAgaWYgKHNpemUgPCAoMiArIChyZWNlcHRpb25SZXBvcnRDb3VudCAqIDYpKSAqIDQpIHsKKyAgICAgICAgLy8gUGFja2V0IHRvbyBzaG9ydCBmb3IgdGhlIG1pbmltYWwgcmVjZWl2ZXIgcmVwb3J0IGhlYWRlci4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogI2lmIDAKICAgICBBTE9HSSgiWFhYIHRpbWVVcGRhdGU6IHNzcmM9MHglMDh4LCBydHBUaW1lICV1ID09IG50cFRpbWUgJS4zZiIsCkBAIC05NTgsMTAgKzk5NCw0MCBAQAogICAgICAgICAgcnRwVGltZSwKICAgICAgICAgIChudHBUaW1lID4+IDMyKSArIChkb3VibGUpKG50cFRpbWUgJiAweGZmZmZmZmZmKSAvICgxbGwgPDwgMzIpKTsKICNlbmRpZgorICAgIGludDY0X3QgcmVjdlRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgdWludDMyX3Qgc2VuZGVySWQgPSB1MzJhdCgmZGF0YVs0XSk7CiAKLSAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIGlkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2VwdGlvblJlcG9ydENvdW50OyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBvZmZzZXQgPSA4ICsgKGkgKiAyNCk7CisgICAgICAgIHBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2socywgcmVjdlRpbWVVcywgc2VuZGVySWQsIGRhdGEgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOworICAgIH0KIAotICAgIHNvdXJjZS0+dGltZVVwZGF0ZShydHBUaW1lLCBudHBUaW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2soCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3Qgc2VuZGVySWQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR19BU1NFUlQoc2l6ZSA+PSAyNCwgInBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2s6IGludmFsaWQgcGFja2V0IHNpemUuIik7CisgICAgaWYgKHNpemUgPCAyNCkgeworICAgICAgICAvLyByZW1haW5pbmcgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gcmVjZXB0aW9uIHJlcG9ydCBibG9jayBzaXplLgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdWludDMyX3QgcmJJZCA9IHUzMmF0KCZkYXRhWzBdKTsKKyAgICB1aW50MzJfdCBmTG9zdCA9IGRhdGFbNF07CisgICAgaW50MzJfdCBjdW1Mb3N0ID0gdTI0YXQoJmRhdGFbNV0pOworICAgIHVpbnQzMl90IGVoU2VxID0gdTMyYXQoJmRhdGFbOF0pOworICAgIHVpbnQzMl90IGppdHRlciA9IHUzMmF0KCZkYXRhWzEyXSk7CisgICAgdWludDMyX3QgbHNyID0gdTMyYXQoJmRhdGFbMTZdKTsKKyAgICB1aW50MzJfdCBkbHNyID0gdTMyYXQoJmRhdGFbMjBdKTsKKworICAgIEFMT0dEKCJSZWNlcHRpb24gUmVwb3J0IEJsb2NrOiB0OiVsbHUgc2lkOiV1IHJpZDoldSBmbDoldSBjbDoldSBoczoldSBqdDoldSBsc3I6JXUgZGxzcjoldSIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlY3ZUaW1lVXMsIHNlbmRlcklkLCByYklkLCBmTG9zdCwgY3VtTG9zdCwKKyAgICAgICAgICAgIGVoU2VxLCBqaXR0ZXIsIGxzciwgZGxzcik7CisgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gZmluZFNvdXJjZShzLCBzZW5kZXJJZCk7CisgICAgc3A8UmVjZXB0aW9uUmVwb3J0QmxvY2s+IHJyYiA9IG5ldyBSZWNlcHRpb25SZXBvcnRCbG9jaygKKyAgICAgICAgICAgIHJiSWQsIGZMb3N0LCBjdW1Mb3N0LCBlaFNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgIHNvdXJjZS0+cHJvY2Vzc1JlY2VwdGlvblJlcG9ydEJsb2NrKHJlY3ZUaW1lVXMsIHNlbmRlcklkLCBycmIpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCmluZGV4IGU1YWNiMDYuLmRhZTQ2ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCkBAIC0xOCw3ICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJBUlRQU2Vzc2lvbiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFSVFBTZXNzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0yOSw5ICszMiw2IEBACiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCi0jaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCmluZGV4IDM4YTM3MGIuLjcxN2Q4YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBTb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKLSNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQUFWQ0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFIRVZDQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQUgyNjNBc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJBTVBFRzJUU0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0xMzIsMTAgKzEzMiwxMCBAQAogICAgIH0KIH0KIAotdm9pZCBBUlRQU291cmNlOjp0aW1lVXBkYXRlKHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKK3ZvaWQgQVJUUFNvdXJjZTo6dGltZVVwZGF0ZShpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKICAgICBtTGFzdFNyUnRwVGltZSA9IHJ0cFRpbWU7CiAgICAgbUxhc3RTck50cFRpbWUgPSBudHBUaW1lOwotICAgIG1MYXN0U3JVcGRhdGVUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIG1MYXN0U3JVcGRhdGVUaW1lVXMgPSByZWN2VGltZVVzOwogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoInRpbWUtdXBkYXRlIiwgdHJ1ZSk7CkBAIC0xNDMsNyArMTQzLDMwIEBACiAgICAgbm90aWZ5LT5zZXRJbnQ2NCgibnRwLXRpbWUiLCBudHBUaW1lKTsKICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgUlRDUF9TUik7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgbUxhc3RTclVwZGF0ZVRpbWVVcyk7CisgICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgcmVjdlRpbWVVcyk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6cHJvY2Vzc1JlY2VwdGlvblJlcG9ydEJsb2NrKAorICAgICAgICBpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHNlbmRlcklkLCBzcDxSZWNlcHRpb25SZXBvcnRCbG9jaz4gcnJiKSB7CisgICAgbUxhc3RSclVwZGF0ZVRpbWVVcyA9IHJlY3ZUaW1lVXM7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgIC8vIEEgUmVjZXB0aW9uIFJlcG9ydCBCbG9jayAoUlJCKSBjYW4gYmUgaW5jbHVkZWQgaW4gYm90aCBTZW5kZXIgUmVwb3J0IGFuZCBSZWNlaXZlciBSZXBvcnQuCisgICAgLy8gQnV0IGl0IG1lYW5zICdQYWNrZXQgUmVjZXB0aW9uIFJlcG9ydCcgYWN0dWFsbHkuCisgICAgLy8gU28gdGhhdCwgd2Ugd2lsbCByZXBvcnQgUlJCIGFzIFJSIHNpbmNlIHRoZXJlIGlzIG5vIG1lYW5pbmcgZGlmZmVyZW5jZQorICAgIC8vIGJldHdlZW4gUlJCKFJlY2VwdGlvbiBSZXBvcnQgQmxvY2spIGFuZCBSUihSZWNlaXZlciBSZXBvcnQpLgorICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIFJUQ1BfUlIpOworICAgIG5vdGlmeS0+c2V0SW50NjQoInJlY3YtdGltZS11cyIsIHJlY3ZUaW1lVXMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnItc3NyYyIsIHNlbmRlcklkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1zc3JjIiwgcnJiLT5zc3JjKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1mcmFjdGlvbiIsIHJyYi0+ZnJhY3Rpb24pOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWxvc3QiLCBycmItPmxvc3QpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWxhc3RTZXEiLCBycmItPmxhc3RTZXEpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWppdHRlciIsIHJyYi0+aml0dGVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1sc3IiLCBycmItPmxzcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ycmItZGxzciIsIHJyYi0+ZGxzcik7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTQ1Myw3ICs0NzYsOCBAQAogICAgIGRhdGFbMThdID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDgpICYgMHhmZjsKICAgICBkYXRhWzE5XSA9IG1IaWdoZXN0U2VxTnVtYmVyICYgMHhmZjsKIAotICAgIHVpbnQzMl90IGppdHRlclRpbWUgPSAwOworICAgIHVpbnQzMl90IGppdHRlclRpbWVNcyA9ICh1aW50MzJfdClnZXRJbnRlckFycml2YWxKaXR0ZXJUaW1lTXMoKTsKKyAgICB1aW50MzJfdCBqaXR0ZXJUaW1lID0gaml0dGVyVGltZU1zICogbUNsb2NrUmF0ZSAvIDEwMDA7CiAgICAgZGF0YVsyMF0gPSBqaXR0ZXJUaW1lID4+IDI0OyAgICAvLyBJbnRlcmFycml2YWwgaml0dGVyCiAgICAgZGF0YVsyMV0gPSAoaml0dGVyVGltZSA+PiAxNikgJiAweGZmOwogICAgIGRhdGFbMjJdID0gKGppdHRlclRpbWUgPj4gOCkgJiAweGZmOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKaW5kZXggMTFjN2FlYi4uODk5MGYwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBXcml0ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUlRQV3JpdGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGMzM2JmM2YuLmFhYjYzYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTE4LDggKzE4LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQVJUU1BDb25uZWN0aW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oPgogCiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9IVFRQQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCmluZGV4IDE2N2Y3YTQuLjkyMTBhZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTE4LDEwICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJBUmF3QXVkaW9Bc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUmF3QXVkaW9Bc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCA1YjViNGIxLi4yMTdlY2E3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVNlc3Npb25EZXNjcmlwdGlvbiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKaW5kZXggMzRkMTc4OC4uNWI2M2NjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icApAQCAtNDcsMTAgKzQ3LDkgQEAKICAgICAgICAgImxpYm1lZGlhIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3BfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGFyY2g6IHsKQEAgLTczLDYgKzcyLDE4IEBACiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCiAKQEAgLTkwLDYgKzEwMSwxMCBAQAogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAorLy8gMjAyMi0wMS0xMzogdGhpcyBpcyBzdGFsZTsgaXQncyBiZWVuIGRpc2FibGVkIGZvciA1IHllYXJzLgorLy8gdGVzdCByZWZlcmVuY2VzIFVEUFB1c2hlciBhbmQgQVJUUFNlc3Npb24sIG5laXRoZXIgb2Ygd2hpY2ggaXMgYnVpbHQgaW50bworLy8gbGlic3RhZ2VmcmlnaHRfcnRzcAorLy8KIGNjX3Rlc3QgewogICAgIG5hbWU6ICJydHBfdGVzdCIsCiAgICAgZ3Rlc3Q6IGZhbHNlLApAQCAtMTA4LDEwICsxMjMsOSBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvY21kcy9zdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3BfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5jcHAKaW5kZXggOTNiNWE4My4uOTNhZmU5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkppdHRlckNhbGMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJKaXR0ZXJDYWxjdWxhdG9yLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmg+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KIApAQCAtMzgsMTQgKzM4LDEzIEBACiAgICAgbUludGVyQXJyaXZhbEppdHRlclVzID0gaW50ZXI7CiB9CiAKLXZvaWQgSml0dGVyQ2FsYzo6cHV0QmFzZURhdGEoaW50NjRfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lVXMpIHsKLSAgICAvLyBBIFJUUCB0aW1lIHdyYXBzIGFyb3VuZCBhZnRlciBVSU5UMzJfTUFYLiBXZSBtdXN0IGNvbnNpZGVyIHRoaXMgY2FzZS4KLSAgICBjb25zdCBpbnQ2NF90IFVJTlQzMl9NU0IgPSAweDgwMDAwMDAwOwotICAgIGludDY0X3Qgb3ZlcmZsb3dNYXNrID0gKG1GaXJzdFRpbWVTdGFtcCAmIFVJTlQzMl9NU0IgJiB+cnRwVGltZSkgPDwgMTsKLSAgICBpbnQ2NF90IHRlbXBSdHBUaW1lID0gb3ZlcmZsb3dNYXNrIHwgcnRwVGltZTsKK3ZvaWQgSml0dGVyQ2FsYzo6cHV0QmFzZURhdGEodWludDMyX3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzKSB7CisgICAgLy8gQSBSVFAgdGltZSB3cmFwcyBhcm91bmQgYWZ0ZXIgVUlOVDMyX01BWC4gT3ZlcmZsb3cgY2FuIHByZXNlbnQuCisgICAgdWludDMyX3QgZGlmZiA9IDA7CisgICAgX19idWlsdGluX3VzdWJfb3ZlcmZsb3cocnRwVGltZSwgbUZpcnN0VGltZVN0YW1wLCAmZGlmZik7CiAKICAgICAvLyBCYXNlIGppdHRlciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdmFyaW91cwotICAgIGludDY0X3Qgc2NoZWR1bGVkVGltZVVzID0gKHRlbXBSdHBUaW1lIC0gKGludDY0X3QpbUZpcnN0VGltZVN0YW1wKSAqIDEwMDAwMDBsbCAvIG1DbG9ja1JhdGU7CisgICAgaW50NjRfdCBzY2hlZHVsZWRUaW1lVXMgPSAoKGludDMyX3QpZGlmZikgKiAxMDAwMDAwbGwgLyBtQ2xvY2tSYXRlOwogICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFycml2YWxUaW1lVXMgLSBtRmlyc3RBcnJpdmFsVGltZVVzOwogICAgIGludDY0X3QgY29ycmVjdGlvblRpbWVVcyA9IGVsYXBzZWRUaW1lVXMgLSBzY2hlZHVsZWRUaW1lVXM7IC8vIGFkZGl0aW9uYWwgcHJvcGFnYXRpb24gZGVsYXk7CiAgICAgbUJhc2VKaXR0ZXJVcyA9IChtQmFzZUppdHRlclVzICogMTUgKyBjb3JyZWN0aW9uVGltZVVzKSAvIDE2OwpAQCAtNTMsMTggKzUyLDEzIEBACiAgICAgICAgICAgICAobG9uZyBsb25nKW1CYXNlSml0dGVyVXMsIChsb25nIGxvbmcpY29ycmVjdGlvblRpbWVVcyk7CiB9CiAKLXZvaWQgSml0dGVyQ2FsYzo6cHV0SW50ZXJBcnJpdmFsRGF0YShpbnQ2NF90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcykgewotICAgIGNvbnN0IGludDY0X3QgVUlOVDMyX01TQiA9IDB4ODAwMDAwMDA7Ci0gICAgaW50NjRfdCB0ZW1wUnRwVGltZSA9IHJ0cFRpbWU7Ci0gICAgaW50NjRfdCB0ZW1wTGFzdFRpbWVTdGFtcCA9IG1MYXN0VGltZVN0YW1wOwotCi0gICAgLy8gQSBSVFAgdGltZSB3cmFwcyBhcm91bmQgYWZ0ZXIgVUlOVDMyX01BWC4gV2UgbXVzdCBjb25zaWRlciB0aGlzIGNhc2UuCi0gICAgaW50NjRfdCBvdmVyZmxvd01hc2sgPSAobUxhc3RUaW1lU3RhbXAgXiBydHBUaW1lKSAmIFVJTlQzMl9NU0I7Ci0gICAgdGVtcFJ0cFRpbWUgfD0gKChvdmVyZmxvd01hc2sgJiB+cnRwVGltZSkgPDwgMSk7Ci0gICAgdGVtcExhc3RUaW1lU3RhbXAgfD0gKChvdmVyZmxvd01hc2sgJiB+bUxhc3RUaW1lU3RhbXApIDw8IDEpOwordm9pZCBKaXR0ZXJDYWxjOjpwdXRJbnRlckFycml2YWxEYXRhKHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcykgeworICAgIC8vIEEgUlRQIHRpbWUgd3JhcHMgYXJvdW5kIGFmdGVyIFVJTlQzMl9NQVguIE92ZXJmbG93IGNhbiBwcmVzZW50LgorICAgIHVpbnQzMl90IGRpZmYgPSAwOworICAgIF9fYnVpbHRpbl91c3ViX292ZXJmbG93KHJ0cFRpbWUsIG1MYXN0VGltZVN0YW1wLCAmZGlmZik7CiAKICAgICAvLyA2LjQuMSBvZiBSRkMzNTUwIGRlZmluZXMgdGhpcyBpbnRlcmFycml2YWwgaml0dGVyIHZhbHVlLgotICAgIGludDY0X3QgZGlmZlRpbWVTdGFtcFVzID0gYWJzKHRlbXBSdHBUaW1lIC0gdGVtcExhc3RUaW1lU3RhbXApICogMTAwMDAwMGxsIC8gbUNsb2NrUmF0ZTsKKyAgICBpbnQ2NF90IGRpZmZUaW1lU3RhbXBVcyA9IGFicygoaW50MzJfdClkaWZmKSAqIDEwMDAwMDBsbCAvIG1DbG9ja1JhdGU7CiAgICAgaW50NjRfdCBkaWZmQXJyaXZhbFVzID0gYXJyaXZhbFRpbWVVcyAtIG1MYXN0QXJyaXZhbFRpbWVVczsgLy8gQ2FuJ3QgYmUgbWludXMKICAgICBBTE9HVigiZGlmZlRpbWVTdGFtcFVzICVsbGQgXHRcdCBkaWZmQXJyaXZhbFVzICVsbGQiLAogICAgICAgICAgICAgKGxvbmcgbG9uZylkaWZmVGltZVN0YW1wVXMsIChsb25nIGxvbmcpZGlmZkFycml2YWxVcyk7CkBAIC03Miw3ICs2Niw3IEBACiAgICAgaW50NjRfdCB2YXJpYW5jZVVzID0gZGlmZkFycml2YWxVcyAtIGRpZmZUaW1lU3RhbXBVczsKICAgICBtSW50ZXJBcnJpdmFsSml0dGVyVXMgPSAobUludGVyQXJyaXZhbEppdHRlclVzICogMTUgKyBhYnModmFyaWFuY2VVcykpIC8gMTY7CiAKLSAgICBtTGFzdFRpbWVTdGFtcCA9ICh1aW50MzJfdClydHBUaW1lOworICAgIG1MYXN0VGltZVN0YW1wID0gcnRwVGltZTsKICAgICBtTGFzdEFycml2YWxUaW1lVXMgPSBhcnJpdmFsVGltZVVzOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015VHJhbnNtaXR0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQ0YWZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1ZX1RSQU5TTUlUVEVSX0hfCi0KLSNkZWZpbmUgTVlfVFJBTlNNSVRURVJfSF8KLQotI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi0jaWZkZWYgQU5EUk9JRAotI2luY2x1ZGUgIlZpZGVvU291cmNlLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNkZWZpbmUgVFJBQ0tfU1VGRklYICAgICJ0cmFja2lkPTEiCi0jZGVmaW5lIFBUICAgICAgICAgICAgICA5NgotI2RlZmluZSBQVF9TVFIgICAgICAgICAgIjk2IgotCi0jZGVmaW5lIFVTRVJOQU1FICAgICAgICAiYmNhc3QiCi0jZGVmaW5lIFBBU1NXT1JEICAgICAgICAidGVzdCIKLQotc3RhdGljIGludCB1bmlmb3JtUmFuZChpbnQgbGltaXQpIHsKLSAgICByZXR1cm4gKChkb3VibGUpcmFuZCgpICogbGltaXQpIC8gUkFORF9NQVg7Ci19Ci0KLXN0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7Ci0gICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7Ci0KLSAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7Ci0gICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKLSAgICB9Ci19Ci0KLXN0cnVjdCBNeVRyYW5zbWl0dGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBNeVRyYW5zbWl0dGVyKGNvbnN0IGNoYXIgKnVybCwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKLSAgICAgICAgOiBtU2VydmVyVVJMKHVybCksCi0gICAgICAgICAgbUxvb3Blcihsb29wZXIpLAotICAgICAgICAgIG1Db25uKG5ldyBBUlRTUENvbm5lY3Rpb24pLAotICAgICAgICAgIG1Db25uZWN0ZWQoZmFsc2UpLAotICAgICAgICAgIG1BdXRoVHlwZShOT05FKSwKLSAgICAgICAgICBtUlRQU29ja2V0KC0xKSwKLSAgICAgICAgICBtUlRDUFNvY2tldCgtMSksCi0gICAgICAgICAgbVNvdXJjZUlEKHJhbmQoKSksCi0gICAgICAgICAgbVNlcU5vKHVuaWZvcm1SYW5kKDY1NTM2KSksCi0gICAgICAgICAgbVJUUFRpbWVCYXNlKHJhbmQoKSksCi0gICAgICAgICAgbU51bVNhbXBsZXNTZW50KDApLAotICAgICAgICAgIG1OdW1SVFBTZW50KDApLAotICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50KDApLAotICAgICAgICAgIG1MYXN0UlRQVGltZSgwKSwKLSAgICAgICAgICBtTGFzdE5UUFRpbWUoMCkgewotICAgICAgICBtU3RyZWFtVVJMID0gbVNlcnZlclVSTDsKLSAgICAgICAgbVN0cmVhbVVSTC5hcHBlbmQoIi9iYXpvbmcuc2RwIik7Ci0KLSAgICAgICAgbVRyYWNrVVJMID0gbVN0cmVhbVVSTDsKLSAgICAgICAgbVRyYWNrVVJMLmFwcGVuZCgiLyIpOwotICAgICAgICBtVHJhY2tVUkwuYXBwZW5kKFRSQUNLX1NVRkZJWCk7Ci0KLSAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwotICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvbm4pOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwotICAgICAgICBtQ29ubi0+Y29ubmVjdChtU2VydmVyVVJMLmNfc3RyKCksIHJlcGx5KTsKLQotI2lmZGVmIEFORFJPSUQKLSAgICAgICAgaW50IHdpZHRoID0gNjQwOwotICAgICAgICBpbnQgaGVpZ2h0ID0gNDgwOwotCi0gICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBuZXcgVmlkZW9Tb3VyY2Uod2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IGVuY01ldGEgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIGVuY01ldGEtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgIGVuY01ldGEtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7Ci0gICAgICAgIGVuY01ldGEtPnNldEludDMyKCJmcmFtZS1yYXRlIiwgMzApOwotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMigiYml0cmF0ZSIsIDI1NjAwMCk7Ci0gICAgICAgIGVuY01ldGEtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgMTApOwotCi0gICAgICAgIHNwPEFMb29wZXI+IGVuY0xvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBlbmNMb29wZXItPnNldE5hbWUoInJ0c3BfdHJhbnNtaXR0ZXIiKTsKLSAgICAgICAgZW5jTG9vcGVyLT5zdGFydCgpOwotCi0gICAgICAgIG1FbmNvZGVyID0gTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKGVuY0xvb3BlciwgZW5jTWV0YSwgc291cmNlKTsKLQotICAgICAgICBtRW5jb2Rlci0+c3RhcnQoKTsKLQotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICBDSEVDS19FUShtRW5jb2Rlci0+cmVhZCgmYnVmZmVyKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgQ0hFQ0soYnVmZmVyICE9IE5VTEwpOwotCi0gICAgICAgIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoYnVmZmVyKTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLSNlbmRpZgotICAgIH0KLQotICAgIHVpbnQ2NF90IG50cFRpbWUoKSB7Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLQotICAgICAgICB1aW50NjRfdCBub3dVcyA9IHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X3VzZWM7Ci0KLSAgICAgICAgbm93VXMgKz0gKCg3MGxsICogMzY1ICsgMTcpICogMjQpICogNjAgKiA2MCAqIDEwMDAwMDBsbDsKLQotICAgICAgICB1aW50NjRfdCBoaSA9IG5vd1VzIC8gMTAwMDAwMGxsOwotICAgICAgICB1aW50NjRfdCBsbyA9ICgoMWxsIDw8IDMyKSAqIChub3dVcyAlIDEwMDAwMDBsbCkpIC8gMTAwMDAwMGxsOwotCi0gICAgICAgIHJldHVybiAoaGkgPDwgMzIpIHwgbG87Ci0gICAgfQotCi0gICAgdm9pZCBpc3N1ZUFubm91bmNlKCkgewotICAgICAgICBBU3RyaW5nIHNkcDsKLSAgICAgICAgc2RwID0gInY9MFxyXG4iOwotCi0gICAgICAgIHNkcC5hcHBlbmQoIm89LSAiKTsKLQotICAgICAgICB1aW50NjRfdCBudHAgPSBudHBUaW1lKCk7Ci0gICAgICAgIHNkcC5hcHBlbmQobnRwKTsKLSAgICAgICAgc2RwLmFwcGVuZCgiICIpOwotICAgICAgICBzZHAuYXBwZW5kKG50cCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIiBJTiBJUDQgMTI3LjAuMC4wXHJcbiIpOwotCi0gICAgICAgIHNkcC5hcHBlbmQoCi0gICAgICAgICAgICAgICJzPVNhbXBsZVxyXG4iCi0gICAgICAgICAgICAgICJpPVBsYXlpbmcgYXJvdW5kIHdpdGggQU5OT1VOQ0VcclxuIgotICAgICAgICAgICAgICAiYz1JTiBJUDQgIik7Ci0KLSAgICAgICAgc3RydWN0IGluX2FkZHIgYWRkcjsKLSAgICAgICAgYWRkci5zX2FkZHIgPSBodG9ubChtU2VydmVySVApOwotCi0gICAgICAgIHNkcC5hcHBlbmQoaW5ldF9udG9hKGFkZHIpKTsKLQotICAgICAgICBzZHAuYXBwZW5kKAotICAgICAgICAgICAgICAiXHJcbiIKLSAgICAgICAgICAgICAgInQ9MCAwXHJcbiIKLSAgICAgICAgICAgICAgImE9cmFuZ2U6bnB0PW5vdy1cclxuIik7Ci0KLSNpZmRlZiBBTkRST0lECi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUVuY29kZXItPmdldEZvcm1hdCgpOwotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIHNkcC5hcHBlbmQoCi0gICAgICAgICAgICAgICJtPXZpZGVvIDAgUlRQL0FWUCAiIFBUX1NUUiAiXHJcbiIKLSAgICAgICAgICAgICAgImI9QVMgMzIwMDAwXHJcbiIKLSAgICAgICAgICAgICAgImE9cnRwbWFwOiIgUFRfU1RSICIgSDI2NC85MDAwMFxyXG4iKTsKLQotICAgICAgICBzZHAuYXBwZW5kKCJhPWNsaXByZWN0IDAsMCwiKTsKLSAgICAgICAgc2RwLmFwcGVuZChoZWlnaHQpOwotICAgICAgICBzZHAuYXBwZW5kKCIsIik7Ci0gICAgICAgIHNkcC5hcHBlbmQod2lkdGgpOwotICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgKLSAgICAgICAgICAgICAgImE9ZnJhbWVzaXplOiIgUFRfU1RSICIgIik7Ci0gICAgICAgIHNkcC5hcHBlbmQod2lkdGgpOwotICAgICAgICBzZHAuYXBwZW5kKCItIik7Ci0gICAgICAgIHNkcC5hcHBlbmQoaGVpZ2h0KTsKLSAgICAgICAgc2RwLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIHNkcC5hcHBlbmQoCi0gICAgICAgICAgICAgICJhPWZtdHA6IiBQVF9TVFIgIiBwcm9maWxlLWxldmVsLWlkPTQyQzAxNTtzcHJvcC1wYXJhbWV0ZXItc2V0cz0iKTsKLQotICAgICAgICBzZHAuYXBwZW5kKG1TZXFQYXJhbVNldCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIiwiKTsKLSAgICAgICAgc2RwLmFwcGVuZChtUGljUGFyYW1TZXQpOwotICAgICAgICBzZHAuYXBwZW5kKCI7cGFja2V0aXphdGlvbi1tb2RlPTFcclxuIik7Ci0jZWxzZQotICAgICAgICBzZHAuYXBwZW5kKAotICAgICAgICAgICAgICAgICJtPWF1ZGlvIDAgUlRQL0FWUCAiIFBUX1NUUiAiXHJcbiIKLSAgICAgICAgICAgICAgICAiYT1ydHBtYXA6IiBQVF9TVFIgIiBMOC84MDAwLzFcclxuIik7Ci0jZW5kaWYKLQotICAgICAgICBzZHAuYXBwZW5kKCJhPWNvbnRyb2w6IiBUUkFDS19TVUZGSVggIlxyXG4iKTsKLQotICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJBTk5PVU5DRSAiKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0KLSAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJBTk5PVU5DRSIsIG1TdHJlYW1VUkwuY19zdHIoKSk7Ci0KLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwXHJcbiIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1MZW5ndGg6ICIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZChzZHAuc2l6ZSgpKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZChzZHApOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnYW5ubycsIHRoaXMpOwotICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7Ci0gICAgfQotCi0gICAgdm9pZCBIKGNvbnN0IEFTdHJpbmcgJnMsIEFTdHJpbmcgKm91dCkgewotICAgICAgICBvdXQtPmNsZWFyKCk7Ci0KLSAgICAgICAgTUQ1X0NUWCBtOwotICAgICAgICBNRDVfSW5pdCgmbSk7Ci0gICAgICAgIE1ENV9VcGRhdGUoJm0sIHMuY19zdHIoKSwgcy5zaXplKCkpOwotCi0gICAgICAgIHVpbnQ4X3Qga2V5WzE2XTsKLSAgICAgICAgTUQ1X0ZpbmFsKGtleSwgJm0pOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgICAgICAgICAgY2hhciBuaWJibGUgPSBrZXlbaV0gPj4gNDsKLSAgICAgICAgICAgIGlmIChuaWJibGUgPD0gOSkgewotICAgICAgICAgICAgICAgIG5pYmJsZSArPSAnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5pYmJsZSArPSAnYScgLSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC0+YXBwZW5kKCZuaWJibGUsIDEpOwotCi0gICAgICAgICAgICBuaWJibGUgPSBrZXlbaV0gJiAweDBmOwotICAgICAgICAgICAgaWYgKG5pYmJsZSA8PSA5KSB7Ci0gICAgICAgICAgICAgICAgbmliYmxlICs9ICcwJzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmliYmxlICs9ICdhJyAtIDEwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LT5hcHBlbmQoJm5pYmJsZSwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGF1dGhlbnRpY2F0ZShjb25zdCBzcDxBUlRTUFJlc3BvbnNlPiAmcmVzcG9uc2UpIHsKLSAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInd3dy1hdXRoZW50aWNhdGUiKTsKLSAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7Ci0KLSAgICAgICAgQVN0cmluZyB2YWx1ZSA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGlmICghc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAiQmFzaWMiLCA1KSkgewotICAgICAgICAgICAgbUF1dGhUeXBlID0gQkFTSUM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDSyghc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAiRGlnZXN0IiwgNikpOwotICAgICAgICAgICAgbUF1dGhUeXBlID0gRElHRVNUOwotCi0gICAgICAgICAgICBpID0gdmFsdWUuZmluZCgibm9uY2U9Iik7Ci0gICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKLSAgICAgICAgICAgIENIRUNLX0VRKHZhbHVlLmNfc3RyKClbaSArIDZdLCAnXCInKTsKLSAgICAgICAgICAgIHNzaXplX3QgaiA9IHZhbHVlLmZpbmQoIlwiIiwgaSArIDcpOwotICAgICAgICAgICAgQ0hFQ0tfR0UoaiwgMCk7Ci0KLSAgICAgICAgICAgIG1Ob25jZS5zZXRUbyh2YWx1ZSwgaSArIDcsIGogLSBpIC0gNyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpc3N1ZUFubm91bmNlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRBdXRoZW50aWNhdGlvbigKLSAgICAgICAgICAgIEFTdHJpbmcgKnJlcXVlc3QsIGNvbnN0IGNoYXIgKm1ldGhvZCwgY29uc3QgY2hhciAqdXJsKSB7Ci0gICAgICAgIGlmIChtQXV0aFR5cGUgPT0gTk9ORSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BdXRoVHlwZSA9PSBCQVNJQykgewotICAgICAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJBdXRob3JpemF0aW9uOiBCYXNpYyBZbU5oYzNRNmRHVnpkQW89XHJcbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0tfRVEoKGludCltQXV0aFR5cGUsIChpbnQpRElHRVNUKTsKLQotICAgICAgICBBU3RyaW5nIEExOwotICAgICAgICBBMS5hcHBlbmQoVVNFUk5BTUUpOwotICAgICAgICBBMS5hcHBlbmQoIjoiKTsKLSAgICAgICAgQTEuYXBwZW5kKCJTdHJlYW1pbmcgU2VydmVyIik7Ci0gICAgICAgIEExLmFwcGVuZCgiOiIpOwotICAgICAgICBBMS5hcHBlbmQoUEFTU1dPUkQpOwotCi0gICAgICAgIEFTdHJpbmcgQTI7Ci0gICAgICAgIEEyLmFwcGVuZChtZXRob2QpOwotICAgICAgICBBMi5hcHBlbmQoIjoiKTsKLSAgICAgICAgQTIuYXBwZW5kKHVybCk7Ci0KLSAgICAgICAgQVN0cmluZyBIQTEsIEhBMjsKLSAgICAgICAgSChBMSwgJkhBMSk7Ci0gICAgICAgIEgoQTIsICZIQTIpOwotCi0gICAgICAgIEFTdHJpbmcgdG1wOwotICAgICAgICB0bXAuYXBwZW5kKEhBMSk7Ci0gICAgICAgIHRtcC5hcHBlbmQoIjoiKTsKLSAgICAgICAgdG1wLmFwcGVuZChtTm9uY2UpOwotICAgICAgICB0bXAuYXBwZW5kKCI6Iik7Ci0gICAgICAgIHRtcC5hcHBlbmQoSEEyKTsKLQotICAgICAgICBBU3RyaW5nIGRpZ2VzdDsKLSAgICAgICAgSCh0bXAsICZkaWdlc3QpOwotCi0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiQXV0aG9yaXphdGlvbjogRGlnZXN0ICIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIm5vbmNlPVwiIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZChtTm9uY2UpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIlwiLCAiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJ1c2VybmFtZT1cIiIgVVNFUk5BTUUgIlwiLCAiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJ1cmk9XCIiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKHVybCk7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIsICIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInJlc3BvbnNlPVwiIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZChkaWdlc3QpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIlwiIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXHJcbiIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgICAgICBjYXNlICdjb25uJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJjb25uZWN0aW9uIHJlcXVlc3QgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXJ2ZXItaXAiLCAoaW50MzJfdCAqKSZtU2VydmVySVApKTsKLQotICAgICAgICAgICAgICAgIGlzc3VlQW5ub3VuY2UoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAnYW5ubyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQU5OT1VOQ0UgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOwotICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA9PSA0MDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXV0aFR5cGUgIT0gTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRkFJTEVEIHRvIGF1dGhlbnRpY2F0ZSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUocmVzcG9uc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LIHx8IHJlc3BvbnNlLT5tU3RhdHVzQ29kZSAhPSAyMDApIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBydHBQb3J0OwotICAgICAgICAgICAgICAgIEFSVFBDb25uZWN0aW9uOjpNYWtlUG9ydFBhaXIoJm1SVFBTb2NrZXQsICZtUlRDUFNvY2tldCwgJnJ0cFBvcnQpOwotCi0gICAgICAgICAgICAgICAgLy8gKG5ldyBBTWVzc2FnZSgncG9sbCcsIHRoaXMpKS0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTRVRVUCAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtVHJhY2tVUkwpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlNFVFVQIiwgbVRyYWNrVVJMLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUDt1bmljYXN0O2NsaWVudF9wb3J0PSIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHJ0cFBvcnQpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocnRwUG9ydCArIDEpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCI7bW9kZT1yZWNvcmRcclxuIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2V0dScsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgIGNhc2UgJ3BvbGwnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZkX3NldCByczsKLSAgICAgICAgICAgICAgICBGRF9aRVJPKCZycyk7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKG1SVENQU29ja2V0LCAmcnMpOwotCi0gICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgICAgICAgICAgdHYudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICB0di50dl91c2VjID0gMDsKLQotICAgICAgICAgICAgICAgIGludCByZXMgPSBzZWxlY3QobVJUQ1BTb2NrZXQgKyAxLCAmcnMsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOwotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSByZWN2KG1SVENQU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInJlY3YgcmV0dXJuZWQgIiA8PCBuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJyZWN2IHJldHVybmVkICIgPDwgbiA8PCAiIGJ5dGVzIG9mIGRhdGEuIjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoNTAwMDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIGNhc2UgJ3NldHUnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlNFVFVQIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKLSAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0sgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJzZXNzaW9uIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25JRCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGkgPSBtU2Vzc2lvbklELmZpbmQoIjsiKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvcHRpb25zLCBpLmUuICI7dGltZW91dD05MCIKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JRC5lcmFzZShpLCBtU2Vzc2lvbklELnNpemUoKSAtIGkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgidHJhbnNwb3J0Iik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyB0cmFuc3BvcnQgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAidHJhbnNwb3J0ID0gJyIgPDwgdHJhbnNwb3J0IDw8ICInIjsKLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgdmFsdWU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHRyYW5zcG9ydC5jX3N0cigpLCAic2VydmVyX3BvcnQiLCAmdmFsdWUpKTsKLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJ0cFBvcnQsIHJ0Y3BQb3J0OwotICAgICAgICAgICAgICAgIENIRUNLX0VRKHNzY2FuZih2YWx1ZS5jX3N0cigpLCAiJXUtJXUiLCAmcnRwUG9ydCwgJnJ0Y3BQb3J0KSwgMik7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUodHJhbnNwb3J0LmNfc3RyKCksICJzb3VyY2UiLCAmdmFsdWUpKTsKLQotICAgICAgICAgICAgICAgIG1lbXNldChtUmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKG1SZW1vdGVBZGRyLnNpbl96ZXJvKSk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKHZhbHVlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVBZGRyLnNpbl9wb3J0ID0gaHRvbnMocnRwUG9ydCk7Ci0KLSAgICAgICAgICAgICAgICBtUmVtb3RlUlRDUEFkZHIgPSBtUmVtb3RlQWRkcjsKLSAgICAgICAgICAgICAgICBtUmVtb3RlUlRDUEFkZHIuc2luX3BvcnQgPSBodG9ucyhydHBQb3J0ICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDS19FUSgwLCBjb25uZWN0KG1SVFBTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJm1SZW1vdGVBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1SZW1vdGVBZGRyKSkpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgY29ubmVjdChtUlRDUFNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmbVJlbW90ZVJUQ1BBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1SZW1vdGVSVENQQWRkcikpKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IHggPSBudG9obChtUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAic2VuZGluZyBkYXRhIHRvICIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICh4ID4+IDI0KQotICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgICA8PCAoKHggPj4gMTYpICYgMHhmZikKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgPDwgKCh4ID4+IDgpICYgMHhmZikKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgPDwgKHggJiAweGZmKQotICAgICAgICAgICAgICAgICAgICAgPDwgIjoiCi0gICAgICAgICAgICAgICAgICAgICA8PCBydHBQb3J0OwotCi0gICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJSRUNPUkQgIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLQotICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiUkVDT1JEIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3JlY28nLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ3JlY28nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlJFQ09SRCBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7Ci0gICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXNwb25zZSAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnbW9yZScsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3NyICAnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgdGhpcykpLT5wb3N0KDMwMDAwMDAwbGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdhbGl2JzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJPUFRJT05TICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TdHJlYW1VUkwpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlJFQ09SRCIsIG1TdHJlYW1VUkwuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdvcHRzJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJPUFRJT05TIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpKS0+cG9zdCgzMDAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAnbW9yZSc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDY1NTM2KTsKLSAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgZGF0YVswXSA9IDB4ODA7Ci0gICAgICAgICAgICAgICAgZGF0YVsxXSA9ICgxIDw8IDcpIHwgUFQ7ICAvLyBNLWJpdAotICAgICAgICAgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKLSAgICAgICAgICAgICAgICBkYXRhWzhdID0gbVNvdXJjZUlEID4+IDI0OwotICAgICAgICAgICAgICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7Ci0KLSNpZmRlZiBBTkRST0lECi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1FbmNvZGVyLT5yZWFkKCZtZWRpYUJ1ZiksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMGxsKTsKLQotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKCFtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBtZWRpYURhdGEsIDQpKTsKLQotICAgICAgICAgICAgICAgIENIRUNLX0xFKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIDQgKyAxMiwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCZkYXRhWzEyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEYXRhICsgNCwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCk7Ci0KLSAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIDQgKyAxMik7Ci0KLSAgICAgICAgICAgICAgICBtZWRpYUJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1lZGlhQnVmID0gTlVMTDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArIG1OdW1SVFBTZW50ICogMTI4OwotICAgICAgICAgICAgICAgIG1lbXNldCgmZGF0YVsxMl0sIDAsIDEyOCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAxMiArIDEyOCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OwotICAgICAgICAgICAgICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgICAgIGRhdGFbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZGF0YVs3XSA9IHJ0cFRpbWUgJiAweGZmOwotCi0gICAgICAgICAgICAgICAgc3NpemVfdCBuID0gc2VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SVFBTb2NrZXQsIGRhdGEsIGJ1ZmZlci0+c2l6ZSgpLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAic2VuZCBmYWlsZWQgKCIgPDwgc3RyZXJyb3IoZXJybm8pIDw8ICIpIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgKyttU2VxTm87Ci0KLSAgICAgICAgICAgICAgICArK21OdW1SVFBTZW50OwotICAgICAgICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gMTI7Ci0KLSAgICAgICAgICAgICAgICBtTGFzdFJUUFRpbWUgPSBydHBUaW1lOwotICAgICAgICAgICAgICAgIG1MYXN0TlRQVGltZSA9IG50cFRpbWUoKTsKLQotI2lmZGVmIEFORFJPSUQKLSAgICAgICAgICAgICAgICBpZiAobU51bVJUUFNlbnQgPCA2MCAqIDI1KSB7ICAvLyA2MCBzZWNzIHdvcnRoCi0gICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg0MDAwMCk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGlmIChtTnVtUlRQT2N0ZXRzU2VudCA8IDgwMDAgKiA2MCkgewotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsICogMTI4IC8gODAwMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlRoYXQncyBlbm91Z2gsIHBhdXNpbmcuIjsKLQotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJQQVVTRSAiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJQQVVTRSIsIG1TdHJlYW1VUkwuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BhdXMnLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAnc3IgICc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDY1NTM2KTsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOwotCi0gICAgICAgICAgICAgICAgYWRkU1IoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBhZGRTREVTKGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBuID0gc2VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SVENQU29ja2V0LCBkYXRhLCBidWZmZXItPnNpemUoKSwgMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KDMwMDAwMDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdwYXVzJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJQQVVTRSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7Ci0gICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7Ci0KLSAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRFQVJET1dOICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TdHJlYW1VUkwpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlRFQVJET1dOIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ3RlYXInOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlRFQVJET1dOIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKLSAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAnZGlzYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJkaXNjb25uZWN0IGNvbXBsZXRlZCI7Ci0KLSAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdxdWl0JzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubi0+ZGlzY29ubmVjdChuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtUlRQU29ja2V0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UobVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgIG1SVFBTb2NrZXQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVJUQ1BTb2NrZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZShtUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgIG1SVENQU29ja2V0ID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotCi0jaWZkZWYgQU5EUk9JRAotICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgbUVuY29kZXIuY2xlYXIoKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NeVRyYW5zbWl0dGVyKCkgewotICAgIH0KLQotcHJpdmF0ZToKLSAgICBlbnVtIEF1dGhUeXBlIHsKLSAgICAgICAgTk9ORSwKLSAgICAgICAgQkFTSUMsCi0gICAgICAgIERJR0VTVAotICAgIH07Ci0KLSAgICBBU3RyaW5nIG1TZXJ2ZXJVUkw7Ci0gICAgQVN0cmluZyBtVHJhY2tVUkw7Ci0gICAgQVN0cmluZyBtU3RyZWFtVVJMOwotCi0gICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKLSAgICBzcDxBUlRTUENvbm5lY3Rpb24+IG1Db25uOwotICAgIGJvb2wgbUNvbm5lY3RlZDsKLSAgICB1aW50MzJfdCBtU2VydmVySVA7Ci0gICAgQXV0aFR5cGUgbUF1dGhUeXBlOwotICAgIEFTdHJpbmcgbU5vbmNlOwotICAgIEFTdHJpbmcgbVNlc3Npb25JRDsKLSAgICBpbnQgbVJUUFNvY2tldCwgbVJUQ1BTb2NrZXQ7Ci0gICAgdWludDMyX3QgbVNvdXJjZUlEOwotICAgIHVpbnQzMl90IG1TZXFObzsKLSAgICB1aW50MzJfdCBtUlRQVGltZUJhc2U7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIG1SZW1vdGVBZGRyOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUmVtb3RlUlRDUEFkZHI7Ci0gICAgc2l6ZV90IG1OdW1TYW1wbGVzU2VudDsKLSAgICB1aW50MzJfdCBtTnVtUlRQU2VudDsKLSAgICB1aW50MzJfdCBtTnVtUlRQT2N0ZXRzU2VudDsKLSAgICB1aW50MzJfdCBtTGFzdFJUUFRpbWU7Ci0gICAgdWludDY0X3QgbUxhc3ROVFBUaW1lOwotCi0jaWZkZWYgQU5EUk9JRAotICAgIHNwPE1lZGlhU291cmNlPiBtRW5jb2RlcjsKLSAgICBBU3RyaW5nIG1TZXFQYXJhbVNldDsKLSAgICBBU3RyaW5nIG1QaWNQYXJhbVNldDsKLQotICAgIHZvaWQgbWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdGFydENvZGVbXSA9ICJceDAwXHgwMFx4MDBceDAxIjsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICAgICAgQ0hFQ0tfR0Uoc2l6ZSwgMHUpOwotICAgICAgICBDSEVDSyghbWVtY21wKGtTdGFydENvZGUsIGRhdGEsIDQpKTsKLQotICAgICAgICBkYXRhICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gNDsKLQotICAgICAgICBzaXplX3Qgc3RhcnRDb2RlUG9zID0gMDsKLSAgICAgICAgd2hpbGUgKHN0YXJ0Q29kZVBvcyArIDMgPCBzaXplCi0gICAgICAgICAgICAgICAgJiYgbWVtY21wKGtTdGFydENvZGUsICZkYXRhW3N0YXJ0Q29kZVBvc10sIDQpKSB7Ci0gICAgICAgICAgICArK3N0YXJ0Q29kZVBvczsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLX0xUKHN0YXJ0Q29kZVBvcyArIDMsIHNpemUpOwotCi0gICAgICAgIGVuY29kZUJhc2U2NChkYXRhLCBzdGFydENvZGVQb3MsICZtU2VxUGFyYW1TZXQpOwotCi0gICAgICAgIGVuY29kZUJhc2U2NCgmZGF0YVtzdGFydENvZGVQb3MgKyA0XSwgc2l6ZSAtIHN0YXJ0Q29kZVBvcyAtIDQsCi0gICAgICAgICAgICAgICAgICAgICAmbVBpY1BhcmFtU2V0KTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHZvaWQgYWRkU1IoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKLQotICAgICAgICBkYXRhWzBdID0gMHg4MCB8IDA7Ci0gICAgICAgIGRhdGFbMV0gPSAyMDA7ICAvLyBTUgotICAgICAgICBkYXRhWzJdID0gMDsKLSAgICAgICAgZGF0YVszXSA9IDY7Ci0gICAgICAgIGRhdGFbNF0gPSBtU291cmNlSUQgPj4gMjQ7Ci0gICAgICAgIGRhdGFbNV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbNl0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICAgICAgZGF0YVs3XSA9IG1Tb3VyY2VJRCAmIDB4ZmY7Ci0KLSAgICAgICAgZGF0YVs4XSA9IG1MYXN0TlRQVGltZSA+PiAoNjQgLSA4KTsKLSAgICAgICAgZGF0YVs5XSA9IChtTGFzdE5UUFRpbWUgPj4gKDY0IC0gMTYpKSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTBdID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAyNCkpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxMV0gPSAobUxhc3ROVFBUaW1lID4+IDMyKSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTJdID0gKG1MYXN0TlRQVGltZSA+PiAyNCkgJiAweGZmOwotICAgICAgICBkYXRhWzEzXSA9IChtTGFzdE5UUFRpbWUgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxNF0gPSAobUxhc3ROVFBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxNV0gPSBtTGFzdE5UUFRpbWUgJiAweGZmOwotCi0gICAgICAgIGRhdGFbMTZdID0gKG1MYXN0UlRQVGltZSA+PiAyNCkgJiAweGZmOwotICAgICAgICBkYXRhWzE3XSA9IChtTGFzdFJUUFRpbWUgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxOF0gPSAobUxhc3RSVFBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxOV0gPSBtTGFzdFJUUFRpbWUgJiAweGZmOwotCi0gICAgICAgIGRhdGFbMjBdID0gbU51bVJUUFNlbnQgPj4gMjQ7Ci0gICAgICAgIGRhdGFbMjFdID0gKG1OdW1SVFBTZW50ID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMjJdID0gKG1OdW1SVFBTZW50ID4+IDgpICYgMHhmZjsKLSAgICAgICAgZGF0YVsyM10gPSBtTnVtUlRQU2VudCAmIDB4ZmY7Ci0KLSAgICAgICAgZGF0YVsyNF0gPSBtTnVtUlRQT2N0ZXRzU2VudCA+PiAyNDsKLSAgICAgICAgZGF0YVsyNV0gPSAobU51bVJUUE9jdGV0c1NlbnQgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgZGF0YVsyNl0gPSAobU51bVJUUE9jdGV0c1NlbnQgPj4gOCkgJiAweGZmOwotICAgICAgICBkYXRhWzI3XSA9IG1OdW1SVFBPY3RldHNTZW50ICYgMHhmZjsKLQotICAgICAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMjgpOwotICAgIH0KLQotICAgIHZvaWQgYWRkU0RFUyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICBkYXRhWzBdID0gMHg4MCB8IDE7Ci0gICAgICAgIGRhdGFbMV0gPSAyMDI7ICAvLyBTREVTCi0gICAgICAgIGRhdGFbNF0gPSBtU291cmNlSUQgPj4gMjQ7Ci0gICAgICAgIGRhdGFbNV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbNl0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICAgICAgZGF0YVs3XSA9IG1Tb3VyY2VJRCAmIDB4ZmY7Ci0KLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IDg7Ci0KLSAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAxOyAgLy8gQ05BTUUKLQotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqa0NOQU1FID0gImFuZGloQGxhcHRvcCI7Ci0gICAgICAgIGRhdGFbb2Zmc2V0KytdID0gc3RybGVuKGtDTkFNRSk7Ci0KLSAgICAgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtDTkFNRSwgc3RybGVuKGtDTkFNRSkpOwotICAgICAgICBvZmZzZXQgKz0gc3RybGVuKGtDTkFNRSk7Ci0KLSAgICAgICAgZGF0YVtvZmZzZXQrK10gPSA3OyAgLy8gTk9URQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICprTk9URSA9ICJIZWxsJ3MgZnJvemVuIG92ZXIuIjsKLSAgICAgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa05PVEUpOwotCi0gICAgICAgIG1lbWNweSgmZGF0YVtvZmZzZXRdLCBrTk9URSwgc3RybGVuKGtOT1RFKSk7Ci0gICAgICAgIG9mZnNldCArPSBzdHJsZW4oa05PVEUpOwotCi0gICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKLQotICAgICAgICBpZiAoKG9mZnNldCAlIDQpID4gMCkgewotICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gNCAtIChvZmZzZXQgJSA0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoY291bnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBudW1Xb3JkcyA9IChvZmZzZXQgLyA0KSAtIDE7Ci0gICAgICAgIGRhdGFbMl0gPSBudW1Xb3JkcyA+PiA4OwotICAgICAgICBkYXRhWzNdID0gbnVtV29yZHMgJiAweGZmOwotCi0gICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyBvZmZzZXQpOwotICAgIH0KLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE15VHJhbnNtaXR0ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNWV9UUkFOU01JVFRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCmluZGV4IGMwNTNiZTguLmU4ZWM2NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgogI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKaW5kZXggNjYyMTU5Yy4uMzBmYzM4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmg+CiAKIC8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5jcHAKaW5kZXggMzdhYTMyNi4uZjFmODIyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIlF1YWxNYW5hZ2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCBlMjM2MjY3Li44Y2QzM2NmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0xOCw5ICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJTRFBMb2FkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NEUExvYWRlci5oIgorLy8gI2luY2x1ZGUgImluY2x1ZGUvU0RQTG9hZGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuaD4KIAotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPGRhdGFzb3VyY2UvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwCmluZGV4IDVjNjg1YTEuLjRlODEyZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiVURQUHVzaGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiVURQUHVzaGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCmluZGV4IGY5NTljNDAuLjM5MTYxYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaApAQCAtMTA1LDYgKzEwNSwyNyBAQAogICAgICAgICAgICAgKGxvbmcgbG9uZylydHAsIChsb25nIGxvbmcpcGxheSwgKGxvbmcgbG9uZylleHAsIGlzRXhwKTsKIH0KIAorc3RydWN0IFJlY2VwdGlvblJlcG9ydEJsb2NrIDogcHVibGljIFJlZkJhc2UgeworICAgIHVpbnQzMl90IHNzcmM7ICAgICAgIC8vIHNzcmMgb2YgZGF0YSBzb3VyY2UgYmVpbmcgcmVwb3J0ZWQKKyAgICB1aW50MzJfdCBmcmFjdGlvbjsgICAvLyBmcmFjdGlvbiBsb3N0IHNpbmNlIGxhc3QgU1IvUlIKKyAgICBpbnQzMl90IGxvc3Q7ICAgICAgICAvLyBjdW11bC4gbm8uIHBrdHMgbG9zdCAoc2lnbmVkISkKKyAgICB1aW50MzJfdCBsYXN0U2VxOyAgICAvLyBleHRlbmRlZCBsYXN0IHNlcS4gbm8uIHJlY2VpdmVkCisgICAgdWludDMyX3Qgaml0dGVyOyAgICAgLy8gaW50ZXJhcnJpdmFsIGppdHRlcgorICAgIHVpbnQzMl90IGxzcjsgICAgICAgIC8vIGxhc3QgU1IgcGFja2V0IGZyb20gdGhpcyBzb3VyY2UKKyAgICB1aW50MzJfdCBkbHNyOyAgICAgICAvLyBkZWxheSBzaW5jZSBsYXN0IFNSIHBhY2tldAorCisgICAgUmVjZXB0aW9uUmVwb3J0QmxvY2sodWludDMyX3Qgc3NyYywgdWludDMyX3QgZnJhY3Rpb24sIGludDMyX3QgbG9zdCwgdWludDMyX3QgbGFzdFNlcSwKKyAgICAgICAgICAgIHVpbnQzMl90IGppdHRlciwgdWludDMyX3QgbHNyLCB1aW50MzJfdCBkbHNyKSB7CisgICAgICAgIHRoaXMtPnNzcmMgPSBzc3JjOworICAgICAgICB0aGlzLT5mcmFjdGlvbiA9IGZyYWN0aW9uOworICAgICAgICB0aGlzLT5sb3N0ID0gbG9zdDsKKyAgICAgICAgdGhpcy0+bGFzdFNlcSA9IGxhc3RTZXE7CisgICAgICAgIHRoaXMtPmppdHRlciA9IGppdHRlcjsKKyAgICAgICAgdGhpcy0+bHNyID0gbHNyOworICAgICAgICB0aGlzLT5kbHNyID0gZGxzcjsKKyAgICB9Cit9OworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFfUlRQX0FTU0VNQkxFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKaW5kZXggMzZjY2EzMS4uNzNkMjg2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKQEAgLTExMCw3ICsxMTAsMTAgQEAKICAgICBzdGF0dXNfdCBwYXJzZVJUUChTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICBzdGF0dXNfdCBwYXJzZVJUUEV4dChTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpleHREYXRhLCBzaXplX3QgZXh0TGVuLCBpbnQzMl90ICpjdm9EZWdyZWVzKTsKICAgICBzdGF0dXNfdCBwYXJzZVJUQ1AoU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgcGFyc2VTUihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VTZW5kZXJSZXBvcnQoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlUmVjZWl2ZXJSZXBvcnQoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2soU3RyZWFtSW5mbyAqaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3Qgc2VuZGVySWQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZVRTRkIoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlUFNGQihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VCWUUoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCmluZGV4IDQ5ODRlOTEuLmU5YjQ5NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaApAQCAtMzYsNiArMzYsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQVJUUEFzc2VtYmxlcjsKK3N0cnVjdCBSZWNlcHRpb25SZXBvcnRCbG9jazsKIHN0cnVjdCBBU2Vzc2lvbkRlc2NyaXB0aW9uOwogCiBzdHJ1Y3QgQVJUUFNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTU5LDggKzYwLDEwIEBACiAKICAgICB2b2lkIHByb2Nlc3NSVFBQYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBwcm9jZXNzUlRQUGFja2V0KCk7CisgICAgdm9pZCBwcm9jZXNzUmVjZXB0aW9uUmVwb3J0QmxvY2soCisgICAgICAgICAgICBpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHNlbmRlcklkLCBzcDxSZWNlcHRpb25SZXBvcnRCbG9jaz4gcnJiKTsKICAgICB2b2lkIHRpbWVSZXNldCgpOwotICAgIHZvaWQgdGltZVVwZGF0ZSh1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKTsKKyAgICB2b2lkIHRpbWVVcGRhdGUoaW50NjRfdCByZWN2VGltZVVzLCB1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKTsKICAgICB2b2lkIGJ5ZVJlY2VpdmVkKCk7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKCkgeyByZXR1cm4gJm1RdWV1ZTsgfQpAQCAtMTM1LDYgKzEzOCw4IEBACiAgICAgdWludDY0X3QgbUxhc3RTck50cFRpbWU7CiAgICAgaW50NjRfdCBtTGFzdFNyVXBkYXRlVGltZVVzOwogCisgICAgaW50NjRfdCBtTGFzdFJyVXBkYXRlVGltZVVzOworCiAgICAgYm9vbCBtSXNGaXJzdFJ0cFJ0Y3BHYXA7CiAgICAgZG91YmxlIG1BdmdSdHBSdGNwR2FwTXM7CiAgICAgZG91YmxlIG1BdmdVbmRlcmxpbmVEZWxheU1zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuaApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oCmluZGV4IGZmMzZmMWYuLjRmM2I3NjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuaApAQCAtNDAsOCArNDAsOCBAQAogICAgIEppdHRlckNhbGMoaW50MzJfdCBjbG9ja1JhdGUpOwogCiAgICAgdm9pZCBpbml0KHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcywgaW50MzJfdCBiYXNlLCBpbnQzMl90IGludGVyKTsKLSAgICB2b2lkIHB1dEludGVyQXJyaXZhbERhdGEoaW50NjRfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lKTsKLSAgICB2b2lkIHB1dEJhc2VEYXRhKGludDY0X3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzKTsKKyAgICB2b2lkIHB1dEludGVyQXJyaXZhbERhdGEodWludDMyX3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZSk7CisgICAgdm9pZCBwdXRCYXNlRGF0YSh1aW50MzJfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lVXMpOwogICAgIGludDMyX3QgZ2V0QmFzZUppdHRlck1zKCk7CiAgICAgaW50MzJfdCBnZXRJbnRlckFycml2YWxKaXR0ZXJNcygpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVmlkZW9Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCmluZGV4IDQ1OTA2OTkuLmE4Y2Q3ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgogCi0jaW5jbHVkZSAiQVJUUFNlc3Npb24uaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCi0jaW5jbHVkZSAiVURQUHVzaGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC0xODIsNyArMTgyLDcgQEAKICAgICBDSEVDS19FUShkZWNvZGVyLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCiAgICAgZm9yICg7OykgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjb2Rlci0+cmVhZCgmYnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMDEsNyArMjAxLDcgQEAKICNpZiAxCiAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpICE9IDApIHsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBwcmludGYoImRlY29kZXIgcmV0dXJuZWQgZnJhbWUgb2Ygc2l6ZSAlenUgYXQgdGltZSAlLjJmIHNlY3NcbiIsCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgdGltZVVzIC8gMUU2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGE3OTlhMTMuLmU2YjY3Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icApAQCAtMzIsMTEgKzMyLDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCmluZGV4IDkxYmYzODUuLjdhMGJhNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKQEAgLTQ0LDEwICs0NCw2IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKaW5kZXggMzI0YTA0Mi4uYzQzZTFmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxmc3RyZWFtPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+Ci0jaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKKyNpbmNsdWRlIDxIZXZjVXRpbHMuaD4KIAogI2luY2x1ZGUgIkhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCmluZGV4IDBjMjJhNDIuLjIwNzM3ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCkBAIC0yMCwxMSArMjAsMTAgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgotCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oPgogCiAjaW5jbHVkZSA8dmVjdG9yPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAKaW5kZXggMTNkNWI4OS4uYTA2NzI4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icApAQCAtNTEsMTAgKzUxLDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICAvLyBUT0RPOiAoYi8xNTAxODE1ODMpCiAgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwCmluZGV4IDAwOTc4MzAuLjJiY2ZkNjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTMyLDkgKzMyLDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJtZWRpYV9wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKIH0KIAogY2NfZnV6eiB7CkBAIC03NCw2ICs3MSw3IEBACiAgICAgc3JjczogWwogICAgICAgICAiRnJhbWVEZWNvZGVyRnV6emVyLmNwcCIsCiAgICAgXSwKKyAgICBjb3JwdXM6IFsiY29ycHVzLyoiXSwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKIH0KIApAQCAtODUsMTAgKzgzLDEwIEBACiAgICAgXSwKICAgICBkaWN0aW9uYXJ5OiAiZGljdGlvbmFyaWVzL2Zvcm1hdHMuZGljdCIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm1faGVhZGVycyIsCisgICAgXSwKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAotICAgICAgICAibGlib2dnIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwCmluZGV4IGMyNTE0NzkuLjQyMThkMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnJhbWVEZWNvZGVyRnV6emVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIgorI2luY2x1ZGUgPEZyYW1lRGVjb2Rlci5oPgogI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtNDYsMTIgKzQ2LDE1IEBACiAgICAgfQogCiAgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgewotICAgICAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDMpKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgZGVjb2Rlci0+aW5pdCgvKmZyYW1lVGltZVVzKi8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvcHRpb24qLyBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sb3JGb3JtYXQqLyBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKSk7CisgICAgICAgIHVpbnQ4X3Qgc3dpdGNoQ2FzZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDMpOworICAgICAgICBzd2l0Y2ggKHN3aXRjaENhc2UpIHsKKyAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICAgICAgICAgICAgaW50IG9wdGlvbiA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgICAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgICAgICAgICAgICAgIGRlY29kZXItPmluaXQoZnJhbWVUaW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgIGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwCmluZGV4IDgxMGFlOTUuLmQ5NGM4ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAKQEAgLTIzLDcgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWltZVR5cGVzLmgiCi0jaW5jbHVkZSAid2VibS9XZWJtV3JpdGVyLmgiCisKKyNpbmNsdWRlIDx3ZWJtL1dlYm1Xcml0ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RkOjpzdHJpbmcgZ2VuTWltZVR5cGUoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIpIHsKQEAgLTEyMSw0ICsxMjIsNCBAQAogICAgIH0KICAgICByZXR1cm4gd3JpdGVyOwogfQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9jb3JwdXMvY29sb3JfZm9ybWF0X3JnYl81NjUuZGF0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9jb3JwdXMvY29sb3JfZm9ybWF0X3JnYl81NjUuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGUyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9jb2xvcl9mb3JtYXRfcmdiXzU2NS5kYXQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcAppbmRleCBhYzFlOWIxLi5hOGU2NGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcApAQCAtMzkzLDMgKzM5Myw1MSBAQAogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwogICAgIGxvb3Blci0+c3RvcCgpOwogfQorCitURVNUKE1lZGlhQ29kZWNUZXN0LCBEZWFkV2hpbGVTdG9wcGluZ0Vycm9yKSB7CisgICAgLy8gVGVzdCBzY2VuYXJpbzoKKyAgICAvLworICAgIC8vIDEpIENsaWVudCB0aHJlYWQgY2FsbHMgc3RvcCgpOyBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgY2FsbHMKKyAgICAvLyAgICBpbml0aWF0ZVNodXRkb3duKCk7IHNodXRkb3duIGlzIGJlaW5nIGhhbmRsZWQgYXQgdGhlIGNvbXBvbmVudCB0aHJlYWQuCisgICAgLy8gMikgQW4gZXJyb3Igb2NjdXJzIHdoaWxlIGhhbmRsaW5nIGluaXRpYXRlU2h1dGRvd24oKS4KKyAgICAvLyAzKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZXJyb3IuCisgICAgLy8gNCkgQ29kZWMgc2VydmljZSBkaWVzIGFmdGVyIHRoZSBlcnJvciBpcyBoYW5kbGVkCisgICAgLy8gNSkgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGhhbmRsZXMgdGhlIGRlYXRoLgorCisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjTmFtZXsidGVzdC5jb2RlYyJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY093bmVyeyJub2JvZHkifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrTWVkaWFUeXBleyJ2aWRlby94LXRlc3QifTsKKworICAgIHNwPE1vY2tDb2RlYz4gbW9ja0NvZGVjOworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcik+IGdldENvZGVjQmFzZSA9CisgICAgICAgIFsmbW9ja0NvZGVjXShjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKikgeworICAgICAgICAgICAgbW9ja0NvZGVjID0gbmV3IE1vY2tDb2RlYyhbXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TW9ja0J1ZmZlckNoYW5uZWw+ICYpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBtb2NrIHNldHVwLCBhcyB3ZSBkb24ndCBleHBlY3QgYW55IGJ1ZmZlciBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzY2VuYXJpby4KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGNvbnN0IHNwPEFNZXNzYWdlPiAmKSB7CisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25Db21wb25lbnRBbGxvY2F0ZWQoa0NvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVTaHV0ZG93bihfKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShib29sKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIpCisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICAgICAgICAgIC8vIDQpCisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgICAgICAgICAvLyBDb2RlYyBzZXJ2aWNlIGhhcyBkaWVkLCBubyBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBtb2NrQ29kZWM7CisgICAgICAgIH07CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXJ7bmV3IEFMb29wZXJ9OworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gU2V0dXBNZWRpYUNvZGVjKAorICAgICAgICAgICAga0NvZGVjT3duZXIsIGtDb2RlY05hbWUsIGtNZWRpYVR5cGUsIGxvb3BlciwgZ2V0Q29kZWNCYXNlKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29kZWMpIDw8ICJDb2RlYyBtdXN0IG5vdCBiZSBudWxsIjsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbW9ja0NvZGVjKSA8PCAiTW9ja0NvZGVjIG11c3Qgbm90IGJlIG51bGwiOworCisgICAgY29kZWMtPnN0b3AoKTsKKyAgICAvLyBzbGVlcCBoZXJlIHNvIHRoYXQgdGhlIGxvb3BlciB0aHJlYWQgY2FuIGhhbmRsZSB0aGUgZXJyb3IKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICBsb29wZXItPnN0b3AoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKaW5kZXggMzhkNWVjYy4uNDlmYjU2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKQEAgLTUyLDEwICs1Miw2IEBACiAgICAgICAgICJsaWJvZ2ciLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icAppbmRleCA2NTkwZWY3Li42MTllMDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icApAQCAtMzUsOCArMzUsMTYgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUvdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9pbmNsdWRlL3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9pbmNsdWRlL3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwCmluZGV4IDBiNjMyYmYuLmFlOTdjNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApAQCAtMzYsMTcgKzM2LDE3IEBACiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCmluZGV4IGQ4NWFlMzkuLmY5MzRiNTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCi0jaW5jbHVkZSAidGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlIDx0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oPgogCiAjaW5jbHVkZSAiVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCAzMmEyMmJhLi42ZWQzZTBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0zMyw3ICszMywxMSBAQAogICAgICAgICAiV2VibVdyaXRlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIl0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlL3dlYm0iLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKQEAgLTQ0LDcgKzQ4LDIwIEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhdi1oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAotICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiB9CisKKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfd2VibV9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9FYm1sVXRpbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL0VibWxVdGlsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Db25zdGFudHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtQ29uc3RhbnRzLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Db25zdGFudHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUVsZW1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9XZWJtRWxlbWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUZyYW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1GcmFtZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Xcml0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Xcml0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDQ0NDM3NjYuLjYyOWVlNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMxLDggKzMxLDggQEAKICAgICAgICAgIldlYm1GcmFtZVRocmVhZFVuaXRUZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggYTMzYjg4OC4uYjgxZjI3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9BbmRyb2lkLmJwCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAogICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvV3JpdGVyRnV6emVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcAppbmRleCBlZTdhZjcwLi5iOTdmMzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcApAQCAtMTc0LDEwICsxNzQsMTMgQEAKICAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gMTYwMDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1heCgxLCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBwYXJhbXMuY2hhbm5lbENvdW50ID0gbWF4KDAsIHBhcmFtcy5jaGFubmVsQ291bnQpOwogICAgICAgICB9CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMuY2hhbm5lbENvdW50KTsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMuc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIGlmICghc3RybmNtcChwYXJhbXMubWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIHBhcmFtcy53aWR0aCA9IG1heCgxLCBwYXJhbXMud2lkdGgpOworICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gbWF4KDEsIHBhcmFtcy5oZWlnaHQpOwogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHBhcmFtcy53aWR0aCk7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHBhcmFtcy5oZWlnaHQpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggMDU1ZGQ4MC4uYWZjODczYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTQxLDggKzQxLDYgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAogCi0gICAgY2xhbmc6IHRydWUsCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAKaW5kZXggNDExYzIwNi4uNTUwNmE3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIGRhcndpbjogewogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgIH0sCi0gICAgICAgIGxpbnV4X2dsaWJjOiB7CisgICAgICAgIGdsaWJjOiB7CiAgICAgICAgICAgICBjZmxhZ3M6IFsKICAgICAgICAgICAgICAgICAiLURzaWdldl9ub3RpZnlfdGhyZWFkX2lkPV9zaWdldl91bi5fdGlkIiwKICAgICAgICAgICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBlMjU2NThmLi5lZGRkYWE0IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTMzLDcgKzMzLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAibGliYW5kcm9pZGljdSIsCisgICAgICAgICJsaWJpY3UiLAogICAgICAgICAibGliZm1xIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC00NywxMSArNDcsNiBAQAogICAgICAgICAibGlicmVnaXN0ZXJtc2V4dCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCi0gICAgXSwKLQogICAgIC8vIEJ5IGRlZmF1bHQgbWVkaWFzZXJ2ZXIgcnVucyBpbiAzMi1iaXQgdG8gc2F2ZSBtZW1vcnksIGV4Y2VwdAogICAgIC8vIG9uIDY0LWJpdC1vbmx5IGx1bmNoIHRhcmdldHMuCiAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCA1OGUyZDJhLi4wMjY4NDdhIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMjUsOSArMjUsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIlJlZ2lzdGVyRXh0ZW5zaW9ucy5oIgogCi0vLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJNZWRpYVBsYXllclNlcnZpY2UuaCIKLSNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8TWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8UmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL09XTkVSUyBiL21lZGlhL210cC9PV05FUlMKaW5kZXggMTkyOGJhOC4uNTRkM2Q0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL09XTkVSUworKysgYi9tZWRpYS9tdHAvT1dORVJTCkBAIC0xLDYgKzEsNSBAQAogc2V0IG5vcGFyZW50CiAKLW1hcmNvbmVAZ29vZ2xlLmNvbQoganNoYXJrZXlAYW5kcm9pZC5jb20KIGphbWVzd2VpQGdvb2dsZS5jb20KIHJtb2p1bWRlckBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDhkNTI3ZTkuLmRkYzcxZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC02Myw2ICs2Myw3IEBACiB9CiAKIC8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworLy8gc3VwcG9ydHMgdXNlIGFzIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPiBub3QgPE5ka01lZGlhRXh0cmFjdG9yLmg+CiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTEwMyw4ICsxMDQsNiBAQAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgICAgICAic3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIiwKICAgICBdLAogCkBAIC0xNDUsNiArMTQ0LDcgQEAKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImpuaV9oZWFkZXJzIl0sCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICBzdHViczogewogICAgICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAogICAgICAgICB2ZXJzaW9uczogWyIyOSJdLAotICAgIH0sCisgICAgfQogfQogCiBjY19saWJyYXJ5IHsKQEAgLTE3Nyw5ICsxNzcsOCBAQAogICAgICAgICAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrL2luY2x1ZGUiLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKQEAgLTE5Myw3ICsxOTIsOSBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMjIzLDYgKzIyNCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgIF0sCisKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLApAQCAtMjMwLDkgKzIzMiw2IEBACiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAogICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay8iLAotICAgIF0sCiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCmluZGV4IDVmZGQ0NWEuLjEyYTBkNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfVXRpbHMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWQvQUhhcmR3YXJlQnVmZmVySGVscGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTM3NSw4ICszNzQsOCBAQAogICAgIHVpbnQ4X3QqIGpwZWdCdWZmZXIgPSBtTG9ja2VkQnVmZmVyLT5kYXRhOwogCiAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIEpQRUcgdHJhbnNwb3J0IGhlYWRlciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICB1aW50OF90KiBoZWFkZXIgPSBqcGVnQnVmZmVyICsgKHdpZHRoIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYikpOwotICAgIHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYiogYmxvYiA9IChzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IqKShoZWFkZXIpOworICAgIHVpbnQ4X3QqIGhlYWRlciA9IGpwZWdCdWZmZXIgKyAod2lkdGggLSBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iX3YyKSk7CisgICAgc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iX3YyKiBibG9iID0gKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYl92MiopKGhlYWRlcik7CiAgICAgaWYgKGJsb2ItPmpwZWdfYmxvYl9pZCA9PSBDQU1FUkEzX0pQRUdfQkxPQl9JRCkgewogICAgICAgICBzaXplID0gYmxvYi0+anBlZ19zaXplOwogICAgICAgICBBTE9HVigiJXM6IEpwZWcgc2l6ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCAxYWUyYjQ0Li4zOGU0MjJkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0xNSw2ICsxNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhQ29kZWMiCkBAIC0yOSw2ICszMSw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC00MSw2ICs0NCw3IEBACiAKIAogc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9IGVsc2UgaWYgKGVyciA9PSAtRUFHQUlOKSB7CkBAIC01MCw3ICs1NCwxOCBAQAogICAgIH0gZWxzZSBpZiAoZXJyID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19FUlJPUl9SRUNMQUlNRUQ7CiAgICAgfQotICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisKKyAgICB7CisgICAgICAgIC8vIG1pbmltaXplIGxvZyBmbG9vZGluZy4gU29tZSBDVFMgYmVoYXZpb3IgbWFkZSB0aGlzIG5vaXN5IGFuZCBhcHBzIGNvdWxkIGRvIHRoZSBzYW1lLgorICAgICAgICBzdGF0aWMgc3RkOjpzZXQ8c3RhdHVzX3Q+IHVudHJhbnNsYXRlZDsKKyAgICAgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtdXRleCk7CisKKyAgICAgICAgaWYgKHVudHJhbnNsYXRlZC5maW5kKGVycikgPT0gdW50cmFuc2xhdGVkLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW50cmFuc2xhdGVkIHNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZC5pbnNlcnQoZXJyKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKQEAgLTU5LDYgKzc0LDcgQEAKICAgICBrV2hhdEFzeW5jTm90aWZ5LAogICAgIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKICAgICBrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnMsCisgICAga1doYXRGcmFtZVJlbmRlcmVkTm90aWZ5LAogfTsKIAogc3RydWN0IEFNZWRpYUNvZGVjUGVyc2lzdGVudFN1cmZhY2UgOiBwdWJsaWMgU3VyZmFjZSB7CkBAIC05OCw2ICsxMTQsMTEgQEAKICAgICBtdXRhYmxlIE11dGV4IG1Bc3luY0NhbGxiYWNrTG9jazsKICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBtQXN5bmNDYWxsYmFjazsKICAgICB2b2lkICptQXN5bmNDYWxsYmFja1VzZXJEYXRhOworCisgICAgc3A8QU1lc3NhZ2U+IG1GcmFtZVJlbmRlcmVkTm90aWZ5OworICAgIG11dGFibGUgTXV0ZXggbUZyYW1lUmVuZGVyZWRDYWxsYmFja0xvY2s7CisgICAgQU1lZGlhQ29kZWNPbkZyYW1lUmVuZGVyZWQgbUZyYW1lUmVuZGVyZWRDYWxsYmFjazsKKyAgICB2b2lkICptRnJhbWVSZW5kZXJlZENhbGxiYWNrVXNlckRhdGE7CiB9OwogCiBDb2RlY0hhbmRsZXI6OkNvZGVjSGFuZGxlcihBTWVkaWFDb2RlYyAqY29kZWMpIHsKQEAgLTE1OCw4ICsxNzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOwotICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jSW5wdXRBdmFpbGFibGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0lucHV0QXZhaWxhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNJbnB1dEF2YWlsYWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSwKQEAgLTIwNSw4ICsyMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmbGFnc307CiAKICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNPdXRwdXRBdmFpbGFibGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY091dHB1dEF2YWlsYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jT3V0cHV0QXZhaWxhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhLApAQCAtMjM0LDggKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmFNZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZjb3B5KTsKIAogICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Zvcm1hdENoYW5nZWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Zvcm1hdENoYW5nZWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Zvcm1hdENoYW5nZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCkBAIC0yNTksMTIgKzI3NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKTsKLSAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnJvcigweCV4KSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyb3IoMHgleC8lcyksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgU3RyTWVkaWFFcnJvcihlcnIpLmNfc3RyKCksIGFjdGlvbkNvZGUsIGRldGFpbC5jX3N0cigpKTsKIAogICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Vycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNFcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCkBAIC0yOTgsNiArMzE1LDQzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRGcmFtZVJlbmRlcmVkTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGF0YTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kTWVzc2FnZSgiZGF0YSIsICZkYXRhKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdEZyYW1lUmVuZGVyZWROb3RpZnk6IGRhdGEgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKworICAgICAgICAgICAgLy8gVE9ETy4gVGhpcyBjb2RlIGhhcyBkZXBlbmRlbmN5IHdpdGggTWVkaWFDb2RlYzo6Q3JlYXRlRnJhbWVzUmVuZGVyZWRNZXNzYWdlLgorICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGRhdGEtPmNvdW50RW50cmllcygpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgQVN0cmluZyBuYW1lID0gZGF0YS0+Z2V0RW50cnlOYW1lQXQoaXgsICZ0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKEFTdHJpbmdQcmludGYoIiV6dS1tZWRpYS10aW1lLXVzIiwgaW5kZXgpLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBkYXRhID0gbXNnLT5nZXRFbnRyeUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5maW5kKCZtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoQVN0cmluZ1ByaW50ZigiJXp1LXN5c3RlbS1uYW5vIiwgaW5kZXgpLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBkYXRhID0gbXNnLT5nZXRFbnRyeUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5maW5kKCZzeXN0ZW1OYW5vKTsKKworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUZyYW1lUmVuZGVyZWRDYWxsYmFja1VzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtTmFubyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzaG91bGRuJ3QgYmUgaGVyZSIpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NTIsMTcgKzUwNiwxOSBAQAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogICAgIHNwPEFNZXNzYWdlPiBuYXRpdmVGb3JtYXQ7CiAgICAgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChmb3JtYXQsICZuYXRpdmVGb3JtYXQpOwotICAgIEFMT0dWKCJjb25maWd1cmUgd2l0aCBmb3JtYXQ6ICVzIiwgbmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKyAgICAvLyBjcmVhdGUgb3VyIHNoYWxsb3cgY29weSwgc28gd2UgYXJlbid0IHZpY3RpbSB0byBhbnkgbGF0ZXIgY2hhbmdlcy4KKyAgICBzcDxBTWVzc2FnZT4gZHVwTmF0aXZlRm9ybWF0ID0gbmF0aXZlRm9ybWF0LT5kdXAoKTsKKyAgICBBTE9HVigiY29uZmlndXJlIHdpdGggZm9ybWF0OiAlcyIsIGR1cE5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7CiAgICAgaWYgKHdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgIHN1cmZhY2UgPSAoU3VyZmFjZSopIHdpbmRvdzsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPmNvbmZpZ3VyZShkdXBOYXRpdmVGb3JtYXQsIHN1cmZhY2UsCiAgICAgICAgICAgICBjcnlwdG8gPyBjcnlwdG8tPm1DcnlwdG8gOiBOVUxMLCBmbGFncyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiY29uZmlndXJlOiBlcnIoJWQpLCBmYWlsZWQgd2l0aCBmb3JtYXQ6ICVzIiwKLSAgICAgICAgICAgICAgZXJyLCBuYXRpdmVGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworICAgICAgICAgICAgICBlcnIsIGR1cE5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgfQogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKIH0KQEAgLTQ3MiwyMiArNTI4LDQ2IEBACiAgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKICAgICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgIHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgaWYgKG1EYXRhLT5tQXN5bmNOb3RpZnkgPT0gTlVMTCAmJiB1c2VyZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIG1EYXRhLT5tQXN5bmNOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBc3luY05vdGlmeSwgbURhdGEtPm1IYW5kbGVyKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+c2V0Q2FsbGJhY2sobURhdGEtPm1Bc3luY05vdGlmeSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZXRBc3luY05vdGlmeUNhbGxiYWNrOiBlcnIoJWQpLCBmYWlsZWQgdG8gc2V0IGFzeW5jIGNhbGxiYWNrIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKLSAgICAgICAgfQotICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGF0YS0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKKworICAgIGlmIChtRGF0YS0+bUFzeW5jTm90aWZ5ID09IE5VTEwpIHsKKyAgICAgICAgbURhdGEtPm1Bc3luY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEFzeW5jTm90aWZ5LCBtRGF0YS0+bUhhbmRsZXIpOworICAgIH0KKworICAgIC8vIGFsd2F5cyBjYWxsLCBjb2RlYyBtYXkgaGF2ZSBiZWVuIHJlc2V0L3JlLWNvbmZpZ3VyZWQgc2luY2UgbGFzdCBjYWxsLgorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPnNldENhbGxiYWNrKG1EYXRhLT5tQXN5bmNOb3RpZnkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInNldEFzeW5jTm90aWZ5Q2FsbGJhY2s6IGVyciglZCksIGZhaWxlZCB0byBzZXQgYXN5bmMgY2FsbGJhY2siLCBlcnIpOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgfQorCiAgICAgbURhdGEtPm1Bc3luY0NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgbURhdGEtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKIAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2soCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgQU1lZGlhQ29kZWNPbkZyYW1lUmVuZGVyZWQgY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EYXRhLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrTG9jayk7CisgICAgaWYgKG1EYXRhLT5tRnJhbWVSZW5kZXJlZE5vdGlmeSA9PSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tRnJhbWVSZW5kZXJlZE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEZyYW1lUmVuZGVyZWROb3RpZnksIG1EYXRhLT5tSGFuZGxlcik7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPnNldE9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbihtRGF0YS0+bUZyYW1lUmVuZGVyZWROb3RpZnkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInNldE9uRnJhbWVSZW5kZXJlZE5vdGlmeUNhbGxiYWNrOiBlcnIoJWQpLCBmYWlsZWQgdG8gc2V0IGNhbGxiYWNrIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworICAgIH0KKworICAgIG1EYXRhLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgbURhdGEtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2tVc2VyRGF0YSA9IHVzZXJkYXRhOworCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KIAogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlQ3J5cHRvKEFNZWRpYUNvZGVjICptRGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggNmU5OTQ1ZC4uNTljMTEwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC05Nyw2ICs5Nyw4IEBACiAgICAgTGlzdDxpZHZlY190PiBtSWRzOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1RdWVyeVJlc3VsdHM7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IG1LZXlSZXF1ZXN0OworICAgIFN0cmluZzggbURlZmF1bHRVcmw7CisgICAgQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGUgbWtleVJlcXVlc3RUeXBlOwogICAgIFZlY3Rvcjx1aW50OF90PiBtUHJvdmlzaW9uUmVxdWVzdDsKICAgICBTdHJpbmc4IG1Qcm92aXNpb25Vcmw7CiAgICAgU3RyaW5nOCBtUHJvcGVydHlTdHJpbmc7CkBAIC00MTYsNiArNDE4LDIxIEBACiAgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKSB7CiAKKyAgICByZXR1cm4gQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGUobU9iaiwKKyAgICAgICAgc2NvcGUsIGluaXQsIGluaXRTaXplLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBudW1PcHRpb25hbFBhcmFtZXRlcnMsIGtleVJlcXVlc3QsCisgICAgICAgIGtleVJlcXVlc3RTaXplLCBOVUxMLCBOVUxMKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdFdpdGhEZWZhdWx0VXJsQW5kVHlwZShBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwgY29uc3QgdWludDhfdCAqaW5pdCwgc2l6ZV90IGluaXRTaXplLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwgQU1lZGlhRHJtS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlWYWx1ZSAqb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBzaXplX3QgbnVtT3B0aW9uYWxQYXJhbWV0ZXJzLCBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwKKyAgICAgICAgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKmRlZmF1bHRVcmwsCisgICAgICAgIEFNZWRpYURybUtleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSkgeworCiAgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOwogICAgIH0KQEAgLTQ0OSwxOCArNDY2LDQzIEBACiAgICAgICAgIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLmFkZChTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tS2V5KSwKICAgICAgICAgICAgICAgICBTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tVmFsdWUpKTsKICAgICB9Ci0gICAgU3RyaW5nOCBkZWZhdWx0VXJsOwotICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisKKyAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHJlcXVlc3RUeXBlOwogICAgIG1PYmotPm1LZXlSZXF1ZXN0LmNsZWFyKCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0S2V5UmVxdWVzdCgqaXRlciwgbWRJbml0LCBTdHJpbmc4KG1pbWVUeXBlKSwKLSAgICAgICAgICAgIG1kS2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIG1PYmotPm1LZXlSZXF1ZXN0LCBkZWZhdWx0VXJsLAotICAgICAgICAgICAgJmtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgIG1kS2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIG1PYmotPm1LZXlSZXF1ZXN0LCBtT2JqLT5tRGVmYXVsdFVybCwKKyAgICAgICAgICAgICZyZXF1ZXN0VHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKmtleVJlcXVlc3QgPSBtT2JqLT5tS2V5UmVxdWVzdC5hcnJheSgpOwogICAgICAgICAqa2V5UmVxdWVzdFNpemUgPSBtT2JqLT5tS2V5UmVxdWVzdC5zaXplKCk7CisgICAgICAgIGlmIChkZWZhdWx0VXJsICE9IE5VTEwpCisgICAgICAgICAgICAqZGVmYXVsdFVybCA9IG1PYmotPm1EZWZhdWx0VXJsLnN0cmluZygpOworICAgICAgICBzd2l0Y2gocmVxdWVzdFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDoKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX0lOSVRJQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw6CisgICAgICAgICAgICAgICAgbU9iai0+bWtleVJlcXVlc3RUeXBlID0gS0VZX1JFUVVFU1RfVFlQRV9SRU5FV0FMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOgorICAgICAgICAgICAgICAgIG1PYmotPm1rZXlSZXF1ZXN0VHlwZSA9IEtFWV9SRVFVRVNUX1RZUEVfUkVMRUFTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZToKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX05PTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZToKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX1VQREFURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleVJlcXVlc3RUeXBlICE9IE5VTEwpCisgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBtT2JqLT5ta2V5UmVxdWVzdFR5cGU7CiAgICAgfQorCiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggMDdmYzVkZS4uNmQzYzM0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0zODgsOSArMzg4LDExIEBACiAgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CiAgICAgfQogCisgICAgc3A8QUJ1ZmZlcj4gY2xlYXJidWY7CisgICAgc3A8QUJ1ZmZlcj4gY3J5cHRlZGJ1ZjsKICAgICBpZiAoc2l6ZW9mKHVpbnQzMl90KSAhPSBzaXplb2Yoc2l6ZV90KSkgewotICAgICAgICBzcDxBQnVmZmVyPiBjbGVhcmJ1ZiAgID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY2xlYXJkYXRhKTsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gY3J5cHRlZGJ1ZiA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNyeXB0ZWRkYXRhKTsKKyAgICAgICAgY2xlYXJidWYgICA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNsZWFyZGF0YSk7CisgICAgICAgIGNyeXB0ZWRidWYgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljcnlwdGVkZGF0YSk7CiAgICAgICAgIGNsZWFyZGF0YSAgID0gY2xlYXJidWYgICAgPT0gTlVMTCA/IE5VTEwgOiBjbGVhcmJ1Zi0+ZGF0YSgpOwogICAgICAgICBjcnlwdGVkZGF0YSA9IGNyeXB0ZWRkYXRhID09IE5VTEwgPyBOVUxMIDogY3J5cHRlZGJ1Zi0+ZGF0YSgpOwogICAgICAgICBpZihjcnlwdGVkZGF0YSA9PSBOVUxMIHx8IGNsZWFyZGF0YSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCBjMTc5M2NlLi45MjM0NTNhIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTIwMCw4ICsyMDAsMTEgQEAKICAgICBBU3RyaW5nIHRtcDsKICAgICBpZiAobURhdGEtPm1Gb3JtYXQtPmZpbmRTdHJpbmcobmFtZSwgJnRtcCkpIHsKICAgICAgICAgU3RyaW5nOCByZXQodG1wLmNfc3RyKCkpOwotICAgICAgICBtRGF0YS0+bVN0cmluZ0NhY2hlLmFkZChTdHJpbmc4KG5hbWUpLCByZXQpOwotICAgICAgICAqb3V0ID0gcmV0LnN0cmluZygpOworICAgICAgICBzc2l6ZV90IGkgPSBtRGF0YS0+bVN0cmluZ0NhY2hlLmFkZChTdHJpbmc4KG5hbWUpLCByZXQpOworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gbURhdGEtPm1TdHJpbmdDYWNoZS52YWx1ZUF0KGkpLnN0cmluZygpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzUxLDggKzM1NCwxNCBAQAogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRSA9ICJtaW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBID0gIm1wZWctdXNlci1kYXRhIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIgPSAibXBlZzItc3RyZWFtLWhlYWRlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHSF9DT01QQVRJQkxFX1NFVFMgPSAibXBlZ2gtY29tcGF0aWJsZS1zZXRzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiA9CisgICAgICAgICJtcGVnaC1wcm9maWxlLWxldmVsLWluZGljYXRpb24iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VUID0KKyAgICAgICAgIm1wZWdoLXJlZmVyZW5jZS1jaGFubmVsLWxheW91dCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSA9ICJvcGVyYXRpbmctcmF0ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcgPSAicGNtLWVuY29kaW5nIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BJQ1RVUkVfVFlQRSA9ICJwaWN0dXJlLXR5cGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOID0gInBjbS1iaWctZW5kaWFuIjsKQEAgLTM4Niw2ICszOTUsOSBAQAogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgPSAidHJhY2staWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggPSAidHJhY2staW5kZXgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyA9ICJ2YWxpZC1zYW1wbGVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUwgPQorICAgICAgICAidmlkZW8tZW5jb2Rpbmctc3RhdGlzdGljcy1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WSURFT19RUF9BVkVSQUdFID0gInZpZGVvLXFwLWF2ZXJhZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01BWCA9ICJ2aWRlby1xcC1iLW1heCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOID0gInZpZGVvLXFwLWItbWluIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfSV9NQVggPSAidmlkZW8tcXAtaS1tYXgiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL09XTkVSUyBiL21lZGlhL25kay9PV05FUlMKaW5kZXggOWRjNDQxZS4uODM2NDRmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL09XTkVSUworKysgYi9tZWRpYS9uZGsvT1dORVJTCkBAIC0xLDMgKzEsNCBAQAotbWFyY29uZUBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQogIyBGb3IgQUltYWdlL0FJbWFnZVJlYWRlcgogaW5jbHVkZSBwbGF0Zm9ybS9mcmFtZXdvcmtzL2F2Oi9jYW1lcmEvT1dORVJTCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKaW5kZXggNTE5MTQ4ZS4uNDkzOGY3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaApAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KKwogI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvLmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCkBAIC0xMjIsNiArMTI0LDI1IEBACiB9IEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrOwogCiAvKioKKyAqIENhbGxlZCB3aGVuIGFuIG91dHB1dCBmcmFtZSBoYXMgcmVuZGVyZWQgb24gdGhlIG91dHB1dCBzdXJmYWNlLgorICoKKyAqIFxwYXJhbSBjb2RlYyAgICAgICBUaGUgY29kZWMgb2JqZWN0IHRoYXQgZ2VuZXJhdGVkIHRoaXMgbm90aWZpY2F0aW9uLgorICogXHBhcmFtIHVzZXJkYXRhICAgIFRoZSB1c2VyIGRhdGEgc2V0IGF0IEFNZWRpYUNvZGVjX3NldE9uRnJhbWVSZW5kZXJlZENhbGxiYWNrLgorICogXHBhcmFtIG1lZGlhVGltZVVzIFRoZSBwcmVzZW50YXRpb24gdGltZSAobWVkaWEgdGltZSkgb2YgdGhlIGZyYW1lIHJlbmRlcmVkLgorICogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXN1YWxseSB0aGUgc2FtZSBhcyBzcGVjaWZpZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyLCBidXQgc29tZSBjb2RlY3MgbWF5IGFsdGVyCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIHRpbWUgYnkgYXBwbHlpbmcgc29tZSB0aW1lLWJhc2VkIHRyYW5zZm9ybWF0aW9uLAorICogICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgZnJhbWUgcmF0ZSBjb252ZXJzaW9uLiBJbiB0aGF0IGNhc2UsIHByZXNlbnRhdGlvbgorICogICAgICAgICAgICAgICAgICAgIHRpbWUgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBvdXRwdXQgZnJhbWUgcmVuZGVyZWQuCisgKiBccGFyYW0gc3lzdGVtTmFubyAgVGhlIHN5c3RlbSB0aW1lIHdoZW4gdGhlIGZyYW1lIHdhcyByZW5kZXJlZC4KKyAqLwordHlwZWRlZiB2b2lkICgqQU1lZGlhQ29kZWNPbkZyYW1lUmVuZGVyZWQpKAorICAgICAgICBBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzLAorICAgICAgICBpbnQ2NF90IHN5c3RlbU5hbm8pOworCisvKioKICAqIENyZWF0ZSBjb2RlYyBieSBuYW1lLiBVc2UgdGhpcyBpZiB5b3Uga25vdyB0aGUgZXhhY3QgY29kZWMgeW91IHdhbnQgdG8gdXNlLgogICogV2hlbiBjb25maWd1cmluZywgeW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHRoZSBjb2RlYyBhcyBhbgogICogZW5jb2RlciBvciBkZWNvZGVyLgpAQCAtNDE2LDE4ICs0MzcsMjggQEAKIAogLyoqCiAgKiBTZXQgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGZvciBhY3Rpb25hYmxlIEFNZWRpYUNvZGVjIGV2ZW50cy4KLSAqIFdoZW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGlzIGVuYWJsZWQsIHRoZSBjbGllbnQgc2hvdWxkIG5vdCBjYWxsCisgKiBXaGVuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBpcyBlbmFibGVkLCBpdCBpcyBhbiBlcnJvciBmb3IgdGhlIGNsaWVudCB0byBjYWxsCiAgKiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcnMoKSwgQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVycygpLAogICogQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKCkgb3IgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcigpLgogICoKLSAqIEFsc28sIEFNZWRpYUNvZGVjX2ZsdXNoKCkgYmVoYXZlcyBkaWZmZXJlbnRseSBpbiBhc3luY2hyb25vdXMgbW9kZS4KLSAqIEFmdGVyIGNhbGxpbmcgQU1lZGlhQ29kZWNfZmx1c2goKSwgeW91IG11c3QgY2FsbCBBTWVkaWFDb2RlY19zdGFydCgpIHRvCi0gKiAicmVzdW1lIiByZWNlaXZpbmcgaW5wdXQgYnVmZmVycywgZXZlbiBpZiBhbiBpbnB1dCBzdXJmYWNlIHdhcyBjcmVhdGVkLgorICogQU1lZGlhQ29kZWNfZmx1c2goKSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGFzeW5jaHJvbm91cyBtb2RlLgorICogQWZ0ZXIgY2FsbGluZyBBTWVkaWFDb2RlY19mbHVzaCgpLCB0aGUgY2xpZW50IG11c3QgY2FsbCBBTWVkaWFDb2RlY19zdGFydCgpIHRvCisgKiAicmVzdW1lIiByZWNlaXZpbmcgaW5wdXQgYnVmZmVycy4gRXZlbiBpZiB0aGUgY2xpZW50IGRvZXMgbm90IHJlY2VpdmUKKyAqIEFNZWRpYUNvZGVjT25Bc3luY0lucHV0QXZhaWxhYmxlIGNhbGxiYWNrcyBmcm9tIHZpZGVvIGVuY29kZXJzIGNvbmZpZ3VyZWQKKyAqIHdpdGggYW4gaW5wdXQgc3VyZmFjZSwgdGhlIGNsaWVudCBzdGlsbCBuZWVkcyB0byBjYWxsIEFNZWRpYUNvZGVjX3N0YXJ0KCkKKyAqIHRvIHJlc3VtZSB0aGUgaW5wdXQgc3VyZmFjZSB0byBzZW5kIGJ1ZmZlcnMgdG8gdGhlIGVuY29kZXJzLgorICoKKyAqIFdoZW4gY2FsbGVkIHdpdGggbnVsbCBjYWxsYmFjaywgdGhpcyBtZXRob2QgdW5yZWdpc3RlcnMgYW55IHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrLgogICoKICAqIFJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIG9uIGhvdyBlYWNoCiAgKiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYW5kIHdoYXQgYXJlIHNwZWNpZmllZC4KLSAqIFRoZSBzcGVjaWZpZWQgdXNlcmRhdGEgaXMgdGhlIHBvaW50ZXIgdXNlZCB3aGVuIHRob3NlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUKLSAqIGNhbGxlZC4KKyAqIFRoZSBzcGVjaWZpZWQgdXNlcmRhdGEgaXMgb3BhcXVlIGRhdGEgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYWxvbmcKKyAqIHdoZW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLiBNZWRpYUNvZGVjIGRvZXMgbm90IGxvb2sgYXQgb3IgYWx0ZXIgdGhlCisgKiB2YWx1ZSBvZiB1c2VyZGF0YS4gT2Z0ZW4gaXQgaXMgYSBwb2ludGVyIHRvIGEgY2xpZW50LW93bmVkIG9iamVjdCwKKyAqIGFuZCBjbGllbnQgbWFuYWdlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBvYmplY3QgaW4gdGhhdCBjYXNlLgorICoKKyAqIE9uY2UgdGhlIGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZCBvciB0aGUgY29kZWMgaXMgcmVzZXQgLyByZWxlYXNlZCwgdGhlCisgKiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkLgogICoKICAqIEFsbCBjYWxsYmFja3MgYXJlIGZpcmVkIG9uIG9uZSBOREsgaW50ZXJuYWwgdGhyZWFkLgogICogQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiB0aGUgY2FsbGJhY2sgdGhyZWFkLgpAQCAtNDQxLDYgKzQ3MiwzOSBAQAogICAgICAgICB2b2lkICp1c2VyZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCisgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gb3V0cHV0IGZyYW1lIGlzIHJlbmRlcmVkIG9uIHRoZSBvdXRwdXQgc3VyZmFjZS4KKyAqCisgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGluIGFueSBjb2RlYyBzdGF0ZSwgYnV0IHdpbGwgb25seSBoYXZlIGFuIGVmZmVjdCBpbiB0aGUKKyAqIEV4ZWN1dGluZyBzdGF0ZSBmb3IgY29kZWNzIHRoYXQgcmVuZGVyIGJ1ZmZlcnMgdG8gdGhlIG91dHB1dCBzdXJmYWNlLgorICoKKyAqIFRoaXMgY2FsbGJhY2sgaXMgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seTogdG8gZ2V0IHByZWNpc2UKKyAqIHJlbmRlciB0aW1pbmcgc2FtcGxlcywgYW5kIGNhbiBiZSBzaWduaWZpY2FudGx5IGRlbGF5ZWQgYW5kIGJhdGNoZWQuIFNvbWUgZnJhbWVzIG1heSBoYXZlCisgKiBiZWVuIHJlbmRlcmVkIGV2ZW4gaWYgdGhlcmUgd2FzIG5vIGNhbGxiYWNrIGdlbmVyYXRlZC4KKyAqCisgKiBXaGVuIGNhbGxlZCB3aXRoIG51bGwgY2FsbGJhY2ssIHRoaXMgbWV0aG9kIHVucmVnaXN0ZXJzIGFueSBwcmV2aW91c2x5IHNldCBjYWxsYmFjay4KKyAqCisgKiBSZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCBvbiBob3cgZWFjaAorICogY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGFuZCB3aGF0IGFyZSBzcGVjaWZpZWQuCisgKiBUaGUgc3BlY2lmaWVkIHVzZXJkYXRhIGlzIG9wYXF1ZSBkYXRhIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGFsb25nCisgKiB3aGVuIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIGNhbGxlZC4gTWVkaWFDb2RlYyBkb2VzIG5vdCBsb29rIGF0IG9yIGFsdGVyIHRoZQorICogdmFsdWUgb2YgdXNlcmRhdGEuIE9mdGVuIGl0IGlzIGEgcG9pbnRlciB0byBhIGNsaWVudC1vd25lZCBvYmplY3QsCisgKiBhbmQgY2xpZW50IG1hbmFnZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgb2JqZWN0IGluIHRoYXQgY2FzZS4KKyAqCisgKiBPbmNlIHRoZSBjYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQgb3IgdGhlIGNvZGVjIGlzIHJlc2V0IC8gcmVsZWFzZWQsIHRoZQorICogcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZC4KKyAqCisgKiBBbGwgY2FsbGJhY2tzIGFyZSBmaXJlZCBvbiBvbmUgTkRLIGludGVybmFsIHRocmVhZC4KKyAqIEFNZWRpYUNvZGVjX3NldE9uRnJhbWVSZW5kZXJlZENhbGxiYWNrIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHRoZSBjYWxsYmFjayB0aHJlYWQuCisgKiBObyBoZWF2eSBkdXR5IHRhc2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBjYWxsYmFjayB0aHJlYWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFuZHJvaWQgVC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2soCisgICAgICAgIEFNZWRpYUNvZGVjKiwKKyAgICAgICAgQU1lZGlhQ29kZWNPbkZyYW1lUmVuZGVyZWQgY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKSBfX0lOVFJPRFVDRURfSU4oX19BTkRST0lEX0FQSV9UX18pOworCisvKioKICAqIFJlbGVhc2UgdGhlIGNyeXB0byBpZiBhcHBsaWNhYmxlLgogICoKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAppbmRleCA4NDlhOGY5Li40ZWNhM2Q3IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKQEAgLTExMiw2ICsxMTIsNDEgQEAKIH0gQU1lZGlhRHJtS2V5VHlwZTsKIAogLyoqCisgKiBJbnRyb2R1Y2VkIGluIEFQSSAzMy4KKyAqLwordHlwZWRlZiBlbnVtIEFNZWRpYURybUtleVJlcXVlc3RUeXBlIDogaW50MzJfdCB7CisgICAgLyoqCisgICAgICogS2V5IHJlcXVlc3QgdHlwZSBpcyBpbml0aWFsIGxpY2Vuc2UgcmVxdWVzdC4KKyAgICAgKiBBbiBpbml0aWFsIGxpY2Vuc2UgcmVxdWVzdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCBrZXlzLgorICAgICAqLworICAgIEtFWV9SRVFVRVNUX1RZUEVfSU5JVElBTCwKKworICAgIC8qKgorICAgICAqIEtleSByZXF1ZXN0IHR5cGUgaXMgbGljZW5zZSByZW5ld2FsLgorICAgICAqIEEgcmVuZXdhbCBsaWNlbnNlIHJlcXVlc3QgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgdGhlIGtleXMgZnJvbSBleHBpcmluZy4KKyAgICAgKi8KKyAgICBLRVlfUkVRVUVTVF9UWVBFX1JFTkVXQUwsCisKKyAgICAvKioKKyAgICAgKiBLZXkgcmVxdWVzdCB0eXBlIGlzIGxpY2Vuc2UgcmVsZWFzZS4KKyAgICAgKiBBIGxpY2Vuc2UgcmVsZWFzZSByZXF1ZXN0IGluZGljYXRlcyB0aGF0IGtleXMgYXJlIHJlbW92ZWQuCisgICAgICovCisgICAgS0VZX1JFUVVFU1RfVFlQRV9SRUxFQVNFLAorCisgICAgLyoqCisgICAgICogS2V5cyBhcmUgYWxyZWFkeSBsb2FkZWQgYW5kIGFyZSBhdmFpbGFibGUgZm9yIHVzZS4gTm8gbGljZW5zZSByZXF1ZXN0IGlzIG5lY2Vzc2FyeSwgYW5kCisgICAgICogbm8ga2V5IHJlcXVlc3QgZGF0YSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBLRVlfUkVRVUVTVF9UWVBFX05PTkUsCisKKyAgICAvKioKKyAgICAgKiBLZXlzIGhhdmUgYmVlbiBsb2FkZWQgYnV0IGFuIGFkZGl0aW9uYWwgbGljZW5zZSByZXF1ZXN0IGlzIG5lZWRlZAorICAgICAqIHRvIHVwZGF0ZSB0aGVpciB2YWx1ZXMuCisgICAgICovCisgICAgS0VZX1JFUVVFU1RfVFlQRV9VUERBVEUKK30gQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGU7CisKKy8qKgogICogIERhdGEgdHlwZSBjb250YWluaW5nIHtrZXksIHZhbHVlfSBwYWlyCiAgKi8KIHR5cGVkZWYgc3RydWN0IEFNZWRpYURybUtleVZhbHVlUGFpciB7CkBAIC0yNDgsNyArMjgzLDEwIEBACiAgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KICAqIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IGlzIHVzZWQgdG8gb2J0YWluIGFuIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKICAqIGlzIGRlbGl2ZXJlZCB0byB0aGUgbGljZW5zZSBzZXJ2ZXIuICBUaGUgb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgaXMKLSAqIHJldHVybmVkIGluIEtleVJlcXVlc3QuZGF0YS4KKyAqIHJldHVybmVkIGluICprZXlSZXF1ZXN0IGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXF1ZXN0IGlzCisgKiByZXR1cm5lZCBpbiAqa2V5UmVxdWVzdFNpemUuCisgKiBUaGlzIEFQSSBoYXMgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlKCkKKyAqIHdoZW4gZGVmYXVsdFVybCBhbmQga2V5UmVxdWVzdFR5cGUgYXJlIHBhc3NlZCBpbiBhcyBOVUxMLgogICoKICAqIEFmdGVyIHRoZSBhcHAgaGFzIHJlY2VpdmVkIHRoZSBrZXkgcmVxdWVzdCByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIsCiAgKiBpdCBzaG91bGQgZGVsaXZlciB0byB0aGUgcmVzcG9uc2UgdG8gdGhlIERSTSBlbmdpbmUgcGx1Z2luIHVzaW5nIHRoZSBtZXRob2QKQEAgLTI4MCwxMSArMzE4LDE0IEBACiAgKiAgIGJ5IHRoZSBjYWxsZXIKICAqCiAgKiBPbiBleGl0OgorICogICBJZiB0aGlzIHJldHVybnMgQU1FRElBX09LLAogICogICAxLiBUaGUga2V5UmVxdWVzdCBwb2ludGVyIHdpbGwgcmVmZXJlbmNlIHRoZSBvcGFxdWUga2V5IHJlcXVlc3QgZGF0YS4gIEl0CiAgKiAgICAgICB3aWxsIHJlc2lkZSBpbiBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QsIGFuZCB3aWxsIHJlbWFpbgotICogICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IG9yIHVudGlsIHRoZQorICogICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0CisgKiAgICAgICBvciBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdFdpdGhEZWZhdWx0VXJsQW5kVHlwZSBvciB1bnRpbCB0aGUKICAqICAgICAgIE1lZGlhRHJtIG9iamVjdCBpcyByZWxlYXNlZC4KICAqICAgMi4ga2V5UmVxdWVzdFNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QKKyAqICAgSWYgdGhpcyBkb2VzIG5vdCByZXR1cm4gQU1FRElBX09LLCB2YWx1ZSBvZiB0aGVzZSBwYXJhbWV0ZXJzIHNob3VsZCBub3QgYmUgdXNlZC4KICAqCiAgKiBSZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiByZXByb3Zpc2lvbmluZyBpcyBuZWVkZWQsIGR1ZSB0byBhCiAgKiBwcm9ibGVtIHdpdGggdGhlIGRldmljZSBjZXJ0aWZpY2F0ZS4KQEAgLTI5Nyw2ICszMzgsNzIgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgorICogQSBrZXkgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIGxpY2Vuc2Ugc2VydmVyCisgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KKyAqIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IGlzIHVzZWQgdG8gb2J0YWluIGFuIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKKyAqIGlzIGRlbGl2ZXJlZCB0byB0aGUgbGljZW5zZSBzZXJ2ZXIuICBUaGUgb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgaXMKKyAqIHJldHVybmVkIGluICprZXlSZXF1ZXN0IGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXF1ZXN0IGlzCisgKiByZXR1cm5lZCBpbiAqa2V5UmVxdWVzdFNpemUuCisgKgorICogQWZ0ZXIgdGhlIGFwcCBoYXMgcmVjZWl2ZWQgdGhlIGtleSByZXF1ZXN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwKKyAqIGl0IHNob3VsZCBkZWxpdmVyIHRvIHRoZSByZXNwb25zZSB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgdGhlIG1ldGhvZAorICogQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZS4KKyAqCisgKiBzY29wZSBtYXkgYmUgYSBzZXNzaW9uSWQgb3IgYSBrZXlTZXRJZCwgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQga2V5VHlwZS4KKyAqIFdoZW4gdGhlIGtleVR5cGUgaXMgS0VZX1RZUEVfU1RSRUFNSU5HIG9yIEtFWV9UWVBFX09GRkxJTkUsIHNjb3BlIHNob3VsZCBiZSBzZXQKKyAqIHRvIHRoZSBzZXNzaW9uSWQgdGhlIGtleXMgd2lsbCBiZSBwcm92aWRlZCB0by4gIFdoZW4gdGhlIGtleVR5cGUgaXMKKyAqIEtFWV9UWVBFX1JFTEVBU0UsIHNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIG9mIHRoZSBrZXlzIGJlaW5nIHJlbGVhc2VkLgorICogUmVsZWFzaW5nIGtleXMgZnJvbSBhIGRldmljZSBpbnZhbGlkYXRlcyB0aGVtIGZvciBhbGwgc2Vzc2lvbnMuCisgKgorICogaW5pdCBjb250YWluZXItc3BlY2lmaWMgZGF0YSwgaXRzIG1lYW5pbmcgaXMgaW50ZXJwcmV0ZWQgYmFzZWQgb24gdGhlIG1pbWUgdHlwZQorICogcHJvdmlkZWQgaW4gdGhlIG1pbWVUeXBlIHBhcmFtZXRlci4gIEl0IGNvdWxkIGNvbnRhaW4sIGZvciBleGFtcGxlLCB0aGUgY29udGVudAorICogSUQsIGtleSBJRCBvciBvdGhlciBkYXRhIG9idGFpbmVkIGZyb20gdGhlIGNvbnRlbnQgbWV0YWRhdGEgdGhhdCBpcyByZXF1aXJlZCBpbgorICogZ2VuZXJhdGluZyB0aGUga2V5IHJlcXVlc3QuIGluaXQgbWF5IGJlIG51bGwgd2hlbiBrZXlUeXBlIGlzIEtFWV9UWVBFX1JFTEVBU0UuCisgKgorICogaW5pdFNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBpbml0RGF0YQorICoKKyAqIG1pbWVUeXBlIGlkZW50aWZpZXMgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudC4KKyAqCisgKiBrZXlUeXBlIHNwZWNpZmVzIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0LiBUaGUgcmVxdWVzdCBtYXkgYmUgdG8gYWNxdWlyZSBrZXlzIGZvcgorICogICBzdHJlYW1pbmcgb3Igb2ZmbGluZSBjb250ZW50LCBvciB0byByZWxlYXNlIHByZXZpb3VzbHkgYWNxdWlyZWQga2V5cywgd2hpY2ggYXJlCisgKiAgIGlkZW50aWZpZWQgYnkgYSBrZXlTZXRJZC4KKyAqCisgKiBvcHRpb25hbFBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBrZXkgcmVxdWVzdCBtZXNzYWdlIHRvIGFsbG93IGEgY2xpZW50CisgKiAgIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBtZXNzYWdlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlci4KKyAqCisgKiBudW1PcHRpb25hbFBhcmFtZXRlcnMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyBwcm92aWRlZAorICogICBieSB0aGUgY2FsbGVyCisgKgorICogT24gZXhpdDoKKyAqICAgSWYgdGhpcyByZXR1cm5zIEFNRURJQV9PSywKKyAqICAgMS4gVGhlIGtleVJlcXVlc3QgcG9pbnRlciB3aWxsIHJlZmVyZW5jZSB0aGUgb3BhcXVlIGtleSByZXF1ZXN0IGRhdGEuICBJdAorICogICAgICAgd2lsbCByZXNpZGUgaW4gbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LCBhbmQgd2lsbCByZW1haW4KKyAqICAgICAgIGFjY2Vzc2libGUgdW50aWwgdGhlIG5leHQgY2FsbCB0byBlaXRoZXIgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QKKyAqICAgICAgIG9yIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlIG9yIHVudGlsIHRoZQorICogICAgICAgTWVkaWFEcm0gb2JqZWN0IGlzIHJlbGVhc2VkLgorICogICAyLiBrZXlSZXF1ZXN0U2l6ZSB3aWxsIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdC4KKyAqICAgMy4gZGVmYXVsdFVybCB3aWxsIGJlIHNldCB0byB0aGUgcmVjb21tZW5kZWQgVVJMIHRvIGRlbGl2ZXIgdGhlIGtleSByZXF1ZXN0LgorICogICAgICBUaGUgZGVmYXVsdFVybCBwb2ludGVyIHdpbGwgcmVmZXJlbmNlIGEgTlVMTCB0ZXJtaW5hdGVkIFVSTCBzdHJpbmcuCisgKiAgICAgIEl0IHdpbGwgYmUgVVRGLTggZW5jb2RlZCBhbmQgaGF2ZSBzYW1lIGxpZmV0aW1lIHdpdGggdGhlIGtleSByZXF1ZXN0IGRhdGEKKyAqICAgICAgS2V5UmVxdWVzdCBwb2ludGVyIHJlZmVyZW5jZXMgdG8uIFBhc3NpbmcgaW4gTlVMTCBtZWFucyB5b3UgZG9uJ3QgbmVlZCBpdAorICogICAgICB0byBiZSByZXBvcnRlZC4KKyAqICAgNC4ga2V5UmVxdWVzdFR5cGUgd2lsbCBiZSBzZXQgdG8gdGhlIGtleSByZXF1ZXN0IHR5cGUuIFBhc3NpbmcgaW4gTlVMTCBtZWFucworKiAgICAgICB5b3UgZG9uJ3QgbmVlZCBpdCB0byBiZSByZXBvcnRlZC4KKyAqCisgKiBSZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiByZXByb3Zpc2lvbmluZyBpcyBuZWVkZWQsIGR1ZSB0byBhCisgKiBwcm9ibGVtIHdpdGggdGhlIGRldmljZSBjZXJ0aWZpY2F0ZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMzLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdFdpdGhEZWZhdWx0VXJsQW5kVHlwZShBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLCBjb25zdCB1aW50OF90ICppbml0LCBzaXplX3QgaW5pdFNpemUsCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBBTWVkaWFEcm1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LAorICAgICAgICBzaXplX3QgKmtleVJlcXVlc3RTaXplLCBjb25zdCBjaGFyICoqZGVmYXVsdFVybCwKKyAgICAgICAgQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSBfX0lOVFJPRFVDRURfSU4oX19BTkRST0lEX0FQSV9UX18pOworCisvKioKICAqIEEga2V5IHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyIGJ5IHRoZSBhcHAsIHRoZW4gaXQgaXMKICAqIHByb3ZpZGVkIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuICBXaGVuIHRoZQogICogcmVzcG9uc2UgaXMgZm9yIGFuIG9mZmxpbmUga2V5IHJlcXVlc3QsIGEga2V5U2V0SWQgaXMgcmV0dXJuZWQgdGhhdCBjYW4gYmUKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCmluZGV4IGZiZDg1NWQuLjIxOTU2NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaApAQCAtMzExLDYgKzMxMSwxMCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFTVF9TQU1QTEVfSU5ERVhfSU5fQ0hVTksgX19JTlRST0RVQ0VEX0lOKDMxKTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9USU1FX0JFRk9SRV9BUFBFTkQgX19JTlRST0RVQ0VEX0lOKDMxKTsKIAorZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUElDVFVSRV9UWVBFIF9fSU5UUk9EVUNFRF9JTigzMyk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMIF9fSU5UUk9EVUNFRF9JTigzMyk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WSURFT19RUF9BVkVSQUdFIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfQl9NQVggX19JTlRST0RVQ0VEX0lOKDMxKTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfQl9NSU4gX19JTlRST0RVQ0VEX0lOKDMxKTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfSV9NQVggX19JTlRST0RVQ0VEX0lOKDMxKTsKQEAgLTMyMCw2ICszMjQsMzQgQEAKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NQVggX19JTlRST0RVQ0VEX0lOKDMxKTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NSU4gX19JTlRST0RVQ0VEX0lOKDMxKTsKIAorLyoqCisgKiBNUEVHLUggYXVkaW8gcHJvZmlsZSBhbmQgbGV2ZWwgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBTZWUgRkRBbWRfMiBvZiBJU09fSUVDXzIzMDA4LTM7MjAxOSBNSEFQcm9maWxlQW5kTGV2ZWxDb21wYXRpYmlsaXR5U2V0Qm94LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzIuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUyBfX0lOVFJPRFVDRURfSU4oMzIpOworCisvKioKKyAqIE1QRUctSCBhdWRpbyBwcm9maWxlIGxldmVsIGluZGljYXRpb24uCisgKgorICogU2VlIElTT19JRUNfMjMwMDgtMzsyMDE5IE1IQURlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIG1wZWdoM2RhUHJvZmlsZUxldmVsSW5kaWNhdGlvbi4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMyLgorICovCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHSF9QUk9GSUxFX0xFVkVMX0lORElDQVRJT04gX19JTlRST0RVQ0VEX0lOKDMyKTsKKworLyoqCisgKiBNUEVHLUggYXVkaW8gcmVmZXJlbmNlIGNoYW5uZWwgbGF5b3V0LgorICoKKyAqIFNlZSBJU09fSUVDXzIzMDA4LTM7MjAxOSBNSEFEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCByZWZlcmVuY2VDaGFubmVsTGF5b3V0CisgKiBhbmQgSVNPX0lFQ18yMzAwMeKAkDggQ2hhbm5lbENvbmZpZ3VyYXRpb24gdmFsdWUuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VUIF9fSU5UUk9EVUNFRF9JTigzMik7CisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IDdlOWU1N2UuLmM4ZmFjZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC0xMjYsNiArMTI2LDkgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUU7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9DT01QQVRJQkxFX1NFVFM7ICMgdmFyIGludHJvZHVjZWQ9MzIKKyAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0zMgorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VUOyAjIHZhciBpbnRyb2R1Y2VkPTMyCiAgICAgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU47ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORzsgIyB2YXIgaW50cm9kdWNlZD0yOApAQCAtMjAwLDYgKzIwMyw3IEBACiAgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lOwogICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2s7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUNvZGVjX3NldE9uRnJhbWVSZW5kZXJlZENhbGxiYWNrOyAjIGludHJvZHVjZWQ9VGlyYW1pc3UKICAgICBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBTWVkaWFDb2RlY19zZXRQYXJhbWV0ZXJzOyAjIGludHJvZHVjZWQ9MjYKICAgICBBTWVkaWFDb2RlY19zZXRJbnB1dFN1cmZhY2U7ICMgaW50cm9kdWNlZD0yNgpAQCAtMjI2LDYgKzIzMCw3IEBACiAgICAgQU1lZGlhRHJtX2RlY3J5cHQ7CiAgICAgQU1lZGlhRHJtX2VuY3J5cHQ7CiAgICAgQU1lZGlhRHJtX2dldEtleVJlcXVlc3Q7CisgICAgQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGU7ICMgaW50cm9kdWNlZD1UaXJhbWlzdQogICAgIEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheTsKICAgICBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmc7CiAgICAgQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjE3NTQxZC4uNzVkNzNiZiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzAsNyArMzAsOCBAQAogICAgICAgICBhbmRyb2lkOnJvdW5kSWNvbj0iQG1pcG1hcC9pY19sYXVuY2hlcl9yb3VuZCIKICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL0FwcFRoZW1lIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KQEAgLTQyLDQgKzQzLDQgQEAKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNhbXBsZVZpZGVvRW5jb2RlciBUZXN0Ii8+CiAKLTwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icAppbmRleCAyZTA2ZGE1Li40YjQ0ZGNmIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCkBAIC02OSw3ICs2OSw2IEBACiBqYXZhX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiTWVkaWFCZW5jaG1hcmstZGVmYXVsdHMiLAogCi0gICAgc2RrX3ZlcnNpb246ICJzeXN0ZW1fY3VycmVudCIsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjgiLAotICAgIHRhcmdldF9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICB0YXJnZXRfc2RrX3ZlcnNpb246ICIzMCIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCmluZGV4IGIyYWVlMWEuLmIyMjJkNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCkBAIC0xNywyMSArMTcsMjEgQEAKIGJ1aWxkc2NyaXB0IHsKICAgICByZXBvc2l0b3JpZXMgewogICAgICAgICBnb29nbGUoKQotICAgICAgICBqY2VudGVyKCkKKyAgICAgICAgbWF2ZW5DZW50cmFsKCkKICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6My41LjAnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjQuMi4xJwogICAgIH0KIH0KIAogYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQuYXBwbGljYXRpb24nCiAKIGFuZHJvaWQgewotICAgIGNvbXBpbGVTZGtWZXJzaW9uIDI5CisgICAgY29tcGlsZVNka1ZlcnNpb24gMzAKICAgICBkZWZhdWx0Q29uZmlnIHsKICAgICAgICAgYXBwbGljYXRpb25JZCAiY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrIgogICAgICAgICBtaW5TZGtWZXJzaW9uIDI4Ci0gICAgICAgIHRhcmdldFNka1ZlcnNpb24gMjkKKyAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAzMAogICAgICAgICB2ZXJzaW9uQ29kZSAxCiAgICAgICAgIHZlcnNpb25OYW1lICIxLjAiCiAgICAgICAgIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKQEAgLTU3LDIwICs1NywyMCBAQAogICAgIGV4dGVybmFsTmF0aXZlQnVpbGQgewogICAgICAgICBjbWFrZSB7CiAgICAgICAgICAgICBwYXRoICJzcmMvbWFpbi9jcHAvQ01ha2VMaXN0cy50eHQiCi0gICAgICAgICAgICB2ZXJzaW9uICIzLjEwLjIiCisgICAgICAgICAgICB2ZXJzaW9uICIzLjE4LjEiCiAgICAgICAgIH0KICAgICB9CiB9CiAKIHJlcG9zaXRvcmllcyB7CiAgICAgZ29vZ2xlKCkKLSAgICBqY2VudGVyKCkKKyAgICBtYXZlbkNlbnRyYWwoKQogfQogCiBkZXBlbmRlbmNpZXMgewogICAgIGltcGxlbWVudGF0aW9uIGZpbGVUcmVlKGRpcjogJ2xpYnMnLCBpbmNsdWRlOiBbJyouamFyJ10pCi0gICAgaW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LmFwcGNvbXBhdDphcHBjb21wYXQ6MS4xLjAnCi0gICAgdGVzdEltcGxlbWVudGF0aW9uICdqdW5pdDpqdW5pdDo0LjEyJwotICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMi4wJwotICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4xJworICAgIGltcGxlbWVudGF0aW9uICdhbmRyb2lkeC5hcHBjb21wYXQ6YXBwY29tcGF0OjEuMy4wJworICAgIHRlc3RJbXBsZW1lbnRhdGlvbiAnanVuaXQ6anVuaXQ6NC4xMy4yJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMy4wJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4yJwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwCmluZGV4IGFmOTI0MjQuLjAxOTJkNjggMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icApAQCAtOSw3ICs5LDYgQEAKIAogY2NfdGVzdF9saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfam5pIiwKLSAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAogCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvbW1vbi1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDZiNTRjNmEuLjc5ODg5NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC01NSw3ICs1NSw2IEBACiAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmstZGVmYXVsdHMiLAotICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCiAgICAgc3RsOiAiYysrX3NoYXJlZCIsCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtOTUsMTAgKzk0LDYgQEAKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAogICAgICAgICAibGlibWVkaWFuZGsiLApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcAppbmRleCBmMGJiM2I5Li4zYmRmYmFkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcApAQCAtMTI0LDkgKzEyNCw3IEBACiAKICAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CiAgICAgaWYgKG1FeHRyYWN0b3IpIHsKLSAgICAgICAgLy8gVE9ETzogKGIvMTQwMTI4NTA1KSBNdWx0aXBsZSBjYWxscyByZXN1bHQgaW4gRG9TLgotICAgICAgICAvLyBVbmNvbW1lbnQgY2FsbCB0byBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKCkgb25jZSB0aGlzIGlzIHJlc29sdmVkCi0gICAgICAgIC8vIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CiAgICAgICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOwogICAgIH0KICAgICBpbnQ2NF90IGVUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDBmYmQyMGQuLjlhOGNhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMyw3ICszMywxMiBAQAogCiAgICAgc3JjczogWyJFeHRyYWN0b3JUZXN0LmNwcCJdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIl0KKyAgICBzdGF0aWNfbGliczogWyJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCiB9CiAKIGNjX3Rlc3QgewpAQCAtNTAsNiArNTUsMTEgQEAKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKICAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgXSwKIH0KIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcAppbmRleCA4MWVmMDJhLi4zNjY2NzI0IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxsaW1pdHM+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKICNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJEZWNvZGVyLmgiCiAKQEAgLTE3NSw2ICsxNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiLCB0cnVlKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKICAgICBnRW52ID0gbmV3IEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpOwogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOwogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCmluZGV4IGQxNGQxNWIuLjI3ZWU5YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKICNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJFeHRyYWN0b3IuaCIKIApAQCAtNzMsNiArNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKICAgICBnRW52ID0gbmV3IEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpOwogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOwogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggYmZlNzNkNS4uYTM4ZWY1NyAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCkBAIC0yOCwxMiArMjgsMTggQEAKICAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAorICAgICAgICAiTGlicmFyeS5jcHAiLAogICAgICAgICAiTGltaXRQcm9jZXNzTWVtb3J5LmNwcCIsCisgICAgICAgICJNZWRpYVV0aWxzRGVsYXllZC5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAorICAgICAgICAiTWV0aG9kU3RhdGlzdGljcy5jcHAiLAorICAgICAgICAiUHJvY2Vzcy5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaHJlYWRTbmFwc2hvdC5jcHAiLAogICAgICAgICAiVGltZUNoZWNrLmNwcCIsCisgICAgICAgICJUaW1lclRocmVhZC5jcHAiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCkBAIC00Miw3ICs0OCw3IEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLCAvLyBmb3IgY2xvY2suaAorICAgICAgICAibGliYXVkaW91dGlscyIsIC8vIGZvciBjbG9jay5oLCBTdGF0aXN0aWNzLmgKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTUxLDYgKzU3LDcgQEAKICAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJiYXR0ZXJ5c3RhdHNfYWlkbCIsCkBAIC03Myw2ICs4MCwxMCBAQAogICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgXSwKIAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2RlbGF5ZWQiLCAgLy8gbGF6eSBsb2FkZWQKKyAgICBdLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKICAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKQEAgLTgxLDkgKzkyLDY4IEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2RlbGF5ZWQiLCAvLyBtYXRjaCB3aXRoIE1FRElBVVRJTFNfREVMQVlFRF9MSUJSQVJZX05BTUUKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwgIC8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybS9oYXJkd2FyZS9pbnRlcmZhY2VzCisgICAgc3JjczogWworICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKworCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsICAvLyByZXF1aXJlZCBmb3IgcGxhdGZvcm0vaGFyZHdhcmUvaW50ZXJmYWNlcwogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX3Rlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lbW9yeS10ZXN0LmNwcCIsCisgICAgICAgICJUaW1lclRocmVhZC10ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgImxpYnV0aWxzIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9MaWJyYXJ5LmNwcCBiL21lZGlhL3V0aWxzL0xpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTIyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9MaWJyYXJ5LmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJMaWJyYXJ5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTGlicmFyeS5oPgorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBkbGVycm9ySWZQcmVzZW50KCkgeworICAgIGNvbnN0IGNoYXIgKmRsZXJyID0gZGxlcnJvcigpOworICAgIGlmIChkbGVyciA9PSBudWxscHRyKSByZXR1cm4gImRsZXJyb3I6IG5vbmUiOworICAgIHJldHVybiBzdGQ6OnN0cmluZygiZGxlcnJvcjogJyIpLmFwcGVuZChkbGVycikuYXBwZW5kKCInIik7Cit9CisKK30KK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYnJhcnlOYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbGlicmFyeXsKKyAgICAgICAgZGxvcGVuKGxpYnJhcnlOYW1lLCBmbGFncyksCisgICAgICAgIFtdKHZvaWQgKmxpYikgeworICAgICAgICAgICAgaWYgKGxpYiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJldCA9IGRsY2xvc2UobGliKTsKKyAgICAgICAgICAgICAgICBBTE9HV19JRihyZXQgIT0wLCAiJXM6IGRsY2xvc2UoJXApID09ICVkLCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGliLCByZXQsIGRsZXJyb3JJZlByZXNlbnQoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAoIWxpYnJhcnkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgbG9hZCBsaWJyYXJ5TmFtZSAlcywgJXMiLAorICAgICAgICAgICAgX19mdW5jX18sIGxpYnJhcnlOYW1lLCBkbGVycm9ySWZQcmVzZW50KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgcmV0dXJuIGxpYnJhcnk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjx2b2lkPiBnZXRVbnR5cGVkT2JqZWN0RnJvbUxpYnJhcnkoCisgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiYgbGlicmFyeSkgeworICAgIGlmICghbGlicmFyeSkgeworICAgICAgICBBTE9HVygiJXM6IG51bGwgbGlicmFyeSwgY2Fubm90IGxvYWQgb2JqZWN0TmFtZSAlcyIsIF9fZnVuY19fLCBvYmplY3ROYW1lKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICB2b2lkICpwdHIgPSBkbHN5bShsaWJyYXJ5LmdldCgpLCBvYmplY3ROYW1lKTsKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgbG9hZCBvYmplY3ROYW1lICVzLCAlcyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG9iamVjdE5hbWUsIGRsZXJyb3JJZlByZXNlbnQoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIC8vIE5vdGU6IHdlIHVzZSB0aGUgImFsaWFzaW5nIiBjb25zdHJ1Y3RvciBvZiB0aGUgc3RkOnNoYXJlZF9wdHIuCisgICAgLy8KKyAgICAvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbWVtb3J5L3NoYXJlZF9wdHIvc2hhcmVkX3B0cgorICAgIC8vCisgICAgcmV0dXJuIHsgbGlicmFyeSwgcHRyIH07ICAvLyByZXR1cm5zIHNoYXJlZF9wdHIgdG8gcHRyLCBidXQgcmVmIGNvdW50ZWQgb24gbGlicmFyeS4KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuY3BwIGIvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzA5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZC5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0xpYnJhcnkuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01lZGlhVXRpbHNEZWxheWVkLmg+CisjaW5jbHVkZSAiTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmgiCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFVdGlsc0RlbGF5ZWQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKK25hbWVzcGFjZSB7CisvLyAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgTWVkaWFVdGlscyBEZWxheWVkIExpYnJhcnkuCisKKy8vIFRoZSBmb2xsb3dpbmcgdXNlIHN0YXRpYyBNZXllcidzIHNpbmdsZXRvbiBjYWNoZXMgaW5zdGVhZCBvZiBsZXR0aW5nCisvLyByZWZjb3VudGVkIG1hbmFnZW1lbnQgYXMgcHJvdmlkZWQgYWJvdmUuIFRoaXMgaXMgZm9yIHNwZWVkLgorc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGdldERlbGF5ZWRMaWJyYXJ5KCkgeworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbGlicmFyeSA9IGxvYWRMaWJyYXJ5KE1FRElBVVRJTFNfREVMQVlFRF9MSUJSQVJZX05BTUUpOworICAgIHJldHVybiBsaWJyYXJ5OworfQorCisvLyBHZXQgdGhlIGRlbGF5ZWQgZGlzcGF0Y2ggdGFibGUuICBUaGlzIGlzIHJlZmNvdW50ZWQgYW5kIGtlZXBzIHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkgYWxpdmUuCitzdGQ6OnNoYXJlZF9wdHI8ZGVsYXllZF9saWJyYXJ5OjpEZWxheWVkRGlzcGF0Y2hUYWJsZT4gZ2V0RGVsYXllZERpc3BhdGNoVGFibGUoKSB7CisgICAgc3RhdGljIGF1dG8gZGVsYXllZERpc3BhdGNoVGFibGUgPQorICAgICAgICAgICAgZ2V0T2JqZWN0RnJvbUxpYnJhcnk8ZGVsYXllZF9saWJyYXJ5OjpEZWxheWVkRGlzcGF0Y2hUYWJsZT4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBVVRJTFNfREVMQVlFRF9ESVNQQVRDSF9UQUJMRV9TWU1CT0xfTkFNRSwgZ2V0RGVsYXllZExpYnJhcnkoKSk7CisgICAgcmV0dXJuIGRlbGF5ZWREaXNwYXRjaFRhYmxlOworfQorCit9IC8vIG5hbWVzcGFjZQorCisvLyBQdWJsaWMgaW1wbGVtZW50YXRpb25zIG9mIG1ldGhvZHMgaGVyZS4KKworc3RkOjpzdHJpbmcgZ2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKHBpZF90IHRpZCkgeworICAgIGF1dG8gZGVsYXllZERpc3BhdGNoVGFibGUgPSBnZXREZWxheWVkRGlzcGF0Y2hUYWJsZSgpOworICAgIGlmICghZGVsYXllZERpc3BhdGNoVGFibGUpIHJldHVybiB7fTsgIC8vIG9uIGZhaWx1cmUsIHJldHVybiBlbXB0eSBzdHJpbmcKKyAgICByZXR1cm4gZGVsYXllZERpc3BhdGNoVGFibGUtPmdldENhbGxTdGFja1N0cmluZ0ZvclRpZCh0aWQpOworfQorCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL01lZGlhVXRpbHNEZWxheWVkTGlicmFyeS5jcHAgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTRjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmgiCisjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CisKKy8vIE1ldGhvZHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgbGlua2VkLgorbmFtZXNwYWNlIHsKKworc3RkOjpzdHJpbmcgZ2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKHBpZF90IHRpZCkgeworICAgIGFuZHJvaWQ6OkNhbGxTdGFjayBjc3t9OworICAgIGNzLnVwZGF0ZSgwIC8qIGlnbm9yZURlcHRoICovLCB0aWQpOworICAgIHJldHVybiBjcy50b1N0cmluZygpLmNfc3RyKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIGxlYXZlIGdsb2JhbCwgdGhpcyBpcyBwaWNrZWQgdXAgZnJvbSBkeW5hbWljIGxpbmtpbmcKK2FuZHJvaWQ6Om1lZGlhdXRpbHM6OmRlbGF5ZWRfbGlicmFyeTo6RGVsYXllZERpc3BhdGNoVGFibGUgZ0RlbGF5ZWREaXNwYXRjaFRhYmxlIHsKKyAgICBnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQsCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmggYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDcyYTNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvLyBUaGlzIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgaW5jbHVkZWQgYnkgY2xpZW50cy4KKy8vIFVzZSBNZWRpYVV0aWxzRGVsYXllZC5oIGluc3RlYWQuCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzOjpkZWxheWVkX2xpYnJhcnkgeworCisvLyBVc2UgYSBkaXNwYXRjaCB0YWJsZSB0byByZXR1cm4gbWV0aG9kcyBmcm9tIHRoZSBkZWxheWVkIGxpYnJhcnkKK3N0cnVjdCBEZWxheWVkRGlzcGF0Y2hUYWJsZSB7CisgICAgc3RkOjpzdHJpbmcgKCpnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQpKHBpZF90IHRpZCk7Cit9OworCisvLyBNYXRjaCB3aXRoIEFuZHJvaWQuYnAgYW5kIE1lZGlhVXRpbHNEZWxheWVkLmNwcC4KKyNkZWZpbmUgTUVESUFVVElMU19ERUxBWUVEX0xJQlJBUllfTkFNRSAibGlibWVkaWF1dGlsc19kZWxheWVkLnNvIgorCisvLyBNYXRjaCB3aXRoIE1lZGlhVXRpbHNEZWxheWVkLmNwcCBhbmQgTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmNwcAorI2RlZmluZSBNRURJQVVUSUxTX0RFTEFZRURfRElTUEFUQ0hfVEFCTEVfU1lNQk9MX05BTUUgImdEZWxheWVkRGlzcGF0Y2hUYWJsZSIKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczo6ZGVsYXllZF9saWJyYXJ5CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9NZXRob2RTdGF0aXN0aWNzLmNwcCBiL21lZGlhL3V0aWxzL01ldGhvZFN0YXRpc3RpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzliMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZXRob2RTdGF0aXN0aWNzLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8vIFJlcG9zaXRvcnkgZm9yIE1ldGhvZFN0YXRpc3RpY3MgT2JqZWN0cworCitzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PgorZ2V0U3RhdGlzdGljc0NsYXNzZXNGb3JNb2R1bGUoc3RkOjpzdHJpbmdfdmlldyBtb2R1bGVOYW1lKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Pj4gbSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PigKKyAgICAgICAgICAgICAgICBuZXcgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eworICAgICAgICAgICAgICAgICJEZXZpY2VIYWxIaWRsIiwKKyAgICAgICAgICAgICAgICAiRWZmZWN0SGFsSGlkbCIsCisgICAgICAgICAgICAgICAgIlN0cmVhbUluSGFsSGlkbCIsCisgICAgICAgICAgICAgICAgIlN0cmVhbU91dEhhbEhpZGwiLAorICAgICAgICAgICAgICB9KQorICAgICAgICB9LAorICAgIH07CisgICAgYXV0byBpdCA9IG0uZmluZCh7bW9kdWxlTmFtZS5iZWdpbigpLCBtb2R1bGVOYW1lLmVuZCgpfSk7CisgICAgaWYgKGl0ID09IG0uZW5kKCkpIHJldHVybiB7fTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworc3RhdGljIHZvaWQgYWRkQ2xhc3Nlc1RvTWFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+ICZjbGFzc05hbWVzLAorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPE1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+Pj4gJm1hcCkgeworICAgIGlmIChjbGFzc05hbWVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xhc3NOYW1lIDogKmNsYXNzTmFtZXMpIHsKKyAgICAgICAgICAgIG1hcC5lbXBsYWNlKGNsYXNzTmFtZSwgc3RkOjptYWtlX3NoYXJlZDxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4oKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNpbmdsZXRvbiBzdGF0aXN0aWNzIGZvciBEZXZpY2VIYWxIaWRsIFN0cmVhbU91dEhhbEhpZGwgU3RyZWFtSW5IYWxIaWRsCitzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+CitnZXRTdGF0aXN0aWNzRm9yQ2xhc3Moc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4+IG0gPQorICAgICAgICAvLyBjb3B5IGVsaWRlZCBpbml0aWFsaXphdGlvbiBvZiBtYXAgbS4KKyAgICAgICAgW10oKXsKKyAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+PiBtOworICAgICAgICAgICAgYWRkQ2xhc3Nlc1RvTWFwKAorICAgICAgICAgICAgICAgICAgICBnZXRTdGF0aXN0aWNzQ2xhc3Nlc0Zvck1vZHVsZShNRVRIT0RfU1RBVElTVElDU19NT0RVTEVfTkFNRV9BVURJT19ISURMKSwKKyAgICAgICAgICAgICAgICAgICAgbSk7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfSgpOworCisgICAgYXV0byBpdCA9IG0uZmluZCh7Y2xhc3NOYW1lLmJlZ2luKCksIGNsYXNzTmFtZS5lbmQoKX0pOworICAgIGlmIChpdCA9PSBtLmVuZCgpKSByZXR1cm4ge307CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvUHJvY2Vzcy5jcHAgYi9tZWRpYS91dGlscy9Qcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU4MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvUHJvY2Vzcy5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUHJvY2VzcyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1Byb2Nlc3MuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworCit2b2lkIHByb2Nlc3NMaW5lKHN0ZDo6c3RyaW5nX3ZpZXcgcywgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4mIG0pIHsKKyAgICBpZiAocy5lbXB0eSgpKSByZXR1cm47CisKKyAgICBjb25zdCBzaXplX3QgY29sb25fcG9zID0gcy5maW5kKCc6Jyk7CisgICAgaWYgKGNvbG9uX3BvcyA9PSBzdGQ6OnN0cmluZ192aWV3OjpucG9zKSByZXR1cm47CisKKyAgICBjb25zdCBzaXplX3Qgc3BhY2VfcG9zID0gcy5maW5kKCcgJyk7CisgICAgaWYgKHNwYWNlX3BvcyA9PSAwIHx8IHNwYWNlX3BvcyA9PSBzdGQ6OnN0cmluZ192aWV3OjpucG9zIHx8IHNwYWNlX3BvcyA+IGNvbG9uX3BvcykgcmV0dXJuOworICAgIHN0ZDo6c3RyaW5nIGtleShzLmRhdGEoKSwgcy5kYXRhKCkgKyBzcGFjZV9wb3MpOworCisgICAgY29uc3Qgc2l6ZV90IHZhbHVlX3BvcyA9IHMuZmluZF9maXJzdF9ub3Rfb2YoJyAnLCBjb2xvbl9wb3MgKyAxKTsKKyAgICBpZiAodmFsdWVfcG9zID09IHN0ZDo6c3RyaW5nX3ZpZXc6Om5wb3MpIHJldHVybjsKKworICAgIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IHN0cnRvZChzLmRhdGEoKSArIHZhbHVlX3BvcywgbnVsbHB0ciAvKiBlbmQgKi8pOworICAgIG1bc3RkOjptb3ZlKGtleSldID0gdmFsdWU7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworc3RkOjpzdHJpbmcgZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyhwaWRfdCB0aWQpIHsKKyAgICBjb25zdCBwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gc3RkOjpzdHJpbmcoIi9wcm9jLyIpLmFwcGVuZChzdGQ6OnRvX3N0cmluZyhwaWQpKQorICAgICAgICAgICAgLmFwcGVuZCgiL3Rhc2svIikuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHRpZCkpLmFwcGVuZCgiL3NjaGVkIik7CisgICAgc3RkOjpzdHJpbmcgc2NoZWQ7CisgICAgKHZvaWQpYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhwYXRoLmNfc3RyKCksICZzY2hlZCk7CisgICAgcmV0dXJuIHNjaGVkOworfQorCitzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzY2hlZFN0cmluZykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IG07CisgICAgaWYgKHNjaGVkU3RyaW5nLmVtcHR5KCkpIHJldHVybiBtOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdsaXN0ID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoc2NoZWRTdHJpbmcsICJcbiIpOworCisgICAgLy8gIE9LIHdlIHVzZSB2YWx1ZXMgbm90IHN0cmluZ3MuLi4gbVsic3VtbWFyeSJdID0gc3RyaW5nbGlzdFswXTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHN0cmluZ2xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgcHJvY2Vzc0xpbmUoc3RyaW5nbGlzdFtpXSwgbSk7CisgICAgfQorICAgIHJldHVybiBtOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAgYi9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKaW5kZXggZTIxMjc5NC4uZGExOTljNCAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCisrKyBiL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcApAQCAtNjQsMTEgKzY0LDI3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgUHJvY2Vzc0luZm86OmlzVmFsaWRQaWQoaW50IHBpZCkgeworYm9vbCBQcm9jZXNzSW5mbzo6aXNQaWRUcnVzdGVkKGludCBwaWQpIHsKKyAgICByZXR1cm4gaXNQaWRVaWRUcnVzdGVkKHBpZCwgLTEpOworfQorCitib29sIFByb2Nlc3NJbmZvOjppc1BpZFVpZFRydXN0ZWQoaW50IHBpZCwgaW50IHVpZCkgewogICAgIGludCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGludCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIC8vIFRydXN0IGl0IGlmIHRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHNhbWUgcHJvY2VzcyBvdGhlcndpc2UgcGlkIGhhcyB0byBtYXRjaCB0aGUgY2FsbGluZyBwaWQuCi0gICAgcmV0dXJuIChjYWxsaW5nUGlkID09IGdldHBpZCgpKSB8fCAoY2FsbGluZ1BpZCA9PSBwaWQpIHx8IChjYWxsaW5nVWlkID09IEFJRF9NRURJQSk7CisgICAgLy8gQWx3YXlzIHRydXN0IHdoZW4gdGhlIGNhbGxlciBpcyBhY3Rpbmcgb24gdGhlaXIgb3duIGJlaGFsZi4KKyAgICBpZiAocGlkID09IGNhbGxpbmdQaWQgJiYgKHVpZCA9PSBjYWxsaW5nVWlkIHx8IHVpZCA9PSAtMSkpIHsgLy8gVUlEIGNhbiBiZSBvcHRpb25hbAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gSW1wbGljaXRseSB0cnVzdCB3aGVuIHRoZSBjYWxsZXIgaXMgb3VyIG93biBwcm9jZXNzLgorICAgIGlmIChjYWxsaW5nUGlkID09IGdldHBpZCgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBJbXBsaWNpdGx5IHRydXN0IHdoZW4gYSBtZWRpYSBwcm9jZXNzIGlzIGNhbGxpbmcuCisgICAgaWYgKGNhbGxpbmdVaWQgPT0gQUlEX01FRElBKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsIGFsbG93IHRoZSBjYWxsZXIgdG8gYWN0IGFzIGFub3RoZXIgcHJvY2VzcyB3aGVuIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb25zLgorICAgIHJldHVybiBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uTUVESUFfUkVTT1VSQ0VfT1ZFUlJJREVfUElEIikpOwogfQogCiBib29sIFByb2Nlc3NJbmZvOjpvdmVycmlkZVByb2Nlc3NJbmZvKGludCBwaWQsIGludCBwcm9jU3RhdGUsIGludCBvb21TY29yZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcAppbmRleCA5YzdiODYzLi4wN2Y0NTI5IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtNDUsNiArNDUsNyBAQAogc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CiBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FsbEF1ZGlvSW50ZXJjZXB0aW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FMTF9BVURJT19JTlRFUkNFUFRJT04iKTsKIAogc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+IG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewpAQCAtNzEsNiArNzIsNyBAQAogICBzd2l0Y2ggKHNvdXJjZSkgewogICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CiAgICAgICByZXR1cm4gQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPX0hPVFdPUkQ7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6IC8vIGZhbGx0aHJvdWdoCiAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKICAgICAgIHJldHVybiBBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU9fT1VUUFVUOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgpAQCAtMTAxLDcgKzEwMywxMSBAQAogICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgbXlBdHRyaWJ1dGlvblNvdXJjZTsKICAgICBteUF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX0ZBVEFMKGFuZHJvaWQ6OmxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoZ2V0dWlkKCkpKTsKICAgICBteUF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGFuZHJvaWQ6OmxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKLSAgICBteUF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBpZiAoY2FsbGVyQXR0cmlidXRpb25Tb3VyY2UudG9rZW4gIT0gbnVsbHB0cikgeworICAgICAgICBteUF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gY2FsbGVyQXR0cmlidXRpb25Tb3VyY2UudG9rZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgfQogICAgIG15QXR0cmlidXRpb25Tb3VyY2UubmV4dC5wdXNoX2JhY2sobmV4dEF0dHJpYnV0aW9uU291cmNlKTsKIAogICAgIHJldHVybiBzdGQ6Om9wdGlvbmFsPEF0dHJpYnV0aW9uU291cmNlU3RhdGU+e215QXR0cmlidXRpb25Tb3VyY2V9OwpAQCAtMTc1LDEwICsxODEsMTQgQEAKIAogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CiAgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKLSAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGF0dHJpYnV0aW9uU291cmNlLnBpZCkpOwogICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOworICAgIC8vIFVzZSBQZXJtaXNzaW9uQ2hlY2tlciwgd2hpY2ggaW5jbHVkZXMgc29tZSBsb2dpYyBmb3IgYWxsb3dpbmcgdGhlIGlzb2xhdGVkCisgICAgLy8gSG90d29yZERldGVjdGlvblNlcnZpY2UgdG8gaG9sZCBjZXJ0YWluIHBlcm1pc3Npb25zLgorICAgIHBlcm1pc3Npb246OlBlcm1pc3Npb25DaGVja2VyIHBlcm1pc3Npb25DaGVja2VyOworICAgIGJvb2wgb2sgPSAocGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0KAorICAgICAgICAgICAgc0NhcHR1cmVBdWRpb091dHB1dCwgYXR0cmlidXRpb25Tb3VyY2UsIFN0cmluZzE2KCksCisgICAgICAgICAgICBBcHBPcHNNYW5hZ2VyOjpPUF9OT05FKSAhPSBwZXJtaXNzaW9uOjpQZXJtaXNzaW9uQ2hlY2tlcjo6UEVSTUlTU0lPTl9IQVJEX0RFTklFRCk7CiAgICAgaWYgKCFvaykgQUxPR1YoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CiAgICAgcmV0dXJuIG9rOwogfQpAQCAtMjE0LDYgKzIyNCwxNyBAQAogICAgIHJldHVybiBvazsKIH0KIAorYm9vbCBhY2Nlc3NVbHRyYXNvdW5kQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgdWlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FjY2Vzc1VsdHJhc291bmQoCisgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VMVFJBU09VTkQiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0FjY2Vzc1VsdHJhc291bmQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VMVFJBU09VTkQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CiAgICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgogICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKQEAgLTMwNCw2ICszMjUsMTcgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKK2Jvb2wgY2FsbEF1ZGlvSW50ZXJjZXB0aW9uQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYWxsQXVkaW9JbnRlcmNlcHRpb24sIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HVigiJXMoKTogYW5kcm9pZC5wZXJtaXNzaW9uLkNBTExfQVVESU9fSU5URVJDRVBUSU9OIGRlbmllZCBmb3IgdWlkICVkIiwKKyAgICAgICAgX19mdW5jX18sIHVpZCk7CisgICAgcmV0dXJuIG9rOworfQorCiBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpIHsKICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaHJlYWRTbmFwc2hvdC5jcHAgYi9tZWRpYS91dGlscy9UaHJlYWRTbmFwc2hvdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNzM4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1RocmVhZFNuYXBzaG90LmNwcApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGhyZWFkU25hcHNob3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9Qcm9jZXNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworcGlkX3QgVGhyZWFkU25hcHNob3Q6OmdldFRpZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIHJldHVybiBtU3RhdGUubVRpZDsKK30KKwordm9pZCBUaHJlYWRTbmFwc2hvdDo6c2V0VGlkKHBpZF90IHRpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgaWYgKG1TdGF0ZS5tVGlkID09IHRpZCkgcmV0dXJuOworICAgIG1TdGF0ZS5yZXNldCh0aWQpOworfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpyZXNldCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIG1TdGF0ZS5yZXNldChtU3RhdGUubVRpZCk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6Om9uQmVnaW4oKSB7CisgICAgc3RkOjpzdHJpbmcgc2NoZWQgPSBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKGdldFRpZCgpKTsgLy8gdGlkIGNvdWxkIHJhY2UgaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYXMgYmVuaWduLgorICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgbVN0YXRlLm9uQmVnaW4oc3RkOjptb3ZlKHNjaGVkKSk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6Om9uRW5kKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgbVN0YXRlLm9uRW5kKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRocmVhZFNuYXBzaG90Ojp0b1N0cmluZygpIGNvbnN0IHsKKyAgICAvLyBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgc3RhdHMgZGF0YSB1bmRlciBsb2NrLgorICAgIFN0YXRlIHN0YXRlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgc3RhdGUgPSBtU3RhdGU7CisgICAgfQorICAgIHJldHVybiBzdGF0ZS50b1N0cmluZygpOworfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpTdGF0ZTo6cmVzZXQocGlkX3QgdGlkKSB7CisgICAgbVRpZCA9IHRpZDsKKyAgICBtQmVnaW5UaW1lTnMgPSAtMjsKKyAgICBtRW5kVGltZU5zID0gLTE7CisgICAgbUN1bXVsYXRpdmVUaW1lTnMgPSAwOworICAgIG1CZWdpblNjaGVkLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6OlN0YXRlOjpvbkJlZ2luKHN0ZDo6c3RyaW5nIHNjaGVkKSB7CisgICAgaWYgKG1CZWdpblRpbWVOcyA8IG1FbmRUaW1lTnMpIHsKKyAgICAgICAgbUJlZ2luVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBtQmVnaW5TY2hlZCA9IHN0ZDo6bW92ZShzY2hlZCk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpTdGF0ZTo6b25FbmQoKSB7CisgICAgaWYgKG1FbmRUaW1lTnMgPCBtQmVnaW5UaW1lTnMpIHsKKyAgICAgICAgbUVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbUN1bXVsYXRpdmVUaW1lTnMgKz0gbUVuZFRpbWVOcyAtIG1CZWdpblRpbWVOczsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIFRocmVhZFNuYXBzaG90OjpTdGF0ZTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgaWYgKG1CZWdpblRpbWVOcyA8IDApIHJldHVybiB7fTsgIC8vIG5ldmVyIGJlZ3VuLgorCisgICAgLy8gY29tcHV0ZSB0aW1lIGludGVydmFscy4KKyAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZSgpOworICAgIGludDY0X3QgY3VtdWxhdGl2ZVRpbWVOcyA9IG1DdW11bGF0aXZlVGltZU5zOworICAgIGludDY0X3QgZGlmZk5zID0gbUVuZFRpbWVOcyAtIG1CZWdpblRpbWVOczsgLy8gaWYgb25FbmQoKSBpc24ndCBtYXRjaGVkLCBkaWZmTnMgPCAwLgorICAgIGlmIChkaWZmTnMgPCAwKSB7CisgICAgICAgIGRpZmZOcyA9IG5vd05zIC0gbUJlZ2luVGltZU5zOworICAgICAgICBjdW11bGF0aXZlVGltZU5zICs9IGRpZmZOczsKKyAgICB9CisgICAgLy8gbm9ybWFsaXphdGlvbiBmb3IgcmF0ZSB2YXJpYWJsZXMKKyAgICBjb25zdCBkb3VibGUgbGFzdFJ1blBlclNlYyA9ICAxZTkgLyBkaWZmTnM7CisgICAgY29uc3QgZG91YmxlIHRvdGFsUGVyU2VjID0gMWU5IC8gY3VtdWxhdGl2ZVRpbWVOczsKKworICAgIC8vIEhBTkRMRSBUSEUgU0NIRURVTEVSIFNUQVRJU1RJQ1MgSEVSRQorICAgIC8vIGN1cnJlbnQgYW5kIGRpZmZlcmVudGlhbCBzdGF0aXN0aWNzIGZvciB0aGUgc2NoZWR1bGVyLgorICAgIHN0ZDo6c3RyaW5nIHNjaGVkTm93ID0gZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyhtVGlkKTsKKyAgICBjb25zdCBhdXRvIHNjaGVkTWFwVGhlbiA9IHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcobUJlZ2luU2NoZWQpOworICAgIGNvbnN0IGF1dG8gc2NoZWRNYXBOb3cgPSBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKHNjaGVkTm93KTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIHNjaGVkRGlmZktleUxpc3RbXSA9IHsKKyAgICAgICAgInNlLnN1bV9leGVjX3J1bnRpbWUiLAorICAgICAgICAic2UubnJfbWlncmF0aW9ucyIsCisgICAgICAgICJzZS5zdGF0aXN0aWNzLndhaXRfc3VtIiwKKyAgICAgICAgInNlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCIsCisgICAgICAgICJzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0iLAorICAgICAgICAic2Uuc3RhdGlzdGljcy5pb3dhaXRfY291bnQiLAorICAgICAgICAic2Uuc3RhdGlzdGljcy5ucl9mb3JjZWRfbWlncmF0aW9ucyIsCisgICAgICAgICJucl9pbnZvbHVudGFyeV9zd2l0Y2hlcyIsCisgICAgfTsKKworICAgIC8vIGNvbXB1dGUgZGlmZmVyZW50aWFsIHJhdGUgc3RhdGlzdGljcy4KKyAgICBzdGQ6OnN0cmluZyBkaWZmU3RyaW5nOworICAgIGZvciAoY29uc3QgYXV0byBkaWZmS2V5IDogc2NoZWREaWZmS2V5TGlzdCkgeworICAgICAgICBpZiAoYXV0byBpdFRoZW4gPSBzY2hlZE1hcFRoZW4uZmluZChkaWZmS2V5KTsKKyAgICAgICAgICAgICAgICBpdFRoZW4gIT0gc2NoZWRNYXBUaGVuLmVuZCgpKSB7CisKKyAgICAgICAgICAgIGlmIChhdXRvIGl0Tm93ID0gc2NoZWRNYXBOb3cuZmluZChkaWZmS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaXROb3cgIT0gc2NoZWRNYXBOb3cuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGRpZmYgPSBpdE5vdy0+c2Vjb25kIC0gaXRUaGVuLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZGlmZiAqPSBsYXN0UnVuUGVyU2VjOworICAgICAgICAgICAgICAgIGF1dG8gdG90YWwgPSBpdE5vdy0+c2Vjb25kICogdG90YWxQZXJTZWM7CisgICAgICAgICAgICAgICAgZGlmZlN0cmluZy5hcHBlbmQoZGlmZktleSkuYXBwZW5kKCIgIGxhc3QtcnVuOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKGRpZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICBjdW11bGF0aXZlOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHRvdGFsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRpZmZTdHJpbmcuZW1wdHkoKSkgeworICAgICAgICBzY2hlZE5vdy5hcHBlbmQoIioqKiBwZXIgc2Vjb25kIHN0YXRzICoqKlxuIikuYXBwZW5kKGRpZmZTdHJpbmcpOworICAgIH0KKworICAgIC8vIFJldHVybiBzbmFwc2hvdCBzdHJpbmcuCisgICAgcmV0dXJuIHNjaGVkTm93OworfQorCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCmluZGV4IDgxOWUxNDYuLjA4NDhlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKKysrIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApAQCAtMTYsMTIgKzE2LDgwIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVGltZUNoZWNrIgogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0V2ZW50TG9nLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZXRob2RTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJkZWJ1Z2dlcmQvaGFuZGxlci5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogUmV0dXJucyB0aGUgc3RkOjpzdHJpbmcgIkhIOk1NOlNTLk1TYyIgZnJvbSBhIHN5c3RlbV9jbG9jayB0aW1lX3BvaW50LgorICovCitzdGQ6OnN0cmluZyBmb3JtYXRUaW1lKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgdCkgeworICAgIGF1dG8gdGltZV9zdHJpbmcgPSBhdWRpb191dGlsc190aW1lX3N0cmluZ19mcm9tX25zKAorICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHQudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpKTsKKworICAgIC8vIFRoZSB0aW1lIHN0cmluZyBpcyAxOSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgbnVsbCB0ZXJtaW5hdGlvbikuCisgICAgLy8gRXhhbXBsZTogIjAzLTI3IDE2OjQ3OjA2LjE4NyIKKyAgICAvLyAgICAgICAgICAgTU0gREQgSEggTU0gU1MgTVMKKyAgICAvLyBXZSBvZmZzZXQgYnkgNiB0byBnZXQgSEg6TU06U1MuTVNjCisgICAgLy8KKyAgICByZXR1cm4gdGltZV9zdHJpbmcudGltZSArIDY7IC8vIG9mZnNldCB0byByZW1vdmUgbW9udGgvZGF5LgorfQorCisvKioKKyAqIEZpbmRzIHRoZSBlbmQgb2YgdGhlIGNvbW1vbiB0aW1lIHByZWZpeC4KKyAqCisgKiBUaGlzIGlzIGFzIGFuIG9wdGlvbiB0byByZW1vdmUgdGhlIGNvbW1vbiB0aW1lIHByZWZpeCB0byBhdm9pZAorICogdW5uZWNlc3NhcnkgZHVwbGljYXRlZCBzdHJpbmdzLgorICoKKyAqIFxwYXJhbSB0aW1lMSBhIHRpbWUgc3RyaW5nCisgKiBccGFyYW0gdGltZTIgYSB0aW1lIHN0cmluZworICogXHJldHVybiAgICAgIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgY29tbW9uIHRpbWUgcHJlZml4IGVuZHMuIEZvciBhYmJyZXZpYXRlZAorICogICAgICAgICAgICAgIHByaW50aW5nIG9mIHRpbWUyLCBvZmZzZXQgdGhlIGNoYXJhY3RlciBwb2ludGVyIGJ5IHRoaXMgcG9zaXRpb24uCisgKi8KK3N0YXRpYyBzaXplX3QgY29tbW9uVGltZVByZWZpeFBvc2l0aW9uKHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTEsIHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTIpIHsKKyAgICBjb25zdCBzaXplX3QgZW5kUG9zID0gc3RkOjptaW4odGltZTEuc2l6ZSgpLCB0aW1lMi5zaXplKCkpOworICAgIHNpemVfdCBpOworCisgICAgLy8gRmluZCBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgbWlzbWF0Y2ggYmV0d2VlbiBzdHJpbmdzCisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgaWYgKGkgPT0gZW5kUG9zKSB7CisgICAgICAgICAgICByZXR1cm4gaTsgLy8gc3RyaW5ncyBtYXRjaCBjb21wbGV0ZWx5IHRvIHRoZSBsZW5ndGggb2Ygb25lIG9mIHRoZSBzdHJpbmdzLgorICAgICAgICB9CisgICAgICAgIGlmICh0aW1lMVtpXSAhPSB0aW1lMltpXSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpbWUxW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIHJldHVybiBpOyAvLyAicHJpbnRlZCIgc3RyaW5ncyBtYXRjaCBjb21wbGV0ZWx5LiAgTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyLgorICAgICAgICB9CisgICAgfQorCisgICAgLy8gR28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYSBkZWxpbWV0ZXIgb3Igc3BhY2UuCisgICAgZm9yICg7IGkgPiAwCisgICAgICAgICAgICYmIGlzZGlnaXQodGltZTFbaV0pIC8vIHN0aWxsIGEgbnVtYmVyCisgICAgICAgICAgICYmIHRpbWUxW2kgLSAxXSAhPSAnICcKKyAgICAgICAgIDsgLS1pKSB7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHVuaXF1ZSBzdWZmaXggb2YgdGltZTIgdGhhdCBpc24ndCBwcmVzZW50IGluIHRpbWUxLgorICoKKyAqIElmIHRpbWUyIGlzIGlkZW50aWNhbCB0byB0aW1lMSwgdGhlbiBhbiBlbXB0eSBzdHJpbmdfdmlldyBpcyByZXR1cm5lZC4KKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZWxpZGUgdGhlIGNvbW1vbiBwcmVmaXggd2hlbiBwcmludGluZyB0aW1lcy4KKyAqLworc3RkOjpzdHJpbmdfdmlldyB0aW1lU3VmZml4KHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTEsIHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTIpIHsKKyAgICBjb25zdCBzaXplX3QgcG9zID0gY29tbW9uVGltZVByZWZpeFBvc2l0aW9uKHRpbWUxLCB0aW1lMik7CisgICAgcmV0dXJuIHRpbWUyLnN1YnN0cihwb3MpOworfQogCiAvLyBBdWRpbyBIQUwgc2VydmVyIHBpZHMgdmVjdG9yIHVzZWQgdG8gZ2VuZXJhdGUgYXVkaW8gSEFMIHByb2Nlc3NlcyB0b21ic3RvbmUKIC8vIHdoZW4gYXVkaW9zZXJ2ZXIgd2F0Y2hkb2cgdHJpZ2dlcnMuCkBAIC0zNiw3ICsxMDQsNyBAQAogdm9pZCBUaW1lQ2hlY2s6OmFjY2Vzc0F1ZGlvSGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4qIHBpZHMsIGJvb2wgdXBkYXRlKSB7CiAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUF1ZGlvSGFsUGlkc1ZlY3RvcnMgPSAzOwogICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxwaWRfdD4gYXVkaW9IYWxQaWRzW2tOdW1BdWRpb0hhbFBpZHNWZWN0b3JzXTsKLSAgICBzdGF0aWMgc3RkOjphdG9taWM8aW50PiBjdXJBdWRpb0hhbFBpZHMgPSAwOworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gY3VyQXVkaW9IYWxQaWRzID0gMDsKIAogICAgIGlmICh1cGRhdGUpIHsKICAgICAgICAgYXVkaW9IYWxQaWRzWyhjdXJBdWRpb0hhbFBpZHMrKyArIDEpICUga051bUF1ZGlvSGFsUGlkc1ZlY3RvcnNdID0gKnBpZHM7CkBAIC01OCw4NCArMTI2LDEyMSBAQAogfQogCiAvKiBzdGF0aWMgKi8KLXNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7CitUaW1lclRocmVhZCYgVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKSB7CisgICAgc3RhdGljIFRpbWVyVGhyZWFkIHNUaW1lQ2hlY2tUaHJlYWR7fTsKICAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKIH0KIAotVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCi0gICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoteworLyogc3RhdGljICovCitzdGQ6OnN0cmluZyBUaW1lQ2hlY2s6OnRvU3RyaW5nKCkgeworICAgIC8vIG5vdGUgcGVuZGluZyBhbmQgcmV0aXJlZCBhcmUgaW5kaXZpZHVhbGx5IGxvY2tlZCBmb3IgbWF4aW11bSBjb25jdXJyZW5jeSwKKyAgICAvLyBzbmFwc2hvdCBpcyBub3QgaW5zdGFudGFuZW91cyBhdCBhIHNpbmdsZSB0aW1lLgorICAgIHJldHVybiBnZXRUaW1lQ2hlY2tUaHJlYWQoKS50b1N0cmluZygpOwogfQogCitUaW1lQ2hlY2s6OlRpbWVDaGVjayhzdGQ6OnN0cmluZyB0YWcsIE9uVGltZXJGdW5jJiYgb25UaW1lciwgdWludDMyX3QgdGltZW91dE1zLAorICAgICAgICBib29sIGNyYXNoT25UaW1lb3V0KQorICAgIDogbVRpbWVDaGVja0hhbmRsZXIobmV3IFRpbWVDaGVja0hhbmRsZXJ7CisgICAgICAgICAgICBzdGQ6Om1vdmUodGFnKSwgc3RkOjptb3ZlKG9uVGltZXIpLCBjcmFzaE9uVGltZW91dCwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpLCBnZXR0aWQoKX0pCisgICAgLCBtVGltZXJIYW5kbGUodGltZW91dE1zID09IDAKKyAgICAgICAgICAgICAgPyBnZXRUaW1lQ2hlY2tUaHJlYWQoKS50cmFja1Rhc2sobVRpbWVDaGVja0hhbmRsZXItPnRhZykKKyAgICAgICAgICAgICAgOiBnZXRUaW1lQ2hlY2tUaHJlYWQoKS5zY2hlZHVsZVRhc2soCisgICAgICAgICAgICAgICAgICAgICAgbVRpbWVDaGVja0hhbmRsZXItPnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGluIGFsbCB0aGUgYXJndW1lbnRzIGJ5IHZhbHVlIHRvIHRoaXMgdGFzayBmb3Igc2FmZXR5LgorICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgY291bGQgY2FsbCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVzdHJ1Y3RvciBpcyBub3QgYmxvY2tlZCBvbiBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICBbIHRpbWVDaGVja0hhbmRsZXIgPSBtVGltZUNoZWNrSGFuZGxlciBdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUNoZWNrSGFuZGxlci0+b25UaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRpbWVvdXRNcykpKSB7fQorCiBUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7Ci0gICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLW5zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7Ci0gICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci0gICAgcmV0dXJuIGVuZFRpbWVOczsKLX0KLQotdm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0KLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOwotICAgICAgICBjb25zdCBjaGFyICp0YWcgPSAiPHVuc3BlY2lmaWVkPiI7Ci0gICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAotICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKLSAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhdWRpbyBIQUwgcHJvY2Vzc2VzIHRvbWJzdG9uZXMgYW5kIGFsbG93IHRpbWUgdG8gY29tcGxldGUKLSAgICAgICAgICAgIC8vIGJlZm9yZSBmb3JjaW5nIHJlc3RhcnQKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBwaWRzID0gZ2V0QXVkaW9IYWxQaWRzKCk7Ci0gICAgICAgICAgICBpZiAocGlkcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGlkIDogcGlkcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmVxdWVzdGluZyB0b21ic3RvbmUgZm9yIHBpZDogJWQiLCBwaWQpOwotICAgICAgICAgICAgICAgICAgICBzaWdxdWV1ZShwaWQsIERFQlVHR0VSX1NJR05BTCwgey5zaXZhbF9pbnQgPSAwfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiTm8gSEFMIHByb2Nlc3MgcGlkIGF2YWlsYWJsZSwgc2tpcHBpbmcgdG9tYnN0b25lcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HX0VWRU5UX1NUUklORyhMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQsIHRhZyk7Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOwotICAgICAgICB9CisgICAgaWYgKG1UaW1lQ2hlY2tIYW5kbGVyKSB7CisgICAgICAgIG1UaW1lQ2hlY2tIYW5kbGVyLT5vbkNhbmNlbChtVGltZXJIYW5kbGUpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK3ZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tIYW5kbGVyOjpvbkNhbmNlbChUaW1lclRocmVhZDo6SGFuZGxlIHRpbWVySGFuZGxlKSBjb25zdAoreworICAgIGlmIChUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpLmNhbmNlbFRhc2sodGltZXJIYW5kbGUpICYmIG9uVGltZXIpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBlbmRUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgICAgIG9uVGltZXIoZmFsc2UgLyogdGltZW91dCAqLywKKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZmxvYXQsIHN0ZDo6bWlsbGk+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUgLSBzdGFydFRpbWUpLmNvdW50KCkpOworICAgIH0KK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja0hhbmRsZXI6Om9uVGltZW91dCgpIGNvbnN0Cit7CisgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBlbmRUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgaWYgKG9uVGltZXIpIHsKKyAgICAgICAgb25UaW1lcih0cnVlIC8qIHRpbWVvdXQgKi8sCisgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OmR1cmF0aW9uPGZsb2F0LCBzdGQ6Om1pbGxpPj4oCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lIC0gc3RhcnRUaW1lKS5jb3VudCgpKTsKKyAgICB9CisKKyAgICBpZiAoIWNyYXNoT25UaW1lb3V0KSByZXR1cm47CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgVGltZXJUaHJlYWQgc3VtbWFyeSBzdHJpbmcgZWFybHkgYmVmb3JlIHNlbmRpbmcgc2lnbmFscyB0byB0aGUKKyAgICAvLyBIQUwgcHJvY2Vzc2VzIHdoaWNoIGNhbiBhZmZlY3QgdGhyZWFkIGJlaGF2aW9yLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN1bW1hcnkgPSBnZXRUaW1lQ2hlY2tUaHJlYWQoKS50b1N0cmluZyg0IC8qIHJldGlyZWRDb3VudCAqLyk7CisKKyAgICAvLyBHZW5lcmF0ZSBhdWRpbyBIQUwgcHJvY2Vzc2VzIHRvbWJzdG9uZXMgYW5kIGFsbG93IHRpbWUgdG8gY29tcGxldGUKKyAgICAvLyBiZWZvcmUgZm9yY2luZyByZXN0YXJ0CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHMgPSBUaW1lQ2hlY2s6OmdldEF1ZGlvSGFsUGlkcygpOworICAgIHN0ZDo6c3RyaW5nIGhhbFBpZHMgPSAiSEFMIHBpZHMgWyAiOworICAgIGlmIChwaWRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGlkIDogcGlkcykgeworICAgICAgICAgICAgQUxPR0koInJlcXVlc3RpbmcgdG9tYnN0b25lIGZvciBwaWQ6ICVkIiwgcGlkKTsKKyAgICAgICAgICAgIGhhbFBpZHMuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHBpZCkpLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc2lncXVldWUocGlkLCBERUJVR0dFUl9TSUdOQUwsIHsuc2l2YWxfaW50ID0gMH0pOworICAgICAgICB9CisgICAgICAgIHNsZWVwKDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dJKCJObyBIQUwgcHJvY2VzcyBwaWQgYXZhaWxhYmxlLCBza2lwcGluZyB0b21ic3RvbmVzIik7CisgICAgfQorICAgIGhhbFBpZHMuYXBwZW5kKCJdIik7CisKKyAgICBMT0dfRVZFTlRfU1RSSU5HKExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCwgdGFnLmNfc3RyKCkpOworCisgICAgLy8gQ3JlYXRlIGFib3J0IG1lc3NhZ2Ugc3RyaW5nIC0gY2F1dGlvbjogdGhpcyBjYW4gYmUgdmVyeSBsYXJnZS4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBhYm9ydE1lc3NhZ2UgPSBzdGQ6OnN0cmluZygiVGltZUNoZWNrIHRpbWVvdXQgZm9yICIpCisgICAgICAgICAgICAuYXBwZW5kKHRhZykKKyAgICAgICAgICAgIC5hcHBlbmQoIiBzY2hlZHVsZWQgIikuYXBwZW5kKGZvcm1hdFRpbWUoc3RhcnRUaW1lKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiBvbiB0aHJlYWQgIikuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHRpZCkpLmFwcGVuZCgiXG4iKQorICAgICAgICAgICAgLmFwcGVuZChoYWxQaWRzKS5hcHBlbmQoIlxuIikKKyAgICAgICAgICAgIC5hcHBlbmQoc3VtbWFyeSk7CisKKyAgICAvLyBOb3RlOiBMT0dfQUxXQVlTX0ZBVEFMIGxpbWl0cyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIC0gcGVyIGxvZy9sb2cuaDoKKyAgICAvLyBMb2cgbWVzc2FnZSB0ZXh0IG1heSBiZSB0cnVuY2F0ZWQgdG8gbGVzcyB0aGFuIGFuCisgICAgLy8gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgbGltaXQgKDEwMjMgYnl0ZXMpLgorICAgIC8vCisgICAgLy8gSGVyZSwgd2Ugc2VuZCB0aGUgc3RyaW5nIHRocm91Z2ggYW5kcm9pZC1iYXNlL2xvZ2dpbmcuaCBMT0coKQorICAgIC8vIHRvIGF2b2lkIHRoZSBzaXplIGxpbWl0YXRpb24uIExPRyhGQVRBTCkgZG9lcyBhbiBhYm9ydCB3aGVyZWFzCisgICAgLy8gTE9HKEZBVEFMX1dJVEhPVVRfQUJPUlQpIGRvZXMgbm90IGFib3J0LgorCisgICAgTE9HKEZBVEFMKSA8PCBhYm9ydE1lc3NhZ2U7Cit9CisKKy8vIEF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgVGltZUNoZWNrIGNsYXNzIGZvciBhIGNsYXNzIGFuZCBtZXRob2QuCisvLyBUaGlzIGlzIHVzZWQgZm9yIEF1ZGlvIEhJREwgc3VwcG9ydC4KK21lZGlhdXRpbHM6OlRpbWVDaGVjayBtYWtlVGltZUNoZWNrU3RhdHNGb3JDbGFzc01ldGhvZCgKKyAgICAgICAgc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIHN0ZDo6c3RyaW5nX3ZpZXcgbWV0aG9kTmFtZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4gc3RhdGlzdGljcyA9CisgICAgICAgICAgICBtZWRpYXV0aWxzOjpnZXRTdGF0aXN0aWNzRm9yQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICBpZiAoIXN0YXRpc3RpY3MpIHJldHVybiB7fTsgLy8gZW1wdHkgVGltZUNoZWNrLgorICAgIHJldHVybiBtZWRpYXV0aWxzOjpUaW1lQ2hlY2soCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhjbGFzc05hbWUpLmFwcGVuZCgiOjoiKS5hcHBlbmQobWV0aG9kTmFtZSksCisgICAgICAgICAgICBbIGNsYXp6ID0gc3RkOjpzdHJpbmcoY2xhc3NOYW1lKSwgbWV0aG9kID0gc3RkOjpzdHJpbmcobWV0aG9kTmFtZSksCisgICAgICAgICAgICAgIHN0YXRzID0gc3RkOjptb3ZlKHN0YXRpc3RpY3MpIF0KKyAgICAgICAgICAgIChib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgOyAvLyBpZ25vcmVkLCB0aGVyZSBpcyBubyB0aW1lb3V0IHZhbHVlLgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPmV2ZW50KG1ldGhvZCwgZWxhcHNlZE1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMCAvKiB0aW1lb3V0TXMgKi8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQtdGVzdC5jcHAgYi9tZWRpYS91dGlscy9UaW1lclRocmVhZC10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2NkNjRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQtdGVzdC5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZXJUaHJlYWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBhdXRvIGtKaXR0ZXIgPSAxMG1zOworCisvLyBFYWNoIHRhc2sgd3JpdHRlbiBieSAqVG9TdHJpbmcoKSB3aWxsIHN0YXJ0IHdpdGggYSBsZWZ0IGJyYWNlLgorY29uc3RleHByIGNoYXIgUkVRVUVTVF9TVEFSVCA9ICd7JzsKKworaW5saW5lIHNpemVfdCBjb3VudENoYXJzKHN0ZDo6c3RyaW5nX3ZpZXcgcywgY2hhciBjKSB7CisgICAgcmV0dXJuIHN0ZDo6Y291bnQocy5iZWdpbigpLCBzLmVuZCgpLCBjKTsKK30KKworVEVTVChUaW1lclRocmVhZCwgQmFzaWMpIHsKKyAgICBzdGQ6OmF0b21pYzxib29sPiB0YXNrUmFuID0gZmFsc2U7CisgICAgVGltZXJUaHJlYWQgdGhyZWFkOworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIkJhc2ljIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW4gPSB0cnVlOyB9LCAxMDBtcyk7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zIC0ga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW4pOworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigyICoga0ppdHRlcik7CisgICAgQVNTRVJUX1RSVUUodGFza1Jhbik7CisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7Cit9CisKK1RFU1QoVGltZXJUaHJlYWQsIENhbmNlbCkgeworICAgIHN0ZDo6YXRvbWljPGJvb2w+IHRhc2tSYW4gPSBmYWxzZTsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisgICAgVGltZXJUaHJlYWQ6OkhhbmRsZSBoYW5kbGUgPQorICAgICAgICAgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiQ2FuY2VsIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW4gPSB0cnVlOyB9LCAxMDBtcyk7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zIC0ga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW4pOworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZSkpOworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigyICoga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW4pOworICAgIEFTU0VSVF9FUSgxLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworfQorCitURVNUKFRpbWVyVGhyZWFkLCBDYW5jZWxBZnRlclJ1bikgeworICAgIHN0ZDo6YXRvbWljPGJvb2w+IHRhc2tSYW4gPSBmYWxzZTsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisgICAgVGltZXJUaHJlYWQ6OkhhbmRsZSBoYW5kbGUgPQorICAgICAgICAgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiQ2FuY2VsQWZ0ZXJSdW4iLCBbJnRhc2tSYW5dIHsgdGFza1JhbiA9IHRydWU7IH0sIDEwMG1zKTsKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMgKyBrSml0dGVyKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuKTsKKyAgICBBU1NFUlRfRkFMU0UodGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlKSk7CisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7Cit9CisKK1RFU1QoVGltZXJUaHJlYWQsIE11bHRpcGxlVGFza3MpIHsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXRvbWljPGJvb2w+LCA2PiB0YXNrUmFue307CisgICAgVGltZXJUaHJlYWQgdGhyZWFkOworCisgICAgYXV0byBzdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIjAiLCBbJnRhc2tSYW5dIHsgdGFza1JhblswXSA9IHRydWU7IH0sIDMwMG1zKTsKKyAgICB0aHJlYWQuc2NoZWR1bGVUYXNrKCIxIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW5bMV0gPSB0cnVlOyB9LCAxMDBtcyk7CisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiMiIsIFsmdGFza1Jhbl0geyB0YXNrUmFuWzJdID0gdHJ1ZTsgfSwgMjAwbXMpOworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIjMiLCBbJnRhc2tSYW5dIHsgdGFza1JhblszXSA9IHRydWU7IH0sIDQwMG1zKTsKKyAgICBhdXRvIGhhbmRsZTQgPSB0aHJlYWQuc2NoZWR1bGVUYXNrKCI0IiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW5bNF0gPSB0cnVlOyB9LCAyMDBtcyk7CisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiNSIsIFsmdGFza1Jhbl0geyB0YXNrUmFuWzVdID0gdHJ1ZTsgfSwgMjAwbXMpOworCisgICAgLy8gNiB0YXNrcyBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDYsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMCB0YXNrcyBjb21wbGV0ZWQKKyAgICBBU1NFUlRfRVEoMCwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIC8vIFRhc2sgMSBzaG91bGQgdHJpZ2dlciBhcm91bmQgMTAwbXMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMTAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzVdKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX3VudGlsKHN0YXJ0VGltZSArIDEwMG1zICsga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIENhbmNlbCB0YXNrIDQgYmVmb3JlIGl0IGdldHMgYSBjaGFuY2UgdG8gcnVuLgorICAgIHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTQpOworCisgICAgLy8gVGFza3MgMiBhbmQgNSBzaG91bGQgdHJpZ2dlciBhcm91bmQgMjAwbXMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMjAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzNdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls0XSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNV0pOworCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMjAwbXMgKyBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIFRhc2sgMCBzaG91bGQgdHJpZ2dlciBhcm91bmQgMzAwbXMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMzAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX3VudGlsKHN0YXJ0VGltZSArIDMwMG1zICsga0ppdHRlcik7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIDEgdGFzayBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gNCB0YXNrcyByYW4gYW5kIDEgY2FuY2VsbGVkCisgICAgQVNTRVJUX0VRKDQgKyAxLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgLy8gVGFzayAzIHNob3VsZCB0cmlnZ2VyIGFyb3VuZCA0MDBtcy4KKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyA0MDBtcyAtIGtKaXR0ZXIpOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzNdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls0XSk7CisgICAgQVNTRVJUX1RSVUUodGFza1Jhbls1XSk7CisKKyAgICAvLyA0IHRhc2tzIHJhbiBhbmQgMSBjYW5jZWxsZWQKKyAgICBBU1NFUlRfRVEoNCArIDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyA0MDBtcyArIGtKaXR0ZXIpOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIDAgdGFza3MgcGVuZGluZworICAgIEFTU0VSVF9FUSgwLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDUgdGFza3MgcmFuIGFuZCAxIGNhbmNlbGxlZAorICAgIEFTU0VSVF9FUSg1ICsgMSwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKK30KKworVEVTVChUaW1lclRocmVhZCwgVHJhY2tlZFRhc2tzKSB7CisgICAgVGltZXJUaHJlYWQgdGhyZWFkOworCisgICAgYXV0byBoYW5kbGUwID0gdGhyZWFkLnRyYWNrVGFzaygiMCIpOworICAgIGF1dG8gaGFuZGxlMSA9IHRocmVhZC50cmFja1Rhc2soIjEiKTsKKyAgICBhdXRvIGhhbmRsZTIgPSB0aHJlYWQudHJhY2tUYXNrKCIyIik7CisKKyAgICAvLyAzIHRhc2tzIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMywgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAwIHRhc2tzIHJldGlyZWQKKyAgICBBU1NFUlRfRVEoMCwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTApKTsKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuY2FuY2VsVGFzayhoYW5kbGUxKSk7CisKKyAgICAvLyAxIHRhc2sgcGVuZGluZworICAgIEFTU0VSVF9FUSgxLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDIgdGFza3MgcmV0aXJlZAorICAgIEFTU0VSVF9FUSgyLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgLy8gaGFuZGxlMSBpcyBzdGFsZSwgY2FuY2VsIHJldHVybnMgZmFsc2UuCisgICAgQVNTRVJUX0ZBTFNFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTEpKTsKKworICAgIC8vIDEgdGFzayBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMiB0YXNrcyByZXRpcmVkCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICAvLyBBZGQgYW5vdGhlciB0cmFja2VkIHRhc2suCisgICAgYXV0byBoYW5kbGUzID0gdGhyZWFkLnRyYWNrVGFzaygiMyIpOworCisgICAgLy8gMiB0YXNrcyBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMiB0YXNrcyByZXRpcmVkCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuY2FuY2VsVGFzayhoYW5kbGUyKSk7CisKKyAgICAvLyAxIHRhc2tzIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMSwgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAzIHRhc2tzIHJldGlyZWQKKyAgICBBU1NFUlRfRVEoMywgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTMpKTsKKworICAgIC8vIDAgdGFza3MgcGVuZGluZworICAgIEFTU0VSVF9FUSgwLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDQgdGFza3MgcmV0aXJlZAorICAgIEFTU0VSVF9FUSg0LCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVyVGhyZWFkLmNwcCBiL21lZGlhL3V0aWxzL1RpbWVyVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU2YjEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUaW1lclRocmVhZCIKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZWRpYVV0aWxzRGVsYXllZC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZXJUaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWREZWZzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworZXh0ZXJuIHN0ZDo6c3RyaW5nIGZvcm1hdFRpbWUoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0KTsKK2V4dGVybiBzdGQ6OnN0cmluZ192aWV3IHRpbWVTdWZmaXgoc3RkOjpzdHJpbmdfdmlldyB0aW1lMSwgc3RkOjpzdHJpbmdfdmlldyB0aW1lMik7CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6OnNjaGVkdWxlVGFzaygKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mJiBmdW5jLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBjb25zdCBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0eworICAgICAgICAgICAgbmV3IFJlcXVlc3R7IG5vdywgbm93ICsgdGltZW91dCwgZ2V0dGlkKCksIHN0ZDo6bW92ZSh0YWcpIH19OworICAgIHJldHVybiBtTW9uaXRvclRocmVhZC5hZGQoc3RkOjptb3ZlKHJlcXVlc3QpLCBzdGQ6Om1vdmUoZnVuYyksIHRpbWVvdXQpOworfQorCitUaW1lclRocmVhZDo6SGFuZGxlIFRpbWVyVGhyZWFkOjp0cmFja1Rhc2soc3RkOjpzdHJpbmcgdGFnKSB7CisgICAgY29uc3QgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVxdWVzdHsKKyAgICAgICAgICAgIG5ldyBSZXF1ZXN0eyBub3csIG5vdywgZ2V0dGlkKCksIHN0ZDo6bW92ZSh0YWcpIH19OworICAgIHJldHVybiBtTm9UaW1lb3V0TWFwLmFkZChzdGQ6Om1vdmUocmVxdWVzdCkpOworfQorCitib29sIFRpbWVyVGhyZWFkOjpjYW5jZWxUYXNrKEhhbmRsZSBoYW5kbGUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVxdWVzdCA9IG1Ob1RpbWVvdXRNYXAuaXNWYWxpZEhhbmRsZShoYW5kbGUpID8KKyAgICAgICAgICAgICBtTm9UaW1lb3V0TWFwLnJlbW92ZShoYW5kbGUpIDogbU1vbml0b3JUaHJlYWQucmVtb3ZlKGhhbmRsZSk7CisgICAgaWYgKCFyZXF1ZXN0KSByZXR1cm4gZmFsc2U7CisgICAgbVJldGlyZWRRdWV1ZS5hZGQoc3RkOjptb3ZlKHJlcXVlc3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OnRvU3RyaW5nKHNpemVfdCByZXRpcmVkQ291bnQpIGNvbnN0IHsKKyAgICAvLyBOb3RlOiBUaGVzZSByZXF1ZXN0IHF1ZXVlcyBhcmUgc25hcHNob3QgdmVyeSBjbG9zZSB0b2dldGhlciBidXQKKyAgICAvLyBub3QgYXQgImlkZW50aWNhbCIgdGltZXMgYXMgd2UgZG9uJ3QgdXNlIGEgY2xhc3Mtd2lkZSBsb2NrLgorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiB0aW1lb3V0UmVxdWVzdHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiByZXRpcmVkUmVxdWVzdHM7CisgICAgbVRpbWVvdXRRdWV1ZS5jb3B5UmVxdWVzdHModGltZW91dFJlcXVlc3RzKTsKKyAgICBtUmV0aXJlZFF1ZXVlLmNvcHlSZXF1ZXN0cyhyZXRpcmVkUmVxdWVzdHMsIHJldGlyZWRDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiBwZW5kaW5nUmVxdWVzdHMgPQorICAgICAgICBnZXRQZW5kaW5nUmVxdWVzdHMoKTsKKworICAgIHN0cnVjdCBBbmFseXNpcyBhbmFseXNpcyA9IGFuYWx5emVUaW1lb3V0KHRpbWVvdXRSZXF1ZXN0cywgcGVuZGluZ1JlcXVlc3RzKTsKKyAgICBzdGQ6OnN0cmluZyBhbmFseXNpc1N1bW1hcnk7CisgICAgaWYgKCFhbmFseXNpcy5zdW1tYXJ5LmVtcHR5KCkpIHsKKyAgICAgICAgYW5hbHlzaXNTdW1tYXJ5ID0gc3RkOjpzdHJpbmcoIlxuYW5hbHlzaXMgWyAiKS5hcHBlbmQoYW5hbHlzaXMuc3VtbWFyeSkuYXBwZW5kKCIgXSIpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0aW1lb3V0U3RhY2s7CisgICAgaWYgKGFuYWx5c2lzLnRpbWVvdXRUaWQgIT0gLTEpIHsKKyAgICAgICAgdGltZW91dFN0YWNrID0gc3RkOjpzdHJpbmcoIlxudGltZW91dCgiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoc3RkOjp0b19zdHJpbmcoYW5hbHlzaXMudGltZW91dFRpZCkpLmFwcGVuZCgiKSBjYWxsc3RhY2sgW1xuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGdldENhbGxTdGFja1N0cmluZ0ZvclRpZChhbmFseXNpcy50aW1lb3V0VGlkKSkuYXBwZW5kKCJdIik7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGJsb2NrZWRTdGFjazsKKyAgICBpZiAoYW5hbHlzaXMuSEFMQmxvY2tlZFRpZCAhPSAtMSkgeworICAgICAgICBibG9ja2VkU3RhY2sgPSBzdGQ6OnN0cmluZygiXG5ibG9ja2VkKCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChzdGQ6OnRvX3N0cmluZyhhbmFseXNpcy5IQUxCbG9ja2VkVGlkKSkuYXBwZW5kKCIpICBjYWxsc3RhY2sgW1xuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGdldENhbGxTdGFja1N0cmluZ0ZvclRpZChhbmFseXNpcy5IQUxCbG9ja2VkVGlkKSkuYXBwZW5kKCJdIik7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJub3cgIikKKyAgICAgICAgICAgIC5hcHBlbmQoZm9ybWF0VGltZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSkpCisgICAgICAgICAgICAuYXBwZW5kKGFuYWx5c2lzU3VtbWFyeSkKKyAgICAgICAgICAgIC5hcHBlbmQoIlxudGltZW91dCBbICIpCisgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3RzVG9TdHJpbmcodGltZW91dFJlcXVlc3RzKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiBdXG5wZW5kaW5nIFsgIikKKyAgICAgICAgICAgIC5hcHBlbmQocmVxdWVzdHNUb1N0cmluZyhwZW5kaW5nUmVxdWVzdHMpKQorICAgICAgICAgICAgLmFwcGVuZCgiIF1cbnJldGlyZWQgWyAiKQorICAgICAgICAgICAgLmFwcGVuZChyZXF1ZXN0c1RvU3RyaW5nKHJldGlyZWRSZXF1ZXN0cykpCisgICAgICAgICAgICAuYXBwZW5kKCIgXSIpCisgICAgICAgICAgICAuYXBwZW5kKHRpbWVvdXRTdGFjaykKKyAgICAgICAgICAgIC5hcHBlbmQoYmxvY2tlZFN0YWNrKTsKK30KKworLy8gQSBIQUwgbWV0aG9kIGlzIHdoZXJlIHRoZSBzdWJzdHJpbmcgIkhpZGwiIGlzIGluIHRoZSBjbGFzcyBuYW1lLgorLy8gVGhlIHRhZyBzaG91bGQgbG9vayBsaWtlOiAuLi4gSGlkbCAuLi4gOjogLi4uCisvLyBXaGVuIHRoZSBhdWRpbyBIQUwgaXMgdXBkYXRlZCB0byBBSURMIHBlcmhhcHMgd2Ugd2lsbCB1c2UgaW5zdGVhZAorLy8gYSBnbG9iYWwgZGlyZWN0b3J5IG9mIEhBTCBjbGFzc2VzLgorLy8KKy8vIFNlZSBNZXRob2RTdGF0aXN0aWNzLmNwcDoKKy8vIG1lZGlhdXRpbHM6OmdldFN0YXRpc3RpY3NDbGFzc2VzRm9yTW9kdWxlKE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwpCisvLworLyogc3RhdGljICovCitib29sIFRpbWVyVGhyZWFkOjppc1JlcXVlc3RGcm9tSGFsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiYgcmVxdWVzdCkgeworICAgIGNvbnN0IHNpemVfdCBoaWRsUG9zID0gcmVxdWVzdC0+dGFnLmZpbmQoIkhpZGwiKTsKKyAgICBpZiAoaGlkbFBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgcmV0dXJuIGZhbHNlOworICAgIC8vIHNob3VsZCBiZSBhIHNlcGFyYXRvciBhZnRlcndhcmRzIEhpZGwgd2hpY2ggaW5kaWNhdGVzIHRoZSBzdHJpbmcgd2FzIGluIHRoZSBjbGFzcy4KKyAgICBjb25zdCBzaXplX3Qgc2VwYXJhdG9yUG9zID0gcmVxdWVzdC0+dGFnLmZpbmQoIjo6IiwgaGlkbFBvcyk7CisgICAgcmV0dXJuIHNlcGFyYXRvclBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKworLyogc3RhdGljICovCitzdHJ1Y3QgVGltZXJUaHJlYWQ6OkFuYWx5c2lzIFRpbWVyVGhyZWFkOjphbmFseXplVGltZW91dCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiB0aW1lb3V0UmVxdWVzdHMsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcGVuZGluZ1JlcXVlc3RzKSB7CisKKyAgICBpZiAodGltZW91dFJlcXVlc3RzLmVtcHR5KCkgfHwgcGVuZGluZ1JlcXVlc3RzLmVtcHR5KCkpIHJldHVybiB7fTsgLy8gbm90aGluZyB0byBzYXkuCisKKyAgICAvLyBmb3Igbm93IGxvb2sgYXQgbGFzdCB0aW1lb3V0IChpbiBvdXIgY2FzZSwgdGhlIG9ubHkgdGltZW91dCkKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gdGltZW91dCA9IHRpbWVvdXRSZXF1ZXN0cy5iYWNrKCk7CisKKyAgICAvLyBwZW5kaW5nIFJlcXVlc3RzIHRoYXQgYXJlIHByb2JsZW1hdGljLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gcGVuZGluZ0V4YWN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gcGVuZGluZ1Bvc3NpYmxlOworCisgICAgLy8gV2UgbG9vayBhdCBwZW5kaW5nIHJlcXVlc3RzIHRoYXQgd2VyZSBzY2hlZHVsZWQgbm8gbGF0ZXIgdGhhbiBrRHVyYXRpb24KKyAgICAvLyBhZnRlciB0aGUgdGltZW91dCByZXF1ZXN0LiBUaGlzIHByZXZlbnRzIGZhbHNlIG1hdGNoZXMgd2l0aCBjYWxscworICAgIC8vIHRoYXQgbmF0dXJhbGx5IGJsb2NrIGZvciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lCisgICAgLy8gc3VjaCBhcyBIQUwgd3JpdGUoKSBhbmQgcmVhZCgpLgorICAgIC8vCisgICAgYXV0byBjb25zdGV4cHIga0R1cmF0aW9uID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBlbmRpbmcgOiBwZW5kaW5nUmVxdWVzdHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHBlbmRpbmcgdGlkIGlzIHRoZSBzYW1lIGFzIHRpbWVvdXQgdGlkLCBwcm9ibGVtIGlkZW50aWZpZWQuCisgICAgICAgIGlmIChwZW5kaW5nLT50aWQgPT0gdGltZW91dC0+dGlkKSB7CisgICAgICAgICAgICBwZW5kaW5nRXhhY3QuZW1wbGFjZV9iYWNrKHBlbmRpbmcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgcGVuZGluZyB0aWQgaXMgc2NoZWR1bGVkIHdpdGhpbiB0aW1lIGxpbWl0CisgICAgICAgIGlmIChwZW5kaW5nLT5zY2hlZHVsZWQgLSB0aW1lb3V0LT5zY2hlZHVsZWQgPCBrRHVyYXRpb24pIHsKKyAgICAgICAgICAgIHBlbmRpbmdQb3NzaWJsZS5lbXBsYWNlX2JhY2socGVuZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJ1Y3QgQW5hbHlzaXMgYW5hbHlzaXN7fTsKKworICAgIGFuYWx5c2lzLnRpbWVvdXRUaWQgPSB0aW1lb3V0LT50aWQ7CisgICAgc3RkOjpzdHJpbmcmIHN1bW1hcnkgPSBhbmFseXNpcy5zdW1tYXJ5OworICAgIGlmICghcGVuZGluZ0V4YWN0LmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgcmVxdWVzdCA9IHBlbmRpbmdFeGFjdC5mcm9udCgpOworICAgICAgICBjb25zdCBib29sIGhhbCA9IGlzUmVxdWVzdEZyb21IYWwocmVxdWVzdCk7CisKKyAgICAgICAgaWYgKGhhbCkgeworICAgICAgICAgICAgc3VtbWFyeSA9IHN0ZDo6c3RyaW5nKCJCbG9ja2VkIGRpcmVjdGx5IGR1ZSB0byBIQUwgY2FsbDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3QtPnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdW1tYXJ5LmVtcHR5KCkgJiYgIXBlbmRpbmdQb3NzaWJsZS5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IHBlbmRpbmdQb3NzaWJsZSkgeworICAgICAgICAgICAgY29uc3QgYm9vbCBoYWwgPSBpc1JlcXVlc3RGcm9tSGFsKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGhhbCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBibG9ja2VkIGNhbGwgaXMgdGhlIG1vc3QgbGlrZWx5IG9uZS4KKyAgICAgICAgICAgICAgICAvLyBSZWNlbnQgY2FsbHMgbWlnaHQgYmUgdGVtcG9yYXJpbHkgYmxvY2tlZAorICAgICAgICAgICAgICAgIC8vIGNhbGxzIHN1Y2ggYXMgd3JpdGUoKSBvciByZWFkKCkgZGVwZW5kaW5nIG9uIGtEdXJhdGlvbi4KKyAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gc3RkOjpzdHJpbmcoIkJsb2NrZWQgcG9zc2libHkgZHVlIHRvIEhBTCBjYWxsOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3QtPnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGFuYWx5c2lzLkhBTEJsb2NrZWRUaWQgPSByZXF1ZXN0LT50aWQ7CisgICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYW5hbHlzaXM7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaW1lclRocmVhZDo6UmVxdWVzdD4+IFRpbWVyVGhyZWFkOjpnZXRQZW5kaW5nUmVxdWVzdHMoKSBjb25zdCB7CisgICAgY29uc3RleHByIHNpemVfdCBrRXN0aW1hdGVkUGVuZGluZ1JlcXVlc3RzID0gODsgIC8vIGFwcHJveCAxMjggYnl0ZSBhbGxvYy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHBlbmRpbmdSZXF1ZXN0czsKKyAgICBwZW5kaW5nUmVxdWVzdHMucmVzZXJ2ZShrRXN0aW1hdGVkUGVuZGluZ1JlcXVlc3RzKTsgLy8gcHJlYWxsb2NhdGUgdmVjdG9yIG91dCBvZiBsb2NrLgorCisgICAgLy8gZm9sbG93aW5nIGFyZSBpbnRlcm5hbGx5IGxvY2tlZCBjYWxscywgd2hpY2ggYWRkIHRvIG91ciBsb2NhbCBwZW5kaW5nUmVxdWVzdHMuCisgICAgbU1vbml0b3JUaHJlYWQuY29weVJlcXVlc3RzKHBlbmRpbmdSZXF1ZXN0cyk7CisgICAgbU5vVGltZW91dE1hcC5jb3B5UmVxdWVzdHMocGVuZGluZ1JlcXVlc3RzKTsKKworICAgIC8vIFNvcnQgaW4gb3JkZXIgb2Ygc2NoZWR1bGVkIHRpbWUuCisgICAgc3RkOjpzb3J0KHBlbmRpbmdSZXF1ZXN0cy5iZWdpbigpLCBwZW5kaW5nUmVxdWVzdHMuZW5kKCksCisgICAgICAgIFtdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiYgcjEsCisgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiYgcjIpIHsKKyAgICAgICAgICAgICAgIHJldHVybiByMS0+c2NoZWR1bGVkIDwgcjItPnNjaGVkdWxlZDsKKyAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0czsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OnBlbmRpbmdUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVxdWVzdHNUb1N0cmluZyhnZXRQZW5kaW5nUmVxdWVzdHMoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRpbWVyVGhyZWFkOjpyZXRpcmVkVG9TdHJpbmcoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHJldGlyZWRSZXF1ZXN0czsKKyAgICBtUmV0aXJlZFF1ZXVlLmNvcHlSZXF1ZXN0cyhyZXRpcmVkUmVxdWVzdHMsIG4pOworCisgICAgLy8gRHVtcCB0byBzdHJpbmcKKyAgICByZXR1cm4gcmVxdWVzdHNUb1N0cmluZyhyZXRpcmVkUmVxdWVzdHMpOworfQorCitzdGQ6OnN0cmluZyBUaW1lclRocmVhZDo6dGltZW91dFRvU3RyaW5nKHNpemVfdCBuKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiB0aW1lb3V0UmVxdWVzdHM7CisgICAgbVRpbWVvdXRRdWV1ZS5jb3B5UmVxdWVzdHModGltZW91dFJlcXVlc3RzLCBuKTsKKworICAgIC8vIER1bXAgdG8gc3RyaW5nCisgICAgcmV0dXJuIHJlcXVlc3RzVG9TdHJpbmcodGltZW91dFJlcXVlc3RzKTsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OlJlcXVlc3Q6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gc2NoZWR1bGVkU3RyaW5nID0gZm9ybWF0VGltZShzY2hlZHVsZWQpOworICAgIGNvbnN0IGF1dG8gZGVhZGxpbmVTdHJpbmcgPSBmb3JtYXRUaW1lKGRlYWRsaW5lKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcodGFnKQorICAgICAgICAuYXBwZW5kKCIgc2NoZWR1bGVkICIpLmFwcGVuZChzY2hlZHVsZWRTdHJpbmcpCisgICAgICAgIC5hcHBlbmQoIiBkZWFkbGluZSAiKS5hcHBlbmQodGltZVN1ZmZpeChzY2hlZHVsZWRTdHJpbmcsIGRlYWRsaW5lU3RyaW5nKSkKKyAgICAgICAgLmFwcGVuZCgiIHRpZCAiKS5hcHBlbmQoc3RkOjp0b19zdHJpbmcodGlkKSk7Cit9CisKK3ZvaWQgVGltZXJUaHJlYWQ6OlJlcXVlc3RRdWV1ZTo6YWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1SUU11dGV4KTsKKyAgICBtUmVxdWVzdFF1ZXVlLmVtcGxhY2VfYmFjayhzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSwgc3RkOjptb3ZlKHJlcXVlc3QpKTsKKyAgICBpZiAobVJlcXVlc3RRdWV1ZS5zaXplKCkgPiBtUmVxdWVzdFF1ZXVlTWF4KSB7CisgICAgICAgIG1SZXF1ZXN0UXVldWUucG9wX2Zyb250KCk7CisgICAgfQorfQorCit2b2lkIFRpbWVyVGhyZWFkOjpSZXF1ZXN0UXVldWU6OmNvcHlSZXF1ZXN0cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMsIHNpemVfdCBuKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1SUU11dGV4KTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1SZXF1ZXN0UXVldWUuc2l6ZSgpOworICAgIHNpemVfdCBpID0gbiA+PSAgc2l6ZSA/IDAgOiBzaXplIC0gbjsKKyAgICBmb3IgKDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBhdXRvICZbdGltZSwgcmVxdWVzdF0gPSBtUmVxdWVzdFF1ZXVlW2ldOworICAgICAgICByZXF1ZXN0cy5lbXBsYWNlX2JhY2socmVxdWVzdCk7CisgICAgfQorfQorCitib29sIFRpbWVyVGhyZWFkOjpOb1RpbWVvdXRNYXA6OmlzVmFsaWRIYW5kbGUoSGFuZGxlIGhhbmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYW5kbGUgPiBnZXRJbmRleGVkSGFuZGxlKG1Ob1RpbWVvdXRSZXF1ZXN0cyk7Cit9CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6Ok5vVGltZW91dE1hcDo6YWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1OVE11dGV4KTsKKyAgICAvLyBBIHVuaXF1ZSBoYW5kbGUgaXMgb2J0YWluZWQgYnkgbU5vVGltZW91dFJlcXVlc3RzLmZldGNoX2FkZCgxKSwKKyAgICAvLyBUaGlzIG5lZWQgbm90IGJlIHVuZGVyIGEgbG9jaywgYnV0IHdlIGRvIHNvIGFueWhvdy4KKyAgICBjb25zdCBIYW5kbGUgaGFuZGxlID0gZ2V0SW5kZXhlZEhhbmRsZShtTm9UaW1lb3V0UmVxdWVzdHMrKyk7CisgICAgbU1hcFtoYW5kbGVdID0gcmVxdWVzdDsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGltZXJUaHJlYWQ6OlJlcXVlc3Q+IFRpbWVyVGhyZWFkOjpOb1RpbWVvdXRNYXA6OnJlbW92ZShIYW5kbGUgaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1OVE11dGV4KTsKKyAgICBhdXRvIGl0ID0gbU1hcC5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ID09IG1NYXAuZW5kKCkpIHJldHVybiB7fTsKKyAgICBhdXRvIHJlcXVlc3QgPSBpdC0+c2Vjb25kOworICAgIG1NYXAuZXJhc2UoaXQpOworICAgIHJldHVybiByZXF1ZXN0OworfQorCit2b2lkIFRpbWVyVGhyZWFkOjpOb1RpbWVvdXRNYXA6OmNvcHlSZXF1ZXN0cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobU5UTXV0ZXgpOworICAgIGZvciAoY29uc3QgYXV0byAmW2hhbmRsZSwgcmVxdWVzdF0gOiBtTWFwKSB7CisgICAgICAgIHJlcXVlc3RzLmVtcGxhY2VfYmFjayhyZXF1ZXN0KTsKKyAgICB9Cit9CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6Ok1vbml0b3JUaHJlYWQ6OmdldFVuaXF1ZUhhbmRsZV9sKAorICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKKyAgICAvLyBUbyBhdm9pZCBrZXkgY29sbGlzaW9ucywgYWR2YW5jZSBieSAxIHRpY2sgdW50aWwgdGhlIGtleSBpcyB1bmlxdWUuCisgICAgYXV0byBkZWFkbGluZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgdGltZW91dDsKKyAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5maW5kKGRlYWRsaW5lKSAhPSBtTW9uaXRvclJlcXVlc3RzLmVuZCgpOworICAgICAgICAgZGVhZGxpbmUgKz0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24oMSkpCisgICAgICAgIDsKKyAgICByZXR1cm4gZGVhZGxpbmU7Cit9CisKK1RpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjpNb25pdG9yVGhyZWFkKFJlcXVlc3RRdWV1ZSYgdGltZW91dFF1ZXVlKQorICAgICAgICA6IG1UaW1lb3V0UXVldWUodGltZW91dFF1ZXVlKQorICAgICAgICAsIG1UaHJlYWQoW3RoaXNdIHsgdGhyZWFkRnVuYygpOyB9KSB7CisgICAgIHB0aHJlYWRfc2V0bmFtZV9ucChtVGhyZWFkLm5hdGl2ZV9oYW5kbGUoKSwgIlRpbWVyVGhyZWFkIik7CisgICAgIHB0aHJlYWRfc2V0c2NoZWRwcmlvKG1UaHJlYWQubmF0aXZlX2hhbmRsZSgpLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOworfQorCitUaW1lclRocmVhZDo6TW9uaXRvclRocmVhZDo6fk1vbml0b3JUaHJlYWQoKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgX2wobU11dGV4KTsKKyAgICAgICAgbVNob3VsZEV4aXQgPSB0cnVlOworICAgICAgICBtQ29uZC5ub3RpZnlfYWxsKCk7CisgICAgfQorICAgIG1UaHJlYWQuam9pbigpOworfQorCit2b2lkIFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjp0aHJlYWRGdW5jKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgX2wobU11dGV4KTsKKyAgICB3aGlsZSAoIW1TaG91bGRFeGl0KSB7CisgICAgICAgIGlmICghbU1vbml0b3JSZXF1ZXN0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICBIYW5kbGUgbmV4dERlYWRsaW5lID0gbU1vbml0b3JSZXF1ZXN0cy5iZWdpbigpLT5maXJzdDsKKyAgICAgICAgICAgIGlmIChuZXh0RGVhZGxpbmUgPCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICAgICAgICAgIC8vIERlYWRsaW5lIGhhcyBleHBpcmVkLCBoYW5kbGUgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdXRvIG5vZGUgPSBtTW9uaXRvclJlcXVlc3RzLmV4dHJhY3QobU1vbml0b3JSZXF1ZXN0cy5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgX2wudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFkZCBSZXF1ZXN0IHRvIHJldGlyZWQgcXVldWUgZWFybHkgc28gdGhhdCBpdCBjYW4gYmUgZHVtcGVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVvdXRRdWV1ZS5hZGQoc3RkOjptb3ZlKG5vZGUubWFwcGVkKCkuZmlyc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXBwZWQoKS5zZWNvbmQoKTsgLy8gQ2F1dGlvbjogd2UgZG9uJ3QgaG9sZCBsb2NrIGhlcmUgLSBidXQgZG8gd2UgY2FyZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgdGltZW91dCBjYXNlISAgV2Ugd2lsbCBjcmFzaCBzb29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXliZSBiZWZvcmUgcmV0dXJuaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IG92ZXIgaXMgcmVsZWFzZWQgaGVyZSBvdXRzaWRlIGxvY2suCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlYWNxdWlyZSB0aGUgbG9jayAtIGlmIHNvbWV0aGluZyB3YXMgYWRkZWQsIHdlIGxvb3AgaW1tZWRpYXRlbHkgdG8gY2hlY2suCisgICAgICAgICAgICAgICAgX2wubG9jaygpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmQud2FpdF91bnRpbChfbCwgbmV4dERlYWRsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db25kLndhaXQoX2wpOworICAgICAgICB9CisgICAgfQorfQorCitUaW1lclRocmVhZDo6SGFuZGxlIFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjphZGQoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mJiBmdW5jLAorICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgX2wobU11dGV4KTsKKyAgICBjb25zdCBIYW5kbGUgaGFuZGxlID0gZ2V0VW5pcXVlSGFuZGxlX2wodGltZW91dCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5lbXBsYWNlKGhhbmRsZSwgc3RkOjptYWtlX3BhaXIoc3RkOjptb3ZlKHJlcXVlc3QpLCBzdGQ6Om1vdmUoZnVuYykpKTsKKyAgICBtQ29uZC5ub3RpZnlfYWxsKCk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRpbWVyVGhyZWFkOjpSZXF1ZXN0PiBUaW1lclRocmVhZDo6TW9uaXRvclRocmVhZDo6cmVtb3ZlKEhhbmRsZSBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIHVsKG1NdXRleCk7CisgICAgY29uc3QgYXV0byBpdCA9IG1Nb25pdG9yUmVxdWVzdHMuZmluZChoYW5kbGUpOworICAgIGlmIChpdCA9PSBtTW9uaXRvclJlcXVlc3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRpbWVyVGhyZWFkOjpSZXF1ZXN0PiByZXF1ZXN0ID0gc3RkOjptb3ZlKGl0LT5zZWNvbmQuZmlyc3QpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jID0gc3RkOjptb3ZlKGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmVyYXNlKGl0KTsKKyAgICB1bC51bmxvY2soKTsgIC8vIG1hbnVhbGx5IHJlbGVhc2UgbG9jayBoZXJlIHNvIGZ1bmMgaXMgcmVsZWFzZWQgb3V0c2lkZSBvZiBsb2NrLgorICAgIHJldHVybiByZXF1ZXN0OworfQorCit2b2lkIFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjpjb3B5UmVxdWVzdHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHJlcXVlc3RzKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1NdXRleCk7CisgICAgZm9yIChjb25zdCBhdXRvICZbZGVhZGxpbmUsIG1vbml0b3JwYWlyXSA6IG1Nb25pdG9yUmVxdWVzdHMpIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKG1vbml0b3JwYWlyLmZpcnN0KTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggYzE2OThkYy4uZDI2ZTZjMiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMTgsNiArMTgsNyBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0zMSwxMSArMzIsNiBAQAogICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKLSAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKLSAgICBdLAogfQogCiBjY19mdXp6IHsKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKaW5kZXggNmU1MjUxMi4uNTFlOGQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlICA8dHlwZV90cmFpdHM+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCmluZGV4IGVlYjZiYTYuLjc5NjY0NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcApAQCAtNDQsMTEgKzQ0LDExIEBACiAKICAgICAvLyAyLiBXZSBhbHNvIGhhdmUgc2V0QXVkaW9IYWxQaWRzLCB3aGljaCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgcGlkcyBzZXQKICAgICAvLyBhYm92ZS4KLSAgICBhbmRyb2lkOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgICBhbmRyb2lkOjptZWRpYXV0aWxzOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOwogCiAgICAgLy8gMy4gVGhlIGNvbnN0cnVjdG9yLCB3aGljaCBpcyBmdXp6ZWQgaGVyZToKLSAgICBhbmRyb2lkOjpUaW1lQ2hlY2sgdGltZUNoZWNrKG5hbWUuY19zdHIoKSwgdGltZW91dE1zKTsKKyAgICBhbmRyb2lkOjptZWRpYXV0aWxzOjpUaW1lQ2hlY2sgdGltZUNoZWNrKG5hbWUuY19zdHIoKSwge30gLyogb25UaW1lciAqLywgdGltZW91dE1zKTsKICAgICAvLyBXZSB3aWxsIGxlYXZlIHNvbWUgYnVmZmVyIHRvIGF2b2lkIHNsZWVwaW5nIHRvbyBsb25nCiAgICAgdWludDhfdCBzbGVlcF9hbW91bnRfbXMgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdGltZW91dE1zIC8gMik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9MaWJyYXJ5LmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2ZjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTGlicmFyeS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvKioKKyAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGlicmFyeSBpbnN0YW5jZS4KKyAqCisgKiBXaGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgbGlicmFyeSBpcyByZW1vdmVkLCB0aGUgbGlicmFyeSB3aWxsIGJlIGRsY2xvc2UoKS4KKyAqCisgKiBOb3RlczoKKyAqIDEpIFRoZSBBbmRyb2lkIGJpb25pYyBsaW5rZXIgYWx3YXlzIHVzZXMgUlRMRF9HTE9CQUwgZm9yIGV4ZWN1dGFibGUgbGlua2luZworICogd2hpY2ggcHJvdmlkZXMgdGhlIHN5bWJvbHMgZm9yIG90aGVyIHN1YnNlcXVlbnQgbGlicmFyaWVzLgorICoKKyAqIDIpIFJUTERfR0xPQkFMIGxpa2UgUlRMRF9OT0RFTEVURSBkaXNhYmxlcyB1bmxvYWRpbmcgb2YgdGhlIGxpYnJhcnkKKyAqIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLgorICoKKyAqIDMpIFJUTERfTE9DQUwgaXMgdGhlIGRlZmF1bHQgaW4gdGhlIGFic2VuY2Ugb2YgUlRMRF9HTE9CQUwuCisgKiBSVExEX0xPQ0FMIG1heSBiZSBpZ25vcmVkIGluIHNvbWUgc2l0dWF0aW9ucywgZm9yIGV4YW1wbGU6CisgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjgwODg4OS9zdGF0aWMtb2JqZWN0cy1kZXN0cnVjdGVkLWJlZm9yZS1kbGNsb3NlCisgKgorICogNCkgV2UgZGVmYXVsdCB0byB1c2UgUlRMRF9MQVpZIHRvIGRlbGF5IHN5bWJvbCByZWxvY2F0aW9ucyB1bnRpbCBuZWVkZWQuCisgKiBUaGlzIGZsYWcgbWF5IGJlIGlnbm9yZWQgYnkgQW5kcm9pZC4gIFJUTERfTEFaWSBtYXkgYWxsb3cKKyAqIHVucmVzb2x2ZWQgc3ltYm9scyBpZiBub3QgYWNjZXNzZWQsIG9yIHN5bWJvbHMgYWRkZWQgbGF0ZXIgd2l0aCBhbm90aGVyIGxpYnJhcnkKKyAqIGxvYWRlZCB3aXRoIFJUTERfR0xPQkFMLiBTZWUgUlRMRF9OT1cgZm9yIGNvbXBhcmlzb24uCisgKgorICogNSkgQXZvaWQgYm90aCBzdGF0aWNseSBsb2FkaW5nIGFuZCBkeW5hbWljYWxseSBsb2FkaW5nIHRoZSBzYW1lIGxpYnJhcnkuCisgKiBUaGlzIGlzIGtub3duIHRvIGNhdXNlIGRvdWJsZSBmcmVlIGlzc3VlcyBhcyBsaWJyYXJ5IHN5bWJvbHMgbWF5IG1hcCB0bworICogdGhlIHNhbWUgbG9jYXRpb24uICBSVExEX0RFRVBCSU5EIGRvZXMgbm90IGFwcGVhciBzdXBwb3J0ZWQgYXMgb2YgVC4KKyAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0MDczMDUxL3doZW4td2UtYXJlLXN1cHBvc2VkLXRvLXVzZS1ydGxkLWRlZXBiaW5kCisgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTIwOTY5My9zdGF0aWMtbGlicmFyeS1saW5rZWQtdHdvLXRpbWVzCisgKgorICogRGV0YWlscyBvbiBBbmRyb2lkIGxpbmtlciBhbmQgZGVidWdnaW5nIGhlcmU6CisgKiBTZWU6IGFkYiBzaGVsbCBzZXRwcm9wIGRlYnVnLmxkLmFsbCBkbGVycm9yLGRsb3BlbixkbHN5bQorICogU2VlOiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9iaW9uaWMvKy9tYXN0ZXIvYW5kcm9pZC1jaGFuZ2VzLWZvci1uZGstZGV2ZWxvcGVycy5tZAorICoKKyAqIFNvbWUgb3RoZXIgcmVsZXZhbnQgaW5mbzoKKyAqIFNlZTogU29vbmcgZG91YmxlX2xvYWRhYmxlOnRydWUgZ28vZG91YmxlX2xvYWRhYmxlCisgKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09uZV9EZWZpbml0aW9uX1J1bGUjU3VtbWFyeQorICoKKyAqIFRPRE8oYi8yMjgwOTMxNTEpOiBDb25zaWRlciBtb3ZpbmcgdG8gcGxhdGZvcm0vc3lzdGVtLgorICoKKyAqIFxwYXJhbSBsaWJyYXJ5TmFtZQorICogXHBhcmFtIGZsYWdzIG9uZSBvZiB0aGUgZGxvcGVuIFJUTERfKiBmbGFncy4gaHR0cHM6Ly9saW51eC5kaWUubmV0L21hbi8zL2Rsb3BlbgorICogXHJldHVybiBzaGFyZWRfcHRyIHRvIHRoZSBsaWJyYXJ5LiBUaGlzIHdpbGwgYmUgbnVsbHB0ciBpZiBpdCBpc24ndCBmb3VuZC4KKyAqLworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYnJhcnlOYW1lLCBpbnQgZmxhZ3MgPSBSVExEX0xBWlkpOworCisvKioKKyAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byBhbiBvYmplY3QgaW4gdGhlIGxpYnJhcnkKKyAqCisgKiBUaGUgb2JqZWN0IHdpbGwgYmUgYSBnbG9iYWwgdmFyaWFibGUgb3IgbWV0aG9kIGluIHRoZSBsaWJyYXJ5LgorICogVGhlIG9iamVjdCByZWZlcmVuY2UgY291bnRpbmcgaXMgYWxpYXNlZCB0byB0aGUgbGlicmFyeSBzaGFyZWQgcHRyLgorICoKKyAqIE5vdGU6IElmIGFueSBpbnRlcm5hbHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGFyZSBleHBvc2VkLCBmb3IgZXhhbXBsZSBieQorICogYSBtZXRob2QgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBsaWJyYXJ5IGdsb2JhbHMsCisgKiBvciByZXR1cm5pbmcgYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRlZmluaXRpb24gaXMgZnJvbSB0aGUgbGlicmFyeSwKKyAqIHRoZW4gdGhlIHNoYXJlZF9wdHIgbXVzdCBiZSBrZXB0IGFsaXZlIHdoaWxlIHN1Y2ggcmVmZXJlbmNlcyB0bworICogbGlicmFyeSBpbnRlcm5hbHMgZXhpc3QgdG8gcHJldmVudCBsaWJyYXJ5IHVubG9hZGluZy4KKyAqCisgKiBTZWUgdXNhZ2Ugb2YgUlRMRF9OT0RFTEVURSBhcyBhIGZsYWcgdG8gcHJldmVudCB1bmxvYWRpbmcuCisgKgorICogXHBhcmFtIG9iamVjdE5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICogXHBhcmFtIGxpYnJhcnkgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGlicmFyeSByZXR1cm5lZCBieSBsb2FkTGlicmFyeSgpLgorICogXHJldHVybiBzaGFyZWRfcHRyIHRvIHRoZSBvYmplY3QsIGJ1dCB3aG9zZSByZWZjb3VudCBpcworICogICAgICAgICBhbGlhc2VkIHRvIHRoZSBsaWJyYXJ5IHNoYXJlZCBwdHIuCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjx2b2lkPiBnZXRVbnR5cGVkT2JqZWN0RnJvbUxpYnJhcnkoCisgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiYgbGlicmFyeSk7CisKKy8qKgorICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIGFuIG9iamVjdCBpbiB0aGUgbGlicmFyeQorICoKKyAqIFRoaXMgaXMgdGhlIHRlbXBsYXRlIHR5cGVkIHZlcnNpb24gb2YgZ2V0VW50eXBlZE9iamVjdEZyb21MaWJyYXJ5KCkuCisgKgorICogXHBhcmFtIG9iamVjdE5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICogXHBhcmFtIGxpYnJhcnkgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGlicmFyeQorICogXHJldHVybiBzaGFyZWRfcHRyIHRvIHRoZSBvYmplY3QsIGJ1dCB3aG9zZSByZWZjb3VudCBpcworICogICAgICAgICBhbGlhc2VkIHRvIHRoZSBsaWJyYXJ5IHNoYXJlZCBwdHIuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzaGFyZWRfcHRyPFQ+IGdldE9iamVjdEZyb21MaWJyYXJ5KAorICAgICAgICBjb25zdCBjaGFyICpvYmplY3ROYW1lLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4mIGxpYnJhcnkpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PFQ+KGdldFVudHlwZWRPYmplY3RGcm9tTGlicmFyeShvYmplY3ROYW1lLCBsaWJyYXJ5KSk7Cit9CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9NZWRpYVV0aWxzRGVsYXllZC5oCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCmNvcHkgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01lZGlhVXRpbHNEZWxheWVkLmgKaW5kZXggOWUwNGU4Mi4uMTU4M2U2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDE0ICsxMywxOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLy8gVGhlc2UgbWV0aG9kcyB1c2UgbGF6eSBsaWJyYXJ5IGxvYWRpbmcuCiAKIC8qKgotICoge0BoaWRlfQorICogUmV0dXJucyBhIHN0cmluZyBjYWxsc3RhY2sgZnJvbSB0aGUgdGhyZWFkIGlkIHRpZC4KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSB7Ci0gICAgIE5PTkUgPSAwLAotICAgICBFTEVNRU5UQVJZX1NUUkVBTSA9IDEsCi0gICAgIEhBTkRMRSA9IDIsCi19CitzdGQ6OnN0cmluZyBnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQocGlkX3QgdGlkKTsKKworfSAvLyBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBmYmFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogTWV0aG9kU3RhdGlzdGljcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBCaW5kZXIgY29kZXMKKyAqIHdpdGggYSBtZXRob2QgbmFtZSBhbmQgZXhlY3V0aW9uIHRpbWUgc3RhdGlzdGljcy4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgYmluZGVyIHRyYW5zYWN0aW9uIHRpbWVzIGZvcgorICogQXVkaW9GbGluZ2VyIGFuZCBBdWRpb1BvbGljeSBzZXJ2aWNlcy4KKyAqCisgKiBIZXJlLCBDb2RlIGlzIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGZvciB0aGUgbWV0aG9kCisgKiBsb29rdXAuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb2RlPgorY2xhc3MgTWV0aG9kU3RhdGlzdGljcyB7CitwdWJsaWM6CisgICAgdXNpbmcgRmxvYXRUeXBlID0gZmxvYXQ7CisgICAgdXNpbmcgU3RhdHNUeXBlID0gYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8RmxvYXRUeXBlPjsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBzdGF0aXN0aWNzLgorICAgICAqCisgICAgICogSW5pdGlhbGl6ZWQgd2l0aCB0aGUgQmluZGVyIHRyYW5zYWN0aW9uIGxpc3QgZm9yIHRyYWNraW5nIEF1ZGlvRmxpbmdlcgorICAgICAqIGFuZCBBdWRpb1BvbGljeU1hbmFnZXIgZXhlY3V0aW9uIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgZXhwbGljaXQgTWV0aG9kU3RhdGlzdGljcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8Y29uc3QgQ29kZSwgc3RkOjpzdHJpbmc+PiYgbWV0aG9kTWFwID0ge30pCisgICAgICAgIDogbU1ldGhvZE1hcHttZXRob2RNYXB9IHt9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWV0aG9kIGV2ZW50LCB0eXBpY2FsbHkgZXhlY3V0aW9uIHRpbWUgaW4gbXMuCisgICAgICovCisgICAgdm9pZCBldmVudChDb2RlIGNvZGUsIEZsb2F0VHlwZSBleGVjdXRlTXMpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgbVN0YXRpc3RpY3NNYXBbY29kZV0uYWRkKGV4ZWN1dGVNcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIG1ldGhvZCBjb2RlLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGdldE1ldGhvZEZvckNvZGUoQ29kZSBjb2RlKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtTWV0aG9kTWFwLmZpbmQoY29kZSk7CisgICAgICAgIHJldHVybiBpdCA9PSBtTWV0aG9kTWFwLmVuZCgpID8gc3RkOjp0b19zdHJpbmcoKGludCljb2RlKSA6IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBtZXRob2Qgd2FzIGludm9rZWQgYnkgZXZlbnQoKS4KKyAgICAgKi8KKyAgICBzaXplX3QgZ2V0TWV0aG9kQ291bnQoQ29kZSBjb2RlKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgIGF1dG8gaXQgPSBtU3RhdGlzdGljc01hcC5maW5kKGNvZGUpOworICAgICAgICByZXR1cm4gaXQgPT0gbVN0YXRpc3RpY3NNYXAuZW5kKCkgPyAwIDogaXQtPnNlY29uZC5nZXROKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdGlzdGljcyBvYmplY3QgZm9yIHRoZSBtZXRob2QuCisgICAgICovCisgICAgU3RhdHNUeXBlIGdldFN0YXRpc3RpY3MoQ29kZSBjb2RlKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgIGF1dG8gaXQgPSBtU3RhdGlzdGljc01hcC5maW5kKGNvZGUpOworICAgICAgICByZXR1cm4gaXQgPT0gbVN0YXRpc3RpY3NNYXAuZW5kKCkgPyBTdGF0c1R5cGV7fSA6IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcHMgdGhlIGN1cnJlbnQgbWV0aG9kIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19zYW1lX3Y8Q29kZSwgc3RkOjpzdHJpbmc+KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJltjb2RlLCBzdGF0c10gOiBtU3RhdGlzdGljc01hcCkgeworICAgICAgICAgICAgICAgIHNzIDw8IGNvZGUgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbj0iIDw8IHN0YXRzLmdldE4oKSA8PCAiICIgPDwgc3RhdHMudG9TdHJpbmcoKSA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgLyogY29uc3RleHByICovIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmW2NvZGUsIHN0YXRzXSA6IG1TdGF0aXN0aWNzTWFwKSB7CisgICAgICAgICAgICAgICAgc3MgPDwgaW50KGNvZGUpIDw8ICIgIiA8PCBnZXRNZXRob2RGb3JDb2RlKGNvZGUpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAiIG49IiA8PCBzdGF0cy5nZXROKCkgPDwgIiAiIDw8IHN0YXRzLnRvU3RyaW5nKCkgPDwgIlxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6bWFwPENvZGUsIHN0ZDo6c3RyaW5nPiBtTWV0aG9kTWFwOworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDxDb2RlLCBTdGF0c1R5cGU+IG1TdGF0aXN0aWNzTWFwIEdVQVJERURfQlkobUxvY2spOworfTsKKworLy8gTWFuYWdlZCBTdGF0aXN0aWNzIHN1cHBvcnQuCisvLyBTdXBwb3J0ZWQgTW9kdWxlcworI2RlZmluZSBNRVRIT0RfU1RBVElTVElDU19NT0RVTEVfTkFNRV9BVURJT19ISURMICJBdWRpb0hpZGwiCisKKy8vIFJldHVybnMgYSB2ZWN0b3Igb2YgY2xhc3MgbmFtZXMgZm9yIHRoZSBtb2R1bGUsIG9yIGEgbnVsbHB0ciBpZiBtb2R1bGUgbm90IGZvdW5kLgorc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KK2dldFN0YXRpc3RpY3NDbGFzc2VzRm9yTW9kdWxlKHN0ZDo6c3RyaW5nX3ZpZXcgbW9kdWxlTmFtZSk7CisKKy8vIFJldHVybnMgYSBzdGF0aXN0aWNzIG9iamVjdCBmb3IgdGhhdCBjbGFzcywgb3IgYSBudWxscHRyIGlmIGNsYXNzIG5vdCBmb3VuZC4KK3N0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4KK2dldFN0YXRpc3RpY3NGb3JDbGFzcyhzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSk7CisKKy8vIE9ubHkgaWYgdXNlZCwgcmVxdWlyZXMgSUJpbmRlci5oIHRvIGJlIGluY2x1ZGVkIGF0IHRoZSBsb2NhdGlvbiBvZiBpbnZvY2F0aW9uLgorI2RlZmluZSBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDT0RFX1RZUEUpIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpQSU5HX1RSQU5TQUNUSU9OICwgInBpbmcifSwgXAorICAgIHsoQ09ERV9UWVBFKUlCaW5kZXI6OkRVTVBfVFJBTlNBQ1RJT04gLCAiZHVtcCJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6U0hFTExfQ09NTUFORF9UUkFOU0FDVElPTiAsICJzaGVsbENvbW1hbmQifSwgXAorICAgIHsoQ09ERV9UWVBFKUlCaW5kZXI6OklOVEVSRkFDRV9UUkFOU0FDVElPTiAsICJnZXRJbnRlcmZhY2VEZXNjcmlwdG9yIn0sIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpTWVNQUk9QU19UUkFOU0FDVElPTiAsICJTWVNQUk9QU19UUkFOU0FDVElPTiJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6RVhURU5TSU9OX1RSQU5TQUNUSU9OICwgIkVYVEVOU0lPTl9UUkFOU0FDVElPTiJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6REVCVUdfUElEX1RSQU5TQUNUSU9OICwgIkRFQlVHX1BJRF9UUkFOU0FDVElPTiJ9LCBcCisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Byb2Nlc3MuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9Qcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0OWMzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9Qcm9jZXNzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qCisgKiBUaGlzIGhlYWRlciBjb250YWlucyB1dGlsaXRpZXMgdG8gcmVhZCB0aGUgbGludXggc3lzdGVtIC9wcm9jL3BpZCBmaWxlcworICoKKyAqIFRoZSBmb3JtYXQgb2YgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUsIHNvIHVzZSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5LgorICoKKyAqIFRoZSBsaW51eCAicHJvYyIgZGlyZWN0b3J5IGRvY3VtZW50YXRpb246CisgKiBodHRwczovL2tlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKyAqIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L2ZpbGVzeXN0ZW1zL3Byb2MuaHRtbD9oaWdobGlnaHQ9cHJvYyUyMHBpZCNjaGFwdGVyLTMtcGVyLXByb2Nlc3MtcGFyYW1ldGVycworICovCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLyoqCisgKiBSZXR1cm4gdGhlIHRocmVhZCBzY2hlZHVsZSBpbmZvcm1hdGlvbiBmb3IgdGlkLgorICoKKyAqIFN0cmluZyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBwcm9jZXNzIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0bworICogYWNjZXNzIHRoZSAvcHJvYy9waWQgdGFibGVzLCBvciBpZiBub3Qgb24gYSBMaW51eCBkZXZpY2UuCisgKgorICogTGludXggc2NoZWR1bGVyIGRvY3VtZW50YXRpb246CisgKiBodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9odG1sL2xhdGVzdC9zY2hlZHVsZXIvaW5kZXguaHRtbAorICogaHR0cHM6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuNy9zY2hlZC43Lmh0bWwKKyAqCisgKiBTYW1wbGUgYXMgZm9sbG93czoKKworQXVkaW9PdXRfOEQgKDEwODAwLCAjdGhyZWFkczogMzYpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZS5leGVjX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxMzIwNzcuNTk4MDI2CitzZS52cnVudGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA3OTg2ODkuODcyMDg3CitzZS5zdW1fZXhlY19ydW50aW1lICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAxMzY0NjYuOTU3ODM4CitzZS5ucl9taWdyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyNDg3CitzZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICAgICAgICAgICAgICA6ICAgICAgIDU2Mjk3OTQuNTY1OTQ1CitzZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxOTU3MjcuNTg2MzkyCitzZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLnNsZWVwX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDE5OTU2NjUuODY5ODA4CitzZS5zdGF0aXN0aWNzLmJsb2NrX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNTkxNjc1CitzZS5zdGF0aXN0aWNzLmV4ZWNfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDIuNDc3NTgwCitzZS5zdGF0aXN0aWNzLnNsaWNlX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLndhaXRfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDguNjA4NjQyCitzZS5zdGF0aXN0aWNzLndhaXRfc3VtICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgIDQ2ODMuMjY2ODM1CitzZS5zdGF0aXN0aWNzLndhaXRfY291bnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTY0CitzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0gICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX21pZ3JhdGlvbnNfY29sZCAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSAgICA6ICAgICAgICAgICAgICAgICAgMjk3CitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcgICA6ICAgICAgICAgICAgICAgICAxNDEyCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCAgICAgICA6ICAgICAgICAgICAgICAgICAgIDk2CitzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDI2CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjYzCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDg0CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyMzIyCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAyMTY1CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjc5MDk4CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcGFzc2l2ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCithdmdfYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNDUzNDM0CithdmdfcGVyX2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDEuMDMwMDQwCitucl9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTYzCitucl92b2x1bnRhcnlfc3dpdGNoZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjUyCitucl9pbnZvbHVudGFyeV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDE5NzExCitzZS5sb2FkLndlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDczNDc3MTIwCitzZS5hdmcubG9hZF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDU4CitzZS5hdmcucnVubmFibGVfc3VtICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDI3NjQ4CitzZS5hdmcudXRpbF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDIxNTA0CitzZS5hdmcubG9hZF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDQ4CitzZS5hdmcucnVubmFibGVfYXZnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5hdmcudXRpbF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5hdmcubGFzdF91cGRhdGVfdGltZSAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA4MTMyMDc1ODI0MTI4CitzZS5hdmcudXRpbF9lc3QuZXdtYSAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICA4CitzZS5hdmcudXRpbF9lc3QuZW5xdWV1ZWQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAxCit1Y2xhbXAubWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCit1Y2xhbXAubWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0CitlZmZlY3RpdmUgdWNsYW1wLm1pbiAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitlZmZlY3RpdmUgdWNsYW1wLm1heCAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0Citwb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitwcmlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTAxCitjbG9jay1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTYzCisqLworc3RkOjpzdHJpbmcgZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyhwaWRfdCB0aWQpOworCisvKioKKyAqIFJldHVybnMgbWFwIGZvciB0aGUgcmF3IHRocmVhZCBzY2hlZHVsZSBzdHJpbmcuCisgKi8KK3N0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHNjaGVkU3RyaW5nKTsKKworLyoqCisgKiBSZXR1cm5zIG1hcCBmb3IgL3Byb2MvcGlkL3Rhc2svdGlkL3NjaGVkCisgKi8KK2lubGluZSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiBnZXRUaHJlYWRTY2hlZEFzTWFwKHBpZF90IHRpZCkgeworICAgIHJldHVybiBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKGdldFRocmVhZFNjaGVkQXNTdHJpbmcodGlkKSk7Cit9CisKKy8vIFRPRE86IEV4dGVuZCB0byBvdGhlciAvcHJvYy9waWQgZmlsZSBpbmZvcm1hdGlvbi4KKy8vCisvLyBTZWUgInBzIiBjb21tYW5kIGdldF9wcygpLgorLy8gaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpleHRlcm5hbC90b3lib3gvdG95cy9wb3NpeC9wcy5jO2w9NzA3CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Njb3BlZFN0YXRpc3RpY3MuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY29wZWRTdGF0aXN0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmYzFlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY29wZWRTdGF0aXN0aWNzLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiTWV0aG9kU3RhdGlzdGljcy5oIgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworY2xhc3MgU2NvcGVkU3RhdGlzdGljcyB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTY29wZWRTdGF0aXN0aWNzIGlzIGEgUkFJSSB3YXkgb2Ygb2J0YWluaW5nCisgICAgICogZXhlY3V0aW9uIHRpbWUgc3RhdGlzdGljcyBmb3IgYSBzY29wZWQgQysrIGJsb2NrLgorICAgICAqCisgICAgICogSXQgdXBkYXRlcyB0aGUgTWV0aG9kU3RhdGlzdGljcyBzaGFyZWQgcG9pbnRlciBwYXJhbWV0ZXIKKyAgICAgKiB3aXRoIHRoZSBtZXRob2ROYW1lIHBhcmFtZXRlciBhbmQgdGhlIGR1cmF0aW9uL2xpZmV0aW1lIG9mIHRoZQorICAgICAqIFNjb3BlZFN0YXRpc3RpY3Mgb2JqZWN0LgorICAgICAqCisgICAgICogTm90IHRocmVhZC1zYWZlLCBidXQgZXhwZWN0ZWQgdG8gcnVuIGluIGEgc2luZ2xlIGV4ZWN1dGlvbgorICAgICAqIHRocmVhZCwgYW5kIHRoZXJlIGFyZSBubyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGV4cG9zZWQuCisgICAgICoKKyAgICAgKiBFeGFtcGxlOgorICAgICAqCisgICAgICogc3RkOjpzaGFyZWRfcHRyPG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PiBzdGF0cyA9CisgICAgICogICAgIHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+KCk7CisgICAgICoKKyAgICAgKiAvLyAuLi4KKyAgICAgKiB7CisgICAgICogICAgbWVkaWF1dGlsczo6U2NvcGVkU3RhdGlzdGljcyBzY29wZWRTdGF0aXN0aWNzKCJNeUNsYXNzOm15TWV0aG9kIiwgc3RhdHMpOworICAgICAqCisgICAgICogICAgLy8gc29tZSB3b3JrIHRvIGJlIHRpbWVkIGhlcmUgLSB1cCB0byB0aGUgZW5kIG9mIHRoZSBibG9jay4KKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBccGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kbmFtZSB0byB1c2UgIkNsYXNzTmFtZTo6bWV0aG9kTmFtZSIKKyAgICAgKiBccGFyYW0gc3RhdGlzdGljcyBhIHNoYXJlZCBwdHIgdG8gdGhlIE1ldGhvZFN0YXRpc3RpY3Mgb2JqZWN0IHRvIHVzZS4KKyAgICAgKi8KKyAgICBTY29wZWRTdGF0aXN0aWNzKHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+IHN0YXRpc3RpY3MpCisgICAgICAgIDogbU1ldGhvZE5hbWV7c3RkOjptb3ZlKG1ldGhvZE5hbWUpfQorICAgICAgICAsIG1TdGF0aXN0aWNze3N0ZDo6bW92ZShzdGF0aXN0aWNzKX0KKyAgICAgICAgLCBtQmVnaW57c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCl9IHt9CisKKyAgICAvLyBObyBjb3B5IGNvbnN0cnVjdG9yLgorICAgIFNjb3BlZFN0YXRpc3RpY3MoY29uc3QgU2NvcGVkU3RhdGlzdGljcyYgc2NvcGVkU3RhdGlzdGljcykgPSBkZWxldGU7CisgICAgU2NvcGVkU3RhdGlzdGljcyYgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFN0YXRpc3RpY3MmIHNjb3BlZFN0YXRpc3RpY3MpID0gZGVsZXRlOworCisgICAgflNjb3BlZFN0YXRpc3RpY3MoKSB7CisgICAgICAgIGlmIChtU3RhdGlzdGljcykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZWxhcHNlZE1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBtQmVnaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlLTY7IC8vIG5zIHRvIG1zLgorICAgICAgICAgICAgbVN0YXRpc3RpY3MtPmV2ZW50KG1NZXRob2ROYW1lLCBlbGFwc2VkTXMpOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU1ldGhvZE5hbWU7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PiBtU3RhdGlzdGljczsKKyAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1CZWdpbjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCmluZGV4IDczNDMxM2MuLmRlMjBkNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtNjEsNiArNjEsNyBAQAogCiAvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtIHNlcnZlciBvciBpbnRlcm5hbC4KIC8vIE5vdGU6IHN5c3RlbSBzZXJ2ZXIgaXMgbXVsdGlwcm9jZXNzIGZvciBtdWx0aXBsZSB1c2Vycy4gIGF1ZGlvc2VydmVyIGlzIG5vdC4KKy8vIE5vdGU6IGlmIHRoaXMgbWV0aG9kIGlzIG1vZGlmaWVkLCBhbHNvIHVwZGF0ZSB0aGUgc2FtZSBtZXRob2QgaW4gU2Vuc29yU2VydmljZS5oLgogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKICAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA9PSBBSURfU1lTVEVNIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVI7CiB9CkBAIC05NSw2ICs5Niw3IEBACiBib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiBib29sIGNhcHR1cmVWb2ljZUNvbW11bmljYXRpb25PdXRwdXRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKK2Jvb2wgYWNjZXNzVWx0cmFzb3VuZEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKIGJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwpAQCAtMTA0LDYgKzEwNiw3IEBACiBib29sIGR1bXBBbGxvd2VkKCk7CiBib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKIGJvb2wgYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7Citib29sIGNhbGxBdWRpb0ludGVyY2VwdGlvbkFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogdm9pZCBwdXJnZVBlcm1pc3Npb25DYWNoZSgpOwogaW50MzJfdCBnZXRPcEZvclNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzA4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLyoqCisgKiBDb2xsZWN0IFRocmVhZCBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzLgorICoKKyAqIEFuIG9uQmVnaW4oKSBhbmQgb25FbmQoKSBzaWduYWwgYSBjb250aW51b3VzICJydW4iLgorICogU3RhdGlzdGljcyBhcmUgcmV0dXJuZWQgYnkgdG9TdHJpbmcoKS4KKyAqLworY2xhc3MgVGhyZWFkU25hcHNob3QgeworcHVibGljOgorICAgIGV4cGxpY2l0IFRocmVhZFNuYXBzaG90KHBpZF90IHRpZCA9IC0xKSB7IG1TdGF0ZS5yZXNldCh0aWQpOyB9OworCisgICAgLy8gUmV0dXJucyBjdXJyZW50IHRpZAorICAgIHBpZF90IGdldFRpZCgpIGNvbnN0OworCisgICAgLy8gU2V0cyB0aGUgdGlkCisgICAgdm9pZCBzZXRUaWQocGlkX3QgdGlkKTsKKworICAgIC8vIFJlc2V0IHN0YXRpc3RpY3MsIGtlZXAgc2FtZSB0aWQuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gU2lnbmFsIGEgdGltaW5nIHJ1biBpcyBiZWdpbm5pbmcKKyAgICB2b2lkIG9uQmVnaW4oKTsKKworICAgIC8vIFNpZ25hbCBhIHRpbWluZyBydW4gaXMgZW5kaW5nCisgICAgdm9pZCBvbkVuZCgpOworCisgICAgLy8gUmV0dXJuIHRoZSB0aHJlYWQgc25hcHNob3Qgc3RhdGlzdGljcyBpbiBhIHN0cmluZworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworCisgICAgLy8gU3RhdGUgcmVwcmVzZW50cyBvdXIgc3RhdGlzdGljcyBhdCBhIGdpdmVuIHBvaW50IGluIHRpbWUuCisgICAgLy8gSXQgaXMgbm90IHRocmVhZC1zYWZlLCBzbyBhbnkgbG9ja2luZyBtdXN0IG9jY3VyIGF0IHRoZSBjYWxsZXIuCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgcGlkX3QgbVRpZDsKKyAgICAgICAgaW50NjRfdCBtQmVnaW5UaW1lTnM7ICAvLyB3aGVuIGxhc3QgcnVuIGJlZ2FuCisgICAgICAgIGludDY0X3QgbUVuZFRpbWVOczsgICAgLy8gd2hlbiBsYXN0IHJ1biBlbmRzIChpZiBsZXNzIHRoYW4gYmVnaW4gdGltZSwgbm90IHN0YXJ0ZWQpCisgICAgICAgIGludDY0X3QgbUN1bXVsYXRpdmVUaW1lTnM7CisKKyAgICAgICAgLy8gU2NoZWQgaXMgdGhlIHNjaGVkdWxlciBzdGF0aXN0aWNzIG9idGFpbmVkIGFzIGEgc3RyaW5nLgorICAgICAgICAvLyBUaGlzIGlzIHBhcnNlZCBvbmx5IHdoZW4gdG9TdHJpbmcoKSBpcyBjYWxsZWQuCisgICAgICAgIHN0ZDo6c3RyaW5nIG1CZWdpblNjaGVkOworCisgICAgICAgIC8vIENsZWFycyBleGlzdGluZyBzdGF0ZS4KKyAgICAgICAgdm9pZCByZXNldChwaWRfdCB0aWQpOworCisgICAgICAgIC8vIG9uQmVnaW4oKSB0YWtlcyBhIHN0ZDo6c3RyaW5nIHNjaGVkIHNob3VsZCBjYW4gYmUgY2FwdHVyZWQgb3V0c2lkZQorICAgICAgICAvLyBvZiBsb2NraW5nLgorICAgICAgICB2b2lkIG9uQmVnaW4oc3RkOjpzdHJpbmcgc2NoZWQpOworICAgICAgICB2b2lkIG9uRW5kKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgfTsKKworICAgIC8vIE91ciBjdXJyZW50IHN0YXRlLiBXZSBvbmx5IGtlZXAgdGhlIGN1cnJlbnQgcnVubmluZyBzdGF0ZS4KKyAgICBTdGF0ZSBtU3RhdGUgR1VBUkRFRF9CWShtTG9jayk7Cit9OworCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaAppbmRleCA1YmE2ZDdjLi5lZjAzYWVmIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCkBAIC0xNCw2MiArMTQsOTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNwcmFnbWEgb25jZQogCi0jaWZuZGVmIEFORFJPSURfVElNRV9DSEVDS19ICi0jZGVmaW5lIEFORFJPSURfVElNRV9DSEVDS19ICi0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotbmFtZXNwYWNlIGFuZHJvaWQgeworI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZXJUaHJlYWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgewogCiAvLyBBIGNsYXNzIG1vbml0b3JpbmcgZXhlY3V0aW9uIHRpbWUgZm9yIGEgY29kZSBibG9jayAoc2NvcGVkIHZhcmlhYmxlKSBhbmQgY2F1c2luZyBhbiBhc3NlcnQKIC8vIGlmIGl0IGV4Y2VlZHMgYSBjZXJ0YWluIHRpbWUKIAogY2xhc3MgVGltZUNoZWNrIHsKLXB1YmxpYzoKKyAgcHVibGljOgorICAgIHVzaW5nIE9uVGltZXJGdW5jID0gc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgLyogdGltZW91dCAqLywgZmxvYXQgLyogZWxhcHNlZE1zICovICk+OwogCiAgICAgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyBjaG9zZW4gdG8gYmUgbGVzcyB0aGFuIHN5c3RlbSBzZXJ2ZXIgd2F0Y2hkb2cgdGltZW91dAogICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRUaW1lT3V0TXMgPSA1MDAwOwogCi0gICAgICAgICAgICBUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMgPSBrRGVmYXVsdFRpbWVPdXRNcyk7Ci0gICAgICAgICAgICB+VGltZUNoZWNrKCk7Ci0gICAgc3RhdGljICB2b2lkIHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpOwotICAgIHN0YXRpYyAgc3RkOjp2ZWN0b3I8cGlkX3Q+IGdldEF1ZGlvSGFsUGlkcygpOworICAgIC8qKgorICAgICAqIFRpbWVDaGVjayBpcyBhIFJBSUkgb2JqZWN0IHdoaWNoIHdpbGwgbm90aWZ5IGEgY2FsbGJhY2sKKyAgICAgKiBvbiB0aW1lciBleHBpcmF0aW9uIG9yIHdoZW4gdGhlIG9iamVjdCBpcyBkZWFsbG9jYXRlZC4KKyAgICAgKgorICAgICAqIFRpbWVDaGVjayBpcyB1c2VkIGFzIGEgd2F0Y2hkb2cgYW5kIGFib3J0cyBieSBkZWZhdWx0IG9uIHRpbWVyIGV4cGlyYXRpb24uCisgICAgICogV2hlbiBpdCBhYm9ydHMsIGl0IHdpbGwgYWxzbyBzZW5kIGEgZGVidWdnZXIgc2lnbmFsIHRvIHBpZHMgcGFzc2VkIGluIHRocm91Z2gKKyAgICAgKiBzZXRBdWRpb0hhbFBpZHMoKS4KKyAgICAgKgorICAgICAqIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZvciB0aW1lb3V0IGl0IHdpbGwgbm90IGJlIGNhbGxlZCBhZ2FpbiBmb3IKKyAgICAgKiB0aGUgZGVhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIHRhZyAgICAgICBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBUaW1lQ2hlY2sgb2JqZWN0LgorICAgICAqIFxwYXJhbSBvblRpbWVyICAgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCAyIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBib29sIHRpbWVvdXQgICh3aGljaCBpcyB0cnVlIHdoZW4gdGhlIFRpbWVDaGVjayBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIG91dCwgZmFsc2Ugd2hlbiB0aGUgVGltZUNoZWNrIG9iamVjdCBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveWVkIG9yIGxlYXZlcyBzY29wZSBiZWZvcmUgdGhlIHRpbWVyIGV4cGlyZXMuKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGVsYXBzZWRNcyAodGhlIGVsYXBzZWQgdGltZSB0byB0aGlzIGV2ZW50KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgIFRoZSBjYWxsYmFjayB3aGVuIHRpbWVvdXQgaXMgdHJ1ZSB3aWxsIGJlIGNhbGxlZCBvbiBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICogICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjYWxsYmFjayBvbiB0aGUgZGVzdHJ1Y3RvciBidXQgaXMgbm90IGd1YXJhbnRlZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRvIGJsb2NrIGZvciBjYWxsYmFjayBjb21wbGV0aW9uIGlmIGl0IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAgIChmb3IgbWF4aW11bSBjb25jdXJyZW5jeSBhbmQgcmVkdWNlZCBkZWFkbG9jayBwb3RlbnRpYWwpLCBzbyB1c2UgcHJvcGVyCisgICAgICogICAgICAgICAgICAgICAgICBsaWZldGltZSBhbmFseXNpcyAoZS5nLiBzaGFyZWQgb3Igd2VhayBwb2ludGVycykuCisgICAgICogXHBhcmFtIHRpbWVvdXRNcyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIEEgemVybyB0aW1lb3V0IG1lYW5zIG5vIHRpbWVvdXQgaXMgc2V0IC0KKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgb25seSB3aGVuCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgVGltZUNoZWNrIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgbGVhdmVzIHNjb3BlLgorICAgICAqIFxwYXJhbSBjcmFzaE9uVGltZW91dCB0cnVlIGlmIHRoZSBvYmplY3QgaXNzdWVzIGFuIGFib3J0IG9uIHRpbWVvdXQuCisgICAgICovCisgICAgZXhwbGljaXQgVGltZUNoZWNrKHN0ZDo6c3RyaW5nIHRhZywgT25UaW1lckZ1bmMmJiBvblRpbWVyID0ge30sCisgICAgICAgICAgICB1aW50MzJfdCB0aW1lb3V0TXMgPSBrRGVmYXVsdFRpbWVPdXRNcywgYm9vbCBjcmFzaE9uVGltZW91dCA9IHRydWUpOwogCi1wcml2YXRlOgorICAgIFRpbWVDaGVjaygpID0gZGVmYXVsdDsKKyAgICAvLyBSZW1vdmUgY29weSBjb25zdHJ1Y3RvcnMgYXMgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGNhbGwgdG8gdGhlIGRlc3RydWN0b3IuCisgICAgLy8gTW92ZSBpcyBrZXB0IGltcGxpY2l0bHkgZGlzYWJsZWQsIGJ1dCB3b3VsZCBiZSBsb2dpY2FsbHkgY29uc2lzdGVudCBpZiBlbmFibGVkLgorICAgIFRpbWVDaGVjayhjb25zdCBUaW1lQ2hlY2smIG90aGVyKSA9IGRlbGV0ZTsKKyAgICBUaW1lQ2hlY2smIG9wZXJhdG9yPShjb25zdCBUaW1lQ2hlY2smKSA9IGRlbGV0ZTsKIAotICAgIGNsYXNzIFRpbWVDaGVja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIH5UaW1lQ2hlY2soKTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKTsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8cGlkX3Q+IGdldEF1ZGlvSGFsUGlkcygpOworCisgIHByaXZhdGU6CisgICAgLy8gSGVscGVyIGNsYXNzIGZvciBoYW5kbGluZyBldmVudHMuCisgICAgLy8gVGhlIHVzYWdlIGhlcmUgaXMgY29uc3Qgc2FmZS4KKyAgICBjbGFzcyBUaW1lQ2hlY2tIYW5kbGVyIHsKICAgICBwdWJsaWM6CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRhZzsKKyAgICAgICAgY29uc3QgT25UaW1lckZ1bmMgb25UaW1lcjsKKyAgICAgICAgY29uc3QgYm9vbCBjcmFzaE9uVGltZW91dDsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBzdGFydFRpbWU7CisgICAgICAgIGNvbnN0IHBpZF90IHRpZDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVDaGVja1RocmVhZCgpIHt9Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflRpbWVDaGVja1RocmVhZCgpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgc3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcyk7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgICAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKSBvdmVycmlkZSB7IHJ1bigiVGltZUNoZWNrVGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhyZWFkCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICBtQ29uZDsKLSAgICAgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1NdXRleDsKLSAgICAgICAgICAgICAgICAvLyB1c2luZyB0aGUgZW5kIHRpbWUgaW4gbnMgYXMga2V5IGlzIE9LIGdpdmVuIHRoZSByaXNrIGlzIGxvdyB0aGF0IHR3byBlbnRyaWVzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIGluIHN1Y2ggYSB3YXkgdGhhdCA8YWRkIHRpbWU+ICsgPHRpbWVvdXQ+IGFyZSB0aGUgc2FtZSBmb3IgYm90aC4KLSAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjwgbnNlY3NfdCwgY29uc3QgY2hhcio+ICBtTW9uaXRvclJlcXVlc3RzOworICAgICAgICB2b2lkIG9uQ2FuY2VsKFRpbWVyVGhyZWFkOjpIYW5kbGUgaGFuZGxlKSBjb25zdDsKKyAgICAgICAgdm9pZCBvblRpbWVvdXQoKSBjb25zdDsKICAgICB9OwogCi0gICAgc3RhdGljIHNwPFRpbWVDaGVja1RocmVhZD4gZ2V0VGltZUNoZWNrVGhyZWFkKCk7CisgICAgc3RhdGljIFRpbWVyVGhyZWFkJiBnZXRUaW1lQ2hlY2tUaHJlYWQoKTsKICAgICBzdGF0aWMgdm9pZCBhY2Nlc3NBdWRpb0hhbFBpZHMoc3RkOjp2ZWN0b3I8cGlkX3Q+KiBwaWRzLCBib29sIHVwZGF0ZSk7CiAKLSAgICBjb25zdCAgICAgICAgICAgbnNlY3NfdCBtRW5kVGltZU5zOworICAgIC8vIG1UaW1lQ2hlY2tIYW5kbGVyIGlzIGltbXV0YWJsZSwgcHJlZmVyIHRvIGJlIGZpcnN0IGluaXRpYWxpemVkLCBsYXN0IGRlc3Ryb3llZC4KKyAgICAvLyBUZWNobmljYWxseSBzcGVha2luZywgd2UgZG8gbm90IG5lZWQgYSBzaGFyZWRfcHRyIGhlcmUgYmVjYXVzZSBUaW1lclRocmVhZDo6Y2FuY2VsVGFzaygpCisgICAgLy8gaXMgbXV0dWFsbHkgZXhjbHVzaXZlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHRoZSBwcmljZSBwYWlkIGZvciBsaWZldGltZSBzYWZldHkgaXMgbWluaW1hbC4KKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGltZUNoZWNrSGFuZGxlcj4gbVRpbWVDaGVja0hhbmRsZXI7CisgICAgY29uc3QgVGltZXJUaHJlYWQ6OkhhbmRsZSBtVGltZXJIYW5kbGUgPSBUaW1lclRocmVhZDo6SU5WQUxJRF9IQU5ETEU7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gUmV0dXJucyBhIFRpbWVDaGVjayBvYmplY3QgdGhhdCBzZW5kcyBpbmZvIHRvIE1ldGhvZFN0YXRpc3RpY3MKKy8vIG9idGFpbmVkIGZyb20gZ2V0U3RhdGlzdGljc0ZvckNsYXNzKGNsYXNzTmFtZSkuCitUaW1lQ2hlY2sgbWFrZVRpbWVDaGVja1N0YXRzRm9yQ2xhc3NNZXRob2QoCisgICAgICAgIHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lLCBzdGQ6OnN0cmluZ192aWV3IG1ldGhvZE5hbWUpOwogCi0jZW5kaWYgIC8vIEFORFJPSURfVElNRV9DSEVDS19ICit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVyVGhyZWFkLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZXJUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVlNjAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVyVGhyZWFkLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvKioKKyAqIEEgdGhyZWFkIGZvciBkZWZlcnJlZCBleGVjdXRpb24gb2YgdGFza3MsIHdpdGggY2FuY2VsbGF0aW9uLgorICovCitjbGFzcyBUaW1lclRocmVhZCB7CisgIHB1YmxpYzoKKyAgICAvLyBBIEhhbmRsZSBpcyBhIHRpbWVfcG9pbnQgdGhhdCBzZXJ2ZXMgYXMgYSB1bmlxdWUga2V5LiAgSXQgaXMgb3JkZXJlZC4KKyAgICB1c2luZyBIYW5kbGUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50OworCisgICAgc3RhdGljIGlubGluZSBjb25zdGV4cHIgSGFuZGxlIElOVkFMSURfSEFORExFID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQ6Om1pbigpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgdGFzayB0byBiZSBleGVjdXRlZCBpbiB0aGUgZnV0dXJlIChgdGltZW91dGAgZHVyYXRpb24gZnJvbSBub3cpLgorICAgICAqCisgICAgICogXHBhcmFtIHRhZyAgICAgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4gIFRoaXMgbmVlZCBub3QgYmUgdW5pcXVlLAorICAgICAqICAgICAgICAgICAgICAgIGFzIHRoZSBIYW5kbGUgcmV0dXJuZWQgaXMgdXNlZCBmb3IgY2FuY2VsbGluZy4KKyAgICAgKiBccGFyYW0gZnVuYyAgICBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgYXQgdGhlIHRpbWVvdXQuCisgICAgICogXHBhcmFtIHRpbWVvdXQgdGltZW91dCBkdXJhdGlvbiB3aGljaCBpcyBjb252ZXJ0ZWQgdG8gbWlsbGlzZWNvbmRzIHdpdGggYXQKKyAgICAgKiAgICAgICAgICAgICAgICBsZWFzdCA0NSBpbnRlZ2VyIGJpdHMuCisgICAgICogICAgICAgICAgICAgICAgQSB0aW1lb3V0IG9mIDAgKG9yIG5lZ2F0aXZlKSBtZWFucyB0aGUgdGltZXIgbmV2ZXIgZXhwaXJlcworICAgICAqICAgICAgICAgICAgICAgIHNvIGZ1bmMoKSBpcyBuZXZlciBjYWxsZWQuIFRoZXNlIHRhc2tzIGFyZSBzdG9yZWQgaW50ZXJuYWxseQorICAgICAqICAgICAgICAgICAgICAgIGFuZCByZXBvcnRlZCBpbiB0aGUgdG9TdHJpbmcoKSB1bnRpbCBtYW51YWxseSBjYW5jZWxsZWQuCisgICAgICogXHJldHVybnMgICAgICAgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY2FuY2VsbGF0aW9uLgorICAgICAqLworICAgIEhhbmRsZSBzY2hlZHVsZVRhc2soCisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0YWcsIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYmIGZ1bmMsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCk7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgYSB0YXNrIHRoYXQgc2hvd3MgdXAgb24gdG9TdHJpbmcoKSB1bnRpbCBjYW5jZWxsZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdGFnICAgICBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgorICAgICAqIFxyZXR1cm5zICAgICAgIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNhbmNlbGxhdGlvbi4KKyAgICAgKi8KKyAgICBIYW5kbGUgdHJhY2tUYXNrKHN0ZDo6c3RyaW5nIHRhZyk7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGEgdGFzayBwcmV2aW91c2x5IHNjaGVkdWxlZCB3aXRoIHNjaGVkdWxlVGFzaygpCisgICAgICogb3IgdHJhY2tUYXNrKCkuCisgICAgICoKKyAgICAgKiBccmV0dXJucyB0cnVlIGlmIGNhbmNlbGxlZC4gSWYgdGhlIHRhc2sgaGFzIGFscmVhZHkgZXhlY3V0ZWQKKyAgICAgKiAgICAgICAgICBvciBpZiB0aGUgaGFuZGxlIGRvZXNuJ3QgZXhpc3QsIHRoaXMgaXMgYSBuby1vcAorICAgICAqICAgICAgICAgIGFuZCByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIGJvb2wgY2FuY2VsVGFzayhIYW5kbGUgaGFuZGxlKTsKKworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHNpemVfdCByZXRpcmVkQ291bnQgPSBTSVpFX01BWCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUaW1lclRocmVhZCBxdWV1ZS4KKyAgICAgKgorICAgICAqIFRoZSBxdWV1ZSBpcyBkdW1wZWQgaW4gb3JkZXIgb2Ygc2NoZWR1bGluZyAobm90IGRlYWRsaW5lKS4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyBwZW5kaW5nVG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxhc3QgcmV0aXJlZCB0YXNrcy4KKyAgICAgKgorICAgICAqIFRoZXNlIHRhc2tzIGZyb20gdHJhY2tUYXNrKCkgb3Igc2NoZWR1bGVUYXNrKCkgYXJlCisgICAgICogY2FuY2VsbGVkLgorICAgICAqCisgICAgICogVGhlc2UgYXJlIG9yZGVyZWQgd2hlbiB0aGUgdGFzayB3YXMgcmV0aXJlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuIGlzIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIHRvIGR1bXAuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgcmV0aXJlZFRvU3RyaW5nKHNpemVfdCBuID0gU0laRV9NQVgpIGNvbnN0OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsYXN0IHRpbWVvdXQgdGFza3MuCisgICAgICoKKyAgICAgKiBUaGVzZSB0YXNrcyBmcm9tIHNjaGVkdWxlVGFzaygpIHdoaWNoIGhhdmUgIHRpbWVkLW91dC4KKyAgICAgKgorICAgICAqIFRoZXNlIGFyZSBvcmRlcmVkIHdoZW4gdGhlIHRhc2sgaGFkIHRpbWVkLW91dC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuIGlzIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIHRvIGR1bXAuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdGltZW91dFRvU3RyaW5nKHNpemVfdCBuID0gU0laRV9NQVgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRHVtcHMgYSBjb250YWluZXIgd2l0aCBTbWFydFBvaW50ZXI8UmVxdWVzdD4gdG8gYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiAieyBSZXF1ZXN0MSB9IHsgUmVxdWVzdDJ9IC4uLnsgUmVxdWVzdE4gfSIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgcmVxdWVzdHNUb1N0cmluZyhjb25zdCBUJiBjb250YWluZXJSZXF1ZXN0cykgeworICAgICAgICBzdGQ6OnN0cmluZyBzOworICAgICAgICAvLyBhcHBlbmQgc2VlbXMgdG8gYmUgZmFzdGVyIHRoYW4gc3RyaW5nc3RyZWFtLgorICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xODg5MjI4MS9tb3N0LW9wdGltaXplZC13YXktb2YtY29uY2F0ZW5hdGlvbi1pbi1zdHJpbmdzCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IGNvbnRhaW5lclJlcXVlc3RzKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgieyAiKS5hcHBlbmQocmVxdWVzdC0+dG9TdHJpbmcoKSkuYXBwZW5kKCIgfSAiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBub3QgZW1wdHksIHRoZXJlJ3MgYW4gZXh0cmEgc3BhY2UgYXQgdGhlIGVuZCwgc28gd2UgdHJpbSBpdCBvZmYuCisgICAgICAgIGlmICghcy5lbXB0eSgpKSBzLnBvcF9iYWNrKCk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICBwcml2YXRlOgorICAgIC8vIFRvIG1pbmltaXplIG1vdmVtZW50IG9mIGRhdGEsIHdlIHBhc3MgYXJvdW5kIHNoYXJlZF9wdHJzIHRvIFJlcXVlc3RzLgorICAgIC8vIFRoZXNlIGFyZSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIG91dHNpZGUgb2YgdGhlIGxvY2suCisgICAgc3RydWN0IFJlcXVlc3QgeworICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHNjaGVkdWxlZDsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBkZWFkbGluZTsgLy8gZGVhZGxpbmUgOj0gc2NoZWR1bGVkICsgdGltZW91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkZWFkbGluZSA9PSBzY2hlZHVsZWQsIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQsIHRhc2sgbm90IGV4ZWN1dGVkLgorICAgICAgICBjb25zdCBwaWRfdCB0aWQ7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRhZzsKKworICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworICAgIH07CisKKyAgICAvLyBEZXF1ZSBvZiByZXF1ZXN0cywgaW4gb3JkZXIgb2YgYWRkKCkuCisgICAgLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZS4KKyAgICBjbGFzcyBSZXF1ZXN0UXVldWUgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBSZXF1ZXN0UXVldWUoc2l6ZV90IG1heFNpemUpCisgICAgICAgICAgICA6IG1SZXF1ZXN0UXVldWVNYXgobWF4U2l6ZSkge30KKworICAgICAgICB2b2lkIGFkZChzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4pOworCisgICAgICAgIC8vIHJldHVybiB1cCB0byB0aGUgbGFzdCAibiIgcmVxdWVzdHMgcmV0aXJlZC4KKyAgICAgICAgdm9pZCBjb3B5UmVxdWVzdHMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMsCisgICAgICAgICAgICBzaXplX3QgbiA9IFNJWkVfTUFYKSBjb25zdDsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1SZXF1ZXN0UXVldWVNYXg7CisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtUlFNdXRleDsKKyAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+Pj4KKyAgICAgICAgICAgICAgICBtUmVxdWVzdFF1ZXVlIEdVQVJERURfQlkobVJRTXV0ZXgpOworICAgIH07CisKKyAgICAvLyBBIHN0b3JhZ2UgbWFwIG9mIHRhc2tzIHdpdGhvdXQgdGltZW91dHMuICBUaGVyZSBpcyBubyBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4KKyAgICAvLyByZXF1aXJlZCwgaXQganVzdCB0cmFja3MgdGhlIHRhc2tzIHdpdGggdGhlIHRhZywgc2NoZWR1bGVkIHRpbWUgYW5kIHRoZSB0aWQuCisgICAgLy8gVGhlc2UgdGFza3Mgc2hvdyB1cCBvbiBhIHBlbmRpbmdUb1N0cmluZygpIHVudGlsIG1hbnVhbGx5IGNhbmNlbGxlZC4KKyAgICBjbGFzcyBOb1RpbWVvdXRNYXAgeworICAgICAgICAvLyBUaGlzIGEgY291bnRlciBvZiB0aGUgcmVxdWVzdHMgdGhhdCBoYXZlIG5vIHRpbWVvdXQgKHRpbWVvdXQgPT0gMCkuCisgICAgICAgIHN0ZDo6YXRvbWljPHNpemVfdD4gbU5vVGltZW91dFJlcXVlc3Rze307CisKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1OVE11dGV4OworICAgICAgICBzdGQ6Om1hcDxIYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gbU1hcCBHVUFSREVEX0JZKG1OVE11dGV4KTsKKworICAgICAgcHVibGljOgorICAgICAgICBib29sIGlzVmFsaWRIYW5kbGUoSGFuZGxlIGhhbmRsZSkgY29uc3Q7IC8vIGxvY2sgZnJlZQorICAgICAgICBIYW5kbGUgYWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0KTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlbW92ZShIYW5kbGUgaGFuZGxlKTsKKyAgICAgICAgdm9pZCBjb3B5UmVxdWVzdHMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMpIGNvbnN0OworICAgIH07CisKKyAgICAvLyBNb25pdG9yIHRocmVhZC4KKyAgICAvLyBUaGlzIHRocmVhZCBtYW5hZ2VzIHNoYXJlZCBwb2ludGVycyB0byBSZXF1ZXN0cyBhbmQgYSBmdW5jdGlvbiB0bworICAgIC8vIGNhbGwgb24gdGltZW91dC4KKyAgICAvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlLgorICAgIGNsYXNzIE1vbml0b3JUaHJlYWQgeworICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBtdXRhYmxlIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kOworCisgICAgICAgIC8vIE9yZGVyZWQgbWFwIG9mIHJlcXVlc3RzIGJhc2VkIG9uIHRpbWUgb2YgZGVhZGxpbmUuCisgICAgICAgIC8vCisgICAgICAgIHN0ZDo6bWFwPEhhbmRsZSwgc3RkOjpwYWlyPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Piwgc3RkOjpmdW5jdGlvbjx2b2lkKCk+Pj4KKyAgICAgICAgICAgICAgICBtTW9uaXRvclJlcXVlc3RzIEdVQVJERURfQlkobU11dGV4KTsKKworICAgICAgICBSZXF1ZXN0UXVldWUmIG1UaW1lb3V0UXVldWU7IC8vIGxvY2tlZCBpbnRlcm5hbGx5LCBhZGRlZCB0byB3aGVuIHJlcXVlc3QgdGltZXMgb3V0LgorCisgICAgICAgIC8vIFdvcmtlciB0aHJlYWQgdmFyaWFibGVzCisgICAgICAgIGJvb2wgbVNob3VsZEV4aXQgR1VBUkRFRF9CWShtTXV0ZXgpID0gZmFsc2U7CisKKyAgICAgICAgLy8gVG8gYXZvaWQgcmFjZSB3aXRoIGluaXRpYWxpemF0aW9uLAorICAgICAgICAvLyBtVGhyZWFkIHNob3VsZCBiZSBpbml0aWFsaXplZCBsYXN0IGFzIHRoZSB0aHJlYWQgaXMgbGF1bmNoZWQgaW1tZWRpYXRlbHkuCisgICAgICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQ7CisKKyAgICAgICAgdm9pZCB0aHJlYWRGdW5jKCk7CisgICAgICAgIEhhbmRsZSBnZXRVbmlxdWVIYW5kbGVfbChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIFJFUVVJUkVTKG1NdXRleCk7CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgTW9uaXRvclRocmVhZChSZXF1ZXN0UXVldWUgJnRpbWVvdXRRdWV1ZSk7CisgICAgICAgIH5Nb25pdG9yVGhyZWFkKCk7CisKKyAgICAgICAgSGFuZGxlIGFkZChzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVxdWVzdCwgc3RkOjpmdW5jdGlvbjx2b2lkKCk+JiYgZnVuYywKKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVtb3ZlKEhhbmRsZSBoYW5kbGUpOworICAgICAgICB2b2lkIGNvcHlSZXF1ZXN0cyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiByZXF1ZXN0cykgY29uc3Q7CisgICAgfTsKKworICAgIC8vIEFuYWx5c2lzIGNvbnRhaW5zIGluZm8gZGVkdWNlZCBieSBhbmFseXNpc1RpbWVvdXQoKS4KKyAgICAvLworICAgIC8vIFN1bW1hcnkgaXMgdGhlIHJlc3VsdCBzdHJpbmcgZnJvbSBjaGVja2luZyB0aW1lb3V0UmVxdWVzdHMgdG8gc2VlIGlmCisgICAgLy8gYW55IG1pZ2h0IGJlIGNhdXNlZCBieSBibG9ja2VkIGNhbGxzIGluIHBlbmRpbmdSZXF1ZXN0cy4KKyAgICAvLworICAgIC8vIFN1bW1hcnkgc3RyaW5nIGlzIGVtcHR5IGlmIHRoZXJlIGlzIG5vIGF1dG9tYXRpYyBhY3Rpb25hYmxlIGluZm8uCisgICAgLy8KKyAgICAvLyB0aW1lb3V0VGlkIGlzIHRoZSB0aWQgc2VsZWN0ZWQgZnJvbSB0aW1lb3V0UmVxdWVzdHMgKGlmIGFueSkuCisgICAgLy8KKyAgICAvLyBIQUxCbG9ja2VkVGlkIGlzIHRoZSB0aWQgdGhhdCBpcyBibG9ja2VkIGZyb20gcGVuZGluZ1JlcXVlc3RzIGJlbGlldmVkCisgICAgLy8gdG8gY2F1c2UgdGhlIHRpbWVvdXQuCisgICAgLy8gSEFMQmxvY2tlZFRpZCBtYXkgYmUgSU5WQUxJRF9QSUQgaWYgbm8gc3VzcGVjdGVkIHRpZCBpcyBmb3VuZCwKKyAgICAvLyBhbmQgaWYgSEFMQmxvY2tlZFRpZCBpcyB2YWxpZCwgaXQgd2lsbCBub3QgYmUgdGhlIHNhbWUgYXMgdGltZW91dFRpZC4KKyAgICAvLworICAgIHN0YXRpYyBjb25zdGV4cHIgcGlkX3QgSU5WQUxJRF9QSUQgPSAtMTsKKyAgICBzdHJ1Y3QgQW5hbHlzaXMgeworICAgICAgICBzdGQ6OnN0cmluZyBzdW1tYXJ5OworICAgICAgICBwaWRfdCB0aW1lb3V0VGlkID0gSU5WQUxJRF9QSUQ7CisgICAgICAgIHBpZF90IEhBTEJsb2NrZWRUaWQgPSBJTlZBTElEX1BJRDsKKyAgICB9OworCisgICAgLy8gQSBIQUwgbWV0aG9kIGlzIHdoZXJlIHRoZSBzdWJzdHJpbmcgIkhpZGwiIGlzIGluIHRoZSBjbGFzcyBuYW1lLgorICAgIC8vIFRoZSB0YWcgc2hvdWxkIGxvb2sgbGlrZTogLi4uIEhpZGwgLi4uIDo6IC4uLgorICAgIHN0YXRpYyBib29sIGlzUmVxdWVzdEZyb21IYWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+JiByZXF1ZXN0KTsKKworICAgIC8vIFJldHVybnMgYW5hbHlzaXMgZnJvbSB0aGUgcmVxdWVzdHMuCisgICAgc3RhdGljIEFuYWx5c2lzIGFuYWx5emVUaW1lb3V0KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiB0aW1lb3V0UmVxdWVzdHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHBlbmRpbmdSZXF1ZXN0cyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IGdldFBlbmRpbmdSZXF1ZXN0cygpIGNvbnN0OworCisgICAgLy8gQSBuby10aW1lb3V0IHJlcXVlc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSBoYW5kbGVzIGF0IHRoZSBlbmQgb2Ygc3RlYWR5X2Nsb2NrIHRpbWUsCisgICAgLy8gY291bnRpbmcgZG93biBieSB0aGUgbnVtYmVyIG9mIG5vIHRpbWVvdXQgcmVxdWVzdHMgcHJldmlvdXNseSByZXF1ZXN0ZWQuCisgICAgLy8gV2UgbWFuYWdlIHRoZW0gb24gdGhlIE5vVGltZW91dE1hcCwgYnV0IGNvbmNlcHR1YWxseSB0aGV5IGNvdWxkIGJlIHNjaGVkdWxlZAorICAgIC8vIG9uIHRoZSBNb25pdG9yVGhyZWFkIGJlY2F1c2UgdGhvc2UgdGltZSBoYW5kbGVzIHdvbid0IGV4cGlyZSBpbgorICAgIC8vIHRoZSBsaWZldGltZSBvZiB0aGUgZGV2aWNlLgorICAgIHN0YXRpYyBpbmxpbmUgSGFuZGxlIGdldEluZGV4ZWRIYW5kbGUoc2l6ZV90IGluZGV4KSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPjo6bWF4KCkgLQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPjo6ZHVyYXRpb24oaW5kZXgpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtSZXRpcmVkUXVldWVNYXggPSAxNjsKKyAgICBSZXF1ZXN0UXVldWUgbVJldGlyZWRRdWV1ZXtrUmV0aXJlZFF1ZXVlTWF4fTsgIC8vIGxvY2tlZCBpbnRlcm5hbGx5CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrVGltZW91dFF1ZXVlTWF4ID0gMTY7CisgICAgUmVxdWVzdFF1ZXVlIG1UaW1lb3V0UXVldWV7a1RpbWVvdXRRdWV1ZU1heH07ICAvLyBsb2NrZWQgaW50ZXJuYWxseQorCisgICAgTm9UaW1lb3V0TWFwIG1Ob1RpbWVvdXRNYXA7ICAvLyBsb2NrZWQgaW50ZXJuYWxseQorCisgICAgTW9uaXRvclRocmVhZCBtTW9uaXRvclRocmVhZHttVGltZW91dFF1ZXVlfTsgIC8vIFRoaXMgc2hvdWxkIGJlIGluaXRpYWxpemVkIGxhc3QgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGhyZWFkIGlzIGxhdW5jaGVkIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NrZWQgaW50ZXJuYWxseS4KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL21lbW9yeS5oCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCmNvcHkgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL21lbW9yeS5oCmluZGV4IDllMDRlODIuLmNjMDBiYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL21lbW9yeS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsMTQgKzEzLDIxIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKK3N0cnVjdCBGcmVlRGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHApIHsgZnJlZShwKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCiAKIC8qKgotICoge0BoaWRlfQorICogVXNlZCB0byB3cmFwIHBvaW50ZXJzIGFsbG9jYXRlZCBieSBsZWdhY3kgY29kZSB1c2luZyBtYWxsb2MgLyBjYWxsb2MgLyBldGMuCiAgKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgewotICAgICBOT05FID0gMCwKLSAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAotICAgICBIQU5ETEUgPSAyLAotfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyB1bmlxdWVfbWFsbG9jZWRfcHRyID0gc3RkOjp1bmlxdWVfcHRyPFQsIEZyZWVEZWxldGVyPjsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL21lbW9yeS10ZXN0LmNwcCBiL21lZGlhL3V0aWxzL21lbW9yeS10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA5YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvbWVtb3J5LXRlc3QuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL21lbW9yeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgeworCitURVNUKFVuaXF1ZU1hbGxvY2VkUHRyLCBWb2lkKSB7CisgICAgdW5pcXVlX21hbGxvY2VkX3B0cjx2b2lkPiBwKHN0ZDo6bWFsbG9jKDEwKSk7Cit9CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIENoYXIpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IHAocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oc3RkOjptYWxsb2MoMTApKSk7Cit9CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIE51bGwpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IHAobnVsbHB0cik7Cit9CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIERlZmF1bHQpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IHA7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY1OTNkNTYuLjEwMjQwMTggMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvQW5kcm9pZC5icApAQCAtNyw2ICs3LDgyIEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY190ZXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzaGFyZWR0ZXN0IiwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNhbml0aXplOnsKKyAgICAgICBhZGRyZXNzOiB0cnVlLAorICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgIG1lbXRhZ19oZWFwOiB0cnVlLAorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAic2hhcmVkdGVzdC5jcHAiLAorICAgIF0KK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYnJhcnlfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTp7CisgICAgICAgYWRkcmVzczogdHJ1ZSwKKyAgICAgICBjZmk6IHRydWUsCisgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICAgICBtZW10YWdfaGVhcDogdHJ1ZSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBkYXRhX2xpYnM6IFsKKyAgICAgICAgImxpYnNoYXJlZHRlc3QiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJsaWJyYXJ5X3Rlc3RzLmNwcCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhX3Byb2Nlc3NfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9wcm9jZXNzX3Rlc3RzLmNwcCIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIm1lZGlhX3N5bmNocm9uaXphdGlvbl90ZXN0cyIsCiAKQEAgLTI2LDMgKzEwMiw5MiBAQAogICAgICAgICAibWVkaWFfc3luY2hyb25pemF0aW9uX3Rlc3RzLmNwcCIsCiAgICAgXSwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfdGhyZWFkc25hcHNob3RfdGVzdHMuY3BwIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWVkaWF1dGlsc19zY29wZWRzdGF0aXN0aWNzX3Rlc3RzIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMuY3BwIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWV0aG9kc3RhdGlzdGljc190ZXN0cyIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWV0aG9kc3RhdGlzdGljc190ZXN0cy5jcHAiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0aW1lY2hlY2tfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTp7CisgICAgICAgYWRkcmVzczogdHJ1ZSwKKyAgICAgICBjZmk6IHRydWUsCisgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICAgICBtZW10YWdfaGVhcDogdHJ1ZSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAidGltZWNoZWNrX3Rlc3RzLmNwcCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL2xpYnJhcnlfdGVzdHMuY3BwIGIvbWVkaWEvdXRpbHMvdGVzdHMvbGlicmFyeV90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjNTAwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL2xpYnJhcnlfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImxpYnJhcnlfdGVzdHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0xpYnJhcnkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBpbnQzMl90IGhlcmUgPSAwOyAgLy8gYWNjZXNzZWQgb24gc2FtZSB0aHJlYWQuCisKK1RFU1QobGlicmFyeV90ZXN0cywgYmFzaWMpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi9saWJzaGFyZWR0ZXN0LnNvIjsKKyAgICAvLyBUaGUgZmxhZ3MgdG8gbG9hZExpYnJhcnkgc2hvdWxkIG5vdCBpbmNsdWRlICBSVExEX0dMT0JBTCBvciBSVExEX05PREVMRVRFCisgICAgLy8gd2hpY2ggcHJldmVudCB1bmxvYWRpbmcuCisgICAgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxpYnJhcnkgPSBsb2FkTGlicmFyeShwYXRoLmNfc3RyKCksIFJUTERfTEFaWSk7CisgICAgQVNTRVJUX1RSVUUobGlicmFyeSk7CisgICAgQVNTRVJUX0VRKDEsIGxpYnJhcnkudXNlX2NvdW50KCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGludDMyX3QqPiBwdHIgPSBnZXRPYmplY3RGcm9tTGlicmFyeTxpbnQzMl90Kj4oImdQdHIiLCBsaWJyYXJ5KTsKKyAgICBBU1NFUlRfVFJVRShwdHIpOworICAgIEFTU0VSVF9FUSgyLCBsaWJyYXJ5LnVzZV9jb3VudCgpKTsKKworICAgIEFTU0VSVF9FUShudWxscHRyLCAqcHRyKTsgLy8gb3JpZ2luYWwgY29udGVudHMgYXJlIG51bGxwdHIuCisKKyAgICAvLyBUaGVyZSBpcyBhIHN0YXRpYyBvYmplY3QgZGVzdHJ1Y3RvciBpbiBsaWJzaGFyZWR0ZXN0LnNvIHRoYXQgd2lsbCBzZXQgdGhlCisgICAgLy8gY29udGVudHMgb2YgdGhlIGludGVnZXIgcG9pbnRlciAoaWYgbm9uLW51bGwpIHRvIDEgd2hlbiBjYWxsZWQuCisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCB0aGF0IHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLgorICAgICpwdHIgPSAmaGVyZTsKKworICAgIHB0ci5yZXNldCgpOyAgLy8gTm90ZTogdGhpcyBzaGFyZWQgcG9pbnRlciB1c2VzIGxpYnJhcnkncyByZWZjb3VudC4KKyAgICBBU1NFUlRfRVEoMSwgbGlicmFyeS51c2VfY291bnQoKSk7ICAvLyBWZXJpZnkgbGlicmFyeSdzIHJlZmNvdW50IGdvZXMgZG93biBieSAxLgorICAgIEFTU0VSVF9FUSgwLCBoZXJlKTsgIC8vIHRoZSBzaGFyZWQgbGlicmFyeSdzIG9iamVjdCBkZXN0cnVjdG9yIGhhc24ndCBiZWVuIGNhbGxlZC4KKworICAgIC8vIHVzZSB3ZWFrX3B0ciB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGdvbmUuCisgICAgc3RkOjp3ZWFrX3B0cjx2b2lkPiB3bGlicmFyeSA9IGxpYnJhcnk7CisgICAgQVNTRVJUX0VRKDEsIHdsaWJyYXJ5LnVzZV9jb3VudCgpKTsKKyAgICBsaWJyYXJ5LnJlc2V0KCk7CisKKyAgICAvLyB3ZSBzaG91bGQgaGF2ZSByZWxlYXNlZCB0aGUgbGFzdCByZWZlcmVuY2UuCisgICAgQVNTRVJUX0VRKDAsIHdsaWJyYXJ5LnVzZV9jb3VudCgpKTsKKworICAgIC8vIFRoZSBsaWJyYXJ5IHNob3VsZCB1bmxvYWQgYW5kIHRoZSBnbG9iYWwgb2JqZWN0IGRlc3Ryb3llZC4KKyAgICAvLyBOb3RlIG9uIEFuZHJvaWQsIHNwZWNpZnlpbmcgUlRMRF9HTE9CQUwgb3IgUlRMRF9OT0RFTEVURSBpbiB0aGUgZmxhZ3MKKyAgICAvLyB3aWxsIHByZXZlbnQgdW5sb2FkaW5nIGxpYnJhcmllcy4KKyAgICBBU1NFUlRfRVEoMSwgaGVyZSk7Cit9CisKK1RFU1QobGlicmFyeV90ZXN0cywgc2FkX2xpYnJhcnkpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpCisgICAgICAgICAgICArICIvc29tZXRoaW5nX3JhbmRvbV9saWJyYXJ5X3RoYXRfZG9lc24ndF9leGl0LnNvIjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiBsaWJyYXJ5ID0gbG9hZExpYnJhcnkocGF0aC5jX3N0cigpLCBSVExEX0xBWlkpOworICAgIC8vIFdlIHNob3VsZG4ndCBjcmFzaCBvbiBhbiBpbnZhbGlkIGxpYnJhcnkgcGF0aCwganVzdCByZXR1cm4gYW4gZW1wdHkgc2hhcmVkIHBvaW50ZXIuCisgICAgLy8gQ2hlY2sgdGhlIGxvZ2NhdCBmb3IgYW55IGVycm9yIGRldGFpbHMuCisgICAgQVNTRVJUX0ZBTFNFKGxpYnJhcnkpOworfQorCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWFfcHJvY2Vzc190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV9wcm9jZXNzX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUzZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWFfcHJvY2Vzc190ZXN0cy5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWF1dGlscy9Qcm9jZXNzLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfcHJvY2Vzc190ZXN0cyIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK1RFU1QobWVkaWFfcHJvY2Vzc190ZXN0cywgYmFzaWMpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2NoZWRTdHJpbmcgPSBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKGdldHRpZCgpKTsKKworICAodm9pZClzY2hlZFN0cmluZzsKKyAgLy8gV2UgZG9uJ3QgdGVzdCBzY2hlZFN0cmluZywgb25seSB0aGF0IHdlIGhhdmVuJ3QgY3Jhc2hlZC4KKyAgLy8gQVNTRVJUX0ZBTFNFKHNjaGVkU3RyaW5nLmVtcHR5KCkpOworCisgIC8vIHNjaGVkU3RyaW5nIGlzIG5vdCBub3JtYXRpdmUuICBTbyB3ZSBjb25qdXJlIHVwIG91ciBvd24gc3RyaW5nCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZha2VTdHJpbmcgPSAiXAorQXVkaW9PdXRfOEQgKDEwODAwLCAjdGhyZWFkczogMzYpXG5cCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cCitzZS5leGVjX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxMzIwNzcuNTk4MDI2XG5cCitzZS52cnVudGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA3OTg2ODkuODcyMDg3XG5cCitzZS5zdW1fZXhlY19ydW50aW1lICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAxMzY0NjYuOTU3ODM4XG5cCitzZS5ucl9taWdyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyNDg3XG5cCitzZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICAgICAgICAgICAgICA6ICAgICAgIDU2Mjk3OTQuNTY1OTQ1XG5cCitzZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxOTU3MjcuNTg2MzkyXG5cCitzZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLnNsZWVwX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDE5OTU2NjUuODY5ODA4XG5cCitzZS5zdGF0aXN0aWNzLmJsb2NrX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNTkxNjc1XG5cCitzZS5zdGF0aXN0aWNzLmV4ZWNfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDIuNDc3NTgwXG5cCitzZS5zdGF0aXN0aWNzLnNsaWNlX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLndhaXRfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDguNjA4NjQyXG5cCitzZS5zdGF0aXN0aWNzLndhaXRfc3VtICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgIDQ2ODMuMjY2ODM1XG5cCitzZS5zdGF0aXN0aWNzLndhaXRfY291bnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTY0XG5cCitzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0gICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX21pZ3JhdGlvbnNfY29sZCAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSAgICA6ICAgICAgICAgICAgICAgICAgMjk3XG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcgICA6ICAgICAgICAgICAgICAgICAxNDEyXG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCAgICAgICA6ICAgICAgICAgICAgICAgICAgIDk2XG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDI2XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjYzXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDg0XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyMzIyXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAyMTY1XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjc5MDk4XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcGFzc2l2ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCithdmdfYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNDUzNDM0XG5cCithdmdfcGVyX2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDEuMDMwMDQwXG5cCitucl9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTYzXG5cCitucl92b2x1bnRhcnlfc3dpdGNoZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjUyXG5cCitucl9pbnZvbHVudGFyeV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDE5NzExXG5cCitzZS5sb2FkLndlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDczNDc3MTIwXG5cCitzZS5hdmcubG9hZF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDU4XG5cCitzZS5hdmcucnVubmFibGVfc3VtICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDI3NjQ4XG5cCitzZS5hdmcudXRpbF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDIxNTA0XG5cCitzZS5hdmcubG9hZF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDQ4XG5cCitzZS5hdmcucnVubmFibGVfYXZnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5hdmcudXRpbF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5hdmcubGFzdF91cGRhdGVfdGltZSAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA4MTMyMDc1ODI0MTI4XG5cCitzZS5hdmcudXRpbF9lc3QuZXdtYSAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICA4XG5cCitzZS5hdmcudXRpbF9lc3QuZW5xdWV1ZWQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAxXG5cCit1Y2xhbXAubWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCit1Y2xhbXAubWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0XG5cCitlZmZlY3RpdmUgdWNsYW1wLm1pbiAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitlZmZlY3RpdmUgdWNsYW1wLm1heCAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0XG5cCitwb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitwcmlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTAxXG5cCitjbG9jay1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTYzIjsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiBtID0gcGFyc2VUaHJlYWRTY2hlZFN0cmluZyhmYWtlU3RyaW5nKTsKKworICBhdXRvIGl0ID0gbS5maW5kKCJjbG9jay1kZWx0YSIpOworICBBU1NFUlRfTkUoaXQsIG0uZW5kKCkpOworICBBU1NFUlRfRVEoaXQtPnNlY29uZCwgMTYzKTsKKworICBpdCA9IG0uZmluZCgic2UuYXZnLmxvYWRfYXZnIik7CisgIEFTU0VSVF9ORShpdCwgbS5lbmQoKSk7CisgIEFTU0VSVF9FUShpdC0+c2Vjb25kLCA0OCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNDVlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaD4KKworI2RlZmluZSBMT0dfVEFHICJtZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cyIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzOworCitURVNUKG1lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzLCBiYXNpYykgeworICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKKyAgVGhyZWFkU25hcHNob3QgdGhyZWFkU25hcHNob3QoZ2V0dGlkKCkpOworCisgIHRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKKworICBzdGQ6OnN0cmluZyBzbmFwc2hvdDEgPSB0aHJlYWRTbmFwc2hvdC50b1N0cmluZygpOworCisgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisKKyAgdGhyZWFkU25hcHNob3Qub25FbmQoKTsKKworICBzdGQ6OnN0cmluZyBzbmFwc2hvdDIgPSB0aHJlYWRTbmFwc2hvdC50b1N0cmluZygpOworCisgIC8vIEVpdGhlciB3ZSBjYW4ndCBnZXQgYSBzbmFwc2hvdCwgb3IgdGhleSBtdXN0IGJlIGRpZmZlcmVudCB3aGVuIHRha2VuIHdoZW4gdGhyZWFkIGlzIHJ1bm5pbmcuCisgIGlmIChzbmFwc2hvdDEuZW1wdHkoKSkgeworICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90Mi5lbXB0eSgpKTsKKyAgfSBlbHNlIHsKKyAgICBBU1NFUlRfRkFMU0Uoc25hcHNob3QyLmVtcHR5KCkpOworICAgIEFTU0VSVF9ORShzbmFwc2hvdDEsIHNuYXBzaG90Mik7CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2NlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm1lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cyIKKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NvcGVkU3RhdGlzdGljcy5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK1RFU1QobWVkaWF1dGlsc19zY29wZWRzdGF0aXN0aWNzX3Rlc3RzLCBiYXNpYykgeworICAgIGF1dG8gbWV0aG9kU3RhdGlzdGljcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+KCk7CisgICAgc3RkOjpzdHJpbmcgTUVUSE9EX05BTUV7Ik15TWV0aG9kIn07CisKKyAgICAvLyBubyBzdGF0cyBiZWZvcmUKKyAgICBhdXRvIGVtcHR5ID0gbWV0aG9kU3RhdGlzdGljcy0+Z2V0U3RhdGlzdGljcyhNRVRIT0RfTkFNRSk7CisgICAgQVNTRVJUX0VRKDAsIGVtcHR5LmdldE4oKSk7CisKKyAgICAvLyBjcmVhdGUgYSBzY29wZWQgc3RhdGlzdGljcyBvYmplY3QuCisgICAgeworICAgICAgICBTY29wZWRTdGF0aXN0aWNzIHNjb3BlZFN0YXRpc3RpY3MoTUVUSE9EX05BTUUsIG1ldGhvZFN0YXRpc3RpY3MpOworCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisgICAgfQorCisgICAgLy8gY2hlY2sgdGhhdCBzb21lIHN0YXRzIHdlcmUgbG9nZ2VkLgorICAgIGF1dG8gc3RhdHMgPSBtZXRob2RTdGF0aXN0aWNzLT5nZXRTdGF0aXN0aWNzKE1FVEhPRF9OQU1FKTsKKyAgICBBU1NFUlRfRVEoMSwgc3RhdHMuZ2V0TigpKTsKKyAgICBhdXRvIG1lYW4gPSBzdGF0cy5nZXRNZWFuKCk7CisKKyAgICAvLyBtZWFuIHNob3VsZCBiZSBhYm91dCAxMDBtcywgYnV0IHRvIGF2b2lkIGZhbHNlIGZhaWx1cmVzLAorICAgIC8vIHdlIGNoZWNrIDUwbXMgPCBtZWFuIDwgMzAwbXMuCisgICAgQVNTRVJUX0dUKG1lYW4sIDUwLik7ICAgLy8gdG9vayBtb3JlIHRoYW4gNTBtcy4KKyAgICBBU1NFUlRfTFQobWVhbiwgMzAwLik7ICAvLyB0b29rIGxlc3MgdGhhbiAzMDBtcy4KK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL21ldGhvZHN0YXRpc3RpY3NfdGVzdHMuY3BwIGIvbWVkaWEvdXRpbHMvdGVzdHMvbWV0aG9kc3RhdGlzdGljc190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNGFkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL21ldGhvZHN0YXRpc3RpY3NfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm1ldGhvZHN0YXRpc3RpY3NfdGVzdHMiCisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKK3VzaW5nIENvZGVUeXBlID0gc2l6ZV90OworCitjb25zdGV4cHIgQ29kZVR5cGUgSEVMTE9fQ09ERSA9IDEwOworY29uc3RleHByIGNvbnN0IGNoYXIgKiBIRUxMT19OQU1FID0gImhlbGxvIjsKK2NvbnN0ZXhwciBmbG9hdCBIRUxMT19FVkVOVFNbXSA9IHsgMS5mLCAzLmYgfTsgLy8gbmVlZHMgbG9zc2xlc3MgYXZlcmFnZQorCitjb25zdGV4cHIgQ29kZVR5cGUgV09STERfQ09ERSA9IDIxOworY29uc3RleHByIGNvbnN0IGNoYXIgKiBXT1JMRF9OQU1FID0gIndvcmxkIjsKKworY29uc3RleHByIENvZGVUeXBlIFVOS05PV05fQ09ERSA9IDEyMzQ1OworCitURVNUKG1ldGhvZHN0YXRpc3RpY3NfdGVzdHMsIG1ldGhvZF9uYW1lcykgeworICAgIGNvbnN0IE1ldGhvZFN0YXRpc3RpY3M8Q29kZVR5cGU+IG1ldGhvZFN0YXRpc3RpY3N7CisgICAgICAgICAgICB7SEVMTE9fQ09ERSwgSEVMTE9fTkFNRX0sCisgICAgICAgICAgICB7V09STERfQ09ERSwgV09STERfTkFNRX0sCisgICAgfTsKKworICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZyhIRUxMT19OQU1FKSwgbWV0aG9kU3RhdGlzdGljcy5nZXRNZXRob2RGb3JDb2RlKEhFTExPX0NPREUpKTsKKyAgICBBU1NFUlRfRVEoc3RkOjpzdHJpbmcoV09STERfTkFNRSksIG1ldGhvZFN0YXRpc3RpY3MuZ2V0TWV0aG9kRm9yQ29kZShXT1JMRF9DT0RFKSk7CisgICAgLy8gYW4gdW5rbm93biBjb2RlIHJldHVybnMgaXRzZWxmIGFzIGEgbnVtYmVyLgorICAgIEFTU0VSVF9FUShzdGQ6OnRvX3N0cmluZyhVTktOT1dOX0NPREUpLCBtZXRob2RTdGF0aXN0aWNzLmdldE1ldGhvZEZvckNvZGUoVU5LTk9XTl9DT0RFKSk7Cit9CisKK1RFU1QobWV0aG9kc3RhdGlzdGljc190ZXN0cywgZXZlbnRzKSB7CisgICAgTWV0aG9kU3RhdGlzdGljczxDb2RlVHlwZT4gbWV0aG9kU3RhdGlzdGljc3sKKyAgICAgICAgICAgIHtIRUxMT19DT0RFLCBIRUxMT19OQU1FfSwKKyAgICAgICAgICAgIHtXT1JMRF9DT0RFLCBXT1JMRF9OQU1FfSwKKyAgICB9OworCisgICAgc2l6ZV90IG4gPSAwOworICAgIGZsb2F0IHN1bSA9IDAuZjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZXZlbnQgOiBIRUxMT19FVkVOVFMpIHsKKyAgICAgICAgbWV0aG9kU3RhdGlzdGljcy5ldmVudChIRUxMT19DT0RFLCBldmVudCk7CisgICAgICAgIHN1bSArPSBldmVudDsKKyAgICAgICAgKytuOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gaGVsbG9TdGF0cyA9IG1ldGhvZFN0YXRpc3RpY3MuZ2V0U3RhdGlzdGljcyhIRUxMT19DT0RFKTsKKyAgICBBU1NFUlRfRVEoKHNpZ25lZCluLCBoZWxsb1N0YXRzLmdldE4oKSk7CisgICAgQVNTRVJUX0VRKHN1bSAvIG4sIGhlbGxvU3RhdHMuZ2V0TWVhbigpKTsKKyAgICBBU1NFUlRfRVEobiwgbWV0aG9kU3RhdGlzdGljcy5nZXRNZXRob2RDb3VudChIRUxMT19DT0RFKSk7CisKKyAgICBjb25zdCBhdXRvIHVuc2V0U3RhdHMgPSBtZXRob2RTdGF0aXN0aWNzLmdldFN0YXRpc3RpY3MoVU5LTk9XTl9DT0RFKTsKKyAgICBBU1NFUlRfRVEoMCwgdW5zZXRTdGF0cy5nZXROKCkpOworICAgIEFTU0VSVF9FUSgwLmYsIHVuc2V0U3RhdHMuZ2V0TWVhbigpKTsKKyAgICBBU1NFUlRfRVEoMFUsIG1ldGhvZFN0YXRpc3RpY3MuZ2V0TWV0aG9kQ291bnQoVU5LTk9XTl9DT0RFKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy90ZXN0cy9zaGFyZWR0ZXN0LmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL3NoYXJlZHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODg4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy9zaGFyZWR0ZXN0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjZGVmaW5lIExPR19UQUcgInNoYXJlZHRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIFRlc3QgbGlicmFyeSB3aGljaCBpcyBkeW5hbWljbHkgbG9hZGVkIGJ5IGxpYnJhcnlfdGVzdHMuCisKKy8vIFN0YXRpYyB2YXJpYWJsZSBjb25zdHJ1Y3Rpb24uCisvLyBDYWxscyBBIGNvbnN0cnVjdG9yIG9uIGxpYnJhcnkgbG9hZCwgQSBkZXN0cnVjdG9yIG9uIGxpYnJhcnkgdW5sb2FkLgorCitpbnQzMl90ICpnUHRyID0gbnVsbHB0cjsgIC8vIHRoaXMgcG9pbnRlciBpcyBmaWxsZWQgd2l0aCB0aGUgbG9jYXRpb24gdG8gc2V0IG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIH5BKCkgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgdXNlIGFueXRoaW5nIGludGVybmFsIHRvIHRoaXMgZmlsZSBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBzZWdtZW50IG1heSBubyBsb25nZXIgZXhpc3QgYWZ0ZXIgdW5sb2FkaW5nIHRoZSBsaWJyYXJ5Lgorc3RydWN0IEEgeworICAgIEEoKSB7CisgICAgICAgIEFMT0dEKCIlczogZ1B0cjolcCIsIF9fZnVuY19fLCBnUHRyKTsKKyAgICB9CisKKyAgICB+QSgpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBnUHRyOiVwIiwgX19mdW5jX18sIGdQdHIpOworICAgICAgICBpZiAoZ1B0ciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqZ1B0ciA9IDE7CisgICAgICAgIH0KKyAgICB9Cit9IGdBOworCisvLyAgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBtZXRob2RzIG9jY3VyIGJlZm9yZSBhbnkgc3RhdGljIHZhcmlhYmxlIGNvbnN0cnVjdGlvbi4KKy8vIExpYnJhcmllcyB0aGF0IHVzZSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHNob3VsZCBub3QgcmVseSBvbiBnbG9iYWwgY29uc3RydWN0b3JzCisvLyBiZWZvcmUgbWV0aG9kIGNhbGwgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuCisvLyBTZWUgaGVhcHByb2ZkX2NsaWVudF9hcGkuCisvLyBOT1RFOiBpcyB0aGlzIHJpZ2h0PyBTaG91bGRuJ3QgaXQgb2NjdXIgYWZ0ZXIgY29uc3RydWN0aW9uPworIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkKK3ZvaWQgb25Db25zdHJ1Y3Rpb24oKSB7CisgICAgQUxPR0QoIiVzOiBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsgIC8vIGZvciBsb2djYXQgYW5hbHlzaXMKK30KKworLy8gX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpIG1ldGhvZHMgb2NjdXIgYmVmb3JlIGFueSBzdGF0aWMgdmFyaWFibGUgZGVzdHJ1Y3Rpb24uCisgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpCit2b2lkIG9uRGVzdHJ1Y3Rpb24oKSB7CisgICAgQUxPR0QoIiVzOiBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsgIC8vIGZvciBsb2djYXQgYW5hbHlzaXMKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL3RpbWVjaGVja190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy90aW1lY2hlY2tfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmY0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy90aW1lY2hlY2tfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgInRpbWVjaGVja190ZXN0cyIKKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSB7CisKK1RFU1QodGltZWNoZWNrX3Rlc3RzLCBzdWNjZXNzKSB7CisgICAgYm9vbCB0aW1lb3V0UmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIGZsb2F0IGVsYXBzZWRNc1JlZ2lzdGVyZWQgPSAwLmY7CisgICAgYm9vbCBldmVudCA9IGZhbHNlOworCisgICAgeworICAgICAgICBUaW1lQ2hlY2sgdGltZUNoZWNrKCJzdWNjZXNzIiwKKyAgICAgICAgICAgICAgICBbJmV2ZW50LCAmdGltZW91dFJlZ2lzdGVyZWQsICZlbGFwc2VkTXNSZWdpc3RlcmVkXQorICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wgdGltZW91dCwgZmxvYXQgZWxhcHNlZE1zKSB7CisgICAgICAgICAgICB0aW1lb3V0UmVnaXN0ZXJlZCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBlbGFwc2VkTXNSZWdpc3RlcmVkID0gZWxhcHNlZE1zOworICAgICAgICAgICAgZXZlbnQgPSB0cnVlOworICAgICAgICB9LCAxMDAwIC8qIG1zZWMgKi8sIGZhbHNlIC8qIGNyYXNoICovKTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUoZXZlbnQpOworICAgIEFTU0VSVF9GQUxTRSh0aW1lb3V0UmVnaXN0ZXJlZCk7CisgICAgQVNTRVJUX0dUKGVsYXBzZWRNc1JlZ2lzdGVyZWQsIDAuZik7Cit9CisKK1RFU1QodGltZWNoZWNrX3Rlc3RzLCB0aW1lb3V0KSB7CisgICAgYm9vbCB0aW1lb3V0UmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIGZsb2F0IGVsYXBzZWRNc1JlZ2lzdGVyZWQgPSAwLmY7CisgICAgc3RkOjphdG9taWNfYm9vbCBldmVudCA9IGZhbHNlOyAgLy8gc2VxLWNzdCBpbXBsaWVzIGFjcXVpcmUtcmVsZWFzZQorCisgICAgeworICAgICAgICBUaW1lQ2hlY2sgdGltZUNoZWNrKCJ0aW1lb3V0IiwKKyAgICAgICAgICAgICAgICBbJmV2ZW50LCAmdGltZW91dFJlZ2lzdGVyZWQsICZlbGFwc2VkTXNSZWdpc3RlcmVkXQorICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wgdGltZW91dCwgZmxvYXQgZWxhcHNlZE1zKSB7CisgICAgICAgICAgICB0aW1lb3V0UmVnaXN0ZXJlZCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBlbGFwc2VkTXNSZWdpc3RlcmVkID0gZWxhcHNlZE1zOworICAgICAgICAgICAgZXZlbnQgPSB0cnVlOyAvLyBzdG9yZS1yZWxlYXNlLCBtdXN0IGJlIGxhc3QuCisgICAgICAgIH0sIDEgLyogbXNlYyAqLywgZmFsc2UgLyogY3Jhc2ggKi8pOworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMpOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShldmVudCk7IC8vIGxvYWQtYWNxdWlyZSwgbXVzdCBiZSBmaXJzdC4KKyAgICBBU1NFUlRfVFJVRSh0aW1lb3V0UmVnaXN0ZXJlZCk7IC8vIG9ubHkgY2FsbGVkIG9uY2Ugb24gZmFpbHVyZSwgbm90IG9uIGRlYWxsb2MuCisgICAgQVNTRVJUX0dUKGVsYXBzZWRNc1JlZ2lzdGVyZWQsIDAuZik7Cit9CisKKy8vIE5vdGU6IFdlIGRvIG5vdCB0ZXN0IFRpbWVDaGVjayBjcmFzaCBiZWNhdXNlIFRpbWVDaGVjayBpcyBtdWx0aXRocmVhZGVkIGFuZCB0aGUKKy8vIEVYUEVDVF9FWElUKCkgc2lnbmFsIGNhdGNoaW5nIGlzIGltcGVyZmVjdCBkdWUgdG8gdGhlIGd0ZXN0IGZvcmsuCisKK30gLy8gbmFtZXNwYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YTIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSwpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IGYwYjVlMmYuLjE3ZTYwNWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTEsOSArMSw2IEBACi1jaHpAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXNzaWNrQGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCiBuY2hhbGtvQGdvb2dsZS5jb20KIHF1eGlhbmdmYW5nQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKaW5kZXggYjkxZjMwMi4uNzYzYzA3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgIkZhc3RUaHJlYWRTdGF0ZS5jcHAiLAogICAgICAgICAiTkJBSU9fVGVlLmNwcCIsCiAgICAgICAgICJQYXRjaFBhbmVsLmNwcCIsCisgICAgICAgICJQcm9wZXJ0eVV0aWxzLmNwcCIsCiAgICAgICAgICJTcGRpZlN0cmVhbU91dC5jcHAiLAogICAgICAgICAiU3RhdGVRdWV1ZS5jcHAiLAogICAgICAgICAiVGhyZWFkcy5jcHAiLApAQCAtNTQsNiArNTUsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCkBAIC04MSw2ICs4Myw3IEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidmlicmF0b3IiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtOTAsNiArOTMsNyBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYWF1ZGlvX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCA2NWExNjNmLi5mNzU3NmY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPHRocmVhZD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtNTcsNiArNTgsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCisjaW5jbHVkZSAiUHJvcGVydHlVdGlscy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIApAQCAtNjQsNiArNjYsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3NwYXRpYWxpemVyLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKQEAgLTc2LDYgKzc5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgpAQCAtMTAyLDcgKzEwNiwxMiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKyNkZWZpbmUgTUFYX0FBVURJT19QUk9QRVJUWV9ERVZJQ0VfSEFMX1ZFUlNJT04gNy4xCisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgbWVkaWE6OklFZmZlY3RDbGllbnQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlOwogdXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb0ZsaW5nZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CkBAIC0xNTAsNiArMTU5LDkyIEBACiAgICAgcmV0dXJuIHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZTsKIH0KIAorLy8gQ3JlYXRlcyBhc3NvY2lhdGlvbiBiZXR3ZWVuIEJpbmRlciBjb2RlIHRvIG5hbWUgZm9yIElBdWRpb0ZsaW5nZXIuCisjZGVmaW5lIElBVURJT0ZMSU5HRVJfQklOREVSX01FVEhPRF9NQUNST19MSVNUIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlVHJhY2spIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlUmVjb3JkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNhbXBsZVJhdGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZm9ybWF0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGZyYW1lQ291bnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobGF0ZW5jeSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRNYXN0ZXJWb2x1bWUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0TWFzdGVyTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShtYXN0ZXJWb2x1bWUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobWFzdGVyTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRTdHJlYW1Wb2x1bWUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0U3RyZWFtTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdHJlYW1Wb2x1bWUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3RyZWFtTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRNb2RlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1pY011dGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWljTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRSZWNvcmRTaWxlbmNlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRQYXJhbWV0ZXJzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFBhcmFtZXRlcnMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVnaXN0ZXJDbGllbnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0SW5wdXRCdWZmZXJTaXplKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKG9wZW5PdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkob3BlbkR1cGxpY2F0ZU91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShjbG9zZU91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdXNwZW5kT3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlc3RvcmVPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkob3BlbklucHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNsb3NlSW5wdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoaW52YWxpZGF0ZVN0cmVhbSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRWb2ljZVZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRSZW5kZXJQb3NpdGlvbikgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRJbnB1dEZyYW1lc0xvc3QpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobmV3QXVkaW9VbmlxdWVJZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShhY3F1aXJlQXVkaW9TZXNzaW9uSWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZUF1ZGlvU2Vzc2lvbklkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHF1ZXJ5TnVtYmVyRWZmZWN0cykgXAorQklOREVSX01FVEhPRF9FTlRSWShxdWVyeUVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRFZmZlY3REZXNjcmlwdG9yKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNyZWF0ZUVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShtb3ZlRWZmZWN0cykgXAorQklOREVSX01FVEhPRF9FTlRSWShsb2FkSHdNb2R1bGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRMb3dSYW1EZXZpY2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0QXVkaW9Qb3J0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNyZWF0ZUF1ZGlvUGF0Y2gpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZUF1ZGlvUGF0Y2gpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobGlzdEF1ZGlvUGF0Y2hlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBdWRpb1BvcnRDb25maWcpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN5c3RlbVJlYWR5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGF1ZGlvUG9saWN5UmVhZHkpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZnJhbWVDb3VudEhBTCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNaWNyb3Bob25lcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRNYXN0ZXJCYWxhbmNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE1hc3RlckJhbGFuY2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0RWZmZWN0U3VzcGVuZGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvSGFsUGlkcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRWaWJyYXRvckluZm9zKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHVwZGF0ZVNlY29uZGFyeU91dHB1dHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TW1hcFBvbGljeUluZm9zKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEFBdWRpb01peGVyQnVyc3RDb3VudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSkgXAorCisvLyBzaW5nbGV0b24gZm9yIEJpbmRlciBNZXRob2QgU3RhdGlzdGljcyBmb3IgSUF1ZGlvRmxpbmdlcgorc3RhdGljIGF1dG8mIGdldElBdWRpb0ZsaW5nZXJTdGF0aXN0aWNzKCkgeworICAgIHVzaW5nIENvZGUgPSBhbmRyb2lkOjpBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpEZWxlZ2F0ZTo6VHJhbnNhY3Rpb25Db2RlOworCisjcHJhZ21hIHB1c2hfbWFjcm8oIkJJTkRFUl9NRVRIT0RfRU5UUlkiKQorI3VuZGVmIEJJTkRFUl9NRVRIT0RfRU5UUlkKKyNkZWZpbmUgQklOREVSX01FVEhPRF9FTlRSWShFTlRSWSkgXAorICAgIHsoQ29kZSltZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl8jI0VOVFJZLCAjRU5UUll9LAorCisgICAgc3RhdGljIG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8Q29kZT4gbWV0aG9kU3RhdGlzdGljc3sKKyAgICAgICAgSUFVRElPRkxJTkdFUl9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QKKyAgICAgICAgTUVUSE9EX1NUQVRJU1RJQ1NfQklOREVSX0NPREVfTkFNRVMoQ29kZSkKKyAgICB9OworI3ByYWdtYSBwb3BfbWFjcm8oIkJJTkRFUl9NRVRIT0RfRU5UUlkiKQorCisgICAgcmV0dXJuIG1ldGhvZFN0YXRpc3RpY3M7Cit9CisKIGNsYXNzIERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2tJbXBsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2sgewogICBwdWJsaWM6CiAgICAgdm9pZCBvbk5ld0RldmljZXNBdmFpbGFibGUoKSBvdmVycmlkZSB7CkBAIC0yNjgsNyArMzYzLDcgQEAKICAgICBtTWVkaWFMb2dOb3RpZmllci0+cnVuKCJNZWRpYUxvZ05vdGlmaWVyIik7CiAgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IGhhbFBpZHM7CiAgICAgbURldmljZXNGYWN0b3J5SGFsLT5nZXRIYWxQaWRzKCZoYWxQaWRzKTsKLSAgICBUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhoYWxQaWRzKTsKKyAgICBtZWRpYXV0aWxzOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhoYWxQaWRzKTsKIAogICAgIC8vIE5vdGlmeSB0aGF0IHdlIGhhdmUgc3RhcnRlZCAoYWxzbyBjYWxsZWQgd2hlbiBhdWRpb3NlcnZlciBzZXJ2aWNlIHJlc3RhcnRzKQogICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQpAQCAtMzAwLDEwICszOTUsMTUgQEAKIAogICAgIG1EZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrID0gbmV3IERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2tJbXBsOwogICAgIG1EZXZpY2VzRmFjdG9yeUhhbC0+c2V0Q2FsbGJhY2tPbmNlKG1EZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrKTsKKworICAgIGlmIChtRGV2aWNlc0ZhY3RvcnlIYWwtPmdldEhhbFZlcnNpb24oKSA8PSBNQVhfQUFVRElPX1BST1BFUlRZX0RFVklDRV9IQUxfVkVSU0lPTikgeworICAgICAgICBtQUF1ZGlvQnVyc3RzUGVyQnVmZmVyID0gZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50RnJvbVN5c3RlbVByb3BlcnR5KCk7CisgICAgICAgIG1BQXVkaW9Id0J1cnN0TWluTWljcm9zID0gZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWNGcm9tU3lzdGVtUHJvcGVydHkoKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykgewotICBUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgbWVkaWF1dGlsczo6VGltZUNoZWNrOjpzZXRBdWRpb0hhbFBpZHMocGlkcyk7CiAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzM1LDEyICs0MzUsNjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8vIGdldERlZmF1bHRWaWJyYXRvckluZm9fbCBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlciBsb2NrIGhlbGQuCi1jb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8qIEF1ZGlvRmxpbmdlcjo6Z2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sKCkgewotICAgIGlmIChtQXVkaW9WaWJyYXRvckluZm9zLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY29uc3QgYXV0byBpdCA9IG1Qb2xpY3lJbmZvcy5maW5kKHBvbGljeVR5cGUpOyBpdCAhPSBtUG9saWN5SW5mb3MuZW5kKCkpIHsKKyAgICAgICAgKnBvbGljeUluZm9zID0gaXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KLSAgICByZXR1cm4gJm1BdWRpb1ZpYnJhdG9ySW5mb3MuZnJvbnQoKTsKKyAgICBpZiAobURldmljZXNGYWN0b3J5SGFsLT5nZXRIYWxWZXJzaW9uKCkgPiBNQVhfQUFVRElPX1BST1BFUlRZX0RFVklDRV9IQUxfVkVSU0lPTikgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gaW5mb3M7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXYtPmdldE1tYXBQb2xpY3lJbmZvcyhwb2xpY3lUeXBlLCAmaW5mb3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgbW1hcCBwb2xpY3kgaW5mbyBvZiAlZCwgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0h3RGV2cy5rZXlBdChpKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvbGljeUluZm9zLT5pbnNlcnQocG9saWN5SW5mb3MtPmVuZCgpLCBpbmZvcy5iZWdpbigpLCBpbmZvcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVBvbGljeUluZm9zW3BvbGljeVR5cGVdID0gKnBvbGljeUluZm9zOworICAgIH0gZWxzZSB7CisgICAgICAgIGdldE1tYXBQb2xpY3lJbmZvc0Zyb21TeXN0ZW1Qcm9wZXJ0eShwb2xpY3lUeXBlLCBwb2xpY3lJbmZvcyk7CisgICAgICAgIG1Qb2xpY3lJbmZvc1twb2xpY3lUeXBlXSA9ICpwb2xpY3lJbmZvczsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitpbnQzMl90IEF1ZGlvRmxpbmdlcjo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BQXVkaW9CdXJzdHNQZXJCdWZmZXI7Cit9CisKK2ludDMyX3QgQXVkaW9GbGluZ2VyOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvczsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIHsKKyAgICBzdGF0dXNfdCBmaW5hbF9yZXN1bHQgPSBOT19JTklUOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CisgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX0NPTk5FQ1RFRF9TVEFURTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkZXYtPnNldENvbm5lY3RlZFN0YXRlKHBvcnQsIGNvbm5lY3RlZCk7CisgICAgICAgIC8vIFNhbWUgbG9naWMgYXMgd2l0aCBzZXRQYXJhbWV0ZXI6IGl0J3MgYSBzdWNjZXNzIGlmIGF0IGxlYXN0IG9uZQorICAgICAgICAvLyBIQUwgbW9kdWxlIGFjY2VwdHMgdGhlIHVwZGF0ZS4KKyAgICAgICAgaWYgKGZpbmFsX3Jlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZmluYWxfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CisgICAgcmV0dXJuIGZpbmFsX3Jlc3VsdDsKK30KKworLy8gZ2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyIGxvY2sgaGVsZC4KK3N0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiBBdWRpb0ZsaW5nZXI6OmdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpIHsKKyAgICBpZiAobUF1ZGlvVmlicmF0b3JJbmZvcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1ZpYnJhdG9ySW5mb3MuZnJvbnQoKTsKIH0KIAogQXVkaW9GbGluZ2VyOjp+QXVkaW9GbGluZ2VyKCkKQEAgLTQyOSwxNCArNTg1LDE0IEBACiAgICAgICAgIGZ1bGxDb25maWcuY2hhbm5lbF9tYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CiAgICAgICAgIGZ1bGxDb25maWcuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwotCisgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZDsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmxvY2FsQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBjbGllbnQuYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cywgJmlzU3BhdGlhbGl6ZWQpOwogICAgICAgICBBTE9HV19JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAogICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIsIF9fZnVuY19fKTsKICAgICB9IGVsc2UgewpAQCAtNTY2LDEwICs3MjIsMTIgQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudHM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBwaWQgICAgaGVhcF9zaXplXG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DbGllbnRzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gbUNsaWVudHMudmFsdWVBdChpKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChjbGllbnQgIT0gMCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBwaWQ6ICVkXG4iLCBjbGllbnQtPnBpZCgpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2ZCAlMTJ6dVxuIiwgY2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmdldE1lbW9yeUhlYXAoKS0+Z2V0U2l6ZSgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjk1LDcgKzg1Myw3IEBACiAgICAgICAgIC8vIGR1bXAgYWxsIGhhcmR3YXJlIGRldnMKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICBkZXYtPmR1bXAoZmQpOworICAgICAgICAgICAgZGV2LT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogCiAgICAgICAgIG1QYXRjaFBhbmVsLmR1bXAoZmQpOwpAQCAtNzU3LDYgKzkxNSwzNiBAQAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgcyA9IEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nKHRydWUgLyogY29udGVudHMgKi8sIDEwMCAvKiBsaW1pdCAqLyk7CiAgICAgICAgICAgICB3cml0ZShmZCwgcy5jX3N0cigpLCBzLnNpemUoKSk7CiAgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGltZUNoZWNrU3RhdHMgPSBnZXRJQXVkaW9GbGluZ2VyU3RhdGlzdGljcygpLmR1bXAoKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbklBdWRpb0ZsaW5nZXIgYmluZGVyIGNhbGwgcHJvZmlsZTpcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHRpbWVDaGVja1N0YXRzLmNfc3RyKCksIHRpbWVDaGVja1N0YXRzLnNpemUoKSk7CisKKyAgICAgICAgICAgIGV4dGVybiBtZWRpYXV0aWxzOjpNZXRob2RTdGF0aXN0aWNzPGludD4mIGdldElFZmZlY3RTdGF0aXN0aWNzKCk7CisgICAgICAgICAgICB0aW1lQ2hlY2tTdGF0cyA9IGdldElFZmZlY3RTdGF0aXN0aWNzKCkuZHVtcCgpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuSUVmZmVjdCBiaW5kZXIgY2FsbCBwcm9maWxlOlxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgdGltZUNoZWNrU3RhdHMuY19zdHIoKSwgdGltZUNoZWNrU3RhdHMuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBmZXRjaCBISURMIHN0YXRpc3RpY3MuCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBoaWRsQ2xhc3NOYW1lcyA9CisgICAgICAgICAgICAgICAgICAgIG1lZGlhdXRpbHM6OmdldFN0YXRpc3RpY3NDbGFzc2VzRm9yTW9kdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwpOworICAgICAgICAgICAgaWYgKGhpZGxDbGFzc05hbWVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGFzc05hbWUgOiAqaGlkbENsYXNzTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBzdGF0cyA9IG1lZGlhdXRpbHM6OmdldFN0YXRpc3RpY3NGb3JDbGFzcyhjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVDaGVja1N0YXRzID0gc3RhdHMtPmR1bXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzIGJpbmRlciBjYWxsIHByb2ZpbGU6XG4iLCBjbGFzc05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgdGltZUNoZWNrU3RhdHMuY19zdHIoKSwgdGltZUNoZWNrU3RhdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGltZUNoZWNrU3RhdHMgPSBtZWRpYXV0aWxzOjpUaW1lQ2hlY2s6OnRvU3RyaW5nKCk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG5UaW1lQ2hlY2s6XG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCB0aW1lQ2hlY2tTdGF0cy5jX3N0cigpLCB0aW1lQ2hlY2tTdGF0cy5zaXplKCkpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtODQ2LDYgKzEwMzQsNyBAQAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CisgICAgYm9vbCBpc1NwYXRpYWxpemVkID0gZmFsc2U7OwogCiAgICAgLy8gVE9ETyBiLzE4MjM5MjU1MzogcmVmYWN0b3Igb3IgbWFrZSBjbGVhcmVyCiAgICAgcGlkX3QgY2xpZW50UGlkID0KQEAgLTg4OSw3ICsxMDc4LDggQEAKICAgICBvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0LnNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZsb2NhbEF0dHIsICZvdXRwdXQub3V0cHV0SWQsIHNlc3Npb25JZCwgJnN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLCAmaW5wdXQuY29uZmlnLCBpbnB1dC5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NwYXRpYWxpemVkKTsKIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJuIGVycm9yICVkIG9yIGludmFsaWQgb3V0cHV0IGhhbmRsZSIsIGxTdGF0dXMpOwpAQCAtOTU1LDcgKzExNDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ub3RpZmljYXRpb25zUGVyQnVmZmVyLCBpbnB1dC5zcGVlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsICZvdXRwdXQuZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGFkakF0dHJpYnV0aW9uU291cmNlLCBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCwgaW5wdXQuYXVkaW9UcmFja0NhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCwgaW5wdXQuYXVkaW9UcmFja0NhbGxiYWNrLCBpc1NwYXRpYWxpemVkKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHRyYWNrID09IDApKTsKICAgICAgICAgLy8gd2UgZG9uJ3QgYWJvcnQgeWV0IGlmIGxTdGF0dXMgIT0gTk9fRVJST1I7IHRoZXJlIGlzIHN0aWxsIHdvcmsgdG8gYmUgZG9uZSByZWdhcmRsZXNzCiAKQEAgLTk5Nyw4ICsxMTg3LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCh0aHJlYWQsIHNlc3Npb25JZCk7CisgICAgICAgIGlmICgob3V0cHV0LmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgPT0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgeworICAgICAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wodGhyZWFkLCBzZXNzaW9uSWQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTE4NzMsMTMgKzIwNjQsMTMgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAordm9pZCBBdWRpb0ZsaW5nZXI6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkgeworICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgZXZlbnRBaWRsID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfdF9BdWRpb0lvQ29uZmlnRXZlbnQoZXZlbnQpKTsKICAgICBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3IgZGVzY0FpZGwgPSBWQUxVRV9PUl9GQVRBTCgKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKGlvRGVzYykpOwotICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgZXZlbnRBaWRsID0gVkFMVUVfT1JfRkFUQUwoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KGV2ZW50KSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudExvY2spOwogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwpAQCAtMjE0Miw2ICsyMzMzLDIwIEBACiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIG91dHB1dC5zZXJ2ZXJDb25maWcgPSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZC0+c2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPmNoYW5uZWxNYXNrKCksCisgICAgICAgICAgICAgICAgICAgIHRocmVhZC0+Zm9ybWF0KCkKKyAgICAgICAgICAgIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRwdXQuc2VydmVyQ29uZmlnID0geworICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+c2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmZvcm1hdCgpCisgICAgICAgICAgICB9OworICAgICAgICB9CisKICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcwogICAgICAgICAvLyBzZXNzaW9uIGFuZCBtb3ZlIGl0IHRvIHRoaXMgdGhyZWFkLgogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CkBAIC0yMjcyLDYgKzI0NzcsMTggQEAKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CiAKKyAgICBpZiAobURldmljZXNGYWN0b3J5SGFsLT5nZXRIYWxWZXJzaW9uKCkgPiBNQVhfQUFVRElPX1BST1BFUlRZX0RFVklDRV9IQUxfVkVSU0lPTikgeworICAgICAgICBpZiAoaW50MzJfdCBtaXhlckJ1cnN0cyA9IGRldi0+Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7CisgICAgICAgICAgICBtaXhlckJ1cnN0cyA+IDAgJiYgbWl4ZXJCdXJzdHMgPiBtQUF1ZGlvQnVyc3RzUGVyQnVmZmVyKSB7CisgICAgICAgICAgICBtQUF1ZGlvQnVyc3RzUGVyQnVmZmVyID0gbWl4ZXJCdXJzdHM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludDMyX3QgaHdCdXJzdE1pbk1pY3JvcyA9IGRldi0+Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKTsKKyAgICAgICAgICAgIGh3QnVyc3RNaW5NaWNyb3MgPiAwCisgICAgICAgICAgICAmJiAoaHdCdXJzdE1pbk1pY3JvcyA8IG1BQXVkaW9Id0J1cnN0TWluTWljcm9zIHx8IG1BQXVkaW9Id0J1cnN0TWluTWljcm9zID09IDApKSB7CisgICAgICAgICAgICBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvcyA9IGh3QnVyc3RNaW5NaWNyb3M7CisgICAgICAgIH0KKyAgICB9CisKICAgICBtQXVkaW9Id0RldnMuYWRkKGhhbmRsZSwgYXVkaW9EZXZpY2UpOwogCiAgICAgQUxPR0koImxvYWRId01vZHVsZSgpIExvYWRlZCAlcyBhdWRpbyBpbnRlcmZhY2UsIGhhbmRsZSAlZCIsIG5hbWUsIGhhbmRsZSk7CkBAIC0yMzk2LDIxICsyNjEzLDE3IEBACiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CiAgICAgfQotICAgIFN0cmluZzggcmVwbHk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgaWYgKGRldi0+Z2V0UGFyYW1ldGVycyhTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlId0F2U3luYyksICZyZXBseSkgPT0gT0spIHsKLSAgICAgICAgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihyZXBseSk7Ci0gICAgfQogCi0gICAgaW50IHZhbHVlOwotICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMpLCB2YWx1ZSkgIT0gTk9fRVJST1IpIHsKKyAgICBlcnJvcjo6UmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4gcmVzdWx0ID0gZGV2LT5nZXRId0F2U3luYygpOworICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgQUxPR1coImdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbiBlcnJvciBnZXR0aW5nIHN5bmMgZm9yIHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOwogICAgICAgICByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOwogICAgIH0KKyAgICBhdWRpb19od19zeW5jX3QgdmFsdWUgPSBWQUxVRV9PUl9GQVRBTChyZXN1bHQpOwogCiAgICAgLy8gYWxsb3cgb25seSBvbmUgc2Vzc2lvbiBmb3IgYSBnaXZlbiBIVyBBL1Ygc3luYyBJRC4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id0F2U3luY0lkcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3QXZTeW5jSWRzLnZhbHVlQXQoaSkgPT0gKGF1ZGlvX2h3X3N5bmNfdCl2YWx1ZSkgeworICAgICAgICBpZiAobUh3QXZTeW5jSWRzLnZhbHVlQXQoaSkgPT0gdmFsdWUpIHsKICAgICAgICAgICAgIEFMT0dWKCJnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24gcmVtb3ZpbmcgSUQgJWQgZm9yIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgdmFsdWUsIG1Id0F2U3luY0lkcy5rZXlBdChpKSk7CiAgICAgICAgICAgICBtSHdBdlN5bmNJZHMucmVtb3ZlSXRlbXNBdChpKTsKQEAgLTI0NTUsNiArMjY2OCwxMCBAQAogICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQgPSAoVGhyZWFkQmFzZSAqKW1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSkuZ2V0KCk7CiAgICAgICAgIHRocmVhZC0+c3lzdGVtUmVhZHkoKTsKICAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgVGhyZWFkQmFzZSAqdGhyZWFkID0gKFRocmVhZEJhc2UgKiltTW1hcFRocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgdGhyZWFkLT5zeXN0ZW1SZWFkeSgpOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTI1MDEsMTQgKzI3MTgsMTUgQEAKIAogc3A8QXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlPiBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqaGFsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogewogICAgIEF1ZGlvSHdEZXZpY2UgKm91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZVR5cGUpOwogICAgIGlmIChvdXRId0RldiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKICAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMjUxNyw5ICsyNzM1LDE3IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBkb2VzIG5vdCBjdXJyZW50bHkgcmVxdWVzdCBhIHNwZWNpZmljIG91dHB1dCBoYW5kbGUuCiAgICAgICAgIC8vIElmIHRoaXMgaXMgZXZlciBuZWVkZWQsIHNlZSBvcGVuSW5wdXRfbCgpIGZvciBleGFtcGxlIGNvZGUuCiAgICAgICAgIEFMT0dFKCJvcGVuT3V0cHV0X2wgcmVxdWVzdGVkIG91dHB1dCBoYW5kbGUgJWQgaXMgbm90IEFVRElPX0lPX0hBTkRMRV9OT05FIiwgKm91dHB1dCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKKyNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgorICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSKSB7CisgICAgICAgIEFMT0dFKCJvcGVuT3V0cHV0X2woKSBjYW5ub3QgY3JlYXRlIHNwYXRpYWxpemVyIHRocmVhZCAiCisgICAgICAgICAgICAgICAgIndpdGhvdXQgI2RlZmluZSBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyNlbmRpZgorCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47CiAKICAgICAvLyBGT1IgVEVTVElORyBPTkxZOgpAQCAtMjUyOSwxNiArMjc1NSwxNiBAQAogICAgICAgICAvLyBDaGVjayBvbmx5IGZvciBOb3JtYWwgTWl4aW5nIG1vZGUKICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbikgewogICAgICAgICAgICAgLy8gU3BlY2lmeSBmb3JtYXQgKHVuY29tbWVudCBvbmUgYmVsb3cgdG8gY2hvb3NlKQotICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7Ci0gICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOwotICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOwotICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ7Ci0gICAgICAgICAgICAvLyBBTE9HVigib3Blbk91dHB1dF9sKCkgdXBncmFkaW5nIGZvcm1hdCB0byAlIzA4eCIsIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIC8vaGFsQ29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICAgICAgLy9oYWxDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKKyAgICAgICAgICAgIC8vaGFsQ29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgICAgIC8vaGFsQ29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOworICAgICAgICAgICAgLy8gQUxPR1YoIm9wZW5PdXRwdXRfbCgpIHVwZ3JhZGluZyBmb3JtYXQgdG8gJSMwOHgiLCBoYWxDb25maWctPmZvcm1hdCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CiAgICAgICAgICAgICAvLyBTcGVjaWZ5IGNoYW5uZWwgbWFzayAodW5jb21tZW50IG9uZSBiZWxvdyB0byBjaG9vc2UpCi0gICAgICAgICAgICAvL2NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KDQpOyAgLy8gZm9yIFVTQiA0Y2gKLSAgICAgICAgICAgIC8vY29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKKyAgICAgICAgICAgIC8vaGFsQ29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoNCk7ICAvLyBmb3IgVVNCIDRjaAorICAgICAgICAgICAgLy9oYWxDb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAogICAgICAgICAgICAgLy8gICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgsICgxIDw8IDQpIC0gMSk7ICAvLyBhbm90aGVyIDRjaCBleGFtcGxlCiAgICAgICAgIH0KICAgICB9CkBAIC0yNTQ5LDcgKzI3NzUsNyBAQAogICAgICAgICAgICAgKm91dHB1dCwKICAgICAgICAgICAgIGRldmljZVR5cGUsCiAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgIGhhbENvbmZpZywKICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKQEAgLTI1NjQsMTMgKzI3OTAsMTggQEAKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBuZXcgU3BhdGlhbGl6ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSwgbWl4ZXJDb25maWcpOworICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIHNwYXRpYWxpemVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsCiAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKQotICAgICAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtGb3JtYXQoY29uZmlnLT5mb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSkgeworICAgICAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtGb3JtYXQoaGFsQ29uZmlnLT5mb3JtYXQpCisgICAgICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGhhbENvbmZpZy0+Y2hhbm5lbF9tYXNrKSkgewogICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBtU3lzdGVtUmVhZHkpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsCiAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKQEAgLTI1ODksNyArMjgyMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKQEAgLTI1OTcsOCArMjgyOCwxMCBAQAogewogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QocmVxdWVzdC5tb2R1bGUpKTsKLSAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5jb25maWcpKTsKKyAgICBhdWRpb19jb25maWdfdCBoYWxDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5oYWxDb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtaXhlckNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChyZXF1ZXN0Lm1peGVyQ29uZmlnLCBmYWxzZS8qaXNJbnB1dCovKSk7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VEZXNjcmlwdG9yQmFzZShyZXF1ZXN0LmRldmljZSkpOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKQEAgLTI2MTEsOSArMjg0NCw5IEBACiAgICAgICAgICAgICAgICJDaGFubmVscyAlI3gsIGZsYWdzICUjeCIsCiAgICAgICAgICAgICAgIHRoaXMsIG1vZHVsZSwKICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgaGFsQ29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICBoYWxDb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICBoYWxDb25maWcuY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICBmbGFncyk7CiAKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOwpAQCAtMjYyNSw3ICsyODU4LDggQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuT3V0cHV0X2wobW9kdWxlLCAmb3V0cHV0LCAmY29uZmlnLCBkZXZpY2VUeXBlLCBhZGRyZXNzLCBmbGFncyk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3Blbk91dHB1dF9sKG1vZHVsZSwgJm91dHB1dCwgJmhhbENvbmZpZywKKyAgICAgICAgICAgICZtaXhlckNvbmZpZywgZGV2aWNlVHlwZSwgYWRkcmVzcywgZmxhZ3MpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSkgPT0gMCkgewogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwpAQCAtMjY1MCw3ICsyODg0LDggQEAKICAgICAgICAgICAgIG1tYXBUaHJlYWQtPmlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfT1BFTkVEKTsKICAgICAgICAgfQogICAgICAgICByZXNwb25zZS0+b3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOwotICAgICAgICByZXNwb25zZS0+Y29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICAgICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoaGFsQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgICAgICByZXNwb25zZS0+bGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGF0ZW5jeU1zKSk7CiAgICAgICAgIHJlc3BvbnNlLT5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CkBAIC0yNzM2LDkgKzI5NzEsNyBAQAogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKICAgICAgICAgICAgIEFMT0dEKCJjbG9zaW5nIG1tYXBUaHJlYWQgJXAiLCBtbWFwVGhyZWFkLmdldCgpKTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OwotICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgaW9EZXNjKTsKKyAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9DTE9TRUQsIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShvdXRwdXQpKTsKICAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtQ2xvc2VkKG91dHB1dCk7CiAgICAgfQogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCkBAIC0yODExLDE2ICszMDQ0LDE2IEBACiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIGlmIChyZXF1ZXN0LmRldmljZS50eXBlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhyZXF1ZXN0LmRldmljZSkpOworICAgIGlmIChkZXZpY2UubVR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJlcXVlc3QuaW5wdXQpKTsKICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5jb25maWcpKTsKLSAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2woCiAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KHJlcXVlc3QubW9kdWxlKSksCkBAIC0yODI4LDEzICszMDYxLDE0IEBACiAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgZGV2aWNlLm1UeXBlLAogICAgICAgICAgICAgZGV2aWNlLmFkZHJlc3MoKS5jX3N0cigpLAotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QocmVxdWVzdC5zb3VyY2UpKSwKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QocmVxdWVzdC5zb3VyY2UpKSwKICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2socmVxdWVzdC5mbGFncykpLAogICAgICAgICAgICAgQVVESU9fREVWSUNFX05PTkUsCiAgICAgICAgICAgICBTdHJpbmc4e30pOwogCiAgICAgcmVzcG9uc2UtPmlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlucHV0KSk7Ci0gICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7CisgICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICByZXNwb25zZS0+ZGV2aWNlID0gcmVxdWVzdC5kZXZpY2U7CiAKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTI5OTYsOSArMzIzMCw3IEBACiAgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gaW5wdXQ7Ci0gICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19JTlBVVF9DTE9TRUQsIGlvRGVzYyk7CisgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19JTlBVVF9DTE9TRUQsIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShpbnB1dCkpOwogICAgIH0KICAgICAvLyBGSVhNRTogY2FsbGluZyB0aHJlYWQtPmV4aXQoKSB3aXRob3V0IG1Mb2NrIGhlbGQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55bW9yZSBub3cgdGhhdAogICAgIC8vIHdlIGhhdmUgYSBkaWZmZXJlbnQgbG9jayBmb3Igbm90aWZpY2F0aW9uIGNsaWVudApAQCAtMzY1NywxNyArMzg4OSwyNCBAQAogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKLSAgICAgICAgaWYgKCFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IG9ubHkgQVBNIGNhbiBjcmVhdGUgdXNpbmcgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQVBNIG11c3Qgc3BlY2lmeSBvdXRwdXQgd2hlbiB1c2luZyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbyk7CisgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIG91dHB1dCAlZCBzcGVjaWZpZWQgZm9yIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIiwgX19mdW5jX18sIGlvKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkKKyAgICAgICAgICAgICAgICAmJiAhaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBlZmZlY3Qgb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0Ugbm90IGdyYW50ZWQgZm9yIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CiAgICAgICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGRldmljZSBlZmZlY3QgcGVybWlzc2lvbiBkZW5pZWQgZm9yIHVpZCAlZCIsIF9fZnVuY19fLCBjYWxsaW5nVWlkKTsKQEAgLTM3MjksNiArMzk2OCwxNSBAQAogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKKyAgICAgICAgLy8gT25seSBhdWRpbyBwb2xpY3kgc2VydmljZSBjYW4gY3JlYXRlIGEgc3BhdGlhbGl6ZXIgZWZmZWN0CisgICAgICAgIGlmICgobWVtY21wKCZkZXNjT3V0LnR5cGUsIEZYX0lJRF9TUEFUSUFMSVpFUiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSAmJgorICAgICAgICAgICAgKGNhbGxpbmdVaWQgIT0gQUlEX0FVRElPU0VSVkVSIHx8IGN1cnJlbnRQaWQgIT0gZ2V0cGlkKCkpKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGF0dGVtcHQgdG8gY3JlYXRlIGEgc3BhdGlhbGl6ZXIgZWZmZWN0IGZyb20gdWlkL3BpZCAlZC8lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjdXJyZW50UGlkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGUgb3V0cHV0IHJldHVybmVkIGJ5IGdldE91dHB1dEZvckVmZmVjdCgpIGlzIHJlbW92ZWQgYmVmb3JlIHdlIGxvY2sgdGhlCiAgICAgICAgICAgICAvLyBtdXRleCBiZWxvdywgdGhlIGNhbGwgdG8gY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKSBiZWxvdyB3aWxsIGRldGVjdCBpdApAQCAtMzc0NCw3ICszOTkyLDcgQEAKICAgICAgICAgICAgIEFMT0dWKCIlcyBkZXZpY2UgdHlwZSAlI3ggYWRkcmVzcyAlcyIsIF9fZnVuY19fLCBkZXZpY2UubVR5cGUsIGRldmljZS5nZXRBZGRyZXNzKCkpOwogICAgICAgICAgICAgaGFuZGxlID0gbURldmljZUVmZmVjdE1hbmFnZXIuY3JlYXRlRWZmZWN0X2woCiAgICAgICAgICAgICAgICAgICAgICZkZXNjT3V0LCBkZXZpY2UsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCBtUGF0Y2hQYW5lbC5wYXRjaGVzX2woKSwKLSAgICAgICAgICAgICAgICAgICAgJmVuYWJsZWRPdXQsICZsU3RhdHVzLCBwcm9iZSk7CisgICAgICAgICAgICAgICAgICAgICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcHJvYmUsIHJlcXVlc3Qubm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIGxTdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgd2l0aCBtQ2xpZW50TG9jayBoZWxkCiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CkBAIC0zNzk3LDcgKzQwNDUsOCBAQAogICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3QgaW8gJWQgZm9yIGVmZmVjdCAlcyIsIGlvLCBkZXNjT3V0Lm5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgIT0gbnVsbHB0cikgeworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CiAgICAgICAgICAgICAvLyBhbGxvdyBvbmx5IG9uZSBlZmZlY3QgY2hhaW4gcGVyIHNlc3Npb25JZCBvbiBtUGxheWJhY2tUaHJlYWRzLgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgY2hlY2tJbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7CkBAIC0zODYzLDcgKzQxMTIsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2woY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NPdXQsICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcGlubmVkLCBwcm9iZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NPdXQsICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcGlubmVkLCBwcm9iZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIGxTdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwpAQCAtMzg4MSw2ICs0MTMxLDEyIEBACiAKIFJlZ2lzdGVyOgogICAgIGlmICghcHJvYmUgJiYgKGxTdGF0dXMgPT0gTk9fRVJST1IgfHwgbFN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykpIHsKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5hbHJlYWR5RXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5hbHJlYWR5RXhpc3RzID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgLy8gQ2hlY2sgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UKICAgICAgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gaGFuZGxlLT5lZmZlY3QoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChlZmZlY3QgIT0gbnVsbHB0cikgewpAQCAtMzk3Myw0NyArNDIyOSw4NyBAQAogICAgIC8vIHNvIHRoYXQgYSBuZXcgY2hhaW4gaXMgY3JlYXRlZCB3aXRoIGNvcnJlY3QgcGFyYW1ldGVycyB3aGVuIGZpcnN0IGVmZmVjdCBpcyBhZGRlZC4gVGhpcyBpcwogICAgIC8vIG90aGVyd2lzZSB1bm5lY2Vzc2FyeSBhcyByZW1vdmVFZmZlY3RfbCgpIHdpbGwgcmVtb3ZlIHRoZSBjaGFpbiB3aGVuIGxhc3QgZWZmZWN0IGlzCiAgICAgLy8gcmVtb3ZlZC4KKyAgICAvLyBUT0RPKGIvMjE2ODc1MDE2KTogY29uc2lkZXIgaG9sZGluZyB0aGUgZWZmZWN0IGNoYWluIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG1vdmUuCiAgICAgc3JjVGhyZWFkLT5yZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKIAogICAgIC8vIHRyYW5zZmVyIGFsbCBlZmZlY3RzIG9uZSBieSBvbmUgc28gdGhhdCBuZXcgZWZmZWN0IGNoYWluIGlzIGNyZWF0ZWQgb24gbmV3IHRocmVhZCB3aXRoCiAgICAgLy8gY29ycmVjdCBidWZmZXIgc2l6ZXMgYW5kIGF1ZGlvIHBhcmFtZXRlcnMgYW5kIGVmZmVjdCBlbmdpbmVzIHJlY29uZmlndXJlZCBhY2NvcmRpbmdseQogICAgIHNwPEVmZmVjdENoYWluPiBkc3RDaGFpbjsKLSAgICB1aW50MzJfdCBzdHJhdGVneSA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOwogICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHJlbW92ZWQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgd2hpbGUgKGVmZmVjdCAhPSAwKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgd2hpbGUgKGVmZmVjdCAhPSBudWxscHRyKSB7CiAgICAgICAgIHNyY1RocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKICAgICAgICAgcmVtb3ZlZC5hZGQoZWZmZWN0KTsKICAgICAgICAgc3RhdHVzID0gZHN0VGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBlcnJvclN0cmluZyA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBhZGQgZWZmZWN0ICVwIHRvIGRlc3RpbmF0aW9uIHRocmVhZCIsIGVmZmVjdC5nZXQoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICAvLyByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgd2FzIGFjdGl2ZSBzbyBpdCBtdXN0IGJlIHJlc3RhcnRlZAotICAgICAgICBpZiAoZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6QUNUSVZFIHx8Ci0gICAgICAgICAgICAgICAgZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKLSAgICAgICAgICAgIGVmZmVjdC0+c3RhcnQoKTsKLSAgICAgICAgfQogICAgICAgICAvLyBpZiB0aGUgbW92ZSByZXF1ZXN0IGlzIG5vdCByZWNlaXZlZCBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLCB0aGUgZWZmZWN0IG11c3QgYmUKLSAgICAgICAgLy8gcmUtcmVnaXN0ZXJlZCB3aXRoIHRoZSBuZXcgc3RyYXRlZ3kgYW5kIG91dHB1dAotICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgeworICAgICAgICAvLyByZS1yZWdpc3RlcmVkIHdpdGggdGhlIG5ldyBzdHJhdGVneSBhbmQgb3V0cHV0LgorCisgICAgICAgIC8vIFdlIG9idGFpbiB0aGUgZHN0Q2hhaW4gb25jZSB0aGUgZWZmZWN0IGlzIG9uIHRoZSBuZXcgdGhyZWFkLgorICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmdldENhbGxiYWNrKCktPmNoYWluKCkucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGRzdENoYWluID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibW92ZUVmZmVjdENoYWluX2woKSBjYW5ub3QgZ2V0IGNoYWluIGZyb20gZWZmZWN0ICVwIiwgZWZmZWN0LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcgPSBTdHJpbmdQcmludGYoImNhbm5vdCBnZXQgY2hhaW4gZnJvbSBlZmZlY3QgJXAiLCBlZmZlY3QuZ2V0KCkpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJhdGVneSA9IGRzdENoYWluLT5zdHJhdGVneSgpOwogICAgICAgICB9CiAgICAgICAgIGVmZmVjdCA9IGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbCgwKTsKICAgICB9CiAKKyAgICBzaXplX3QgcmVzdG9yZWQgPSAwOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcmNUaHJlYWQtPmFkZEVmZmVjdF9sKHJlbW92ZWRbaV0pOworICAgICAgICBkc3RDaGFpbi5jbGVhcigpOyAvLyBkc3RDaGFpbiBpcyBub3cgZnJvbSB0aGUgc3JjVGhyZWFkIChjb3VsZCBiZSByZWNyZWF0ZWQpLgorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IHJlbW92ZWQpIHsKKyAgICAgICAgICAgIGRzdFRocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsgLy8gTm90ZTogRGVwZW5kaW5nIG9uIGVycm9yIGxvY2F0aW9uLCB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QgbWF5IG5vdCBoYXZlIGJlZW4gcGxhY2VkIG9uIGRzdFRocmVhZC4KKyAgICAgICAgICAgIGlmIChzcmNUaHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICArK3Jlc3RvcmVkOworICAgICAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdENoYWluID0gZWZmZWN0LT5nZXRDYWxsYmFjaygpLT5jaGFpbigpLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBBZnRlciBhbGwgdGhlIGVmZmVjdHMgaGF2ZSBiZWVuIG1vdmVkIHRvIG5ldyB0aHJlYWQgKG9yIHB1dCBiYWNrKSB3ZSByZXN0YXJ0IHRoZSBlZmZlY3RzCisgICAgLy8gYmVjYXVzZSByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgaXMgY3VycmVudGx5IGFjdGl2ZS4KKyAgICBzaXplX3Qgc3RhcnRlZCA9IDA7CisgICAgaWYgKGRzdENoYWluICE9IG51bGxwdHIgJiYgIXJlbW92ZWQuZW1wdHkoKSkgeworICAgICAgICAvLyBJZiB3ZSBkbyBub3QgdGFrZSB0aGUgZHN0Q2hhaW4gbG9jaywgaXQgaXMgcG9zc2libGUgdGhhdCBwcm9jZXNzaW5nIGlzIG9uZ29pbmcKKyAgICAgICAgLy8gd2hpbGUgd2UgYXJlIHN0YXJ0aW5nIHRoZSBlZmZlY3QuICBUaGlzIGNhbiBjYXVzZSBnbGl0Y2hlcyB3aXRoIHZvbHVtZSwKKyAgICAgICAgLy8gc2VlIGIvMjAyMzYwMTM3LgorICAgICAgICBkc3RDaGFpbi0+bG9jaygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IHJlbW92ZWQpIHsKKyAgICAgICAgICAgIGlmIChlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpBQ1RJVkUgfHwKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKKyAgICAgICAgICAgICAgICArK3N0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzdENoYWluLT51bmxvY2soKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChlcnJvclN0cmluZy5lbXB0eSgpKSB7CisgICAgICAgICAgICBlcnJvclN0cmluZyA9IFN0cmluZ1ByaW50ZigiJXM6IGZhaWxlZCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVygiJXM6ICVzIHVuc3VjY2Vzc2Z1bCBtb3ZlIG9mIHNlc3Npb24gJWQgZnJvbSBzcmNUaHJlYWQgJXAgdG8gZHN0VGhyZWFkICVwICIKKyAgICAgICAgICAgICAgICAiKCV6dSBlZmZlY3RzIHJlbW92ZWQgZnJvbSBzcmNUaHJlYWQsICV6dSBlZmZlY3RzIHJlc3RvcmVkIHRvIHNyY1RocmVhZCwgIgorICAgICAgICAgICAgICAgICIlenUgZWZmZWN0cyBzdGFydGVkKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGVycm9yU3RyaW5nLmNfc3RyKCksIHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQsCisgICAgICAgICAgICAgICAgcmVtb3ZlZC5zaXplKCksIHJlc3RvcmVkLCBzdGFydGVkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiJXM6IHN1Y2Nlc3NmdWwgbW92ZSBvZiBzZXNzaW9uICVkIGZyb20gc3JjVGhyZWFkICVwIHRvIGRzdFRocmVhZCAlcCAiCisgICAgICAgICAgICAgICAgIiglenUgZWZmZWN0cyBtb3ZlZCwgJXp1IGVmZmVjdHMgc3RhcnRlZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzZXNzaW9uSWQsIHNyY1RocmVhZCwgZHN0VGhyZWFkLCByZW1vdmVkLnNpemUoKSwgc3RhcnRlZCk7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQxNzgsNiArNDQ3NCw4IEBACiAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpMSVNUX0FVRElPX1BBVENIRVM6CiAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfQVVESU9fUE9SVF9DT05GSUc6CiAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfUkVDT1JEX1NJTEVOQ0VEOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6QVVESU9fUE9MSUNZX1JFQURZOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX0RFVklDRV9DT05ORUNURURfU1RBVEU6CiAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCkBAIC00MjQ1LDkgKzQ1NDMsMjAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKwotICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZV90PFRyYW5zYWN0aW9uQ29kZT4+KGNvZGUpKSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtZXRob2ROYW1lID0gZ2V0SUF1ZGlvRmxpbmdlclN0YXRpc3RpY3MoKS5nZXRNZXRob2RGb3JDb2RlKGNvZGUpOworICAgIG1lZGlhdXRpbHM6OlRpbWVDaGVjayBjaGVjaygKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJJQXVkaW9GbGluZ2VyOjoiKS5hcHBlbmQobWV0aG9kTmFtZSksCisgICAgICAgICAgICBbY29kZSwgbWV0aG9kTmFtZV0oYm9vbCB0aW1lb3V0LCBmbG9hdCBlbGFwc2VkTXMpIHsgLy8gZG9uJ3QgbW92ZSBtZXRob2ROYW1lLgorICAgICAgICBpZiAodGltZW91dCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9USU1FT1VUKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01FVEhPRENPREUsIGludDY0X3QoY29kZSkpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9ETkFNRSwgbWV0aG9kTmFtZS5jX3N0cigpKQorICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldElBdWRpb0ZsaW5nZXJTdGF0aXN0aWNzKCkuZXZlbnQoY29kZSwgZWxhcHNlZE1zKTsKKyAgICAgICAgfQorICAgIH0pOwogCiAgICAgLy8gTWFrZSBzdXJlIHdlIGNvbm5lY3QgdG8gQXVkaW8gUG9saWN5IFNlcnZpY2UgYmVmb3JlIGNhbGxpbmcgaW50byBBdWRpb0ZsaW5nZXI6CiAgICAgLy8gIC0gQXVkaW9GbGluZ2VyIGNhbiBjYWxsIGludG8gQXVkaW8gUG9saWN5IFNlcnZpY2Ugd2l0aCBpdHMgZ2xvYmFsIG11dGV4IGhlbGQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCBmZmY2MWY4Li44ZTQzODNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC03Niw2ICs3Niw3IEBACiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RocmVhZFNuYXBzaG90Lmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KQEAgLTI2OSw2ICsyNzAsOSBAQAogCiAgICAgLyogSW5kaWNhdGUgSkFWQSBzZXJ2aWNlcyBhcmUgcmVhZHkgKHNjaGVkdWxpbmcsIHBvd2VyIG1hbmFnZW1lbnQgLi4uKSAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF1ZGlvUG9saWN5UmVhZHkoKSB7IG1BdWRpb1BvbGljeVJlYWR5LnN0b3JlKHRydWUpOyByZXR1cm4gTk9fRVJST1I7IH0KKyAgICAgICAgICAgIGJvb2wgaXNBdWRpb1BvbGljeVJlYWR5KCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9saWN5UmVhZHkubG9hZCgpOyB9CisKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwogCkBAIC0yNzksNiArMjgzLDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcyk7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKTsKKwogICAgIHN0YXR1c190IG9uVHJhbnNhY3RXcmFwcGVyKFRyYW5zYWN0aW9uQ29kZSBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+JiBkZWxlZ2F0ZSkgb3ZlcnJpZGU7CiAKQEAgLTMwOSw3ICszMjMsNyBAQAogICAgIHZvaWQgdXBkYXRlRG93blN0cmVhbVBhdGNoZXNfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxhdWRpb19pb19oYW5kbGVfdD4gc3RyZWFtcyk7CiAKLSAgICBjb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8qIGdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpOworICAgIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiBnZXREZWZhdWx0VmlicmF0b3JJbmZvX2woKTsKIAogcHJpdmF0ZToKICAgICAvLyBGSVhNRSBUaGUgNDAwIGlzIHRlbXBvcmFyaWx5IHRvbyBoaWdoIHVudGlsIGEgbGVhayBvZiB3cml0ZXJzIGluIG1lZGlhLmxvZyBpcyBmaXhlZC4KQEAgLTczNSw3ICs3NDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG91dHB1dERldmljZUFkZHJlc3MpOwogICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiBvcGVuT3V0cHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwpAQCAtNzQ2LDcgKzc2MSw3IEBACiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1NdXRlX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGU7IH0KLSAgICAgICAgICAgICAgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IDApOwogCkBAIC05MDAsNiArOTE1LDcgQEAKICAgICAgICAgQVVESU9fSFdfU0VUX01BU1RFUl9NVVRFLCAgICAgICAvLyBzZXRfbWFzdGVyX211dGUKICAgICAgICAgQVVESU9fSFdfR0VUX01BU1RFUl9NVVRFLCAgICAgICAvLyBnZXRfbWFzdGVyX211dGUKICAgICAgICAgQVVESU9fSFdfR0VUX01JQ1JPUEhPTkVTLCAgICAgICAvLyBnZXRNaWNyb3Bob25lcworICAgICAgICBBVURJT19IV19TRVRfQ09OTkVDVEVEX1NUQVRFLCAgIC8vIHNldENvbm5lY3RlZFN0YXRlCiAgICAgfTsKIAogICAgIG11dGFibGUgICAgIGhhcmR3YXJlX2NhbGxfc3RhdGUgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1czsgICAgLy8gZm9yIGR1bXAgb25seQpAQCAtOTg2LDYgKzEwMDIsNyBAQAogICAgIERldmljZUVmZmVjdE1hbmFnZXIgbURldmljZUVmZmVjdE1hbmFnZXI7CiAKICAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKyAgICBzdGQ6OmF0b21pY19ib29sIG1BdWRpb1BvbGljeVJlYWR5e307CiAKICAgICBtZWRpYXV0aWxzOjpVaWRJbmZvIG1VaWRJbmZvOwogCkBAIC05OTksNiArMTAxNiwxMSBAQAogCiAgICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggamF2YSBkZWZpbml0aW9uIGluIG1lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCiAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtNYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IDUwMDA7CisKKyAgICBzdGQ6Om1hcDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSwKKyAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4+IG1Qb2xpY3lJbmZvczsKKyAgICBpbnQzMl90IG1BQXVkaW9CdXJzdHNQZXJCdWZmZXIgPSAwOworICAgIGludDMyX3QgbUFBdWRpb0h3QnVyc3RNaW5NaWNyb3MgPSAwOwogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKaW5kZXggMTZiMjVmNi4uZGVlNjE2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcApAQCAtMjksNiArMjksOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9Id0RldmljZTo6b3Blbk91dHB1dFN0cmVhbSgKQEAgLTEwMiw1ICsxMDUsMTggQEAKICAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRBdWRpb1BvcnQocG9ydCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvSHdEZXZpY2U6OmdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0TW1hcFBvbGljeUluZm9zKHBvbGljeVR5cGUsIHBvbGljeUluZm9zKTsKK30KKworaW50MzJfdCBBdWRpb0h3RGV2aWNlOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7Cit9CisKK2ludDMyX3QgQXVkaW9Id0RldmljZTo6Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKTsKK30KKwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKaW5kZXggZmMyYzY5My4uOGM1ZDIzOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtODUsNiArODcsMTQgQEAKIAogICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgY29uc3Q7CisKKyAgICBpbnQzMl90IGdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpIGNvbnN0OworCisgICAgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIGNvbnN0OworCiBwcml2YXRlOgogICAgIGNvbnN0IGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtSGFuZGxlOwogICAgIGNvbnN0IGNoYXIgKiBjb25zdCAgICAgICAgICBtTW9kdWxlTmFtZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCmluZGV4IGQ4NTY1YmQuLjY1ZWMwZTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtMzksNiArMzksNyBAQAogICAgICAgICAsIG1SYXRlTXVsdGlwbGllcigxKQogICAgICAgICAsIG1IYWxGb3JtYXRIYXNQcm9wb3J0aW9uYWxGcmFtZXMoZmFsc2UpCiAgICAgICAgICwgbUhhbEZyYW1lU2l6ZSgwKQorICAgICAgICAsIG1FeHBlY3RSZXRyb2dyYWRlKGZhbHNlKQogewogfQogCkBAIC02OSw4ICs3MCwxMiBAQAogICAgIGNvbnN0IHVpbnQzMl90IHRydW5jYXRlZFBvc2l0aW9uID0gKHVpbnQzMl90KW1SZW5kZXJQb3NpdGlvbjsKICAgICBpbnQzMl90IGRlbHRhSGFsUG9zaXRpb247IC8vIGluaXRpYWxpemF0aW9uIG5vdCBuZWVkZWQsIG92ZXJ3aXR0ZW4gYnkgX19idWlsdGluX3N1Yl9vdmVyZmxvdygpCiAgICAgKHZvaWQpIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coaGFsUG9zaXRpb24sIHRydW5jYXRlZFBvc2l0aW9uLCAmZGVsdGFIYWxQb3NpdGlvbik7CisKICAgICBpZiAoZGVsdGFIYWxQb3NpdGlvbiA+IDApIHsKICAgICAgICAgbVJlbmRlclBvc2l0aW9uICs9IGRlbHRhSGFsUG9zaXRpb247CisgICAgfSBlbHNlIGlmIChtRXhwZWN0UmV0cm9ncmFkZSkgeworICAgICAgICBtRXhwZWN0UmV0cm9ncmFkZSA9IGZhbHNlOworICAgICAgICBtUmVuZGVyUG9zaXRpb24gLT0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1kZWx0YUhhbFBvc2l0aW9uKTsKICAgICB9CiAgICAgLy8gU2NhbGUgZnJvbSBIQUwgc2FtcGxlIHJhdGUgdG8gYXBwbGljYXRpb24gcmF0ZS4KICAgICAqZnJhbWVzID0gbVJlbmRlclBvc2l0aW9uIC8gbVJhdGVNdWx0aXBsaWVyOwpAQCAtMTg3LDYgKzE5Miw3IEBACiBpbnQgQXVkaW9TdHJlYW1PdXQ6OmZsdXNoKCkKIHsKICAgICBtUmVuZGVyUG9zaXRpb24gPSAwOworICAgIG1FeHBlY3RSZXRyb2dyYWRlID0gZmFsc2U7CiAgICAgbUZyYW1lc1dyaXR0ZW4gPSAwOwogICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5ID0gMDsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBzdHJlYW0tPmZsdXNoKCk7CkBAIC0xOTYsNiArMjAyLDcgQEAKIGludCBBdWRpb1N0cmVhbU91dDo6c3RhbmRieSgpCiB7CiAgICAgbVJlbmRlclBvc2l0aW9uID0gMDsKKyAgICBtRXhwZWN0UmV0cm9ncmFkZSA9IGZhbHNlOwogICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5ID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgcmV0dXJuIHN0cmVhbS0+c3RhbmRieSgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaAppbmRleCA1NjVmNDNhLi44MmZlMjM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaApAQCAtOTMsMTMgKzkzLDIxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwogCisgICAgLy8gQXZvaWQgc3VwcHJlc3NpbmcgcmV0cm9ncmFkZSBtb3Rpb24gaW4gbVJlbmRlclBvc2l0aW9uIGZvciBnYXBsZXNzIG9mZmxvYWQvZGlyZWN0IHdoZW4KKyAgICAvLyB0cmFuc2l0aW9uaW5nIGJldHdlZW4gdHJhY2tzLgorICAgIC8vIFRoZSBIQUwgcmVzZXRzIHRoZSBmcmFtZSBwb3NpdGlvbiB3aXRob3V0IGZsdXNoL3N0b3AgYmVpbmcgY2FsbGVkLCBidXQgY2FsbHMgYmFjayBwcmlvciB0bworICAgIC8vIHRoaXMgZXZlbnQuIFNvLCBvbiB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIHJldHJvZ3JhZGUgbW90aW9uLCB3ZSBwZXJtaXQgYmFja3dhcmRzIG1vdmVtZW50IG9mCisgICAgLy8gbVJlbmRlclBvc2l0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBwcmVzZW50YXRpb25Db21wbGV0ZSgpIHsgbUV4cGVjdFJldHJvZ3JhZGUgPSB0cnVlOyB9CisKIHByb3RlY3RlZDoKICAgICB1aW50NjRfdCAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gcmVzZXQgYnkgZmx1c2gKICAgICB1aW50NjRfdCAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieTsKLSAgICB1aW50NjRfdCAgICAgICAgICAgICBtUmVuZGVyUG9zaXRpb247IC8vIHJlc2V0IGJ5IGZsdXNoIG9yIHN0YW5kYnkKKyAgICB1aW50NjRfdCAgICAgICAgICAgICBtUmVuZGVyUG9zaXRpb247IC8vIHJlc2V0IGJ5IGZsdXNoLCBzdGFuZGJ5LCBvciBwcmVzZW50YXRpb24gY29tcGxldGUKICAgICBpbnQgICAgICAgICAgICAgICAgICBtUmF0ZU11bHRpcGxpZXI7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUhhbEZvcm1hdEhhc1Byb3BvcnRpb25hbEZyYW1lczsKICAgICBzaXplX3QgICAgICAgICAgICAgICBtSGFsRnJhbWVTaXplOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1FeHBlY3RSZXRyb2dyYWRlOyAvLyBzZWUgcHJlc2VudGF0aW9uQ29tcGxldGUKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmNwcAppbmRleCBjZWNkNTJiLi41M2FjNWNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwCkBAIC03Nyw3ICs3Nyw4IEBACiAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaFBhbmVsOjpQYXRjaD4mIHBhdGNoZXMsCiAgICAgICAgIGludCAqZW5hYmxlZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgYm9vbCBwcm9iZSkgeworICAgICAgICBib29sIHByb2JlLAorICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkgewogICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBlZmZlY3Q7CiAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKQEAgLTk1LDEwICs5NiwxMiBAQAogICAgICAgICAgICAgZWZmZWN0ID0gaXRlci0+c2Vjb25kOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZWZmZWN0ID0gbmV3IERldmljZUVmZmVjdFByb3h5KGRldmljZSwgbU15Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfRUZGRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfRUZGRUNUKSwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgfQogICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IGhhbmRsZSBhbmQgY29ubmVjdCBpdCB0byBlZmZlY3QgbW9kdWxlCi0gICAgICAgIGhhbmRsZSA9IG5ldyBFZmZlY3RIYW5kbGUoZWZmZWN0LCBjbGllbnQsIGVmZmVjdENsaWVudCwgMCAvKnByaW9yaXR5Ki8pOworICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIDAgLypwcmlvcml0eSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7CiAgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOwogICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaAppbmRleCBhMDVmNWZlLi5kMmZhYTcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmgKQEAgLTM3LDcgKzM3LDggQEAKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2hQYW5lbDo6UGF0Y2g+JiBwYXRjaGVzLAogICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCwKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUpOworICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgIHZvaWQgY3JlYXRlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IFBhdGNoUGFuZWw6OlBhdGNoJiBwYXRjaCk7CiAgICAgdm9pZCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogCkBAIC0xNjEsMTAgKzE2MiwxNiBAQAogICAgIGJvb2wgaXNPZmZsb2FkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KICAgICBib29sIGlzT2ZmbG9hZE9yRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KICAgICBib29sIGlzT2ZmbG9hZE9yTW1hcCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBpc1NwYXRpYWxpemVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHVpbnQzMl90ICBzYW1wbGVSYXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOyB9Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2soaW50IGlkIF9fdW51c2VkKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIHVpbnQzMl90IGluQ2hhbm5lbENvdW50KGludCBpZCBfX3VudXNlZCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOyB9CisgICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7IH0KICAgICBzaXplX3QgICAgZnJhbWVDb3VudCgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CiAgICAgdWludDMyX3QgIGxhdGVuY3koKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gMDsgfQpAQCAtMTkwLDYgKzE5NywxMCBAQAogCiAgICAgd3A8RWZmZWN0Q2hhaW4+IGNoYWluKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQogCisgICAgYm9vbCBpc0F1ZGlvUG9saWN5UmVhZHkoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTWFuYWdlci5hdWRpb0ZsaW5nZXIoKS5pc0F1ZGlvUG9saWN5UmVhZHkoKTsKKyAgICB9CisKICAgICBpbnQgbmV3RWZmZWN0SWQoKSB7IHJldHVybiBtTWFuYWdlci5hdWRpb0ZsaW5nZXIoKS5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9FRkZFQ1QpOyB9CiAKICAgICBzdGF0dXNfdCBhZGRFZmZlY3RUb0hhbChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGIyNjdkODguLmU2ZDdjZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTI0LDkgKzI0LDExIEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9keW5hbWljc3Byb2Nlc3NpbmcuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3NwYXRpYWxpemVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KQEAgLTM3LDcgKzM5LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9TaG1lbUNvbXBhdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZXRob2RTdGF0aXN0aWNzLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogCkBAIC0yNDIsNiArMjQ2LDEyIEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgaWYgKChpc0ludGVybmFsX2woKSAmJiAhbVBvbGljeVJlZ2lzdGVyZWQpCisgICAgICAgICAgICAgICAgfHwgIWdldENhbGxiYWNrKCktPmlzQXVkaW9Qb2xpY3lSZWFkeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZWdpc3RlciBlZmZlY3Qgd2hlbiBmaXJzdCBoYW5kbGUgaXMgYXR0YWNoZWQgYW5kIHVucmVnaXN0ZXIgd2hlbiBsYXN0IGhhbmRsZSBpcyByZW1vdmVkCiAgICAgICAgIGlmIChtUG9saWN5UmVnaXN0ZXJlZCAhPSBtSGFuZGxlcy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBkb1JlZ2lzdGVyID0gdHJ1ZTsKQEAgLTY0Miw2ICs2NTIsMTMgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbUhhbmRsZXNbaV0tPmRpc2Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXNbaV0tPmZyYW1lc1Byb2Nlc3NlZChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OiAvL0lETEUgLCBBQ1RJVkUsIERFU1RST1lFRAogICAgICAgICBicmVhazsKICAgICB9CkBAIC04NzUsOSArODkyLDkgQEAKICAgICAvLyBzaW1pbGFyIHRvIG91dHB1dCBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVC9SRVBMQUNFLAogICAgIC8vIGluIHdoaWNoIGNhc2UgaW5wdXQgY2hhbm5lbCBtYXNrcyBzaG91bGQgYmUgdXNlZCBoZXJlLgogICAgIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2soKTsKLSAgICBjaGFubmVsTWFzayA9IGNhbGxiYWNrLT5jaGFubmVsTWFzaygpOworICAgIGNoYW5uZWxNYXNrID0gY2FsbGJhY2stPmluQ2hhbm5lbE1hc2sobUlkKTsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7Ci0gICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKKyAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNhbGxiYWNrLT5vdXRDaGFubmVsTWFzaygpOwogCiAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgaWYgKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgewpAQCAtOTQwLDExICs5NTcsNyBAQAogICAgIC8vIEF1eGlsaWFyeSBlZmZlY3Q6CiAgICAgLy8gICAgICBhY2N1bXVsYXRlcyBpbiBvdXRwdXQgYnVmZmVyOiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgogICAgIC8vIFRoZXJlZm9yZTogYWNjdW11bGF0ZSA8PT4gaW5wdXQgYnVmZmVyICE9IG91dHB1dCBidWZmZXIKLSAgICBpZiAobUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ICE9IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcpIHsKLSAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOwotICAgIH0KKyAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gcmVxdWlyZWRFZmZlY3RCdWZmZXJBY2Nlc3NNb2RlKCk7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBjYWxsYmFjay0+ZnJhbWVDb3VudCgpOwpAQCAtMTYwMCw3ICsxNjEzLDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0VmlicmF0b3JJbmZvKGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyogdmlicmF0b3JJbmZvKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldFZpYnJhdG9ySW5mbyhjb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8mIHZpYnJhdG9ySW5mbykKIHsKICAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gbVN0YXR1czsKQEAgLTE2MTAsMTUgKzE2MjMsMTcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGNvbnN0IHNpemVfdCBwYXJhbUNvdW50ID0gMzsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0KAotICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArIDIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyBwYXJhbUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gKGVmZmVjdF9wYXJhbV90KikgcmVxdWVzdC5kYXRhKCk7CiAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludDMyX3QpOwotICAgIHBhcmFtLT52c2l6ZSA9IDIgKiBzaXplb2YoZmxvYXQpOworICAgIHBhcmFtLT52c2l6ZSA9IHBhcmFtQ291bnQgKiBzaXplb2YoZmxvYXQpOwogICAgICooaW50MzJfdCopcGFyYW0tPmRhdGEgPSBIR19QQVJBTV9WSUJSQVRPUl9JTkZPOwogICAgIGZsb2F0KiB2aWJyYXRvckluZm9QdHIgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ocGFyYW0tPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOwotICAgIHZpYnJhdG9ySW5mb1B0clswXSA9IHZpYnJhdG9ySW5mby0+cmVzb25hbnRGcmVxdWVuY3k7Ci0gICAgdmlicmF0b3JJbmZvUHRyWzFdID0gdmlicmF0b3JJbmZvLT5xRmFjdG9yOworICAgIHZpYnJhdG9ySW5mb1B0clswXSA9IHZpYnJhdG9ySW5mby5yZXNvbmFudEZyZXF1ZW5jeTsKKyAgICB2aWJyYXRvckluZm9QdHJbMV0gPSB2aWJyYXRvckluZm8ucUZhY3RvcjsKKyAgICB2aWJyYXRvckluZm9QdHJbMl0gPSB2aWJyYXRvckluZm8ubWF4QW1wbGl0dWRlOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sIHJlcXVlc3QsIHNpemVvZihpbnQzMl90KSwgJnJlc3BvbnNlKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0xNzA4LDEwICsxNzIzLDExIEBACiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6RWZmZWN0SGFuZGxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCiAgICAgOiBCbkVmZmVjdCgpLAogICAgIG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdENsaWVudChlZmZlY3RDbGllbnQpLCBtQ2xpZW50KGNsaWVudCksIG1DYmxrKE5VTEwpLAotICAgIG1Qcmlvcml0eShwcmlvcml0eSksIG1IYXNDb250cm9sKGZhbHNlKSwgbUVuYWJsZWQoZmFsc2UpLCBtRGlzY29ubmVjdGVkKGZhbHNlKQorICAgIG1Qcmlvcml0eShwcmlvcml0eSksIG1IYXNDb250cm9sKGZhbHNlKSwgbUVuYWJsZWQoZmFsc2UpLCBtRGlzY29ubmVjdGVkKGZhbHNlKSwKKyAgICBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkKG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IgJXAgY2xpZW50ICVwIiwgdGhpcywgY2xpZW50LmdldCgpKTsKIApAQCAtMTczNyw2ICsxNzUzLDQ3IEBACiAgICAgZGlzY29ubmVjdChmYWxzZSk7CiB9CiAKKy8vIENyZWF0ZXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBCaW5kZXIgY29kZSB0byBuYW1lIGZvciBJRWZmZWN0LgorI2RlZmluZSBJRUZGRUNUX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVCBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGVuYWJsZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShkaXNhYmxlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNvbW1hbmQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZGlzY29ubmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRDYmxrKSBcCisKKy8vIHNpbmdsZXRvbiBmb3IgQmluZGVyIE1ldGhvZCBTdGF0aXN0aWNzIGZvciBJRWZmZWN0CittZWRpYXV0aWxzOjpNZXRob2RTdGF0aXN0aWNzPGludD4mIGdldElFZmZlY3RTdGF0aXN0aWNzKCkgeworICAgIHVzaW5nIENvZGUgPSBpbnQ7CisKKyNwcmFnbWEgcHVzaF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisjdW5kZWYgQklOREVSX01FVEhPRF9FTlRSWQorI2RlZmluZSBCSU5ERVJfTUVUSE9EX0VOVFJZKEVOVFJZKSBcCisgICAgICAgIHsoQ29kZSltZWRpYTo6Qm5FZmZlY3Q6OlRSQU5TQUNUSU9OXyMjRU5UUlksICNFTlRSWX0sCisKKyAgICBzdGF0aWMgbWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxDb2RlPiBtZXRob2RTdGF0aXN0aWNzeworICAgICAgICBJRUZGRUNUX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAorICAgICAgICBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDb2RlKQorICAgIH07CisjcHJhZ21hIHBvcF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisKKyAgICByZXR1cm4gbWV0aG9kU3RhdGlzdGljczsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6Om9uVHJhbnNhY3QoCisgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtZXRob2ROYW1lID0gZ2V0SUVmZmVjdFN0YXRpc3RpY3MoKS5nZXRNZXRob2RGb3JDb2RlKGNvZGUpOworICAgIG1lZGlhdXRpbHM6OlRpbWVDaGVjayBjaGVjaygKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJJRWZmZWN0OjoiKS5hcHBlbmQobWV0aG9kTmFtZSksCisgICAgICAgICAgICBbY29kZV0oYm9vbCB0aW1lb3V0LCBmbG9hdCBlbGFwc2VkTXMpIHsKKyAgICAgICAgaWYgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIDsgLy8gd2UgZG9uJ3QgdGltZW91dCByaWdodCBub3cgb24gdGhlIGVmZmVjdCBpbnRlcmZhY2UuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRJRWZmZWN0U3RhdGlzdGljcygpLmV2ZW50KGNvZGUsIGVsYXBzZWRNcyk7CisgICAgICAgIH0KKyAgICB9LCAwIC8qIHRpbWVvdXRNcyAqLyk7CisgICAgcmV0dXJuIEJuRWZmZWN0OjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjppbml0Q2hlY2soKQogewogICAgIHJldHVybiBtQ2xpZW50ID09IDAgfHwgbUNibGtNZW1vcnkgIT0gMCA/IE9LIDogTk9fTUVNT1JZOwpAQCAtMjAyMCw2ICsyMDc3LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMpIGNvbnN0Cit7CisgICAgaWYgKG1FZmZlY3RDbGllbnQgIT0gMCAmJiBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkKSB7CisgICAgICAgIG1FZmZlY3RDbGllbnQtPmZyYW1lc1Byb2Nlc3NlZChmcmFtZXMpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwpAQCAtMjA0OCwxMSArMjExMiwxMSBAQAogICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpLAogICAgICAgbUVmZmVjdENhbGxiYWNrKG5ldyBFZmZlY3RDYWxsYmFjayh3cDxFZmZlY3RDaGFpbj4odGhpcyksIHRocmVhZCkpCiB7Ci0gICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CiAgICAgc3A8VGhyZWFkQmFzZT4gcCA9IHRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHAgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG1TdHJhdGVneSA9IHAtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CiAgICAgbU1heFRhaWxCdWZmZXJzID0gKChrUHJvY2Vzc1RhaWxEdXJhdGlvbk1zICogcC0+c2FtcGxlUmF0ZSgpKSAvIDEwMDApIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmZyYW1lQ291bnQoKTsKIH0KQEAgLTIxMjUsOCArMjE4OSw4IEBACiAgICAgaWYgKG1JbkJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEVGRkVDVF9CVUZGRVJfRk9STUFUKSAqIG1FZmZlY3RDYWxsYmFjay0+Y2hhbm5lbENvdW50KCk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoRUZGRUNUX0JVRkZFUl9GT1JNQVQpCisgICAgICAgICAgICAqIG1FZmZlY3RDYWxsYmFjay0+aW5DaGFubmVsQ291bnQobUVmZmVjdHNbMF0tPmlkKCkpOwogCiAgICAgbWVtc2V0KG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3LCAwLCBtRWZmZWN0Q2FsbGJhY2stPmZyYW1lQ291bnQoKSAqIGZyYW1lU2l6ZSk7CiAgICAgbUluQnVmZmVyLT5jb21taXQoKTsKQEAgLTIyMTIsMTEgKzIyNzYsOSBAQAogLy8gYWRkRWZmZWN0X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGFuZCBFZmZlY3RDaGFpbjo6bUxvY2sgaGVsZAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6YWRkRWZmZWN0X2xsKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKIHsKLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3QtPmRlc2MoKTsKLSAgICB1aW50MzJfdCBpbnNlcnRQcmVmID0gZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOwotCiAgICAgZWZmZWN0LT5zZXRDYWxsYmFjayhtRWZmZWN0Q2FsbGJhY2spOwogCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0LT5kZXNjKCk7CiAgICAgaWYgKChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAvLyBBdXhpbGlhcnkgZWZmZWN0cyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBtRWZmZWN0cyB2ZWN0b3IgYXMKICAgICAgICAgLy8gdGhleSBhcmUgcHJvY2Vzc2VkIGZpcnN0IGFuZCBhY2N1bXVsYXRlZCBpbiBjaGFpbiBpbnB1dCBidWZmZXIKQEAgLTIyMzYsOTcgKzIyOTgsMTM5IEBACiAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQzMl90KSwgJmhhbEJ1ZmZlcik7CiAjZW5kaWYKICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICBlZmZlY3QtPmNvbmZpZ3VyZSgpOworCiAgICAgICAgIGVmZmVjdC0+c2V0SW5CdWZmZXIoaGFsQnVmZmVyKTsKICAgICAgICAgLy8gYXV4aWxpYXJ5IGVmZmVjdHMgb3V0cHV0IHNhbXBsZXMgdG8gY2hhaW4gaW5wdXQgYnVmZmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKICAgICAgICAgLy8gYnkgaW5zZXJ0IGVmZmVjdHMKICAgICAgICAgZWZmZWN0LT5zZXRPdXRCdWZmZXIobUluQnVmZmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBJbnNlcnQgZWZmZWN0cyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBtRWZmZWN0cyB2ZWN0b3IgYXMgdGhleSBhcmUgcHJvY2Vzc2VkCi0gICAgICAgIC8vICBhZnRlciB0cmFjayBhbmQgYXV4aWxpYXJ5IGVmZmVjdHMuCi0gICAgICAgIC8vIEluc2VydCBlZmZlY3Qgb3JkZXIgYXMgYSBmdW5jdGlvbiBvZiBpbmRpY2F0ZWQgcHJlZmVyZW5jZToKLSAgICAgICAgLy8gIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUsIGluc2VydCBpbiBmaXJzdCBwb3NpdGlvbiBvciByZWplY3QgaWYKLSAgICAgICAgLy8gIGFub3RoZXIgZWZmZWN0IGlzIHByZXNlbnQKLSAgICAgICAgLy8gIGVsc2UgaWYgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNULCBpbnNlcnQgaW4gZmlyc3QgcG9zaXRpb24gb3IgYWZ0ZXIgdGhlCi0gICAgICAgIC8vICBsYXN0IGVmZmVjdCBjbGFpbWluZyBmaXJzdCBwb3NpdGlvbgotICAgICAgICAvLyAgZWxzZSBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCwgaW5zZXJ0IGluIGxhc3QgcG9zaXRpb24gb3IgYmVmb3JlIHRoZQotICAgICAgICAvLyAgZmlyc3QgZWZmZWN0IGNsYWltaW5nIGxhc3QgcG9zaXRpb24KLSAgICAgICAgLy8gIGVsc2UgaWYgRUZGRUNUX0ZMQUdfSU5TRVJUX0FOWSBpbnNlcnQgYWZ0ZXIgZmlyc3Qgb3IgYmVmb3JlIGxhc3QKLSAgICAgICAgLy8gUmVqZWN0IGluc2VydGlvbiBpZiBhbiBlZmZlY3Qgd2l0aCBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFIGlzCi0gICAgICAgIC8vIGFscmVhZHkgcHJlc2VudAotCi0gICAgICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOwotICAgICAgICBzaXplX3QgaWR4X2luc2VydCA9IHNpemU7Ci0gICAgICAgIHNzaXplX3QgaWR4X2luc2VydF9maXJzdCA9IC0xOwotICAgICAgICBzc2l6ZV90IGlkeF9pbnNlcnRfbGFzdCA9IC0xOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQgPSBtRWZmZWN0c1tpXS0+ZGVzYygpOwotICAgICAgICAgICAgdWludDMyX3QgaU1vZGUgPSBkLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLOwotICAgICAgICAgICAgdWludDMyX3QgaVByZWYgPSBkLmZsYWdzICYgRUZGRUNUX0ZMQUdfSU5TRVJUX01BU0s7Ci0gICAgICAgICAgICBpZiAoaU1vZGUgPT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQpIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpbnZhbGlkIGVmZmVjdCBjaGFpbmluZyBjb21iaW5hdGlvbnMKLSAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0UHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFIHx8Ci0gICAgICAgICAgICAgICAgICAgIGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImFkZEVmZmVjdF9sKCkgY291bGQgbm90IGluc2VydCBlZmZlY3QgJXM6IGV4Y2x1c2l2ZSBjb25mbGljdCB3aXRoICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLm5hbWUsIGQubmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgcG9zaXRpb24gb2YgZmlyc3QgaW5zZXJ0IGVmZmVjdCBhbmQgYnkgZGVmYXVsdAotICAgICAgICAgICAgICAgIC8vIHNlbGVjdCB0aGlzIGFzIGluc2VydCBwb3NpdGlvbiBmb3IgbmV3IGVmZmVjdAotICAgICAgICAgICAgICAgIGlmIChpZHhfaW5zZXJ0ID09IHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHBvc2l0aW9uIG9mIGxhc3QgaW5zZXJ0IGVmZmVjdCBjbGFpbWluZwotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCkgewotICAgICAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0X2ZpcnN0ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgcG9zaXRpb24gb2YgZmlyc3QgaW5zZXJ0IGVmZmVjdCBjbGFpbWluZwotICAgICAgICAgICAgICAgIC8vIGxhc3QgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBpZiAoaVByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgJiYKLSAgICAgICAgICAgICAgICAgICAgaWR4X2luc2VydF9sYXN0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkeF9pbnNlcnRfbGFzdCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBzc2l6ZV90IGlkeF9pbnNlcnQgPSBnZXRJbnNlcnRJbmRleChkZXNjKTsKKyAgICAgICAgaWYgKGlkeF9pbnNlcnQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICAvLyBtb2RpZnkgaWR4X2luc2VydCBmcm9tIGZpcnN0IHBvc2l0aW9uIGlmIG5lZWRlZAotICAgICAgICBpZiAoaW5zZXJ0UHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCkgewotICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnRfbGFzdCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpZHhfaW5zZXJ0X2xhc3Q7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnRfZmlyc3QgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0ID0gaWR4X2luc2VydF9maXJzdCArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhbHdheXMgcmVhZCBzYW1wbGVzIGZyb20gY2hhaW4gaW5wdXQgYnVmZmVyCi0gICAgICAgIGVmZmVjdC0+c2V0SW5CdWZmZXIobUluQnVmZmVyKTsKLQotICAgICAgICAvLyBpZiBsYXN0IGVmZmVjdCBpbiB0aGUgY2hhaW4sIG91dHB1dCBzYW1wbGVzIHRvIGNoYWluCi0gICAgICAgIC8vIG91dHB1dCBidWZmZXIsIG90aGVyd2lzZSB0byBjaGFpbiBpbnB1dCBidWZmZXIKLSAgICAgICAgaWYgKGlkeF9pbnNlcnQgPT0gc2l6ZSkgewotICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnQgIT0gMCkgewotICAgICAgICAgICAgICAgIG1FZmZlY3RzW2lkeF9pbnNlcnQtMV0tPnNldE91dEJ1ZmZlcihtSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIG1FZmZlY3RzW2lkeF9pbnNlcnQtMV0tPmNvbmZpZ3VyZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWZmZWN0LT5zZXRPdXRCdWZmZXIobU91dEJ1ZmZlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtSW5CdWZmZXIpOwotICAgICAgICB9CisgICAgICAgIHNpemVfdCBwcmV2aW91c1NpemUgPSBtRWZmZWN0cy5zaXplKCk7CiAgICAgICAgIG1FZmZlY3RzLmluc2VydEF0KGVmZmVjdCwgaWR4X2luc2VydCk7CiAKLSAgICAgICAgQUxPR1YoImFkZEVmZmVjdF9sKCkgZWZmZWN0ICVwLCBhZGRlZCBpbiBjaGFpbiAlcCBhdCByYW5rICV6dSIsIGVmZmVjdC5nZXQoKSwgdGhpcywKLSAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0KTsKKyAgICAgICAgZWZmZWN0LT5jb25maWd1cmUoKTsKKworICAgICAgICAvLyAtIEJ5IGRlZmF1bHQ6CisgICAgICAgIC8vICAgQWxsIGVmZmVjdHMgcmVhZCBzYW1wbGVzIGZyb20gY2hhaW4gaW5wdXQgYnVmZmVyLgorICAgICAgICAvLyAgIFRoZSBsYXN0IGVmZmVjdCBpbiB0aGUgY2hhaW4sIHdyaXRlcyBzYW1wbGVzIHRvIGNoYWluIG91dHB1dCBidWZmZXIsCisgICAgICAgIC8vICAgb3RoZXJ3aXNlIHRvIGNoYWluIGlucHV0IGJ1ZmZlcgorICAgICAgICAvLyAtIEluIHRoZSBPVVRQVVRfU1RBR0UgY2hhaW4gb2YgYSBzcGF0aWFsaXplciBtaXhlciB0aHJlYWQ6CisgICAgICAgIC8vICAgVGhlIHNwYXRpYWxpemVyIGVmZmVjdCAoZmlyc3QgZWZmZWN0KSByZWFkcyBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAgICAgICAvLyAgIGFuZCB3cml0ZXMgc2FtcGxlcyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgLy8gICBBbGwgb3RoZXIgZWZmZWN0cyByZWFkIGFuZCB3cml0ZXMgc2FtcGxlcyB0byB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICBpZiAobUVmZmVjdENhbGxiYWNrLT5pc1NwYXRpYWxpemVyKCkKKyAgICAgICAgICAgICAgICAmJiBtU2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CisgICAgICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChpZHhfaW5zZXJ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbMV0tPmNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1sxXS0+c2V0SW5CdWZmZXIobU91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzWzFdLT51cGRhdGVBY2Nlc3NNb2RlKCk7ICAgICAgLy8gcmVjb25maWcgaWYgbmVlZWRlZC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcihtSW5CdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPnNldEluQnVmZmVyKG1PdXRCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcihtSW5CdWZmZXIpOworICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnQgPT0gcHJldmlvdXNTaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpZHhfaW5zZXJ0LTFdLT5jb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzW2lkeF9pbnNlcnQgLSAxXS0+dXBkYXRlQWNjZXNzTW9kZSgpOyAgICAgIC8vIHJlY29uZmlnIGlmIG5lZWVkZWQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1PdXRCdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtSW5CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlcyBlZmZlY3QgJXAsIGFkZGVkIGluIGNoYWluICVwIGF0IHJhbmsgJXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZWZmZWN0LmdldCgpLCB0aGlzLCBpZHhfaW5zZXJ0KTsKICAgICB9CiAgICAgZWZmZWN0LT5jb25maWd1cmUoKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpnZXRJbnNlcnRJbmRleChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBkZXNjKSB7CisgICAgLy8gSW5zZXJ0IGVmZmVjdHMgYXJlIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgbUVmZmVjdHMgdmVjdG9yIGFzIHRoZXkgYXJlIHByb2Nlc3NlZAorICAgIC8vICBhZnRlciB0cmFjayBhbmQgYXV4aWxpYXJ5IGVmZmVjdHMuCisgICAgLy8gSW5zZXJ0IGVmZmVjdCBvcmRlciBhcyBhIGZ1bmN0aW9uIG9mIGluZGljYXRlZCBwcmVmZXJlbmNlOgorICAgIC8vICBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFLCBpbnNlcnQgaW4gZmlyc3QgcG9zaXRpb24gb3IgcmVqZWN0IGlmCisgICAgLy8gIGFub3RoZXIgZWZmZWN0IGlzIHByZXNlbnQKKyAgICAvLyAgZWxzZSBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsIGluc2VydCBpbiBmaXJzdCBwb3NpdGlvbiBvciBhZnRlciB0aGUKKyAgICAvLyAgbGFzdCBlZmZlY3QgY2xhaW1pbmcgZmlyc3QgcG9zaXRpb24KKyAgICAvLyAgZWxzZSBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCwgaW5zZXJ0IGluIGxhc3QgcG9zaXRpb24gb3IgYmVmb3JlIHRoZQorICAgIC8vICBmaXJzdCBlZmZlY3QgY2xhaW1pbmcgbGFzdCBwb3NpdGlvbgorICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9BTlkgaW5zZXJ0IGFmdGVyIGZpcnN0IG9yIGJlZm9yZSBsYXN0CisgICAgLy8gUmVqZWN0IGluc2VydGlvbiBpZiBhbiBlZmZlY3Qgd2l0aCBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFIGlzCisgICAgLy8gYWxyZWFkeSBwcmVzZW50CisgICAgLy8gU3BhdGlhbGl6ZXIgb3IgRG93bm1peGVyIGVmZmVjdHMgYXJlIGluc2VydGVkIGluIGZpcnN0IHBvc2l0aW9uIGJlY2F1c2UKKyAgICAvLyB0aGV5IGFkYXB0IHRoZSBjaGFubmVsIGNvdW50IGZvciBhbGwgb3RoZXIgZWZmZWN0cyBpbiB0aGUgY2hhaW4KKyAgICBpZiAoKG1lbWNtcCgmZGVzYy50eXBlLCBGWF9JSURfU1BBVElBTElaRVIsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkKKyAgICAgICAgICAgIHx8IChtZW1jbXAoJmRlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKKyAgICB1aW50MzJfdCBpbnNlcnRQcmVmID0gZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOworICAgIHNzaXplX3QgaWR4X2luc2VydDsKKyAgICBzc2l6ZV90IGlkeF9pbnNlcnRfZmlyc3QgPSAtMTsKKyAgICBzc2l6ZV90IGlkeF9pbnNlcnRfbGFzdCA9IC0xOworCisgICAgaWR4X2luc2VydCA9IHNpemU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkID0gbUVmZmVjdHNbaV0tPmRlc2MoKTsKKyAgICAgICAgdWludDMyX3QgaU1vZGUgPSBkLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLOworICAgICAgICB1aW50MzJfdCBpUHJlZiA9IGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSzsKKyAgICAgICAgaWYgKGlNb2RlID09IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhbGlkIGVmZmVjdCBjaGFpbmluZyBjb21iaW5hdGlvbnMKKyAgICAgICAgICAgIGlmIChpbnNlcnRQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUgfHwKKyAgICAgICAgICAgICAgICBpUHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBpbnNlcnQgZWZmZWN0ICVzOiBleGNsdXNpdmUgY29uZmxpY3Qgd2l0aCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy5uYW1lLCBkLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlbWVtYmVyIHBvc2l0aW9uIG9mIGZpcnN0IGluc2VydCBlZmZlY3QgYW5kIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIC8vIHNlbGVjdCB0aGlzIGFzIGluc2VydCBwb3NpdGlvbiBmb3IgbmV3IGVmZmVjdAorICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnQgPT0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVtZW1iZXIgcG9zaXRpb24gb2YgbGFzdCBpbnNlcnQgZWZmZWN0IGNsYWltaW5nCisgICAgICAgICAgICAvLyBmaXJzdCBwb3NpdGlvbgorICAgICAgICAgICAgaWYgKGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCkgeworICAgICAgICAgICAgICAgIGlkeF9pbnNlcnRfZmlyc3QgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVtZW1iZXIgcG9zaXRpb24gb2YgZmlyc3QgaW5zZXJ0IGVmZmVjdCBjbGFpbWluZworICAgICAgICAgICAgLy8gbGFzdCBwb3NpdGlvbgorICAgICAgICAgICAgaWYgKGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICYmCisgICAgICAgICAgICAgICAgaWR4X2luc2VydF9sYXN0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydF9sYXN0ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG1vZGlmeSBpZHhfaW5zZXJ0IGZyb20gZmlyc3QgcG9zaXRpb24gaWYgbmVlZGVkCisgICAgaWYgKGluc2VydFByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QpIHsKKyAgICAgICAgaWYgKGlkeF9pbnNlcnRfbGFzdCAhPSAtMSkgeworICAgICAgICAgICAgaWR4X2luc2VydCA9IGlkeF9pbnNlcnRfbGFzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlkeF9pbnNlcnRfZmlyc3QgIT0gLTEpIHsKKyAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpZHhfaW5zZXJ0X2ZpcnN0ICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaWR4X2luc2VydDsKK30KKwogLy8gcmVtb3ZlRWZmZWN0X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHNpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpyZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWxlYXNlKQpAQCAtMjM1MCwxNCArMjQ1NCwyMyBAQAogCiAgICAgICAgICAgICBpZiAodHlwZSAhPSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAgICAgICAgIGlmIChpID09IHNpemUgLSAxICYmIGkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpIC0gMV0tPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaSAtIDFdLT5jb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaSAtIDFdLT5zZXRPdXRCdWZmZXIobU91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzW2kgLSAxXS0+dXBkYXRlQWNjZXNzTW9kZSgpOyAgICAgIC8vIHJlY29uZmlnIGlmIG5lZWVkZWQuCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUVmZmVjdHMucmVtb3ZlQXQoaSk7CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgaW5wdXQgYnVmZmVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBuZXcgZmlyc3QgZWZmZWN0IGluIHRoZSBjaGFpbgorICAgICAgICAgICAgLy8gaXMgdXBkYXRlZCBpZiBuZWVkZWQgKGNhbiBzd2l0Y2ggZnJvbSBIQUwgY2hhbm5lbCBtYXNrIHRvIG1peGVyIGNoYW5uZWwgbWFzaykKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgc2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0c1swXS0+Y29uZmlndXJlKCk7CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbMF0tPnNldEluQnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbMF0tPnVwZGF0ZUFjY2Vzc01vZGUoKTsgICAgICAvLyByZWNvbmZpZyBpZiBuZWVlZGVkLgorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBBTE9HVigicmVtb3ZlRWZmZWN0X2woKSBlZmZlY3QgJXAsIHJlbW92ZWQgZnJvbSBjaGFpbiAlcCBhdCByYW5rICV6dSIsIGVmZmVjdC5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgdGhpcywgaSk7Ci0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjkwMSwyNyArMzAxNCwyNiBAQAogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjppc09mZmxvYWQoKSBjb25zdCB7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKLSAgICBpZiAodCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEOworICAgIHJldHVybiBtVGhyZWFkVHlwZSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjppc09mZmxvYWRPckRpcmVjdCgpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwotICAgIGlmICh0ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQgfHwgdC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVDsKKyAgICByZXR1cm4gbVRocmVhZFR5cGUgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCB8fCBtVGhyZWFkVHlwZSA9PSBUaHJlYWRCYXNlOjpESVJFQ1Q7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZE9yTW1hcCgpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwotICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICBzd2l0Y2ggKG1UaHJlYWRUeXBlKSB7CisgICAgY2FzZSBUaHJlYWRCYXNlOjpPRkZMT0FEOgorICAgIGNhc2UgVGhyZWFkQmFzZTo6TU1BUF9QTEFZQkFDSzoKKyAgICBjYXNlIFRocmVhZEJhc2U6Ok1NQVBfQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gdC0+aXNPZmZsb2FkT3JNbWFwKCk7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzU3BhdGlhbGl6ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6OlNQQVRJQUxJWkVSOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTI5MzIsMjAgKzMwNDQsNjggQEAKICAgICByZXR1cm4gdC0+c2FtcGxlUmF0ZSgpOwogfQogCi1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6Y2hhbm5lbE1hc2soKSBjb25zdCB7CithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aW5DaGFubmVsTWFzayhpbnQgaWQpIGNvbnN0IHsKICAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICB9Ci0gICAgcmV0dXJuIHQtPmNoYW5uZWxNYXNrKCk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGMgPSBjaGFpbigpLnByb21vdGUoKTsKKyAgICBpZiAoYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorCisgICAgaWYgKG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6OlNQQVRJQUxJWkVSKSB7CisgICAgICAgIGlmIChjLT5zZXNzaW9uSWQoKSA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgeworICAgICAgICAgICAgaWYgKGMtPmlzRmlyc3RFZmZlY3QoaWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQtPm1peGVyQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQtPmNoYW5uZWxNYXNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKGMtPnNlc3Npb25JZCgpKSkgeworICAgICAgICAgICAgaWYgKCh0LT5oYXNBdWRpb1Nlc3Npb25fbChjLT5zZXNzaW9uSWQoKSkgJiBUaHJlYWRCYXNlOjpTUEFUSUFMSVpFRF9TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQtPm1peGVyQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQtPmNoYW5uZWxNYXNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0LT5jaGFubmVsTWFzaygpOworICAgIH0KIH0KIAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmNoYW5uZWxDb3VudCgpIGNvbnN0IHsKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjppbkNoYW5uZWxDb3VudChpbnQgaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGluQ2hhbm5lbE1hc2soaWQpKTsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6Om91dENoYW5uZWxNYXNrKCkgY29uc3QgewogICAgIHNwPFRocmVhZEJhc2U+IHQgPSB0aHJlYWQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICB9Ci0gICAgcmV0dXJuIHQtPmNoYW5uZWxDb3VudCgpOworICAgIHNwPEVmZmVjdENoYWluPiBjID0gY2hhaW4oKS5wcm9tb3RlKCk7CisgICAgaWYgKGMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKworICAgIGlmIChtVGhyZWFkVHlwZSA9PSBUaHJlYWRCYXNlOjpTUEFUSUFMSVpFUikgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKGMtPnNlc3Npb25JZCgpKSkgeworICAgICAgICAgICAgaWYgKCh0LT5oYXNBdWRpb1Nlc3Npb25fbChjLT5zZXNzaW9uSWQoKSkgJiBUaHJlYWRCYXNlOjpTUEFUSUFMSVpFRF9TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQtPm1peGVyQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQtPmNoYW5uZWxNYXNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0LT5jaGFubmVsTWFzaygpOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6Om91dENoYW5uZWxDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dENoYW5uZWxNYXNrKCkpOwogfQogCiBhdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCB7CkBAIC0zMTQzLDcgKzMzMDMsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1IYWxFZmZlY3QtPnNldERldmljZXMoe21EZXZpY2V9KTsKICAgICAgICAgfQotICAgICAgICAqaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShtSGFsRWZmZWN0LCBudWxscHRyLCBudWxscHRyLCAwIC8qcHJpb3JpdHkqLyk7CisgICAgICAgIG1IYWxFZmZlY3QtPmNvbmZpZ3VyZSgpOworCisgICAgICAgICpoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKG1IYWxFZmZlY3QsIG51bGxwdHIsIG51bGxwdHIsIDAgLypwcmlvcml0eSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgc3RhdHVzID0gKCpoYW5kbGUpLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgc3RhdHVzID0gbUhhbEVmZmVjdC0+YWRkSGFuZGxlKCgqaGFuZGxlKS5nZXQoKSk7CkBAIC0zMTY5LDcgKzMzMzIsOCBAQAogICAgICAgICBpbnQgZW5hYmxlZDsKICAgICAgICAgKmhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2wobnVsbHB0ciwgbnVsbHB0ciwgMCwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8ZWZmZWN0X2Rlc2NyaXB0b3JfdCAqPigmbURlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCwgJnN0YXR1cywgZmFsc2UsIGZhbHNlIC8qcHJvYmUqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkLCAmc3RhdHVzLCBmYWxzZSwgZmFsc2UgLypwcm9iZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgQUxPR1YoIiVzIHRocmVhZC0+Y3JlYXRlRWZmZWN0X2wgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMzE4OSw4ICszMzUzLDE0IEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6b25SZWxlYXNlUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVByb3h5TG9jayk7Ci0gICAgbUVmZmVjdEhhbmRsZXMuZXJhc2UocGF0Y2hIYW5kbGUpOworICAgIHNwPEVmZmVjdEhhbmRsZT4gZWZmZWN0OworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Qcm94eUxvY2spOworICAgICAgICBpZiAobUVmZmVjdEhhbmRsZXMuZmluZChwYXRjaEhhbmRsZSkgIT0gbUVmZmVjdEhhbmRsZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IG1FZmZlY3RIYW5kbGVzLmF0KHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIG1FZmZlY3RIYW5kbGVzLmVyYXNlKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC0zMTk4LDYgKzMzNjgsNyBAQAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtUHJveHlMb2NrKTsKICAgICBpZiAoZWZmZWN0ID09IG1IYWxFZmZlY3QpIHsKKyAgICAgICAgbUhhbEVmZmVjdC0+cmVsZWFzZV9sKCk7CiAgICAgICAgIG1IYWxFZmZlY3QuY2xlYXIoKTsKICAgICAgICAgbURldmljZVBvcnQuaWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIH0KQEAgLTMzNDUsNyArMzUxNiw3IEBACiAgICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBwcm94eS0+YWRkRWZmZWN0VG9IYWwoZWZmZWN0KTsKKyAgICByZXR1cm4gcHJveHktPnJlbW92ZUVmZmVjdEZyb21IYWwoZWZmZWN0KTsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjppc091dHB1dCgpIGNvbnN0IHsKQEAgLTMzNjQsNyArMzUzNSw4IEBACiAgICAgcmV0dXJuIHByb3h5LT5zYW1wbGVSYXRlKCk7CiB9CiAKLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6OmNoYW5uZWxNYXNrKCkgY29uc3QgeworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6aW5DaGFubmVsTWFzaygKKyAgICAgICAgaW50IGlkIF9fdW51c2VkKSBjb25zdCB7CiAgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IHByb3h5ID0gbVByb3h5LnByb21vdGUoKTsKICAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwpAQCAtMzM3Miw3ICszNTQ0LDcgQEAKICAgICByZXR1cm4gcHJveHktPmNoYW5uZWxNYXNrKCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6OmNoYW5uZWxDb3VudCgpIGNvbnN0IHsKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6OmluQ2hhbm5lbENvdW50KGludCBpZCBfX3VudXNlZCkgY29uc3QgewogICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBwcm94eSA9IG1Qcm94eS5wcm9tb3RlKCk7CiAgICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIDI7CkBAIC0zMzgwLDQgKzM1NTIsMzggQEAKICAgICByZXR1cm4gcHJveHktPmNoYW5uZWxDb3VudCgpOwogfQogCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpvdXRDaGFubmVsTWFzaygpIGNvbnN0IHsKKyAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gcHJveHkgPSBtUHJveHkucHJvbW90ZSgpOworICAgIGlmIChwcm94eSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgfQorICAgIHJldHVybiBwcm94eS0+Y2hhbm5lbE1hc2soKTsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6b3V0Q2hhbm5lbENvdW50KCkgY29uc3QgeworICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBwcm94eSA9IG1Qcm94eS5wcm9tb3RlKCk7CisgICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiBwcm94eS0+Y2hhbm5lbENvdW50KCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6b25FZmZlY3RFbmFibGUoCisgICAgICAgIGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3RCYXNlKSB7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBlZmZlY3RCYXNlLT5hc0VmZmVjdE1vZHVsZSgpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVmZmVjdC0+c3RhcnQoKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpvbkVmZmVjdERpc2FibGUoCisgICAgICAgIGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3RCYXNlKSB7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBlZmZlY3RCYXNlLT5hc0VmZmVjdE1vZHVsZSgpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVmZmVjdC0+c3RvcCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCBhNzI3ZTA0Li40MjYxNGNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTMzLDkgKzMzLDEyIEBACiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkT3JEaXJlY3QoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZE9yTW1hcCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTcGF0aWFsaXplcigpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2soaW50IGlkKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBpbkNoYW5uZWxDb3VudChpbnQgaWQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0ID0gMDsKIApAQCAtNjQsNiArNjcsOCBAQAogICAgIHZpcnR1YWwgdm9pZCByZXNldFZvbHVtZSgpID0gMDsKIAogICAgIHZpcnR1YWwgd3A8RWZmZWN0Q2hhaW4+IGNoYWluKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBib29sIGlzQXVkaW9Qb2xpY3lSZWFkeSgpIGNvbnN0ID0gMDsKIH07CiAKIC8vIEVmZmVjdEJhc2UoRWZmZWN0TW9kdWxlKSBhbmQgRWZmZWN0Q2hhaW4gY2xhc3NlcyBib3RoIGhhdmUgdGhlaXIgb3duIG11dGV4IHRvIHByb3RlY3QKQEAgLTE2NCw2ICsxNjksMTYgQEAKIAogICAgIHZvaWQgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCitwcm90ZWN0ZWQ6CisgICAgYm9vbCAgICAgICAgICAgICBpc0ludGVybmFsX2woKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGhhbmRsZSA6IG1IYW5kbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+Y2xpZW50KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBtSGFuZGxlcwogICAgIGJvb2wgICAgICAgICAgICAgbVBpbm5lZCA9IGZhbHNlOwpAQCAtMjQwLDYgKzI1NSwxMyBAQAogICAgICAgICByZXR1cm4gbU91dEJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obU91dEJ1ZmZlci0+cHRyKCkpIDogTlVMTDsKICAgICB9CiAKKyAgICAvLyBVcGRhdGVzIHRoZSBhY2Nlc3MgbW9kZSBpZiBpdCBpcyBvdXQgb2YgZGF0ZS4gIE1heSBpc3N1ZSBhIG5ldyBlZmZlY3QgY29uZmlndXJlLgorICAgIHZvaWQgICAgICAgIHVwZGF0ZUFjY2Vzc01vZGUoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEVmZmVjdEJ1ZmZlckFjY2Vzc01vZGUoKSAhPSBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgIHN0YXR1c190ICAgICAgICAgc2V0RGV2aWNlcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldElucHV0RGV2aWNlKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRWb2x1bWUodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCwgYm9vbCBjb250cm9sbGVyKTsKQEAgLTI1OSw3ICsyODEsNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgaXNIYXB0aWNHZW5lcmF0b3IoKSBjb25zdDsKIAogICAgIHN0YXR1c190ICAgICAgICAgc2V0SGFwdGljSW50ZW5zaXR5KGludCBpZCwgaW50IGludGVuc2l0eSk7Ci0gICAgc3RhdHVzX3QgICAgICAgICBzZXRWaWJyYXRvckluZm8oY29uc3QgbWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvKiB2aWJyYXRvckluZm8pOworICAgIHN0YXR1c190ICAgICAgICAgc2V0VmlicmF0b3JJbmZvKGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyYgdmlicmF0b3JJbmZvKTsKIAogICAgIHZvaWQgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0yNzUsNiArMjk3LDExIEBACiAgICAgc3RhdHVzX3Qgc3RvcF9sKCk7CiAgICAgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0RnJvbUhhbF9sKCk7CiAgICAgc3RhdHVzX3Qgc2VuZFNldEF1ZGlvRGV2aWNlc0NvbW1hbmQoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcywgdWludDMyX3QgY21kQ29kZSk7CisgICAgZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSByZXF1aXJlZEVmZmVjdEJ1ZmZlckFjY2Vzc01vZGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdworICAgICAgICAgICAgICAgID8gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgOiBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIH0KKwogCiAgICAgZWZmZWN0X2NvbmZpZ190ICAgICBtQ29uZmlnOyAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGF1ZGlvIGNvbmZpZ3VyYXRpb24KICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IG1FZmZlY3RJbnRlcmZhY2U7IC8vIEVmZmVjdCBtb2R1bGUgSEFMCkBAIC0zMjcsOCArMzU0LDEwIEBACiAgICAgRWZmZWN0SGFuZGxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QsCiAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAotICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSk7CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LCBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7CiAgICAgdmlydHVhbCB+RWZmZWN0SGFuZGxlKCk7CisgICAgc3RhdHVzX3Qgb25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAKICAgICAvLyBJRWZmZWN0CkBAIC0zNDIsNiArMzcxLDggQEAKICAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CiAgICAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZ2V0Q2JsayhtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAorICAgIHNwPENsaWVudD4gY2xpZW50KCkgY29uc3QgeyByZXR1cm4gbUNsaWVudDsgfQorCiBwcml2YXRlOgogICAgIHZvaWQgZGlzY29ubmVjdChib29sIHVucGluSWZMYXN0KTsKIApAQCAtMzU2LDYgKzM4Nyw4IEBACiAgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAgICAgYm9vbCBlbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbUVuYWJsZWQ7IH0KIAorICAgIHZvaWQgZnJhbWVzUHJvY2Vzc2VkKGludDMyX3QgZnJhbWVzKSBjb25zdDsKKwogICAgIC8vIEdldHRlcnMKICAgICB3cDxFZmZlY3RCYXNlPiBlZmZlY3QoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0OyB9CiAgICAgaW50IGlkKCkgY29uc3QgewpAQCAtMzg5LDYgKzQyMiw4IEBACiAgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZWQgZW5hYmxlIHN0YXRlOiBuZWVkZWQgd2hlbiB0aGUgZWZmZWN0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlZCBhZnRlciBiZWluZyBzdXNwZW5kZWQKICAgICBib29sIG1EaXNjb25uZWN0ZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0byB0cnVlIGJ5IGRpc2Nvbm5lY3QoKQorICAgIGNvbnN0IGJvb2wgbU5vdGlmeUZyYW1lc1Byb2Nlc3NlZDsgICAgICAgLy8gdHJ1ZSBpZiB0aGUgY2xpZW50IGNhbGxiYWNrIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFVkVOVF9GUkFNRVNfUFJPQ0VTU0VEIG11c3QgYmUgZ2VuZXJhdGVkCiB9OwogCiAvLyB0aGUgRWZmZWN0Q2hhaW4gY2xhc3MgcmVwcmVzZW50cyBhIGdyb3VwIG9mIGVmZmVjdHMgYXNzb2NpYXRlZCB0byBvbmUgYXVkaW8gc2Vzc2lvbi4KQEAgLTUxMSw2ICs1NDYsOCBAQAogICAgIHNwPEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlPiBlZmZlY3RDYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RDYWxsYmFjazsgfQogICAgIHdwPFRocmVhZEJhc2U+IHRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RDYWxsYmFjay0+dGhyZWFkKCk7IH0KIAorICAgIGJvb2wgaXNGaXJzdEVmZmVjdChpbnQgaWQpIGNvbnN0IHsgcmV0dXJuICFtRWZmZWN0cy5pc0VtcHR5KCkgJiYgaWQgPT0gbUVmZmVjdHNbMF0tPmlkKCk7IH0KKwogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgpAQCAtNTMwLDYgKzU2NywxMiBAQAogICAgICAgICAgICAgOiBtQ2hhaW4ob3duZXIpCiAgICAgICAgICAgICAsIG1UaHJlYWQodGhyZWFkKQogICAgICAgICAgICAgLCBtQXVkaW9GbGluZ2VyKCpnQXVkaW9GbGluZ2VyKSB7CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiBiYXNlID0gdGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChiYXNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtVGhyZWFkVHlwZSA9IGJhc2UtPnR5cGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRocmVhZFR5cGUgPSBUaHJlYWRCYXNlOjpNSVhFUjsgIC8vIGFzc3VyZSBhIGNvbnNpc3RlbnQgdmFsdWUuCisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBjcmVhdGVFZmZlY3RIYWwoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCkBAIC01NDIsMTAgKzU4NSwxMyBAQAogICAgICAgICBib29sIGlzT2ZmbG9hZCgpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICBib29sIGlzT2ZmbG9hZE9yRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplcigpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2soaW50IGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdWludDMyX3QgaW5DaGFubmVsQ291bnQoaW50IGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdCBvdmVycmlkZTsKQEAgLTU2NiwxNiArNjEyLDIyIEBACiAKICAgICAgICAgd3A8RWZmZWN0Q2hhaW4+IGNoYWluKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUNoYWluOyB9CiAKKyAgICAgICAgYm9vbCBpc0F1ZGlvUG9saWN5UmVhZHkoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci5pc0F1ZGlvUG9saWN5UmVhZHkoKTsKKyAgICAgICAgfQorCiAgICAgICAgIHdwPFRocmVhZEJhc2U+IHRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQubG9hZCgpOyB9CiAKLSAgICAgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCkgeworICAgICAgICB2b2lkIHNldFRocmVhZChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKSB7CiAgICAgICAgICAgICBtVGhyZWFkID0gdGhyZWFkOworICAgICAgICAgICAgbVRocmVhZFR5cGUgPSB0aHJlYWQtPnR5cGUoKTsKICAgICAgICAgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgd3A8RWZmZWN0Q2hhaW4+IG1DaGFpbjsKICAgICAgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFRocmVhZEJhc2U+IG1UaHJlYWQ7CiAgICAgICAgIEF1ZGlvRmxpbmdlciAmbUF1ZGlvRmxpbmdlcjsgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbDogb3V0ZXIgaW5zdGFuY2UgYWx3YXlzIGV4aXN0cy4KKyAgICAgICAgVGhyZWFkQmFzZTo6dHlwZV90IG1UaHJlYWRUeXBlOwogICAgIH07CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1UaHJlYWQsIG1FZmZlY3RzCkBAIC02MTIsNiArNjY0LDggQEAKIAogICAgIHZvaWQgc2V0Vm9sdW1lRm9yT3V0cHV0X2wodWludDMyX3QgbGVmdCwgdWludDMyX3QgcmlnaHQpOwogCisgICAgc3NpemVfdCBnZXRJbnNlcnRJbmRleChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBkZXNjKTsKKwogICAgIG11dGFibGUgIE11dGV4IG1Mb2NrOyAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAogICAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCiAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uSWQ7IC8vIGF1ZGlvIHNlc3Npb24gSUQKQEAgLTY0MywxMSArNjk3LDExIEBACiBwdWJsaWM6CiAgICAgICAgIERldmljZUVmZmVjdFByb3h5IChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRWZmZWN0TWFuYWdlckNhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgaW50IGlkKQorICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGludCBpZCwgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCiAgICAgICAgICAgICA6IEVmZmVjdEJhc2UoY2FsbGJhY2ssIGRlc2MsIGlkLCBBVURJT19TRVNTSU9OX0RFVklDRSwgZmFsc2UpLAogICAgICAgICAgICAgICAgIG1EZXZpY2UoZGV2aWNlKSwgbU1hbmFnZXJDYWxsYmFjayhjYWxsYmFjayksCi0gICAgICAgICAgICAgICAgbU15Q2FsbGJhY2sobmV3IFByb3h5Q2FsbGJhY2sod3A8RGV2aWNlRWZmZWN0UHJveHk+KHRoaXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSkge30KKyAgICAgICAgICAgICAgICBtTXlDYWxsYmFjayhuZXcgUHJveHlDYWxsYmFjayh3cDxEZXZpY2VFZmZlY3RQcm94eT4odGhpcyksIGNhbGxiYWNrKSksCisgICAgICAgICAgICAgICAgbU5vdGlmeUZyYW1lc1Byb2Nlc3NlZChub3RpZnlGcmFtZXNQcm9jZXNzZWQpIHt9CiAKICAgICBzdGF0dXNfdCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCwgYm9vbCBmcm9tSGFuZGxlKSBvdmVycmlkZTsKICAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gYXNEZXZpY2VFZmZlY3RQcm94eSgpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KQEAgLTY5MiwxMCArNzQ2LDEzIEBACiAgICAgICAgIGJvb2wgaXNPZmZsb2FkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgYm9vbCBpc09mZmxvYWRPckRpcmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrKGludCBpZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHVpbnQzMl90IGluQ2hhbm5lbENvdW50KGludCBpZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHVpbnQzMl90IG91dENoYW5uZWxDb3VudCgpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CiAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gMDsgfQpAQCAtNzExLDExICs3NjgsMTUgQEAKICAgICAgICAgdm9pZCByZXNldFZvbHVtZSgpIG92ZXJyaWRlIHt9CiAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KDApOyB9CiAgICAgICAgIGludDMyX3QgYWN0aXZlVHJhY2tDbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9Ci0gICAgICAgIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KLSAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KKyAgICAgICAgdm9pZCBvbkVmZmVjdEVuYWJsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0IF9fdW51c2VkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgd3A8RWZmZWN0Q2hhaW4+IGNoYWluKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQogCisgICAgICAgIGJvb2wgaXNBdWRpb1BvbGljeVJlYWR5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1NYW5hZ2VyQ2FsbGJhY2stPmlzQXVkaW9Qb2xpY3lSZWFkeSgpOworICAgICAgICB9CisKICAgICAgICAgaW50IG5ld0VmZmVjdElkKCk7CiAKICAgICBwcml2YXRlOgpAQCAtNzM0LDQgKzc5NSw1IEBACiAgICAgc3RkOjptYXA8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEVmZmVjdEhhbmRsZT4+IG1FZmZlY3RIYW5kbGVzOyAvLyBwcm90ZWN0ZWQgYnkgbVByb3h5TG9jawogICAgIHNwPEVmZmVjdE1vZHVsZT4gbUhhbEVmZmVjdDsgLy8gcHJvdGVjdGVkIGJ5IG1Qcm94eUxvY2sKICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbURldmljZVBvcnQgPSB7IC5pZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUgfTsKKyAgICBjb25zdCBib29sIG1Ob3RpZnlGcmFtZXNQcm9jZXNzZWQ7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCA4OGQ0ZWFmLi4yNmJkOTJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtODksNiArODksNyBAQAogICAgIC8vIFRPRE86IEFkZCBjaGFubmVsIG1hc2sgdG8gTkJBSU9fRm9ybWF0LgogICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgogICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBnZXRDaGFubmVsTWFza0Zyb21Db3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobVNpbmtDaGFubmVsTWFzayk7CiAKICAgICB1bnNpZ25lZCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6c01heEZhc3RUcmFja3M7ICsraSkgewpAQCAtMjA0LDYgKzIwNSw4IEBACiAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCk7CiAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6SEFQVElDX0lOVEVOU0lUWSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5KTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpIQVBUSUNfTUFYX0FNUExJVFVERSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSgmKGZhc3RUcmFjay0+bUhhcHRpY01heEFtcGxpdHVkZSkpKTsKIAogICAgICAgICBtTWl4ZXItPmVuYWJsZShpbmRleCk7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAppbmRleCA4NTdkM2RlLi5jZTNjYzE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfU1RBVEVfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfU1RBVEVfSAogCisjaW5jbHVkZSA8bWF0aC5oPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlci5oPgpAQCAtNTEsNiArNTMsNyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uOyAgICAgLy8gaW5jcmVtZW50IHdoZW4gYW55IGZpZWxkIGlzIGFzc2lnbmVkCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOyAvLyBoYXB0aWMgcGxheWJhY2sgaXMgZW5hYmxlZCBvciBub3QKICAgICBvczo6SGFwdGljU2NhbGUgICAgICAgICBtSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFOyAvLyBpbnRlbnNpdHkgb2YgaGFwdGljIGRhdGEKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtSGFwdGljTWF4QW1wbGl0dWRlID0gTkFOOyAvLyBtYXggYW1wbGl0dWRlIGFsbG93ZWQgZm9yIGhhcHRpYyBkYXRhCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwppbmRleCAwMzRkMTYxLi4xN2Q0YzM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKQEAgLTEsNCArMSw0IEBACi1na2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGEzODFjN2QuLjQ1ZGQyNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTI1OCw2ICsyNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpLCBmYWxzZSAvKmNsb3NlVGhyZWFkKi8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtaXhlckNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKQEAgLTI3Niw2ICsyNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWl4ZXJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwpAQCAtNTczLDYgKzU3NSwxMiBAQAogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKKworICAgIC8vIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHN0YXJ0IGFzIHNvb24gYXMgcG9zc2libGUgdG8gaGF2ZSB0aGUgbG93ZXN0IHBvc3NpYmxlIGxhdGVuY3kgZXZlbiBpZgorICAgIC8vIGl0IG1pZ2h0IGdsaXRjaC4KKyAgICAvLyBEaXNhYmxlIHRoaXMgYmVoYXZpb3IgZm9yIEZNIFR1bmVyIHNvdXJjZSBpZiBubyBmYXN0IGNhcHR1cmUvbWl4ZXIgYXZhaWxhYmxlLgorICAgIGNvbnN0IGJvb2wgaXNGbUJyaWRnZSA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlID09IEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUjsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSA9IGlzRm1CcmlkZ2UgJiYgIXVzZVBhc3N0aHJ1UGF0Y2hSZWNvcmQgPyBmcmFtZUNvdW50IC8gNCA6IDE7CiAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IHRlbXBQYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay50aHJlYWQoKS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLApAQCAtNTgyLDcgKzU5MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSAvKnRpbWVvdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50VG9CZVJlYWR5KTsKICAgICBzdGF0dXMgPSBtUGxheWJhY2suY2hlY2tUcmFjayh0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAwOTI5MDU1Li42YTEzOGJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMTksNiArMTksOCBAQAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCisjaW5jbHVkZSA8bWF0aC5oPgorCiAvLyBDaGVja3MgYW5kIG1vbml0b3JzIE9QX1BMQVlfQVVESU8KIGNsYXNzIE9wUGxheUF1ZGlvTW9uaXRvciA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKQEAgLTgwLDcgKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHN0YXJ0IHdoZW4gdGhlcmUgYXJlIGFzIG1hbnkgZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWFkeSBhcyBwb3NzaWJsZSAoYWthLiBCdWZmZXIgaXMgZnVsbCkuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5ID0gU0laRV9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gMS4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkID0gZmFsc2UpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtMTYxLDYgKzE2NCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiogUmV0dXJuIGF0IHdoYXQgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljcywgdXNlZCBpbiBtaXhlci4gKi8KICAgICAgICAgICAgIG9zOjpIYXB0aWNTY2FsZSBnZXRIYXB0aWNJbnRlbnNpdHkoKSBjb25zdCB7IHJldHVybiBtSGFwdGljSW50ZW5zaXR5OyB9CisgICAgICAgICAgICAvKiogUmV0dXJuIHRoZSBtYXhpbXVtIGFtcGxpdHVkZSBhbGxvd2VkIGZvciBoYXB0aWNzIGRhdGEsIHVzZWQgaW4gbWl4ZXIuICovCisgICAgICAgICAgICBmbG9hdCBnZXRIYXB0aWNNYXhBbXBsaXR1ZGUoKSBjb25zdCB7IHJldHVybiBtSGFwdGljTWF4QW1wbGl0dWRlOyB9CiAgICAgICAgICAgICAvKiogU2V0IGludGVuc2l0eSBvZiBoYXB0aWMgcGxheWJhY2ssIHNob3VsZCBiZSBzZXQgYWZ0ZXIgcXVlcnlpbmcgdmlicmF0b3Igc2VydmljZS4gKi8KICAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljSW50ZW5zaXR5KG9zOjpIYXB0aWNTY2FsZSBoYXB0aWNJbnRlbnNpdHkpIHsKICAgICAgICAgICAgICAgICBpZiAob3M6OmlzVmFsaWRIYXB0aWNTY2FsZShoYXB0aWNJbnRlbnNpdHkpKSB7CkBAIC0xNjgsNiArMTczLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChtSGFwdGljSW50ZW5zaXR5ICE9IG9zOjpIYXB0aWNTY2FsZTo6TVVURSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqIFNldCBtYXhpbXVtIGFtcGxpdHVkZSBhbGxvd2VkIGZvciBoYXB0aWMgZGF0YSwgc2hvdWxkIGJlIHNldCBhZnRlciBxdWVyeWluZworICAgICAgICAgICAgICogIHZpYnJhdG9yIHNlcnZpY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljTWF4QW1wbGl0dWRlKGZsb2F0IG1heEFtcGxpdHVkZSkgeworICAgICAgICAgICAgICAgIG1IYXB0aWNNYXhBbXBsaXR1ZGUgPSBtYXhBbXBsaXR1ZGU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+IGdldEV4dGVybmFsVmlicmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUV4dGVybmFsVmlicmF0aW9uOyB9CiAKICAgICAgICAgICAgIHZvaWQgICAgc2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpOwpAQCAtMTgzLDggKzE5NCwxNiBAQAogICAgICAgIH0KICAgICB9CiAKKyAgICBzdGF0aWMgYm9vbCBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSA9PSAwOworICAgIH0KKwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldE91dHB1dEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAgICAgZmxvYXQgZ2V0U3BlZWQoKSBjb25zdCB7IHJldHVybiBtU3BlZWQ7IH0KKyAgICBib29sIGlzU3BhdGlhbGl6ZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtSXNTcGF0aWFsaXplZDsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCiAgICAgZnJpZW5kIGNsYXNzIFBsYXliYWNrVGhyZWFkOwpAQCAtMjgyLDYgKzMwMSw4IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGluZGljYXRlcyBoYXB0aWMgcGxheWJhY2sgZW5hYmxlZCBvciBub3QKICAgICAvLyBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YQogICAgIG9zOjpIYXB0aWNTY2FsZSBtSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFOworICAgIC8vIG1heCBhbXBsaXR1ZGUgYWxsb3dlZCBmb3IgaGFwdGljIGRhdGEKKyAgICBmbG9hdCBtSGFwdGljTWF4QW1wbGl0dWRlID0gTkFOOwogICAgIGNsYXNzIEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlciA6IHB1YmxpYyBvczo6Qm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKFRyYWNrKiB0cmFjaykgOiBtVHJhY2sodHJhY2spIHt9CkBAIC0zMzIsNiArMzUzLDcgQEAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CiAgICAgVGVlUGF0Y2hlcyAgbVRlZVBhdGNoZXM7CiAgICAgY29uc3QgZmxvYXQgICAgICAgICBtU3BlZWQ7CisgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNTcGF0aWFsaXplZDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUHJvcGVydHlVdGlscy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUHJvcGVydHlVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlMjUzMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Qcm9wZXJ0eVV0aWxzLmNwcApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3kuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiUHJvcGVydHlVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3k7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOworCitzdGQ6OnN0cmluZyBnZXRNbWFwUG9saWN5UHJvcGVydHkoQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlKSB7CisgICAgc3dpdGNoIChwb2xpY3lUeXBlKSB7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5VHlwZTo6REVGQVVMVDoKKyAgICAgICAgICAgIHJldHVybiAiYWF1ZGlvLm1tYXBfcG9saWN5IjsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3lUeXBlOjpFWENMVVNJVkU6CisgICAgICAgICAgICByZXR1cm4gImFhdWRpby5tbWFwX2V4Y2x1c2l2ZV9wb2xpY3kiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICIiOworICAgIH0KK30KKworaW50IGdldERlZmF1bHRQb2xpY3lGcm9tVHlwZShBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUpIHsKKyAgICBzd2l0Y2ggKHBvbGljeVR5cGUpIHsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3lUeXBlOjpFWENMVVNJVkU6CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkRFRkFVTFQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1BPTElDWV9ORVZFUjsKKyAgICB9Cit9CisKK0F1ZGlvTU1hcFBvbGljeSBsZWdhY3kyYWlkbF9hYXVkaW9fcG9saWN5X3RfQXVkaW9NTWFwUG9saWN5KGFhdWRpb19wb2xpY3lfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfTkVWRVI6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9NTWFwUG9saWN5OjpORVZFUjsKKyAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FVVE86CisgICAgICAgICAgICByZXR1cm4gQXVkaW9NTWFwUG9saWN5OjpBVVRPOworICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfQUxXQVlTOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTU1hcFBvbGljeTo6QUxXQVlTOworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01NYXBQb2xpY3k6OlVOU1BFQ0lGSUVEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzIHVua25vd24gYWF1ZGlvIHBvbGljeTogJWQiLCBfX2Z1bmNfXywgbGVnYWN5KTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01NYXBQb2xpY3k6OlVOU1BFQ0lGSUVEOworICAgIH0KK30KKworc3RhdHVzX3QgZ2V0TW1hcFBvbGljeUluZm9zRnJvbVN5c3RlbVByb3BlcnR5KAorICAgICAgICBBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsIHN0ZDo6dmVjdG9yPEF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgeworICAgIEF1ZGlvTU1hcFBvbGljeUluZm8gcG9saWN5SW5mbzsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwcm9wZXJ0eVN0ciA9IGdldE1tYXBQb2xpY3lQcm9wZXJ0eShwb2xpY3lUeXBlKTsKKyAgICBpZiAocHJvcGVydHlTdHIuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBwb2xpY3lJbmZvLm1tYXBQb2xpY3kgPSBsZWdhY3kyYWlkbF9hYXVkaW9fcG9saWN5X3RfQXVkaW9NTWFwUG9saWN5KAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2ludDMyKHByb3BlcnR5U3RyLmNfc3RyKCksIGdldERlZmF1bHRQb2xpY3lGcm9tVHlwZShwb2xpY3lUeXBlKSkpOworICAgIHBvbGljeUluZm9zLT5wdXNoX2JhY2socG9saWN5SW5mbyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitpbnQzMl90IGdldEFBdWRpb01peGVyQnVyc3RDb3VudEZyb21TeXN0ZW1Qcm9wZXJ0eSgpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzRGVmYXVsdEJ1cnN0cyA9IDI7IC8vIGFyYml0cmFyeSwgdXNlIDIgZm9yIGRvdWJsZSBidWZmZXJlZAorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IHNNYXhCdXJzdHMgPSAxMDI0OyAvLyBhcmJpdHJhcnkKKyAgICBzdGF0aWMgY29uc3QgY2hhciogc1Byb3BNaXhlckJ1cnN0cyA9ICJhYXVkaW8ubWl4ZXJfYnVyc3RzIjsKKyAgICBpbnQzMl90IHByb3AgPSBwcm9wZXJ0eV9nZXRfaW50MzIoc1Byb3BNaXhlckJ1cnN0cywgc0RlZmF1bHRCdXJzdHMpOworICAgIGlmIChwcm9wIDw9IDAgfHwgcHJvcCA+IHNNYXhCdXJzdHMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHZhbHVlICVkLCB1c2UgZGVmYXVsdCAlZCIsIF9fZnVuY19fLCBwcm9wLCBzRGVmYXVsdEJ1cnN0cyk7CisgICAgICAgIHByb3AgPSBzRGVmYXVsdEJ1cnN0czsKKyAgICB9CisgICAgcmV0dXJuIHByb3A7Cit9CisKK2ludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWNGcm9tU3lzdGVtUHJvcGVydHkoKSB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qgc0RlZmF1bHRNaWNyb3MgPSAxMDAwOyAvLyBhcmJpdHJhcnkKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzTWF4TWljcm9zID0gMTAwMCAqIDEwMDA7IC8vIGFyYml0cmFyeQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBzUHJvcEh3QnVyc3RNaW5Vc2VjID0gImFhdWRpby5od19idXJzdF9taW5fdXNlYyI7CisgICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKHNQcm9wSHdCdXJzdE1pblVzZWMsIHNEZWZhdWx0TWljcm9zKTsKKyAgICBpZiAocHJvcCA8PSAwIHx8IHByb3AgPiBzTWF4TWljcm9zKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHZhbHVlICVkLCB1c2UgZGVmYXVsdCAlZCIsIF9fZnVuY19fLCBwcm9wLCBzRGVmYXVsdE1pY3Jvcyk7CisgICAgICAgIHByb3AgPSBzRGVmYXVsdE1pY3JvczsKKyAgICB9CisgICAgcmV0dXJuIHByb3A7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Qcm9wZXJ0eVV0aWxzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUHJvcGVydHlVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjY1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUHJvcGVydHlVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeVR5cGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgZ2V0TW1hcFBvbGljeUluZm9zRnJvbVN5c3RlbVByb3BlcnR5KAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKTsKKworaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnRGcm9tU3lzdGVtUHJvcGVydHkoKTsKKworaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlY0Zyb21TeXN0ZW1Qcm9wZXJ0eSgpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU1YTlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCBiOWNkYWI4Li41NmViYjZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC01MCw4ICs1MCwxMCBAQAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NhZmVfbWF0aC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9zcGF0aWFsaXplci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAvLyBOQkFJTyBpbXBsZW1lbnRhdGlvbnMKQEAgLTYzLDYgKzY1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9Qcm9jZXNzLmg+CiAKICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgpAQCAtNTA3LDYgKzUxMCw4IEBACiAgICAgICAgIHJldHVybiAiTU1BUF9QTEFZQkFDSyI7CiAgICAgY2FzZSBNTUFQX0NBUFRVUkU6CiAgICAgICAgIHJldHVybiAiTU1BUF9DQVBUVVJFIjsKKyAgICBjYXNlIFNQQVRJQUxJWkVSOgorICAgICAgICByZXR1cm4gIlNQQVRJQUxJWkVSIjsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gInVua25vd24iOwogICAgIH0KQEAgLTYyMiw3ICs2MjcsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC02MzAsNyArNjM1LDcgQEAKIH0KIAogLy8gc2VuZElvQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgLy8gVGhlIGF1ZGlvIHN0YXRpc3RpY3MgaGlzdG9yeSBpcyBleHBvbmVudGlhbGx5IHdlaWdodGVkIHRvIGZvcmdldCBldmVudHMKQEAgLTY0MCw2ICs2NDUsNyBAQAogICAgIG1Jb0ppdHRlck1zLnJlc2V0KCk7CiAgICAgbUxhdGVuY3lNcy5yZXNldCgpOwogICAgIG1Qcm9jZXNzVGltZU1zLnJlc2V0KCk7CisgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMucmVzZXQoKTsKICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX0NPTlRJTlVPVVMpOwogCiAgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBpZCwgcG9ydElkKTsKQEAgLTcyMiw2ICs3MjgsMTkgQEAKICAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudF9sKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudF9sKCkKK3sKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPQorICAgICAgICAgICAgKENvbmZpZ0V2ZW50ICopbmV3IENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzRXZlbnQoKTsKKyAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7Cit9CisKIC8vIHBvc3QgY29uZGl0aW9uOiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKQogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnByb2Nlc3NDb25maWdFdmVudHNfbCgpCiB7CkBAIC03ODQsNiArODAzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIChSZXNpemVCdWZmZXJDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CiAgICAgICAgICAgICByZXNpemVJbnB1dEJ1ZmZlcl9sKGRhdGEtPm1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyk7CiAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfQ0hFQ0tfT1VUUFVUX1NUQUdFX0VGRkVDVFM6IHsKKyAgICAgICAgICAgIHNldENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzKCk7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTAwLDYgKzkyNCwyMCBAQAogCiAgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CiAgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOworCisgICAgLy8gLS1hbGwgZG9lcyB0aGUgc3RhdGlzdGljcworICAgIGJvb2wgZHVtcEFsbCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmYXJnIDogYXJncykgeworICAgICAgICBpZiAoYXJnID09IFN0cmluZzE2KCItLWFsbCIpKSB7CisgICAgICAgICAgICBkdW1wQWxsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZHVtcEFsbCB8fCB0eXBlKCkgPT0gU1BBVElBTElaRVIpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc2NoZWQgPSBtVGhyZWFkU25hcHNob3QudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKCFzY2hlZC5lbXB0eSgpKSB7CisgICAgICAgICAgICAodm9pZCl3cml0ZShmZCwgc2NoZWQuY19zdHIoKSwgc2NoZWQuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtOTQwLDcgKzk3OCw4IEBACiAgICAgICAgICAgICB8fCBtVHlwZSA9PSBNSVhFUgogICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKICAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAotICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gU1BBVElBTElaRVIpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIHN0YXRzOiAlc1xuIiwgbVRpbWVzdGFtcFZlcmlmaWVyLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBjb3JyZWN0ZWQ6ICVzXG4iLCBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgPyAieWVzIiA6ICJubyIpOwogICAgIH0KQEAgLTk2Niw2ICsxMDA1LDEyIEBACiAgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCiAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIH0KKworICAgIGlmIChtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIE1vbm9waXBlICVzIHBpcGUgZGVwdGggc3RhdHM6ICVzXG4iLAorICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBFZmZlY3RDaGFpbnNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC0xMDA4LDYgKzEwNTMsOCBAQAogICAgICAgICByZXR1cm4gU3RyaW5nMTYoIk1tYXBQbGF5YmFjayIpOwogICAgIGNhc2UgTU1BUF9DQVBUVVJFOgogICAgICAgICByZXR1cm4gU3RyaW5nMTYoIk1tYXBDYXB0dXJlIik7CisgICAgY2FzZSBTUEFUSUFMSVpFUjoKKyAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb1NwYXRpYWwiKTsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSk7CiAgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9Vbmtub3duIik7CkBAIC0xMjk2LDggKzEzNDMsOCBAQAogewogICAgIC8vIG5vIHByZXByb2Nlc3Npbmcgb24gcGxheWJhY2sgdGhyZWFkcwogICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MpIHsKLSAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IHByZSBwcm9jZXNzaW5nIGVmZmVjdCAlcyBjcmVhdGVkIG9uIHBsYXliYWNrIgotICAgICAgICAgICAgICAgICIgdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOworICAgICAgICBBTE9HVygiJXM6IHByZSBwcm9jZXNzaW5nIGVmZmVjdCAlcyBjcmVhdGVkIG9uIHBsYXliYWNrIgorICAgICAgICAgICAgICAgICIgdGhyZWFkICVzIiwgX19mdW5jX18sIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTEzMTIsMTQgKzEzNTksMjEgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAobWVtY21wKCZkZXNjLT50eXBlLCBGWF9JSURfU1BBVElBTElaRVIsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMAorICAgICAgICAgICAgJiYgbVR5cGUgIT0gU1BBVElBTElaRVIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBhdHRlbXB0IHRvIGNyZWF0ZSBhIHNwYXRpYWxpemVyIGVmZmVjdCBvbiBhIHRocmVhZCBvZiB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIHN3aXRjaCAobVR5cGUpIHsKICAgICBjYXNlIE1JWEVSOiB7CiAjaWZuZGVmIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4KICAgICAgICAgLy8gUmVqZWN0IGFueSBlZmZlY3Qgb24gbWl4ZXIgbXVsdGljaGFubmVsIHNpbmtzLgogICAgICAgICAvLyBUT0RPOiBmaXggYm90aCBmb3JtYXQgYW5kIG11bHRpY2hhbm5lbCBpc3N1ZXMgd2l0aCBlZmZlY3RzLgogICAgICAgICBpZiAobUNoYW5uZWxDb3VudCAhPSBGQ0NfMikgewotICAgICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IGVmZmVjdCAlcyBmb3IgbXVsdGljaGFubmVsKCVkKSBvbiBNSVhFUiIKLSAgICAgICAgICAgICAgICAgICAgIiB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtQ2hhbm5lbENvdW50LCBtVGhyZWFkTmFtZSk7CisgICAgICAgICAgICBBTE9HVygiJXM6IGVmZmVjdCAlcyBmb3IgbXVsdGljaGFubmVsKCVkKSBvbiBNSVhFUiB0aHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSwgbUNoYW5uZWxDb3VudCwgbVRocmVhZE5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogI2VuZGlmCkBAIC0xMzMzLDE1ICsxMzg3LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgewogICAgICAgICAgICAgICAgIC8vIG9ubHkgcG9zdCBwcm9jZXNzaW5nIG9uIG91dHB1dCBzdGFnZSBzZXNzaW9uCiAgICAgICAgICAgICAgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IG5vbiBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0ICVzIG5vdCBhbGxvd2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb24gb3V0cHV0IHN0YWdlIHNlc3Npb24iLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBub24gcG9zdCBwcm9jZXNzaW5nIGVmZmVjdCAlcyBub3QgYWxsb3dlZCBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CiAgICAgICAgICAgICAgICAgLy8gb25seSBwb3N0IHByb2Nlc3Npbmcgb24gb3V0cHV0IHN0YWdlIHNlc3Npb24KICAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogbm9uIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgbm90IGFsbG93ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBkZXZpY2Ugc2Vzc2lvbiIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG5vbiBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0ICVzIG5vdCBhbGxvd2VkIG9uIGRldmljZSBzZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEzNTIsMTMgKzE0MDYsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IGVmZmVjdCAlcyBvbiBwbGF5YmFjayB0aHJlYWQgaW4gcmF3IG1vZGUiLAotICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogZWZmZWN0ICVzIG9uIHBsYXliYWNrIHRocmVhZCBpbiByYXcgbW9kZSIsIF9fZnVuY19fLCBkZXNjLT5uYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogbm9uIEhXIGVmZmVjdCAlcyBvbiBwbGF5YmFjayB0aHJlYWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGluIGZhc3QgbW9kZSIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogbm9uIEhXIGVmZmVjdCAlcyBvbiBwbGF5YmFjayB0aHJlYWQgaW4gZmFzdCBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzcyLDM1ICsxNDI1LDY0IEBACiAgICAgY2FzZSBESVJFQ1Q6CiAgICAgICAgIC8vIFJlamVjdCBhbnkgZWZmZWN0IG9uIERpcmVjdCBvdXRwdXQgdGhyZWFkcyBmb3Igbm93LCBzaW5jZSB0aGUgZm9ybWF0IG9mCiAgICAgICAgIC8vIG1TaW5rQnVmZmVyIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBlZmZlY3QgcHJvY2Vzc2luZyAoUENNIDE2IHN0ZXJlbykuCi0gICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBlZmZlY3QgJXMgb24gRElSRUNUIG91dHB1dCB0aHJlYWQgJXMiLAotICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKKyAgICAgICAgQUxPR1coIiVzOiBlZmZlY3QgJXMgb24gRElSRUNUIG91dHB1dCB0aHJlYWQgJXMiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgY2FzZSBEVVBMSUNBVElORzoKICNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgogICAgICAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBtdWx0aWNoYW5uZWwgc2lua3MuCiAgICAgICAgIC8vIFRPRE86IGZpeCBib3RoIGZvcm1hdCBhbmQgbXVsdGljaGFubmVsIGlzc3VlcyB3aXRoIGVmZmVjdHMuCiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpIgotICAgICAgICAgICAgICAgICAgICAiIG9uIERVUExJQ0FUSU5HIHRocmVhZCAlcyIsIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UaHJlYWROYW1lKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpIG9uIERVUExJQ0FUSU5HIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lLCBtQ2hhbm5lbENvdW50LCBtVGhyZWFkTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgaWYgKGF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKHNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBnbG9iYWwgZWZmZWN0ICVzIG9uIERVUExJQ0FUSU5HIgotICAgICAgICAgICAgICAgICAgICAiIHRocmVhZCAlcyIsIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogZ2xvYmFsIGVmZmVjdCAlcyBvbiBEVVBMSUNBVElORyB0aHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgewotICAgICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgb24iCi0gICAgICAgICAgICAgICAgICAgICIgRFVQTElDQVRJTkcgdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOworICAgICAgICAgICAgQUxPR1coIiVzOiBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0ICVzIG9uIERVUExJQ0FUSU5HIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBIVyB0dW5uZWxlZCBlZmZlY3QgJXMgb24iCi0gICAgICAgICAgICAgICAgICAgICIgRFVQTElDQVRJTkcgdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOworICAgICAgICAgICAgQUxPR1coIiVzOiBIVyB0dW5uZWxlZCBlZmZlY3QgJXMgb24gRFVQTElDQVRJTkcgdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTUEFUSUFMSVpFUjoKKyAgICAgICAgLy8gR2xvYmFsIGVmZmVjdHMgKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgYXJlIG5vdCBzdXBwb3J0ZWQgb24gc3BhdGlhbGl6ZXIgbWl4ZXIKKyAgICAgICAgLy8gYXMgdGhlcmUgaXMgbm8gY29tbW9uIGFjY3VtdWxhdGlvbiBidWZmZXIgZm9yIHNwdGlhbGl6ZWQgYW5kIG5vbiBzcHRpYWxpemVkIHRyYWNrcy4KKyAgICAgICAgLy8gUG9zdCBwcm9jZXNzaW5nIGVmZmVjdHMgKEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIG9yIEFVRElPX1NFU1NJT05fREVWSUNFKQorICAgICAgICAvLyBhcmUgc3VwcG9ydGVkIGFuZCBhZGRlZCBhZnRlciB0aGUgc3BhdGlhbGl6ZXIuCisgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGdsb2JhbCBlZmZlY3QgJXMgbm90IHN1cHBvcnRlZCBvbiBzcGF0aWFsaXplciB0aHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgcG9zdCBwcm9jZXNzaW5nICwgZG93bm1peGVyIG9yIHNwYXRpYWxpemVyIGVmZmVjdHMgb24gb3V0cHV0IHN0YWdlIHNlc3Npb24KKyAgICAgICAgICAgIGlmIChtZW1jbXAoJmRlc2MtPnR5cGUsIEZYX0lJRF9TUEFUSUFMSVpFUiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1lbWNtcCgmZGVzYy0+dHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogbm9uIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgbm90IGFsbG93ZWQgb24gb3V0cHV0IHN0YWdlIHNlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CisgICAgICAgICAgICAvLyBvbmx5IHBvc3QgcHJvY2Vzc2luZyBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbgorICAgICAgICAgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG5vbiBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0ICVzIG5vdCBhbGxvd2VkIG9uIGRldmljZSBzZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IHdyb25nIHRocmVhZCB0eXBlICVkIiwgbVR5cGUpOwogICAgIH0KQEAgLTE0MTgsNyArMTUwMCw4IEBACiAgICAgICAgIGludCAqZW5hYmxlZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKICAgICAgICAgYm9vbCBwaW5uZWQsCi0gICAgICAgIGJvb2wgcHJvYmUpCisgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKQogewogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OwogICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOwpAQCAtMTQ3NywxOCArMTU2MCwxOSBAQAogICAgICAgICBpZiAoZWZmZWN0LT5pc0hhcHRpY0dlbmVyYXRvcigpKSB7CiAgICAgICAgICAgICAvLyBUT0RPKGIvMTg0MTk0MDU3KTogVXNlIHRoZSB2aWJyYXRvciBpbmZvcm1hdGlvbiBmcm9tIHRoZSB2aWJyYXRvciB0aGF0IHdpbGwgYmUgdXNlZAogICAgICAgICAgICAgLy8gZm9yIHRoZSBIYXB0aWNHZW5lcmF0b3IuCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8qIGRlZmF1bHRWaWJyYXRvckluZm8gPQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5nZXREZWZhdWx0VmlicmF0b3JJbmZvX2woKTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0VmlicmF0b3JJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiBkZWZhdWx0VmlicmF0b3JJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG1BdWRpb0ZsaW5nZXItPmdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0VmlicmF0b3JJbmZvKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdGhlIHZpYnJhdG9yIGluZm8gd2hlbiBpdCBpcyBhIHZhbGlkIG9uZS4KLSAgICAgICAgICAgICAgICBlZmZlY3QtPnNldFZpYnJhdG9ySW5mbyhkZWZhdWx0VmlicmF0b3JJbmZvKTsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPnNldFZpYnJhdG9ySW5mbygqZGVmYXVsdFZpYnJhdG9ySW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBoYW5kbGUgYW5kIGNvbm5lY3QgaXQgdG8gZWZmZWN0IG1vZHVsZQotICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5KTsKKyAgICAgICAgaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShlZmZlY3QsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgbFN0YXR1cyA9IGhhbmRsZS0+aW5pdENoZWNrKCk7CiAgICAgICAgIGlmIChsU3RhdHVzID09IE9LKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gZWZmZWN0LT5hZGRIYW5kbGUoaGFuZGxlLmdldCgpKTsKKyAgICAgICAgICAgIHNlbmRDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50X2woKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZW5hYmxlZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqZW5hYmxlZCA9IChpbnQpZWZmZWN0LT5pc0VuYWJsZWQoKTsKQEAgLTE1MzEsNiArMTYxNSw3IEBACiAgICAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgICAgIHJlbW92ZUVmZmVjdF9sKGVmZmVjdCwgdHJ1ZSk7CiAgICAgICAgIH0KKyAgICAgICAgc2VuZENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzRXZlbnRfbCgpOwogICAgIH0KICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgIG1BdWRpb0ZsaW5nZXItPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhlZmZlY3QpOwpAQCAtMTg4NCwxMCArMTk2OSwyNCBAQAogICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMubWVhbiIsIG1MYXRlbmN5TXMuZ2V0TWVhbigpKTsKICAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLnN0ZCIsIG1MYXRlbmN5TXMuZ2V0U3RkRGV2KCkpOwogICAgIH0KKyAgICBpZiAobU1vbm9waXBlUGlwZURlcHRoU3RhdHMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJtb25vcGlwZVBpcGVEZXB0aFN0YXRzLm1lYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5zdGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMuZ2V0U3RkRGV2KCkpOworICAgIH0KIAogICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKIH0KIAorcHJvZHVjdF9zdHJhdGVneV90IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgaWYgKCFtQXVkaW9GbGluZ2VyLT5pc0F1ZGlvUG9saWN5UmVhZHkoKSkgeworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworICAgIH0KKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE4OTYsMTUgKzE5OTUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZykKICAgICA6ICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCB0eXBlLCBzeXN0ZW1SZWFkeSwgdHJ1ZSAvKiBpc091dCAqLyksCiAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtU2lua0J1ZmZlcihOVUxMKSwKLSAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQoQXVkaW9GbGluZ2VyOjprRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24gfHwgdHlwZSA9PSBTUEFUSUFMSVpFUiksCiAgICAgICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQoZmFsc2UpLAotICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uIHx8IHR5cGUgPT0gU1BBVElBTElaRVIpLAogICAgICAgICBtRWZmZWN0QnVmZmVyKE5VTEwpLAogICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZSgwKSwKICAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfSU5WQUxJRCksCkBAIC0xOTU2LDggKzIwNTYsMTggQEAKICAgICAgICAgICAgICAgICBtT3V0cHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CiAgICAgfQogCisgICAgaWYgKG1peGVyQ29uZmlnICE9IG51bGxwdHIgJiYgbWl4ZXJDb25maWctPmNoYW5uZWxfbWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2sgPSBtaXhlckNvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgIH0KKwogICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAorICAgIGlmIChtVHlwZSAhPSBTUEFUSUFMSVpFUgorICAgICAgICAgICAgJiYgbU1peGVyQ2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IGRvZXMgbm90IG1hdGNoIG1peGVyIGNoYW5uZWwgbWFzayAlI3giLAorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbU1peGVyQ2hhbm5lbE1hc2spOworICAgIH0KKwogICAgIC8vIFRPRE86IFdlIG1heSBhbHNvIG1hdGNoIG9uIGFkZHJlc3MgYXMgd2VsbCBhcyBkZXZpY2UgdHlwZSBmb3IKICAgICAvLyBBVURJT19ERVZJQ0VfT1VUX0JVUywgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCiAgICAgaWYgKHR5cGUgPT0gTUlYRVIgfHwgdHlwZSA9PSBESVJFQ1QgfHwgdHlwZSA9PSBPRkZMT0FEKSB7CkBAIC0xOTg2LDYgKzIwOTYsNyBAQAogICAgIGZyZWUobVNpbmtCdWZmZXIpOwogICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOworICAgIGZyZWUobVBvc3RTcGF0aWFsaXplckJ1ZmZlcik7CiB9CiAKIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtMjAwMywxNiArMjExNCwxNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIHJ1bihtVGhyZWFkTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworICAgIG1UaHJlYWRTbmFwc2hvdC5zZXRUaWQoZ2V0VGlkKCkpOwogfQogCiAvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnByZUV4aXQoKQogewogICAgIEFMT0dWKCIgIHByZUV4aXQoKSIpOwotICAgIC8vIEZJWE1FIHRoaXMgaXMgdXNpbmcgaGFyZC1jb2RlZCBzdHJpbmdzIGJ1dCBpbiB0aGUgZnV0dXJlLCB0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZQotICAgIC8vICAgICAgIGNvbnZlcnRlZCB0byB1c2UgYXVkaW8gSEFMIGV4dGVuc2lvbnMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0dW5uZWxpbmcKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMoU3RyaW5nOCgiZXhpdGluZz0xIikpOwotICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gc2V0dGluZyBwYXJhbWV0ZXJzIG9uIGV4aXQ6ICVkIiwgcmVzdWx0KTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmV4aXQoKTsKKyAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIGNhbGxpbmcgZXhpdCgpOiAlZCIsIHJlc3VsdCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKQEAgLTIwODAsMTAgKzIxOTAsMTIgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciB2b2x1bWU6ICVmXG4iLCBtTWFzdGVyVm9sdW1lKTsKICAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbXV0ZTogJXNcbiIsIG1NYXN0ZXJNdXRlID8gIm9uIiA6ICJvZmYiKTsKKyAgICBkcHJpbnRmKGZkLCAiICBNaXhlciBjaGFubmVsIE1hc2s6ICUjeCAoJXMpXG4iLAorICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssIGNoYW5uZWxNYXNrVG9TdHJpbmcobU1peGVyQ2hhbm5lbE1hc2ssIHRydWUgLyogb3V0cHV0ICovKS5jX3N0cigpKTsKICAgICBpZiAobUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBIYXB0aWMgY2hhbm5lbCBtYXNrOiAlI3ggKCVzKVxuIiwgbUhhcHRpY0NoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUhhcHRpY0NoYW5uZWxNYXNrLCB0cnVlIC8qIG91dHB1dCAqLykuY19zdHIoKSk7CkBAIC0yMTA5LDcgKzIyMjEsNyBAQAogICAgIH0KICAgICBpZiAob3V0cHV0ICE9IG51bGxwdHIpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsIHN0cmVhbSBkdW1wOlxuIik7Ci0gICAgICAgICh2b2lkKW91dHB1dC0+c3RyZWFtLT5kdW1wKGZkKTsKKyAgICAgICAgKHZvaWQpb3V0cHV0LT5zdHJlYW0tPmR1bXAoZmQsIGFyZ3MpOwogICAgIH0KIH0KIApAQCAtMjEzMyw3ICsyMjQ1LDggQEAKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaykKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkKQogewogICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKnBGcmFtZUNvdW50OwogICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gKnBOb3RpZmljYXRpb25GcmFtZUNvdW50OwpAQCAtMjIxOSw3ICsyMzMyLDcgQEAKICAgICAgICAgICAgICAgICAgIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JXp1IG1GcmFtZUNvdW50PSV6dSIsCiAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZDogc2hhcmVkQnVmZmVyPSVwIGZyYW1lQ291bnQ9JXp1ICIKKyAgICAgICAgQUxPR0QoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBzaGFyZWRCdWZmZXI9JXAgZnJhbWVDb3VudD0lenUgIgogICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lenUgZm9ybWF0PSUjeCBtRm9ybWF0PSUjeCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggIgogICAgICAgICAgICAgICAgICJzYW1wbGVSYXRlPSV1IG1TYW1wbGVSYXRlPSV1ICIKICAgICAgICAgICAgICAgICAiaGFzRmFzdE1peGVyPSVkIHRpZD0lZCBmYXN0VHJhY2tBdmFpbE1hc2s9JSN4IiwKQEAgLTIzOTcsMTEgKzI1MTAsMTEgQEAKICAgICAgICAgLy8gYWxsIHRyYWNrcyBpbiBzYW1lIGF1ZGlvIHNlc3Npb24gbXVzdCBzaGFyZSB0aGUgc2FtZSByb3V0aW5nIHN0cmF0ZWd5IG90aGVyd2lzZQogICAgICAgICAvLyBjb25mbGljdHMgd2lsbCBoYXBwZW4gd2hlbiB0cmFja3MgYXJlIG1vdmVkIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyIGJ5IGF1ZGlvIHBvbGljeQogICAgICAgICAvLyBtYW5hZ2VyCi0gICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1UeXBlKTsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtVHlwZSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHQgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHQgIT0gMCAmJiB0LT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBhY3R1YWwgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0odC0+c3RyZWFtVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgYWN0dWFsID0gZ2V0U3RyYXRlZ3lGb3JTdHJlYW0odC0+c3RyZWFtVHlwZSgpKTsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHQtPnNlc3Npb25JZCgpICYmIHN0cmF0ZWd5ICE9IGFjdHVhbCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIG1pc21hdGNoZWQgc3RyYXRlZ3k7IGV4cGVjdGVkICV1IGJ1dCBmb3VuZCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksIGFjdHVhbCk7CkBAIC0yNDI1LDcgKzI1MzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgYXR0cmlidXRpb25Tb3VyY2UsIHRyYWNrRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQsIFNJWkVfTUFYIC8qZnJhbWVDb3VudFRvQmVSZWFkeSovLCBzcGVlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQsIFNJWkVfTUFYIC8qZnJhbWVDb3VudFRvQmVSZWFkeSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCwgaXNTcGF0aWFsaXplZCk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrICE9IDAgPyB0cmFjay0+aW5pdENoZWNrKCkgOiAoc3RhdHVzX3QpIE5PX01FTU9SWTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTI0NDUsNyArMjU1OSw3IEBACiAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiY3JlYXRlVHJhY2tfbCgpIHNldHRpbmcgbWFpbiBidWZmZXIgJXAiLCBjaGFpbi0+aW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihjaGFpbi0+aW5CdWZmZXIoKSk7Ci0gICAgICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHRyYWNrLT5zdHJlYW1UeXBlKCkpKTsKKyAgICAgICAgICAgIGNoYWluLT5zZXRTdHJhdGVneShnZXRTdHJhdGVneUZvclN0cmVhbSh0cmFjay0+c3RyZWFtVHlwZSgpKSk7CiAgICAgICAgICAgICBjaGFpbi0+aW5jVHJhY2tDbnQoKTsKICAgICAgICAgfQogCkBAIC0yNjEzLDggKzI3MjcsMTkgQEAKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgY29uc3QgaW50IGludGVuc2l0eSA9IEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4gdmlicmF0b3JJbmZvOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xODQxOTQ3ODApOiBVc2UgdGhlIHZpYnJhdG9yIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpYnJhdG9yIHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gcGxheSB0aGlzIHRyYWNrLgorICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQXVkaW9GbGluZ2VyLT5tTG9jayk7CisgICAgICAgICAgICAgICAgdmlicmF0b3JJbmZvID0gc3RkOjptb3ZlKG1BdWRpb0ZsaW5nZXItPmdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNJbnRlbnNpdHkoc3RhdGljX2Nhc3Q8b3M6OkhhcHRpY1NjYWxlPihpbnRlbnNpdHkpKTsKKyAgICAgICAgICAgIGlmICh2aWJyYXRvckluZm8pIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+c2V0SGFwdGljTWF4QW1wbGl0dWRlKHZpYnJhdG9ySW5mby0+bWF4QW1wbGl0dWRlKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gSGFwdGljIHBsYXliYWNrIHNob3VsZCBiZSBlbmFibGVkIGJ5IHZpYnJhdG9yIHNlcnZpY2UuCiAgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBoYXB0aWMgcGxheWJhY2sgb2YgYWxsIGFjdGl2ZSB0cmFjayB0byBlbnN1cmUgb25seQpAQCAtMjcwNywzNiArMjgzMiwyNiBAQAogICAgIHJldHVybiBtT3V0cHV0LT5zdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKLSAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkIiwgdGhpcywgZXZlbnQpOwotCi0gICAgZGVzYy0+bUlvSGFuZGxlID0gbUlkOwotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCA9IG1QYXRjaDsKLSAgICBpZiAoaXNNc2REZXZpY2UoKSkgewotICAgICAgICBwYXRjaCA9IG1Eb3duU3RyZWFtUGF0Y2g7Ci0gICAgfQotCisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2M7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoID0gaXNNc2REZXZpY2UoKSA/IG1Eb3duU3RyZWFtUGF0Y2ggOiBtUGF0Y2g7CiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBkZXNjLT5tRnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50OyAvLyBGSVhNRSBzZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCkKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnRIQUwgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSBsYXRlbmN5X2woKTsKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQsIHBhdGNoLCBmYWxzZSAvKmlzSW5wdXQqLywKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIC8vIEZJWE1FIEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCkgaW5zdGVhZCBvZiBtTm9ybWFsRnJhbWVDb3VudD8KKyAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGxhdGVuY3lfbCgpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKLSAgICAgICAgZGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgIGRlc2MtPm1Qb3J0SWQgPSBwb3J0SWQ7CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkLCBwYXRjaCwgcG9ydElkKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIG1BdWRpb0ZsaW5nZXItPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgZGVzYywgcGlkKTsKQEAgLTI4MTQsMTQgKzI5MjksMjAgQEAKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKG1DaGFubmVsTWFzaykpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOwogICAgIH0KLSAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKQotICAgICAgICAgICAgJiYgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKSkgeworICAgIGlmIChoYXNNaXhlcigpICYmICFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKG1DaGFubmVsTWFzaykpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0IiwKICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2spOwogICAgIH0KKworICAgIGlmIChtTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7CisgICAgfQorCiAgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOwogICAgIG1CYWxhbmNlLnNldENoYW5uZWxNYXNrKG1DaGFubmVsTWFzayk7CiAKKyAgICB1aW50MzJfdCBtaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtTWl4ZXJDaGFubmVsTWFzayk7CisKICAgICAvLyBHZXQgYWN0dWFsIEhBTCBmb3JtYXQuCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMobnVsbHB0ciwgbnVsbHB0ciwgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiByZXRyaWV2aW5nIG91dHB1dCBzdHJlYW0gZm9ybWF0OiAlZCIsIHJlc3VsdCk7CkBAIC0yODMxLDggKzI5NTIsNyBAQAogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KG1Gb3JtYXQpKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUZvcm1hdCk7CiAgICAgfQotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpCi0gICAgICAgICAgICAmJiAhaXNWYWxpZFBjbVNpbmtGb3JtYXQobUZvcm1hdCkpIHsKKyAgICBpZiAoaGFzTWl4ZXIoKSAmJiAhaXNWYWxpZFBjbVNpbmtGb3JtYXQobUZvcm1hdCkpIHsKICAgICAgICAgTE9HX0ZBVEFMKCJIQUwgZm9ybWF0ICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQiLAogICAgICAgICAgICAgICAgIG1Gb3JtYXQpOwogICAgIH0KQEAgLTI4NDEsNyArMjk2MSw3IEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssCiAgICAgICAgICAgICAiRXJyb3Igd2hlbiByZXRyaWV2aW5nIG91dHB1dCBzdHJlYW0gYnVmZmVyIHNpemU6ICVkIiwgcmVzdWx0KTsKICAgICBtRnJhbWVDb3VudCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKLSAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiAobUZyYW1lQ291bnQgJiAxNSkpIHsKKyAgICBpZiAoaGFzTWl4ZXIoKSAmJiAobUZyYW1lQ291bnQgJiAxNSkpIHsKICAgICAgICAgQUxPR1coIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgaXMgJXp1IGZyYW1lcyBidXQgQXVkaW9NaXhlciByZXF1aXJlcyBtdWx0aXBsZXMgb2YgMTYgZnJhbWVzIiwKICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CiAgICAgfQpAQCAtMjg4OCw2ICszMDA4LDcgQEAKIAogICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBzaW5rIGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQogICAgIGRvdWJsZSBtdWx0aXBsaWVyID0gMS4wOworICAgIC8vIE5vdGU6IG1UeXBlID09IFNQQVRJQUxJWkVSIGRvZXMgbm90IHN1cHBvcnQgRmFzdE1peGVyLgogICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAoa1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfU3RhdGljIHx8CiAgICAgICAgICAgICBrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9EeW5hbWljKSkgewogICAgICAgICBzaXplX3QgbWluTm9ybWFsRnJhbWVDb3VudCA9IChrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CkBAIC0yOTE0LDcgKzMwMzUsNyBAQAogICAgIH0KICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IG11bHRpcGxpZXIgKiBtRnJhbWVDb3VudDsKICAgICAvLyByb3VuZCB1cCB0byBuZWFyZXN0IDE2IGZyYW1lcyB0byBzYXRpc2Z5IEF1ZGlvTWl4ZXIKLSAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpIHsKKyAgICBpZiAoaGFzTWl4ZXIoKSkgewogICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IChtTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKICAgICB9CiAgICAgQUxPR0koIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgJXp1IGZyYW1lcywgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgJXp1IGZyYW1lcyIsIG1GcmFtZUNvdW50LApAQCAtMjkzMCw2ICszMDUxLDcgQEAKICAgICAvLyBPcmlnaW5hbGx5IHRoaXMgd2FzIGludDE2X3RbXSBhcnJheSwgbmVlZCB0byByZW1vdmUgbGVnYWN5IGltcGxpY2F0aW9ucy4KICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKICAgICBtU2lua0J1ZmZlciA9IE5VTEw7CisKICAgICAvLyBGb3Igc2luayBidWZmZXIgc2l6ZSwgd2UgdXNlIHRoZSBmcmFtZSBzaXplIGZyb20gdGhlIGRvd25zdHJlYW0gc2luayB0byBhdm9pZCBwcm9ibGVtcwogICAgIC8vIHdpdGggbm9uIFBDTSBmb3JtYXRzIGZvciBjb21wcmVzc2VkIG11c2ljLCBlLmcuIEFBQywgYW5kIE9mZmxvYWQgdGhyZWFkcy4KICAgICBjb25zdCBzaXplX3Qgc2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CkBAIC0yOTQxLDcgKzMwNjMsNyBAQAogICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CiAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQpIHsKICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gbm8gbG9uZ2VyIHZhbGlkOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAorICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtaXhlckNoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbU1peGVyQnVmZmVyLCAzMiwgbU1peGVyQnVmZmVyU2l6ZSk7CiAgICAgfQpAQCAtMjk0OSwxNSArMzA3MSwyNCBAQAogICAgIG1FZmZlY3RCdWZmZXIgPSBOVUxMOwogICAgIGlmIChtRWZmZWN0QnVmZmVyRW5hYmxlZCkgewogICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gICAgICAgIG1FZmZlY3RCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtaXhlckNoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRWZmZWN0QnVmZmVyRm9ybWF0KTsKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1FZmZlY3RCdWZmZXIsIDMyLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CiAgICAgfQogCisgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CisgICAgICAgIGZyZWUobVBvc3RTcGF0aWFsaXplckJ1ZmZlcik7CisgICAgICAgIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIgPSBudWxscHRyOworICAgICAgICBtUG9zdFNwYXRpYWxpemVyQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRWZmZWN0QnVmZmVyRm9ybWF0KTsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIsIDMyLCBtUG9zdFNwYXRpYWxpemVyQnVmZmVyU2l6ZSk7CisgICAgfQorCiAgICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CiAgICAgbUNoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG1DaGFubmVsTWFzayAmIH5tSGFwdGljQ2hhbm5lbE1hc2spOwogICAgIG1IYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUhhcHRpY0NoYW5uZWxNYXNrKTsKICAgICBtQ2hhbm5lbENvdW50IC09IG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgbU1peGVyQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obU1peGVyQ2hhbm5lbE1hc2sgJiB+bUhhcHRpY0NoYW5uZWxNYXNrKTsKIAogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50CkBAIC0zMDUxLDE1ICszMTgyLDE1IEBACiAgICAgLy8gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggaXMgcGxhY2VkIGluIHNhbWUgc3RyYXRlZ3kgYXMgTVVTSUMgc3RyZWFtIHNvIHRoYXQKICAgICAvLyBpdCBpcyBtb3ZlZCB0byBjb3JyZWN0IG91dHB1dCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aGVuIEEyRFAgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZAogICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICAgICAgcmV0dXJuIGdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKSAmJiAhdHJhY2stPmlzSW52YWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHRyYWNrLT5zdHJlYW1UeXBlKCkpOworICAgICAgICAgICAgcmV0dXJuIGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHRyYWNrLT5zdHJlYW1UeXBlKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICByZXR1cm4gZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKIH0KIAogCkBAIC0zMjI2LDYgKzMzNTcsNyBAQAogICAgIG1JbldyaXRlID0gZmFsc2U7CiAgICAgaWYgKG1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0JlZ2luSW50ZXJ2YWwoKTsKKyAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKQEAgLTMzMzYsMjMgKzM0NjgsMzQgQEAKIHsKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNoYWluLT5zZXNzaW9uSWQoKTsKICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IGhhbEluQnVmZmVyLCBoYWxPdXRCdWZmZXI7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5taXJyb3JCdWZmZXIoCi0gICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZCA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlciwKLSAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkID8gbUVmZmVjdEJ1ZmZlclNpemUgOiBtU2lua0J1ZmZlclNpemUsCi0gICAgICAgICAgICAmaGFsSW5CdWZmZXIpOwotICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7Ci0gICAgaGFsT3V0QnVmZmVyID0gaGFsSW5CdWZmZXI7Ci0gICAgZWZmZWN0X2J1ZmZlcl90ICpidWZmZXIgPSByZWludGVycHJldF9jYXN0PGVmZmVjdF9idWZmZXJfdCo+KGhhbEluQnVmZmVyLT5leHRlcm5hbERhdGEoKSk7Ci0gICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAgZm9yIHNlc3Npb24gJWQiLCBjaGFpbi5nZXQoKSwgdGhpcywgc2Vzc2lvbik7Ci0gICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uKSkgewotICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKLSAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0Ci0gICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKLSAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgIGVmZmVjdF9idWZmZXJfdCAqYnVmZmVyID0gbnVsbHB0cjsgLy8gb25seSB1c2VkIGZvciBub24gZ2xvYmFsIHNlc3Npb25zCisKKyAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIpIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uKSkgeworICAgICAgICAgICAgLy8gcGxheWVyIHNlc3Npb25zIG9uIGEgc3BhdGlhbGl6ZXIgb3V0cHV0IHdpbGwgdXNlIGEgZGVkaWNhdGVkIGlucHV0IGJ1ZmZlciBhbmQKKyAgICAgICAgICAgIC8vIHdpbGwgZWl0aGVyIG91dHB1dCBtdWx0aSBjaGFubmVsIHRvIG1FZmZlY3RCdWZmZXIgaWYgdGhlIHRyYWNrIGlzIHNwYXRpbGFpemVkCisgICAgICAgICAgICAvLyBvciBzdGVyZW8gdG8gbVBvc3RTcGF0aWFsaXplckJ1ZmZlciBpZiBub3Qgc3BhdGlhbGl6ZWQuCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIGJvb2wgaXNTZXNzaW9uU3BhdGlhbGl6ZWQgPQorICAgICAgICAgICAgICAgIChoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uKSAmIFRocmVhZEJhc2U6OlNQQVRJQUxJWkVEX1NFU1NJT04pICE9IDA7CisgICAgICAgICAgICBpZiAoaXNTZXNzaW9uU3BhdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1NaXhlckNoYW5uZWxNYXNrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSArIG1IYXB0aWNDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpLAogICAgICAgICAgICAgICAgICAgICAmaGFsSW5CdWZmZXIpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5taXJyb3JCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIGlzU2Vzc2lvblNwYXRpYWxpemVkID8gbUVmZmVjdEJ1ZmZlciA6IG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGlzU2Vzc2lvblNwYXRpYWxpemVkID8gbUVmZmVjdEJ1ZmZlclNpemUgOiBtUG9zdFNwYXRpYWxpemVyQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmhhbE91dEJ1ZmZlcik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OworCiAjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCiAgICAgICAgICAgICBidWZmZXIgPSBoYWxJbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+ZjMyOwogI2Vsc2UKQEAgLTMzNjAsMTQgKzM1MDMsNjAgQEAKICNlbmRpZgogICAgICAgICAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSBjcmVhdGluZyBuZXcgaW5wdXQgYnVmZmVyICVwIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNlc3Npb24pOwotICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBIGdsb2JhbCBzZXNzaW9uIG9uIGEgU1BBVElBTElaRVIgdGhyZWFkIGlzIGVpdGhlciBPVVRQVVRfU1RBR0Ugb3IgREVWSUNFCisgICAgICAgICAgICAvLyAtIE9VVFBVVF9TVEFHRSBzZXNzaW9uIHVzZXMgdGhlIG1FZmZlY3RCdWZmZXIgYXMgaW5wdXQgYnVmZmVyIGFuZAorICAgICAgICAgICAgLy8gbVBvc3RTcGF0aWFsaXplckJ1ZmZlciBhcyBvdXRwdXQgYnVmZmVyCisgICAgICAgICAgICAvLyAtIERFVklDRSBzZXNzaW9uIHVzZXMgdGhlIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIgYXMgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPm1pcnJvckJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlclNpemUsICZoYWxJbkJ1ZmZlcik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5taXJyb3JCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIsIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXJTaXplLCAmaGFsT3V0QnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CiAKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CisgICAgICAgICAgICAgICAgaGFsSW5CdWZmZXIgPSBoYWxPdXRCdWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPm1pcnJvckJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZCA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlciwKKyAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZCA/IG1FZmZlY3RCdWZmZXJTaXplIDogbVNpbmtCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICZoYWxJbkJ1ZmZlcik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisgICAgICAgIGhhbE91dEJ1ZmZlciA9IGhhbEluQnVmZmVyOworICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uKSkgeworICAgICAgICAgICAgYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfYnVmZmVyX3QqPihoYWxJbkJ1ZmZlci0+ZXh0ZXJuYWxEYXRhKCkpOworICAgICAgICAgICAgLy8gT25seSBvbmUgZWZmZWN0IGNoYWluIGNhbiBiZSBwcmVzZW50IGluIGRpcmVjdCBvdXRwdXQgdGhyZWFkIGFuZCBpdCB1c2VzCisgICAgICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKKyAgICAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAqIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobU1peGVyQ2hhbm5lbE1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGhhbEluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzI7CisjZWxzZQorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGhhbEluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5zMTY7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIGNyZWF0aW5nIG5ldyBpbnB1dCBidWZmZXIgJXAgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uKSkgewogICAgICAgICAvLyBBdHRhY2ggYWxsIHRyYWNrcyB3aXRoIHNhbWUgc2Vzc2lvbiBJRCB0byB0aGlzIGNoYWluLgogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIHRyYWNrLT5zZXRNYWluQnVmZmVyIHRyYWNrICVwIGJ1ZmZlciAlcCIsIHRyYWNrLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIHRyYWNrLT5zZXRNYWluQnVmZmVyIHRyYWNrICVwIGJ1ZmZlciAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5nZXQoKSwgYnVmZmVyKTsKICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihidWZmZXIpOwogICAgICAgICAgICAgICAgIGNoYWluLT5pbmNUcmFja0NudCgpOwogICAgICAgICAgICAgfQpAQCAtMzM3NiwxMSArMzU2NSwxMyBAQAogICAgICAgICAvLyBpbmRpY2F0ZSBhbGwgYWN0aXZlIHRyYWNrcyBpbiB0aGUgY2hhaW4KICAgICAgICAgZm9yIChjb25zdCBzcDxUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSBhY3RpdmF0aW5nIHRyYWNrICVwIG9uIHNlc3Npb24gJWQiLCB0cmFjay5nZXQoKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSBhY3RpdmF0aW5nIHRyYWNrICVwIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suZ2V0KCksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgIGNoYWluLT5pbmNBY3RpdmVUcmFja0NudCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiAgICAgY2hhaW4tPnNldFRocmVhZCh0aGlzKTsKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoaGFsSW5CdWZmZXIpOwogICAgIGNoYWluLT5zZXRPdXRCdWZmZXIoaGFsT3V0QnVmZmVyKTsKQEAgLTM1MDUsNyArMzY5Niw3IEBACiAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogCi0gICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CiAgICAgICAgIHNsZWVwVGltZVNoaWZ0ID0gMDsKICAgICB9CiAKQEAgLTM1MzEsNiArMzcyMiw4IEBACiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAKKyAgICBzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCgpOworCiAgICAgLy8gbG9vcENvdW50IGlzIHVzZWQgZm9yIHN0YXRpc3RpY3MgYW5kIGRpYWdub3N0aWNzLgogICAgIGZvciAoaW50NjRfdCBsb29wQ291bnQgPSAwOyAhZXhpdFBlbmRpbmcoKTsgKytsb29wQ291bnQpCiAgICAgewpAQCAtMzU0Miw2ICszNzM1LDcgQEAKIAogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fTk9ORTsKKyAgICAgICAgYm9vbCBpc0hhcHRpY1Nlc3Npb25TcGF0aWFsaXplZCA9IGZhbHNlOwogICAgICAgICBzdGQ6OnZlY3RvcjxzcDxUcmFjaz4+IGFjdGl2ZVRyYWNrczsKIAogICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfQlVTLCBjaGVjayBmb3IgZG93bnN0cmVhbSBsYXRlbmN5LgpAQCAtMzU4NywxMSArMzc4MSwxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1DaGVja091dHB1dFN0YWdlRWZmZWN0cy5leGNoYW5nZShmYWxzZSkpIHsKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzKCk7CisgICAgICAgIH0KKwogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHMubG9hZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFNlZSBjb21tZW50IGF0IGRlY2xhcmF0aW9uIG9mIGxvZ1N0cmluZyBmb3Igd2h5IHRoaXMgaXMgZG9uZSB1bmRlciBtTG9jawogICAgICAgICAgICAgaWYgKGxvZ1N0cmluZyAhPSBOVUxMKSB7CkBAIC0zNjQyLDYgKzM4NDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0VuZEludGVydmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkU25hcHNob3Qub25FbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZW5kU3RhdGlzdGljcyhmYWxzZSAvKiBmb3JjZSAqLyk7CkBAIC0zNjcyLDcgKzM4NzQsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpICsgbVN0YW5kYnlEZWxheU5zOwogICAgICAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVTaGlmdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMzY5NSwxNiArMzg5NywyMSBAQAogICAgICAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGRvbmUgdW5kZXIgdGhlIHNhbWUgbG9jayBhcyBwcmVwYXJlVHJhY2tzX2woKS4KICAgICAgICAgICAgIC8vIFRoZSBoYXB0aWMgZGF0YSBmcm9tIHRoZSBlZmZlY3QgaXMgYXQgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgb25lIGZyb20gdHJhY2suCiAgICAgICAgICAgICAvLyBUT0RPOiBXcml0ZSBoYXB0aWMgZGF0YSBkaXJlY3RseSB0byBzaW5rIGJ1ZmZlciB3aGVuIG1peGluZy4KLSAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCAmJiBlZmZlY3RDaGFpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGVmZmVjdENoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0Q2hhaW4gIT0gbnVsbHB0ciAmJiBlZmZlY3RDaGFpbi0+Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0Q2hhaW4gIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVmZmVjdENoYWluLT5jb250YWluc0hhcHRpY0dlbmVyYXRpbmdFZmZlY3RfbCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPSB0cmFjay0+c2Vzc2lvbklkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpc0hhcHRpY1Nlc3Npb25TcGF0aWFsaXplZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlID09IFNQQVRJQUxJWkVSICYmIHRyYWNrLT5pc1NwYXRpYWxpemVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPSB0cmFjay0+c2Vzc2lvbklkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSGFwdGljU2Vzc2lvblNwYXRpYWxpemVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUgPT0gU1BBVElBTElaRVIgJiYgdHJhY2stPmlzU3BhdGlhbGl6ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTM3NTQsNiArMzk2MSw4IEBACiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyVmFsaWQgaXMgb25seSBzZXQgdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkuCiAgICAgICAgICAgICAvLyBUT0RPIHVzZSBtU2xlZXBUaW1lVXMgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtTWl4ZXJDaGFubmVsTWFzaykgOiBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CiAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyOwogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXJGb3JtYXQgOiBtRm9ybWF0OwpAQCAtMzc3NCw3ICszOTgzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtaXhlckNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpKTsKIAogICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIGRpcmVjdGx5IHRvIHRoZSBzaW5rIGFuZCB0aGVyZSBhcmUgaGFwdGljIGNoYW5uZWxzLAogICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhZGp1c3QgY2hhbm5lbHMgYXMgdGhlIHNhbXBsZSBkYXRhIGlzIHBhcnRpYWxseSBpbnRlcmxlYXZlZApAQCAtMzgwNyw4ICs0MDE2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlSGFwdGljU2Vzc2lvbklkID09IGVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhcHRpYyBkYXRhIGlzIGFjdGl2ZSBpbiB0aGlzIGNhc2UsIGNvcHkgaXQgZGlyZWN0bHkgZnJvbQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYnVmZmVyIHRvIG91dCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXB0aWNTZXNzaW9uQ2hhbm5lbENvdW50ID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1NaXhlckNoYW5uZWxNYXNrKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIgJiYgIWlzSGFwdGljU2Vzc2lvblNwYXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFwdGljU2Vzc2lvbkNoYW5uZWxDb3VudCA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdWRpb0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoaGFwdGljU2Vzc2lvbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopZWZmZWN0Q2hhaW5zW2ldLT5vdXRCdWZmZXIoKSArIGF1ZGlvQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0JVRkZFUl9GT1JNQVQsCkBAIC0zODM0LDkgKzQwNTEsOSBAQAogICAgICAgICAvLyBUT0RPIHVzZSBtU2xlZXBUaW1lVXMgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KICAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJWYWxpZCkgewogICAgICAgICAgICAgLy9BTE9HVigid3JpdGluZyBlZmZlY3QgYnVmZmVyIHRvIHNpbmsgYnVmZmVyIGZvcm1hdCAlI3giLCBtRm9ybWF0KTsKLQorICAgICAgICAgICAgdm9pZCAqZWZmZWN0QnVmZmVyID0gKG1UeXBlID09IFNQQVRJQUxJWkVSKSA/IG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIgOiBtRWZmZWN0QnVmZmVyOwogICAgICAgICAgICAgaWYgKHJlcXVpcmVNb25vQmxlbmQoKSkgewotICAgICAgICAgICAgICAgIG1vbm9fYmxlbmQobUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwgbUNoYW5uZWxDb3VudCwgbU5vcm1hbEZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgbW9ub19ibGVuZChlZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsIG1DaGFubmVsQ291bnQsIG1Ob3JtYWxGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICAgICAgfQogCkBAIC0zODQ1LDExICs0MDYyLDMwIEBACiAgICAgICAgICAgICAgICAgLy8gV2UgZG8gaXQgaGVyZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCiAgICAgICAgICAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCiAgICAgICAgICAgICAgICAgbUJhbGFuY2Uuc2V0QmFsYW5jZShtTWFzdGVyQmFsYW5jZS5sb2FkKCkpOwotICAgICAgICAgICAgICAgIG1CYWxhbmNlLnByb2Nlc3MoKGZsb2F0ICopbUVmZmVjdEJ1ZmZlciwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIG1CYWxhbmNlLnByb2Nlc3MoKGZsb2F0ICopZWZmZWN0QnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAvLyBmb3IgU1BBVElBTElaRVIgdGhyZWFkLCBNb3ZlIGhhcHRpY3MgY2hhbm5lbHMgZnJvbSBtRWZmZWN0QnVmZmVyIHRvCisgICAgICAgICAgICAvLyBtUG9zdFNwYXRpYWxpemVyQnVmZmVyIGlmIHRoZSBoYXB0aWNzIHRyYWNrIGlzIHNwYXRpYWxpemVkLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgaGFwdGljcyBjaGFubmVscyBhcmUgYWxyZWFkeSBpbiBtUG9zdFNwYXRpYWxpemVyQnVmZmVyLgorICAgICAgICAgICAgLy8gRm9yIG90aGVyIHRocmVhZCB0eXBlcywgdGhlIGhhcHRpY3MgY2hhbm5lbHMgYXJlIGFscmVhZHkgaW4gbUVmZmVjdEJ1ZmZlci4KKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiBpc0hhcHRpY1Nlc3Npb25TcGF0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzcmNCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKgorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtTWl4ZXJDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGRzdEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCwgbUVmZmVjdEJ1ZmZlckZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KCh1aW50OF90KiltUG9zdFNwYXRpYWxpemVyQnVmZmVyICsgZHN0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbUVmZmVjdEJ1ZmZlciArIHNyY0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgZWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworCiAgICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkIHdoZW4gaGFwdGljIGNoYW5uZWxzIGV4aXN0LAogICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgY2hhbm5lbHMgaGVyZS4KICAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgewpAQCAtMzg5OSwxMSArNDEzNSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW9KaXR0ZXJNcy5hZGQoaml0dGVyTXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc1RpbWVNcy5hZGQocHJvY2Vzc01zKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBpcGVTaW5rLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBNb25vcGlwZSBhdmFpbGFibGVUb1dyaXRlLCB3ZSBlc3RpbWF0ZSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb25vUGlwZSogbW9ub1BpcGUgPSBzdGF0aWNfY2FzdDxNb25vUGlwZSo+KG1QaXBlU2luay5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzc2l6ZV90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVRvV3JpdGUgPSBtUGlwZVNpbmstPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBwaXBlRnJhbWVzID0gbW9ub1BpcGUtPm1heEZyYW1lcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0ZyYW1lcyA9IHBpcGVGcmFtZXMgLSBtYXgoYXZhaWxhYmxlVG9Xcml0ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5hZGQocmVtYWluaW5nRnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVdyaXRlTnMgPSBsYXN0SW9FbmROcyAtIGxhc3RJb0JlZ2luTnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmIGRlbHRhV3JpdGVOcyA+IG1heFBlcmlvZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gU1BBVElBTElaRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWx0YVdyaXRlTnMgPiBtYXhQZXJpb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0SW9FbmROcyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CkBAIC0zOTI0LDcgKzQxNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmICFtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gU1BBVElBTElaRVIpICYmICFtU3RhbmRieSkgewogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtVGhyZWFkVGhyb3R0bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZIC8vIHdlIGFyZSBtaXhpbmcgKGFjdGl2ZSB0cmFja3MpCkBAIC00MDQ5LDEzICs0Mjk4LDYgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjb2xsZWN0VGltZXN0YW1wc19sKCkKIHsKLSAgICAvLyBDb2xsZWN0IHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgUGxheWJhY2sgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KLSAgICBpZiAobVR5cGUgIT0gTUlYRVIKLSAgICAgICAgICAgICYmIG1UeXBlICE9IERVUExJQ0FUSU5HCi0gICAgICAgICAgICAmJiBtVHlwZSAhPSBESVJFQ1QKLSAgICAgICAgICAgICYmIG1UeXBlICE9IE9GRkxPQUQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KICAgICBpZiAobVN0YW5kYnkpIHsKICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoZGlzY29udGludWl0eUZvclN0YW5kYnlPckZsdXNoKCkpOwogICAgICAgICByZXR1cm47CkBAIC00MzU3LDE5ICs0NTk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKmFkZHJlc3M7Ci0gICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKLSAgICAgICAgICAgIC8vRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAotICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKLSAgICAgICAgZnJlZShhZGRyZXNzKTsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KXR5cGUpOwotICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+bGVnYWN5Q3JlYXRlQXVkaW9QYXRjaChwYXRjaC0+c2lua3NbMF0sIHN0ZDo6bnVsbG9wdCwgdHlwZSk7CiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0Y2hTaW5rc0FzU3RyaW5nID0gcGF0Y2hTaW5rc1RvU3RyaW5nKHBhdGNoKTsKQEAgLTQ0MTQsOSArNDY0NCw3IEBACiAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwogICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAwKTsKLSAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC00NDQ4LDggKzQ2NzYsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5LCB0eXBlX3QgdHlwZSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCB0eXBlLCBzeXN0ZW1SZWFkeSksCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5LCB0eXBlX3QgdHlwZSwgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgdHlwZSwgc3lzdGVtUmVhZHksIG1peGVyQ29uZmlnKSwKICAgICAgICAgLy8gbUF1ZGlvTWl4ZXIgYmVsb3cKICAgICAgICAgLy8gbUZhc3RNaXhlciBiZWxvdwogICAgICAgICBtRmFzdE1peGVyRnV0ZXgoMCksCkBAIC00NDg3LDI2ICs0NzE1LDI1IEBACiAKICAgICAvLyBpbml0aWFsaXplIGZhc3QgbWl4ZXIgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24KICAgICBib29sIGluaXRGYXN0TWl4ZXI7Ci0gICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7Ci0gICAgY2FzZSBGYXN0TWl4ZXJfTmV2ZXI6CisgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CiAgICAgICAgIGluaXRGYXN0TWl4ZXIgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGYXN0TWl4ZXJfQWx3YXlzOgotICAgICAgICBpbml0RmFzdE1peGVyID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGYXN0TWl4ZXJfU3RhdGljOgotICAgIGNhc2UgRmFzdE1peGVyX0R5bmFtaWM6Ci0gICAgICAgIC8vIEZhc3RNaXhlciB3YXMgZGVzaWduZWQgdG8gb3BlcmF0ZSB3aXRoIGEgSEFMIHRoYXQgcHVsbHMgYXQgYSByZWd1bGFyIHJhdGUsCi0gICAgICAgIC8vIHdoZXJlIHRoZSBwZXJpb2QgaXMgbGVzcyB0aGFuIGFuIGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQgdGhyZXNob2xkIHRoYXQgY2FuIGJlCi0gICAgICAgIC8vIHNjaGVkdWxlZCByZWxpYWJseSB3aXRoIENGUy4gSG93ZXZlciwgdGhlIEJUIEEyRFAgSEFMIGlzCi0gICAgICAgIC8vIGJ1cnN0eSAoZG9lcyBub3QgcHVsbCBhdCBhIHJlZ3VsYXIgcmF0ZSkgYW5kIHNvIGNhbm5vdCBvcGVyYXRlIHdpdGggRmFzdE1peGVyLgotICAgICAgICBpbml0RmFzdE1peGVyID0gbUZyYW1lQ291bnQgPCBtTm9ybWFsRnJhbWVDb3VudAotICAgICAgICAgICAgICAgICYmIEludGVyc2VjdGlvbihvdXREZXZpY2VUeXBlcygpLCBnZXRBdWRpb0RldmljZU91dEFsbEEyZHBTZXQoKSkuZW1wdHkoKTsKLSAgICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CisgICAgICAgIGNhc2UgRmFzdE1peGVyX05ldmVyOgorICAgICAgICAgICAgaW5pdEZhc3RNaXhlciA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmFzdE1peGVyX0Fsd2F5czoKKyAgICAgICAgICAgIGluaXRGYXN0TWl4ZXIgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmFzdE1peGVyX1N0YXRpYzoKKyAgICAgICAgY2FzZSBGYXN0TWl4ZXJfRHluYW1pYzoKKyAgICAgICAgICAgIGluaXRGYXN0TWl4ZXIgPSBtRnJhbWVDb3VudCA8IG1Ob3JtYWxGcmFtZUNvdW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1dfSUYoaW5pdEZhc3RNaXhlciA9PSBmYWxzZSAmJiBtRnJhbWVDb3VudCA8IG1Ob3JtYWxGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICJGYXN0TWl4ZXIgaXMgcHJlZmVycmVkIGZvciB0aGlzIHNpbmsgYXMgZnJhbWVDb3VudCAlenUgaXMgbGVzcyB0aGFuIHRocmVzaG9sZCAlenUiLAorICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgfQotICAgIEFMT0dXX0lGKGluaXRGYXN0TWl4ZXIgPT0gZmFsc2UgJiYgbUZyYW1lQ291bnQgPCBtTm9ybWFsRnJhbWVDb3VudCwKLSAgICAgICAgICAgICJGYXN0TWl4ZXIgaXMgcHJlZmVycmVkIGZvciB0aGlzIHNpbmsgYXMgZnJhbWVDb3VudCAlenUgaXMgbGVzcyB0aGFuIHRocmVzaG9sZCAlenUiLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICBpZiAoaW5pdEZhc3RNaXhlcikgewogICAgICAgICBhdWRpb19mb3JtYXRfdCBmYXN0TWl4ZXJGb3JtYXQ7CiAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkICYmIG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CkBAIC00NTY2LDYgKzQ3OTMsNyBAQAogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpOT05FOworICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNNYXhBbXBsaXR1ZGUgPSBOQU47CiAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgc3RhdGUtPm1GYXN0VHJhY2tzR2VuKys7CiAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrID0gMTsKQEAgLTQ4NjEsNiArNTA4OSw5IEBACiAgICAgICAgIC8vIGJlZm9yZSBlZmZlY3RzIHByb2Nlc3Npbmcgb3Igb3V0cHV0LgogICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKICAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICB9CkBAIC01MDg5LDcgKzUzMjAsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInVuZXhwZWN0ZWQgdHJhY2sgc3RhdGUgJWQiLCB0cmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJ1bmV4cGVjdGVkIHRyYWNrIHN0YXRlICVkIiwgKGludCl0cmFjay0+bVN0YXRlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CkBAIC01MTAzLDYgKzUzMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSB0cmFjay0+bUZvcm1hdDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSB0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCk7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY01heEFtcGxpdHVkZSA9IHRyYWNrLT5nZXRIYXB0aWNNYXhBbXBsaXR1ZGUoKTsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayB8PSAxIDw8IGo7CiAgICAgICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CkBAIC01MTQ4LDcgKzUzODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIFJlbW92ZSB0aGUgQUxPR1cgd2hlbiB0aGlzIHRoZW9yeSBpcyBjb25maXJtZWQuCiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1TdGF0ZT0lZCwgbVRyYWNrTWFzaz0lI3gsIHJlY2VudFVuZGVycnVucz0ldSwgaXNTaGFyZWQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIHRyYWNrLT5tU3RhdGUsIHN0YXRlLT5tVHJhY2tNYXNrLCByZWNlbnRVbmRlcnJ1bnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgKGludCl0cmFjay0+bVN0YXRlLCBzdGF0ZS0+bVRyYWNrTWFzaywgcmVjZW50VW5kZXJydW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKTsKICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIEZhc3RNaXhlciBzdGF0ZSBhbHJlYWR5IGhhcyB0aGUgdHJhY2sgaW5hY3RpdmUsIGRvIG5vdGhpbmcgaGVyZS4KICAgICAgICAgICAgICAgICB9CkBAIC01MzUyLDExICs1NTg0LDIxIEBACiAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIHRyYWNrSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSk7CisKKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiAhdHJhY2stPmlzU3BhdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkobU1peGVyQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCiAgICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVg7CiAgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gcHJveHktPmdldFNhbXBsZVJhdGUoKTsKQEAgLTUzOTMsMTYgKzU2MzUsMjcgQEAKICAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkCiAgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwotICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/Ci0gICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiAhdHJhY2stPmlzU3BhdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1FZmZlY3RCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbVBvc3RTcGF0aWFsaXplckJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbU1peGVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgdHJhY2stPm1haW5CdWZmZXIoKT8KKyAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCkBAIC01NDI1LDYgKzU2NzgsMTAgQEAKICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19NQVhfQU1QTElUVURFLCAodm9pZCAqKSgmKHRyYWNrLT5tSGFwdGljTWF4QW1wbGl0dWRlKSkpOwogCiAgICAgICAgICAgICAvLyByZXNldCByZXRyeSBjb3VudAogICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllczsKQEAgLTU1NzUsNyArNTgzMiw4IEBACiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgdHJhY2tzIHRoYXQgbmVlZCB0byBiZS4uLgogICAgIHJlbW92ZVRyYWNrc19sKCp0cmFja3NUb1JlbW92ZSk7CiAKLSAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICE9IDApIHsKKyAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICE9IDAgfHwKKyAgICAgICAgICAgIGdldEVmZmVjdENoYWluX2woQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpICE9IDApIHsKICAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTU1ODMsMTIgKzU4NDEsMTcgQEAKICAgICAgICAgLy8gYXMgbG9uZyBhcyB0aGVyZSBhcmUgZWZmZWN0cyB3ZSBzaG91bGQgY2xlYXIgdGhlIGVmZmVjdHMgYnVmZmVyLCB0byBhdm9pZAogICAgICAgICAvLyBwYXNzaW5nIGEgbm9uLWNsZWFuIGJ1ZmZlciB0byB0aGUgZWZmZWN0IGNoYWluCiAgICAgICAgIG1lbXNldChtRWZmZWN0QnVmZmVyLCAwLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUikgeworICAgICAgICAgICAgbWVtc2V0KG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIsIDAsIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgfQogICAgIH0KICAgICAvLyBzaW5rIG9yIG1peCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGlmIGFsbCB0cmFja3MgYXJlIGNvbm5lY3RlZCB0byBhbgogICAgIC8vIGVmZmVjdCBjaGFpbiBhcyBpbiB0aGlzIGNhc2UgdGhlIG1peGVyIHdpbGwgbm90IHdyaXRlIHRvIHRoZSBzaW5rIG9yIG1peCBidWZmZXIKICAgICAvLyBhbmQgdHJhY2sgZWZmZWN0cyB3aWxsIGFjY3VtdWxhdGUgaW50byBpdAotICAgIGlmICgobUJ5dGVzUmVtYWluaW5nID09IDApICYmICgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAotICAgICAgICAgICAgKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKSkgeworICAgIC8vIGFsd2F5cyBjbGVhciBzaW5rIGJ1ZmZlciBmb3Igc3BhdGlhbGl6ZXIgb3V0cHV0IGFzIHRoZSBvdXRwdXQgb2YgdGhlIHNwYXRpYWxpemVyCisgICAgLy8gZWZmZWN0IHdpbGwgYmUgYWNjdW11bGF0ZWQgaW50byBpdAorICAgIGlmICgobUJ5dGVzUmVtYWluaW5nID09IDApICYmICgoKG1peGVkVHJhY2tzICE9IDAgJiYgbWl4ZWRUcmFja3MgPT0gdHJhY2tzV2l0aEVmZmVjdCkgfHwKKyAgICAgICAgICAgIChtaXhlZFRyYWNrcyA9PSAwICYmIGZhc3RUcmFja3MgPiAwKSkgfHwgKG1UeXBlID09IFNQQVRJQUxJWkVSKSkpIHsKICAgICAgICAgLy8gRklYTUUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNob3VsZCByZW1lbWJlciBwcmV2aW91cyB6ZXJvIHN0YXR1cwogICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKICAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOwpAQCAtNTYyNiw2ICs1ODg5LDIwIEBACiAgICAgcmV0dXJuIHRyYWNrQ291bnQ7CiB9CiAKK2Jvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2hlY2tSdW5uaW5nVGltZXN0YW1wKCkKK3sKKyAgICB1aW50NjRfdCBwb3NpdGlvbiA9IDA7CisgICAgc3RydWN0IHRpbWVzcGVjIHVudXNlZDsKKyAgICBjb25zdCBzdGF0dXNfdCByZXQgPSBtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb24sICZ1bnVzZWQpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1MYXN0Q2hlY2tlZFRpbWVzdGFtcFBvc2l0aW9uKSB7CisgICAgICAgICAgICBtTGFzdENoZWNrZWRUaW1lc3RhbXBQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBpc1RyYWNrQWxsb3dlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBib29sIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlzVHJhY2tBbGxvd2VkX2woCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC01Njk2LDYgKzU5NzMsNyBAQAogICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0VuZEludGVydmFsKCk7CisgICAgICAgICAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uRW5kKCk7CiAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CkBAIC02MDM4LDkgKzYzMTYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBpbmdfMigpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25zdW1lZCBhbGwgdGhlIGJ1ZmZlcnMgb2YgdGhpcyB0cmFjay4KICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgdHJhY2tzLgorICAgICAgICAgICAgICAgIGJvb2wgcHJlc0NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUobGF0ZW5jeV9sKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAocHJlc0NvbXBsZXRlID0gdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGxhdGVuY3lfbCgpKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1BhdXNlZCgpIHx8IG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlc0NvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5wcmVzZW50YXRpb25Db21wbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYwNTQsMTkgKzYzMzYsMjQgQEAKICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgbGFzdCB0cmFjayBzdGFydGVkIGZvciBtaXhlciBzdGF0ZSBjb250cm9sCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrSWQpOwotICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47Ci0gICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5kaXNhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gaHcgcGF1c2Ugd2hlbiB0cmFjayBpcyBnb2luZyB0byBiZSByZW1vdmVkIGR1ZSB0byBCVUZGRVIgVElNRU9VVC4KLSAgICAgICAgICAgICAgICAgICAgLy8gdW5saWtlIG1peGVydGhyZWFkLCBIQUwgY2FuIGJlIHBhdXNlZCBmb3IgZGlyZWN0IG91dHB1dAotICAgICAgICAgICAgICAgICAgICBBTE9HVygicGF1c2UgYmVjYXVzZSBvZiBVTkRFUlJVTiwgZnJhbWVzUmVhZHkgPSAlenUsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5GcmFtZXMgPSAldSwgbUZvcm1hdCA9ICUjeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUmVhZHksIG1pbkZyYW1lcywgbUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1Id1BhdXNlZCAmJiAhbVN0YW5kYnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHJ1bm5pbmcgPSBjaGVja1J1bm5pbmdUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2tJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcnJ1bjsgaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5kaXNhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIGh3IHBhdXNlIHdoZW4gdHJhY2sgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCBkdWUgdG8gQlVGRkVSIFRJTUVPVVQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxpa2UgbWl4ZXJ0aHJlYWQsIEhBTCBjYW4gYmUgcGF1c2VkIGZvciBkaXJlY3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicGF1c2UgYmVjYXVzZSBvZiBVTkRFUlJVTiwgZnJhbWVzUmVhZHkgPSAlenUsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluRnJhbWVzID0gJXUsIG1Gb3JtYXQgPSAlI3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkeSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1Id1BhdXNlZCAmJiAhbVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKQEAgLTYyMTIsNiArNjQ5OSw3IEBACiAgICAgICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CiAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nRW5kSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkU25hcHNob3Qub25FbmQoKTsKICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKQEAgLTYyNzcsNiArNjU2NSw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmZsdXNoSHdfbCgpCiB7CisgICAgUGxheWJhY2tUaHJlYWQ6OmZsdXNoSHdfbCgpOwogICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOwpAQCAtNjQxMiw4ICs2NzAxLDcgQEAKIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6T2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBPRkZMT0FELCBzeXN0ZW1SZWFkeSksCi0gICAgICAgIG1QYXVzZWRXcml0ZUxlbmd0aCgwKSwgbVBhdXNlZEJ5dGVzUmVtYWluaW5nKDApLCBtS2VlcFdha2VMb2NrKHRydWUpLAotICAgICAgICBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb24ofjBMTCkKKyAgICAgICAgbVBhdXNlZFdyaXRlTGVuZ3RoKDApLCBtUGF1c2VkQnl0ZXNSZW1haW5pbmcoMCksIG1LZWVwV2FrZUxvY2sodHJ1ZSkKIHsKICAgICAvL0ZJWE1FOiBtU3RhbmRieSBzaG91bGQgYmUgc2V0IHRvIHRydWUgYnkgVGhyZWFkQmFzZSBjb25zdHJ1Y3RvCiAgICAgbVN0YW5kYnkgPSB0cnVlOwpAQCAtNjYxMyw3ICs2OTAxLDggQEAKICAgICAgICAgICAgICAgICAvLyBEcmFpbiBoYXMgY29tcGxldGVkIG9yIHdlIGFyZSBpbiBzdGFuZGJ5LCBzaWduYWwgcHJlc2VudGF0aW9uIGNvbXBsZXRlCiAgICAgICAgICAgICAgICAgaWYgKCEobURyYWluU2VxdWVuY2UgJiAxKSB8fCAhbGFzdCB8fCBtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwotICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUobGF0ZW5jeV9sKCkpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5wcmVzZW50YXRpb25Db21wbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUobGF0ZW5jeV9sKCkpOyAvLyBhbHdheXMgcmV0dXJucyB0cnVlCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KQEAgLTY2MzAsMTkgKzY5MTksNyBAQAogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBib29sIHJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdW51c2VkOwotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcnVubmluZyBjaGVjayByZXN0YXJ0cyB0aGUgcmV0cnkgY291bnRlciBhdCBsZWFzdCBvbmNlLgotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKCZwb3NpdGlvbiwgJnVudXNlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IgJiYgcG9zaXRpb24gIT0gbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZsb2FkVW5kZXJydW5Qb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigidW5kZXJydW4gY291bnRlciwgcnVubmluZyglZCk6ICVsbGQgdnMgJWxsZCIsIHJ1bm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcG9zaXRpb24sIChsb25nIGxvbmcpbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHJ1bm5pbmcgPSBjaGVja1J1bm5pbmdUaW1lc3RhbXAoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MTMsNyArNjk5MCw2IEBACiAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKICAgICAvLyByZXNldCBieXRlcyB3cml0dGVuIGNvdW50IHRvIHJlZmxlY3QgdGhhdCBEU1AgYnVmZmVycyBhcmUgZW1wdHkgYWZ0ZXIgZmx1c2guCiAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uID0gfjBMTDsKIAogICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAvLyBkaXNjYXJkIGFueSBwZW5kaW5nIGRyYWluIG9yIHdyaXRlIGFjayBieSBpbmNyZW1lbnRpbmcgc2VxdWVuY2UKQEAgLTY4MTEsNiArNzA4Nyw3IEBACiAgICAgfQogICAgIGlmIChtU3RhbmRieSkgewogICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dCZWdpbkludGVydmFsKCk7CisgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkJlZ2luKCk7CiAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CkBAIC02OTcxLDYgKzcyNDgsNjkgQEAKICAgICBNaXhlclRocmVhZDo6Y2FjaGVQYXJhbWV0ZXJzX2woKTsKIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdWRpb0ZsaW5nZXI6OlNwYXRpYWxpemVyVGhyZWFkOjpTcGF0aWFsaXplclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnKQorICAgIDogTWl4ZXJUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBzeXN0ZW1SZWFkeSwgU1BBVElBTElaRVIsIG1peGVyQ29uZmlnKQoreworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6U3BhdGlhbGl6ZXJUaHJlYWQ6OmNoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzKCkKK3sKKyAgICBib29sIGhhc1ZpcnR1YWxpemVyID0gZmFsc2U7CisgICAgYm9vbCBoYXNEb3duTWl4ZXIgPSBmYWxzZTsKKyAgICBzcDxFZmZlY3RIYW5kbGU+IGZpbmFsRG93bk1peGVyOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBoYXNWaXJ0dWFsaXplciA9IGNoYWluLT5nZXRFZmZlY3RGcm9tVHlwZV9sKEZYX0lJRF9TUEFUSUFMSVpFUikgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgIGhhc0Rvd25NaXhlciA9IGNoYWluLT5nZXRFZmZlY3RGcm9tVHlwZV9sKEVGRkVDVF9VSUlEX0RPV05NSVgpICE9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbERvd25NaXhlciA9IG1GaW5hbERvd25NaXhlcjsKKyAgICAgICAgbUZpbmFsRG93bk1peGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKGhhc1ZpcnR1YWxpemVyKSB7CisgICAgICAgIGlmIChmaW5hbERvd25NaXhlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQzMl90IHJldDsKKyAgICAgICAgICAgIGZpbmFsRG93bk1peGVyLT5kaXNhYmxlKCZyZXQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsRG93bk1peGVyLmNsZWFyKCk7CisgICAgfSBlbHNlIGlmICghaGFzRG93bk1peGVyKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGRlc2NyaXB0b3JzOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3JzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfVUlJRF9ET1dOTUlYLCAmZGVzY3JpcHRvcnMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQUxPR19BU1NFUlQoIWRlc2NyaXB0b3JzLmVtcHR5KCksCisgICAgICAgICAgICAgICAgIiVzIGdldERlc2NyaXB0b3JzKCkgcmV0dXJuZWQgbm8gZXJyb3IgYnV0IGVtcHR5IGxpc3QiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgZmluYWxEb3duTWl4ZXIgPSBjcmVhdGVFZmZlY3RfbChudWxscHRyIC8qY2xpZW50Ki8sIG51bGxwdHIgLyplZmZlY3RDbGllbnQqLywKKyAgICAgICAgICAgICAgICAwIC8qcHJpb3JpdHkqLywgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsICZkZXNjcmlwdG9yc1swXSwgbnVsbHB0ciAvKmVuYWJsZWQqLywKKyAgICAgICAgICAgICAgICAmc3RhdHVzLCBmYWxzZSAvKnBpbm5lZCovLCBmYWxzZSAvKnByb2JlKi8sIGZhbHNlIC8qbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKi8pOworCisgICAgICAgIGlmIChmaW5hbERvd25NaXhlciA9PSBudWxscHRyIHx8IChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgQUxPR1coIiVzIGVycm9yIGNyZWF0aW5nIGRvd25taXhlciAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICAgICAgZmluYWxEb3duTWl4ZXIuY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3QgcmV0OworICAgICAgICAgICAgZmluYWxEb3duTWl4ZXItPmVuYWJsZSgmcmV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUZpbmFsRG93bk1peGVyID0gZmluYWxEb3duTWl4ZXI7CisgICAgfQorfQorCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCkBAIC03MjczLDYgKzc2MTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nQmVnaW5JbnRlcnZhbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwpAQCAtNzQ0NSw2ICs3Nzg2LDcgQEAKIAogICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQgPSBtUGlwZVNvdXJjZS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlVG9SZWFkID49IDApIHsKKyAgICAgICAgICAgICAgICBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5hZGQoYXZhaWxhYmxlVG9SZWFkKTsKICAgICAgICAgICAgICAgICAvLyBQaXBlU291cmNlIGlzIHRoZSBwcmltYXJ5IGNsb2NrLiAgSXQgaXMgdXAgdG8gdGhlIEF1ZGlvUmVjb3JkIGNsaWVudCB0byBrZWVwIHVwLgogICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemVfdClhdmFpbGFibGVUb1JlYWQgPiBtUGlwZUZyYW1lc1AyLAogICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgZnJhbWVzIHRvIHJlYWQgdGhhbiBmaWZvIHNpemUsICV6ZCA+ICV6dSIsCkBAIC03NzUzLDYgKzgwOTUsNyBAQAogICAgIGlmICghbVN0YW5kYnkpIHsKICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0VuZEludGVydmFsKCk7CisgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkVuZCgpOwogICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgfQogfQpAQCAtNzg3Myw2ICs4MjE2LDcgQEAKICAgICAgIGlmICgKICAgICAgICAgICAgIC8vIHdlIGZvcm1lcmx5IGNoZWNrZWQgZm9yIGEgY2FsbGJhY2sgaGFuZGxlciAobm9uLTAgdGlkKSwKICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gbWF0Y2ggaGFyZHdhcmUgZm9ybWF0LCBmb3JtYXQgY29udmVyc2lvbiB3aWxsIGJlIGRvbmUgaW4gY2xpZW50IHNpZGUuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gRnJhbWUgY291bnQgaXMgbm90IHNwZWNpZmllZCAoMCksIG9yIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgcGlwZSBkZXB0aC4KICAgICAgICAgICAgIC8vIEl0IGlzIE9LIHRvIHByb3ZpZGUgYSBoaWdoZXIgY2FwYWNpdHkgdGhhbiByZXF1ZXN0ZWQuCkBAIC03ODgwLDggKzgyMjQsNiBAQAogICAgICAgICAgICAgKGZyYW1lQ291bnQgPD0gbVBpcGVGcmFtZXNQMikgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKLSAgICAgICAgICAgIC8vIGhhcmR3YXJlIGZvcm1hdAotICAgICAgICAgICAgKGZvcm1hdCA9PSBtRm9ybWF0KSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgY2hhbm5lbCBtYXNrCiAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrKSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKQEAgLTgwNDEsNyArODM4Myw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgUEFVU0lORyAtPiBBQ1RJVkUiKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIHN0YXRlICVkIiwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgc3RhdGUgJWQiLCAoaW50KXJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQpAQCAtODA2Nyw3ICs4NDA5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHVuc3luY2hyb25pemVkIG1TdGF0ZTolZCBjaGFuZ2UiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHJlY29yZFRyYWNrLT5tU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIChpbnQpcmVjb3JkVHJhY2stPm1TdGF0ZSk7CiAgICAgICAgICAgICAgICAgLy8gU29tZW9uZSBlbHNlIGhhcyBjaGFuZ2VkIHN0YXRlLCBsZXQgdGhlbSB0YWtlIG92ZXIsCiAgICAgICAgICAgICAgICAgLy8gbGVhdmUgbVN0YXRlIGluIHRoZSBuZXcgc3RhdGUuCiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKQEAgLTg2MzEsMzAgKzg5NzMsMjIgQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0KLSAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7Ci0KKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYzsKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19JTlBVVF9PUEVORUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKLSAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBkZXNjLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwotICAgICAgICBkZXNjLT5tRnJhbWVDb3VudEhBTCA9IG1GcmFtZUNvdW50OwotICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IDA7CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkLCBtUGF0Y2gsIHRydWUgLyppc0lucHV0Ki8sCisgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKLSAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOwotICAgICAgICBkZXNjLT5tUG9ydElkID0gcG9ydElkOworICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCwgbVBhdGNoLCBwb3J0SWQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgorICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBtQXVkaW9GbGluZ2VyLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGRlc2MsIHBpZCk7CkBAIC04ODA2LDIxICs5MTQwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKmFkZHJlc3M7Ci0gICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgewotICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKLSAgICAgICAgZnJlZShhZGRyZXNzKTsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLAotICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUpOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKTsKLSAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5sZWdhY3lDcmVhdGVBdWRpb1BhdGNoKHBhdGNoLT5zb3VyY2VzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIApAQCAtODg1Miw5ICs5MTc0LDcgQEAKICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7Ci0gICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+bGVnYWN5UmVsZWFzZUF1ZGlvUGF0Y2goKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTkxNjEsNiArOTQ4MSw3IEBACiAgICAgfQogICAgIGlmIChtU3RhbmRieSkgewogICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dCZWdpbkludGVydmFsKCk7CisgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkJlZ2luKCk7CiAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTkyMDAsNiArOTUyMSw3IEBACiAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1EZXZpY2VJZDsKICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CisgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZDsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCkBAIC05MjA4LDcgKzk1MzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNTcGF0aWFsaXplZCk7CiAgICAgICAgIEFMT0dEX0lGKCFzZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCksCiAgICAgICAgICAgICAgICAgICJNbWFwVGhyZWFkOjpzdGFydCBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzLCBpZ25vcmluZyB0aGVtIik7CiAgICAgfSBlbHNlIHsKQEAgLTkyNzgsNyArOTYwMSw3IEBACiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wobVNlc3Npb25JZCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKLSAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1UeXBlKCkpKTsKKyAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbVR5cGUoKSkpOwogICAgICAgICBjaGFpbi0+aW5jVHJhY2tDbnQoKTsKICAgICAgICAgY2hhaW4tPmluY0FjdGl2ZVRyYWNrQ250KCk7CiAgICAgfQpAQCAtOTM1NSw2ICs5Njc4LDcgQEAKICAgICBtSGFsU3RyZWFtLT5zdGFuZGJ5KCk7CiAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dFbmRJbnRlcnZhbCgpOworICAgICAgICBtVGhyZWFkU25hcHNob3Qub25FbmQoKTsKICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIH0KICAgICByZWxlYXNlV2FrZUxvY2soKTsKQEAgLTk0OTcsMzEgKzk4MjEsMjYgQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCBfX3VudXNlZCkgewotICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0KLSAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7Ci0KKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYzsKKyAgICBib29sIGlzSW5wdXQgPSBmYWxzZTsKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19JTlBVVF9PUEVORUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgIGlzSW5wdXQgPSB0cnVlOworICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOwotICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgZGVzYy0+bUZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIGRlc2MtPm1GcmFtZUNvdW50SEFMID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIGRlc2MtPm1MYXRlbmN5ID0gMDsKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQsIG1QYXRjaCwgaXNJbnB1dCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICBicmVhazsKLQogICAgIGNhc2UgQVVESU9fSU5QVVRfQ0xPU0VEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgorICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBtQXVkaW9GbGluZ2VyLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGRlc2MsIHBpZCk7CkBAIC05NTc4LDI5ICs5ODk3LDE4IEBACiAgICAgfQogCiAgICAgaWYgKG1BdWRpb0h3RGV2LT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1IYWxEZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPm51bV9zb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworICAgICAgICBzdGF0dXMgPSBtSGFsRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPnNvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLCBoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKmFkZHJlc3M7Ci0gICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKLSAgICAgICAgICAgIC8vRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAotICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIHBvcnQ7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8YXVkaW9fc291cmNlX3Q+IHNvdXJjZTsKKyAgICAgICAgaWYgKGlzT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHBvcnQgPSBwYXRjaC0+c2lua3NbMF07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgICAgICBwb3J0ID0gcGF0Y2gtPnNvdXJjZXNbMF07CisgICAgICAgICAgICBzb3VyY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZTsKICAgICAgICAgfQotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOwotICAgICAgICBmcmVlKGFkZHJlc3MpOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpdHlwZSk7Ci0gICAgICAgIGlmICghaXNPdXRwdXQoKSkgewotICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gbUhhbFN0cmVhbS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgc3RhdHVzID0gbUhhbFN0cmVhbS0+bGVnYWN5Q3JlYXRlQXVkaW9QYXRjaChwb3J0LCBzb3VyY2UsIHR5cGUpOwogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCkBAIC05NjM5LDkgKzk5NDcsNyBAQAogICAgIGlmIChzdXBwb3J0c0F1ZGlvUGF0Y2hlcykgewogICAgICAgICBzdGF0dXMgPSBtSGFsRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIDApOwotICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5sZWdhY3lSZWxlYXNlQXVkaW9QYXRjaCgpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggMTYwODJhOS4uYjI5NjJlZDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICBPRkZMT0FELCAgICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBpcyBPZmZsb2FkVGhyZWFkCiAgICAgICAgIE1NQVBfUExBWUJBQ0ssICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBNTUFQIHBsYXliYWNrIHN0cmVhbQogICAgICAgICBNTUFQX0NBUFRVUkUsICAgICAgIC8vIFRocmVhZCBjbGFzcyBmb3IgTU1BUCBjYXB0dXJlIHN0cmVhbQorICAgICAgICBTUEFUSUFMSVpFUiwgIC8vCiAgICAgICAgIC8vIElmIHlvdSBhZGQgYW55IHZhbHVlcyBoZXJlLCBhbHNvIHVwZGF0ZSBUaHJlYWRCYXNlOjp0aHJlYWRUeXBlVG9TdHJpbmcoKQogICAgIH07CiAKQEAgLTUzLDcgKzU0LDggQEAKICAgICAgICAgQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSCwKICAgICAgICAgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgICAgIENGR19FVkVOVF9VUERBVEVfT1VUX0RFVklDRSwKLSAgICAgICAgQ0ZHX0VWRU5UX1JFU0laRV9CVUZGRVIKKyAgICAgICAgQ0ZHX0VWRU5UX1JFU0laRV9CVUZGRVIsCisgICAgICAgIENGR19FVkVOVF9DSEVDS19PVVRQVVRfU1RBR0VfRUZGRUNUUwogICAgIH07CiAKICAgICBjbGFzcyBDb25maWdFdmVudERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTg3LDcgKzg5LDEzIEBACiAgICAgcHVibGljOgogICAgICAgICB2aXJ0dWFsIH5Db25maWdFdmVudCgpIHt9CiAKLSAgICAgICAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsgbURhdGEtPmR1bXAoYnVmZmVyLCBzaXplKTsgfQorICAgICAgICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiRXZlbnQgdHlwZTogJWRcbiIsIG1UeXBlKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiRGF0YTpcbiIpOworICAgICAgICAgICAgICAgIG1EYXRhLT5kdW1wKGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBjb25zdCBpbnQgbVR5cGU7IC8vIGV2ZW50IHR5cGUgZS5nLiBDRkdfRVZFTlRfSU8KICAgICAgICAgTXV0ZXggbUxvY2s7ICAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHdpdGggbUNvbmQKQEAgLTEwNSwyMiArMTEzLDIyIEBACiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgewogICAgIHB1YmxpYzoKLSAgICAgICAgSW9Db25maWdFdmVudERhdGEoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CiAgICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGlkKHBpZCksIG1Qb3J0SWQocG9ydElkKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJJTyBldmVudDogZXZlbnQgJWRcbiIsIG1FdmVudCk7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICItIElPIGV2ZW50OiBldmVudCAlZFxuIiwgbUV2ZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBtRXZlbnQ7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IG1FdmVudDsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgICBtUG9ydElkOwogICAgIH07CiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CisgICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIDoKICAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTykgewogICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCwgcG9ydElkKTsKICAgICAgICAgfQpAQCAtMTMzLDcgKzE0MSw3IEBACiAgICAgICAgICAgICBtUGlkKHBpZCksIG1UaWQodGlkKSwgbVByaW8ocHJpbyksIG1Gb3JBcHAoZm9yQXBwKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQcmlvIGV2ZW50OiBwaWQgJWQsIHRpZCAlZCwgcHJpbyAlZCwgZm9yIGFwcD8gJWRcbiIsCisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICItIFByaW8gZXZlbnQ6IHBpZCAlZCwgdGlkICVkLCBwcmlvICVkLCBmb3IgYXBwPyAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgbVBpZCwgbVRpZCwgbVByaW8sIG1Gb3JBcHApOwogICAgICAgICB9CiAKQEAgLTE1OCw3ICsxNjYsNyBAQAogICAgICAgICAgICAgbUtleVZhbHVlUGFpcnMoa2V5VmFsdWVQYWlycykge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiS2V5VmFsdWU6ICVzXG4iLCBtS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICItIEtleVZhbHVlOiAlc1xuIiwgbUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKQEAgLTE4MSw3ICsxODksNyBAQAogICAgICAgICAgICAgbVBhdGNoKHBhdGNoKSwgbUhhbmRsZShoYW5kbGUpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlBhdGNoIGhhbmRsZTogJXVcbiIsIG1IYW5kbGUpOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiLSBQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CkBAIC0yMDUsNyArMjEzLDcgQEAKICAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIi0gUGF0Y2ggaGFuZGxlOiAldVxuIiwgbUhhbmRsZSk7CiAgICAgICAgIH0KIAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwpAQCAtMjI3LDcgKzIzNSw3IEBACiAgICAgICAgICAgICBtT3V0RGV2aWNlcyhvdXREZXZpY2VzKSB7fQogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIkRldmljZXM6ICVzIiwgYW5kcm9pZDo6dG9TdHJpbmcobU91dERldmljZXMpLmNfc3RyKCkpOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiLSBEZXZpY2VzOiAlcyIsIGFuZHJvaWQ6OnRvU3RyaW5nKG1PdXREZXZpY2VzKS5jX3N0cigpKTsKICAgICAgICAgfQogCiAgICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yIG1PdXREZXZpY2VzOwpAQCAtMjQ5LDcgKzI1Nyw3IEBACiAgICAgICAgICAgICBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMobWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpIHt9CiAKICAgICAgICAgdmlydHVhbCB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAibU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zOiAlZCIsIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyk7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICItIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNczogJWQiLCBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpOwogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXM7CkBAIC0yNjUsNiArMjczLDE2IEBACiAgICAgICAgIHZpcnR1YWwgflJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50KCkge30KICAgICB9OwogCisgICAgY2xhc3MgQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50KCkgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0NIRUNLX09VVFBVVF9TVEFHRV9FRkZFQ1RTKSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5DaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50KCkge30KKyAgICB9OworCisKICAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0ICAgIFBNRGVhdGhSZWNpcGllbnQoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCkgOiBtVGhyZWFkKHRocmVhZCkge30KQEAgLTI5MCw4ICszMDgsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIGV4dGVybmFsbHktdmlzaWJsZQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CisgICAgdmlydHVhbCAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQorCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUhBTEZvcm1hdDsgfQogICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KKwogICAgICAgICAgICAgICAgIC8vIENhbGxlZCBieSBBdWRpb0ZsaW5nZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBhbmQgZWZmZWN0cywKICAgICAgICAgICAgICAgICAvLyBhbmQgcmV0dXJucyB0aGUgW25vcm1hbCBtaXhdIGJ1ZmZlcidzIGZyYW1lIGNvdW50LgogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCA9IDA7CkBAIC0zMTEsMTUgKzMzMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCiAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8sIGJvb2wgZm9yQXBwKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbywgYm9vbCBmb3JBcHApOwpAQCAtMzMwLDcgKzM1MSwxMSBAQAogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRVcGRhdGVPdXREZXZpY2VDb25maWdFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBvdXREZXZpY2VzKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUmVzaXplQnVmZmVyQ29uZmlnRXZlbnRfbChpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50X2woKTsKKwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzKCkge30KICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOwpAQCAtMzgzLDcgKzQwOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGlubmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogCiAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlcyBmb3IgaGFzQXVkaW9TZXNzaW9uIChiaXQgZmllbGQpCiAgICAgICAgICAgICAgICAgZW51bSBlZmZlY3Rfc3RhdGUgewpAQCAtMzkxLDggKzQxNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QKICAgICAgICAgICAgICAgICAgICAgVFJBQ0tfU0VTU0lPTiA9IDB4MiwgICAgLy8gdGhlIGF1ZGlvIHNlc3Npb24gY29ycmVzcG9uZHMgdG8gYXQgbGVhc3Qgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIEZBU1RfU0VTU0lPTiA9IDB4NCAgICAgIC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICBGQVNUX1NFU1NJT04gPSAweDQsICAgICAvLyB0aGUgYXVkaW8gc2Vzc2lvbiBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFzdCB0cmFjaworICAgICAgICAgICAgICAgICAgICBTUEFUSUFMSVpFRF9TRVNTSU9OID0gMHg4IC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwYXRpYWxpemVkIHRyYWNrCiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIC8vIGdldCBlZmZlY3QgY2hhaW4gY29ycmVzcG9uZGluZyB0byBzZXNzaW9uIElkLgpAQCAtNDMzLDYgKzQ2MSw3IEBACiAgICAgICAgICAgICAgICAgLy8gLSBFRkZFQ1RfU0VTU0lPTiBpZiBlZmZlY3RzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdCBpbiBvbmUgY2hhaW4KICAgICAgICAgICAgICAgICAvLyAtIFRSQUNLX1NFU1NJT04gaWYgdHJhY2tzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdAogICAgICAgICAgICAgICAgIC8vIC0gRkFTVF9TRVNTSU9OIGlmIGZhc3QgdHJhY2tzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdAorICAgICAgICAgICAgICAgIC8vIC0gU1BBVElBTElaRURfU0VTU0lPTiBpZiBzcGF0aWFsaXplZCB0cmFja3Mgb24gdGhpcyBhdWRpbyBzZXNzaW9uIGV4aXN0CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00NTQsNiArNDgzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsgIC8vIGNhdXRpb24sIG9ubHkgcmVwcmVzZW50cyBmaXJzdCB0cmFjay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1NwYXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFNQQVRJQUxJWkVEX1NFU1NJT047ICAvLyBjYXV0aW9uLCBvbmx5IGZpcnN0IHRyYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTc0LDYgKzYwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IH0KICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzX2woaW50IGZkIF9fdW51c2VkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7IH0KQEAgLTY1MywxMCArNjg3LDE0IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSAtMTsKICAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdElvRW5kTnMgPSAtMTsKIAorICAgICAgICAgICAgICAgIC8vIFRocmVhZFNuYXBzaG90IGlzIHRocmVhZC1zYWZlIChpbnRlcm5hbGx5IGxvY2tlZCkKKyAgICAgICAgICAgICAgICBtZWRpYXV0aWxzOjpUaHJlYWRTbmFwc2hvdCBtVGhyZWFkU25hcHNob3Q7CisKICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZWFkIHVuZGVyIFRocmVhZEJhc2UgbG9jayAoaWYgbm90IG9uIHRoZSB0aHJlYWRMb29wIHRocmVhZCkuCiAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSW9KaXR0ZXJNc3swLjk5NSAvKiBhbHBoYSAqL307CiAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtUHJvY2Vzc1RpbWVNc3swLjk5NSAvKiBhbHBoYSAqL307CiAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtTGF0ZW5jeU1zezAuOTk1IC8qIGFscGhhICovfTsKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzezAuOTk5IC8qIGFscGhhICovfTsKIAogICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGxhc3QgY291bnQgd2hlbiB3ZSBkZWxpdmVyZWQgc3RhdGlzdGljcyB0byBtZWRpYW1ldHJpY3MuCiAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RSZWNvcmRlZFRpbWVzdGFtcFZlcmlmaWVyTiA9IDA7CkBAIC04MjQsNyArODYyLDggQEAKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4TmV4dEJ1ZmZlckRlbGF5TnMgPSAxMDAwMDAwMDA7CiAKICAgICBQbGF5YmFja1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHksCisgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcgPSBudWxscHRyKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCkBAIC04ODEsNiArOTIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMsIHRydWUgLyogZm9yY2UgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzKCkge30KKwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3NfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCkBAIC05MjIsNyArOTYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpOwogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGdldE91dHB1dCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBjbGVhck91dHB1dCgpOwpAQCAtOTQyLDcgKzk4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbVN1c3BlbmRlZCkgPiAwOyB9CiAKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOwogICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgYW5kIHBhc3NpbmcgYW4gZXhwbGljaXQgbU1haW5CdWZmZXIgaW5pdGlhbGl6YXRpb24KQEAgLTk3Myw2ICsxMDE1LDEwIEBACiAKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbU5vcm1hbEZyYW1lQ291bnQ7IH0KIAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTWl4ZXJDaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKQEAgLTEwMTUsNiArMTA2MSw5IEBACiAKICAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZDo6VHJhY2sqIGdldFRyYWNrQnlJZF9sKGF1ZGlvX3BvcnRfaGFuZGxlX3QgdHJhY2tJZCk7CiAKKyAgICAgICAgICAgICAgICBib29sIGhhc01peGVyKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcgfHwgbVR5cGUgPT0gU1BBVElBTElaRVI7CisgICAgICAgICAgICAgICAgfQogcHJvdGVjdGVkOgogICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwpAQCAtMTA4NCw2ICsxMTMzLDE1IEBACiAgICAgLy8gZm9yIGFueSBwcm9jZXNzaW5nIChpbmNsdWRpbmcgb3V0cHV0IHByb2Nlc3NpbmcpLgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkOwogCisgICAgLy8gRnJhbWUgc2l6ZSBhbGlnbmVkIGJ1ZmZlciB1c2VkIGFzIGlucHV0IGFuZCBvdXRwdXQgdG8gYWxsIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3RzCisgICAgLy8gZXhjZXB0IHRoZSBTcGF0aWFsaXplciBpbiBhIFNQQVRJQUxJWkVSIHRocmVhZC4gTm9uIHNwYXRpYWxpemVkIHRyYWNrcyBhcmUgbWl4ZWQgaW50bworICAgIC8vIHRoaXMgYnVmZmVyIHNvIHRoYXQgcG9zdCBwcm9jZXNzaW5nIGVmZmVjdHMgY2FuIGJlIGFwcGxpZWQuCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9zdFNwYXRpYWxpemVyQnVmZmVyID0gbnVsbHB0cjsKKworICAgIC8vIFNpemUgb2YgbVBvc3RTcGF0aWFsaXplckJ1ZmZlciBpbiBieXRlcworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvc3RTcGF0aWFsaXplckJ1ZmZlclNpemU7CisKKwogICAgIC8vIHN1c3BlbmQgY291bnQsID4gMCBtZWFucyBzdXNwZW5kZWQuICBXaGlsZSBzdXNwZW5kZWQsIHRoZSB0aHJlYWQgY29udGludWVzIHRvIHB1bGwgZnJvbQogICAgIC8vIHRyYWNrcyBhbmQgbWl4LCBidXQgZG9lc24ndCB3cml0ZSB0byBIQUwuICBBMkRQIGFuZCBTQ08gSEFMIGltcGxlbWVudGF0aW9ucyBjYW4ndCBoYW5kbGUKICAgICAvLyBjb25jdXJyZW50IHVzZSBvZiBib3RoIG9mIHRoZW0sIHNvIEF1ZGlvIFBvbGljeSBTZXJ2aWNlIHN1c3BlbmRzIG9uZSBvZiB0aGUgdGhyZWFkcyB0bwpAQCAtMTEwMSw2ICsxMTU5LDkgQEAKICAgICAvLyBoYXB0aWMgcGxheWJhY2suCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gMDsKKworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisKIHByaXZhdGU6CiAgICAgLy8gbU1hc3Rlck11dGUgaXMgaW4gYm90aCBQbGF5YmFja1RocmVhZCBhbmQgaW4gQXVkaW9GbGluZ2VyLiAgV2hlbiBhCiAgICAgLy8gUGxheWJhY2tUaHJlYWQgbmVlZHMgdG8gZmluZCBvdXQgaWYgbWFzdGVyLW11dGVkLCBpdCBjaGVja3MgaXQncyBsb2NhbApAQCAtMTEzNCw2ICsxMTk1LDkgQEAKIAogICAgIC8vIENhY2hlIHZhcmlvdXMgY2FsY3VsYXRlZCB2YWx1ZXMsIGF0IHRocmVhZExvb3AoKSBlbnRyeSBhbmQgYWZ0ZXIgYSBwYXJhbWV0ZXIgY2hhbmdlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRDaGVja091dHB1dFN0YWdlRWZmZWN0cygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzLnN0b3JlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKQEAgLTEzMTQsNiArMTM3OCwxNiBAQAogICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHBhdGNoIHVzZWQgYnkgdGhlIGRvd25zdHJlYW0gc29mdHdhcmUgcGF0Y2guCiAgICAgICAgICAgICAgICAgLy8gT25seSB1c2VkIGlmIFRocmVhZEJhc2U6Om1Jc01zZERldmljZSBpcyB0cnVlLgogICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtRG93blN0cmVhbVBhdGNoOworCisgICAgICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCBtQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHN7fTsKKworICAgICAgICAgICAgICAgIC8vIEEgZGlmZmVyZW50aWFsIGNoZWNrIG9uIHRoZSB0aW1lc3RhbXBzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAvLyB0aW1lc3RhbXAgZnJhbWUgcG9zaXRpb24gYmV0d2VlbiB0aGUgbGFzdCBjYWxsIHRvIGNoZWNrUnVubmluZ1RpbWVzdGFtcC4KKyAgICAgICAgICAgICAgICB1aW50NjRfdCBtTGFzdENoZWNrZWRUaW1lc3RhbXBQb3NpdGlvbiA9IH4wTEw7CisKKyAgICAgICAgICAgICAgICBib29sIGNoZWNrUnVubmluZ1RpbWVzdGFtcCgpOworCisgICAgdmlydHVhbCAgICAgdm9pZCBmbHVzaEh3X2woKSB7IG1MYXN0Q2hlY2tlZFRpbWVzdGFtcFBvc2l0aW9uID0gfjBMTDsgfQogfTsKIAogY2xhc3MgTWl4ZXJUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewpAQCAtMTMyMiw3ICsxMzk2LDggQEAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCi0gICAgICAgICAgICAgICAgdHlwZV90IHR5cGUgPSBNSVhFUik7CisgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUgPSBNSVhFUiwKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZyA9IG51bGxwdHIpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgfk1peGVyVGhyZWFkKCk7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKQEAgLTE0MzAsNyArMTUwNSw3IEBACiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpIG92ZXJyaWRlOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKIApAQCAtMTQ5NSw3ICsxNTcwLDcgQEAKICAgICBPZmZsb2FkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+T2ZmbG9hZFRocmVhZCgpIHt9OwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwpAQCAtMTUxMiwxMCArMTU4Nyw2IEBACiAgICAgc2l6ZV90ICAgICAgbVBhdXNlZFdyaXRlTGVuZ3RoOyAgICAgLy8gbGVuZ3RoIGluIGJ5dGVzIG9mIHdyaXRlIGludGVycnVwdGVkIGJ5IHBhdXNlCiAgICAgc2l6ZV90ICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nOyAgLy8gYnl0ZXMgc3RpbGwgd2FpdGluZyBpbiBtaXhidWZmZXIgYWZ0ZXIgcmVzdW1lCiAgICAgYm9vbCAgICAgICAgbUtlZXBXYWtlTG9jazsgICAgICAgICAgLy8ga2VlcCB3YWtlIGxvY2sgd2hpbGUgd2FpdGluZyBmb3Igd3JpdGUgY2FsbGJhY2sKLSAgICB1aW50NjRfdCAgICBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb247IC8vIEN1cnJlbnQgZnJhbWUgcG9zaXRpb24gZm9yIG9mZmxvYWRlZCBwbGF5YmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBhbmQgdmFsaWQgb25seSBkdXJpbmcgdW5kZXJydW4uICB+MCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gdW5kZXJydW4gaGFzIG9jY3VycmVkIGR1cmluZyBwbGF5YmFjayBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCByZXNldCBvbiBzdGFuZGJ5LgogfTsKIAogY2xhc3MgQXN5bmNDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewpAQCAtMTYxMSw2ICsxNjgyLDI0IEBACiAgICAgfQogfTsKIAorY2xhc3MgU3BhdGlhbGl6ZXJUaHJlYWQgOiBwdWJsaWMgTWl4ZXJUaHJlYWQgeworcHVibGljOgorICAgIFNwYXRpYWxpemVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZyk7CisgICAgICAgICAgICB+U3BhdGlhbGl6ZXJUaHJlYWQoKSBvdmVycmlkZSB7fQorCisgICAgICAgICAgICBib29sIGhhc0Zhc3RNaXhlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKK3Byb3RlY3RlZDoKKyAgICAgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRTdGFnZUVmZmVjdHMoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gbUZpbmFsRG93bk1peGVyOworfTsKKwogLy8gcmVjb3JkIHRocmVhZAogY2xhc3MgUmVjb3JkVGhyZWFkIDogcHVibGljIFRocmVhZEJhc2UKIHsKQEAgLTE3MjEsNyArMTgxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgdmlydHVhbCB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwpAQCAtMTc3OSw2ICsxODY4LDggQEAKIAogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgcG9wY291bnQgZm9yIGV4YWN0bHkgb25lIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBjdXJyZW50bHkgZGlzYWJsZWQuIEJlZm9yZSBlbmFibGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgY29tcHJlc3NlZCByZWNvcmQgdGltZXN0YW1wcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfaW5wdXRfZGV2aWNlKG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbkRldmljZVR5cGUoKSA9PSBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTkzMCw3ICsyMDIxLDcgQEAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRIYWxQYXJhbWV0ZXJzX2woKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpIHt9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggOTJmMTI5Yy4uMjY3N2FiMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMjMsNyArMjMsNyBAQAogY2xhc3MgVHJhY2tCYXNlIDogcHVibGljIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciwgcHVibGljIFJlZkJhc2UgewogCiBwdWJsaWM6Ci0gICAgZW51bSB0cmFja19zdGF0ZSB7CisgICAgZW51bSB0cmFja19zdGF0ZSA6IGludDMyX3QgewogICAgICAgICBJRExFLAogICAgICAgICBGTFVTSEVELCAgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBFRCwKQEAgLTEwNyw2ICsxMDcsOCBAQAogCiAgICAgYXVkaW9fYXR0cmlidXRlc190ICBhdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF0dHI7IH0KIAorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNTcGF0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlZS5kdW1wKGZkLCByZWFzb24pOwpAQCAtMjcxLDYgKzI3Myw3IEBACiAKICAgICB2b2lkIHJlbGVhc2VDYmxrKCkgewogICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVN0YXRlLmNsZWFyKCk7CiAgICAgICAgICAgICBtQ2Jsay0+fmF1ZGlvX3RyYWNrX2NibGtfdCgpOyAgIC8vIGRlc3Ryb3kgb3VyIHNoYXJlZC1zdHJ1Y3R1cmUuCiAgICAgICAgICAgICBpZiAobUNsaWVudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZnJlZShtQ2Jsayk7CkBAIC0zNTUsNyArMzU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgT3V0cHV0VHJhY2sgd2hlbiBpdCBpcyBpbiBsb2NhbCBtZW1vcnkKICAgICBzaXplX3QgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAvLyBzaXplIG9mIG1CdWZmZXIgaW4gYnl0ZXMKICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCi0gICAgdHJhY2tfc3RhdGUgICAgICAgICBtU3RhdGU7CisgICAgTWlycm9yZWRWYXJpYWJsZTx0cmFja19zdGF0ZT4gIG1TdGF0ZTsKICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHI7CiAgICAgY29uc3QgdWludDMyX3QgICAgICBtU2FtcGxlUmF0ZTsgICAgLy8gaW5pdGlhbCBzYW1wbGUgcmF0ZSBvbmx5OyBmb3IgdHJhY2tzIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGR5bmFtaWMgcmF0ZXMsIHRoZSBjdXJyZW50IHZhbHVlIGlzIGluIGNvbnRyb2wgYmxvY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja01ldHJpY3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja01ldHJpY3MuaAppbmRleCA3ZmI2OWJlLi4zMGQ2OWFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tNZXRyaWNzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrTWV0cmljcy5oCkBAIC0xMTYsNiArMTE2LDIxIEBACiAgICAgICAgIG1EZXZpY2VTdGFydHVwTXMuYWRkKHN0YXJ0dXBNcyk7CiAgICAgfQogCisgICAgdm9pZCB1cGRhdGVNaW5NYXhWb2x1bWUoaW50NjRfdCBkdXJhdGlvbk5zLCBkb3VibGUgZGV2aWNlVm9sdW1lKSB7CisgICAgICAgIGlmIChkZXZpY2VWb2x1bWUgPiBtTWF4Vm9sdW1lKSB7CisgICAgICAgICAgICBtTWF4Vm9sdW1lID0gZGV2aWNlVm9sdW1lOworICAgICAgICAgICAgbU1heFZvbHVtZUR1cmF0aW9uTnMgPSBkdXJhdGlvbk5zOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVZvbHVtZSA9PSBtTWF4Vm9sdW1lKSB7CisgICAgICAgICAgICBtTWF4Vm9sdW1lRHVyYXRpb25OcyArPSBkdXJhdGlvbk5zOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VWb2x1bWUgPCBtTWluVm9sdW1lKSB7CisgICAgICAgICAgICBtTWluVm9sdW1lID0gZGV2aWNlVm9sdW1lOworICAgICAgICAgICAgbU1pblZvbHVtZUR1cmF0aW9uTnMgPSBkdXJhdGlvbk5zOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVZvbHVtZSA9PSBtTWluVm9sdW1lKSB7CisgICAgICAgICAgICBtTWluVm9sdW1lRHVyYXRpb25OcyArPSBkdXJhdGlvbk5zOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYW4gaW50ZXJ2YWwKICAgICB2b2lkIGxvZ1ZvbHVtZShmbG9hdCB2b2x1bWUpIHsKICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBzeXN0ZW1UaW1lKCk7CkBAIC0xMjMsMTAgKzEzOCwxMyBAQAogICAgICAgICBpZiAobVN0YXJ0Vm9sdW1lVGltZU5zID09IDApIHsKICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSBtVm9sdW1lID0gdm9sdW1lOwogICAgICAgICAgICAgbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnMgPSBtU3RhcnRWb2x1bWVUaW1lTnMgPSB0aW1lTnM7CisgICAgICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWUoMCwgbVZvbHVtZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gdGltZU5zIC0gbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnM7CisgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZShkdXJhdGlvbk5zLCBtVm9sdW1lKTsKICAgICAgICAgbURldmljZVZvbHVtZSA9IChtRGV2aWNlVm9sdW1lICogKG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zIC0gbVN0YXJ0Vm9sdW1lVGltZU5zKSArCi0gICAgICAgICAgICBtVm9sdW1lICogKHRpbWVOcyAtIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zKSkgLyAodGltZU5zIC0gbVN0YXJ0Vm9sdW1lVGltZU5zKTsKKyAgICAgICAgICAgIG1Wb2x1bWUgKiBkdXJhdGlvbk5zKSAvICh0aW1lTnMgLSBtU3RhcnRWb2x1bWVUaW1lTnMpOwogICAgICAgICBtVm9sdW1lID0gdm9sdW1lOwogICAgICAgICBtTGFzdFZvbHVtZUNoYW5nZVRpbWVOcyA9IHRpbWVOczsKICAgICB9CkBAIC0xNTcsNyArMTc1LDExIEBACiAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIGV2ZW50TmFtZSkKICAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9JTlRFUlZBTENPVU5ULCAoaW50MzJfdCltSW50ZXJ2YWxDb3VudCk7CiAgICAgICAgICAgICBpZiAobUlzT3V0KSB7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgbURldmljZVZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FRFVSQVRJT05OUywgbU1heFZvbHVtZUR1cmF0aW9uTnMpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1BWFZPTFVNRSwgbU1heFZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUlOVk9MVU1FRFVSQVRJT05OUywgbU1pblZvbHVtZUR1cmF0aW9uTnMpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRSwgbU1pblZvbHVtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobURldmljZUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgaXRlbS5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRUxBVEVOQ1lNUywgbURldmljZUxhdGVuY3lNcy5nZXRNZWFuKCkpCkBAIC0xODUsNiArMjA3LDEwIEBACiAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAwLmY7CiAgICAgICAgIG1TdGFydFZvbHVtZVRpbWVOcyA9IDA7CiAgICAgICAgIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zID0gMDsKKyAgICAgICAgbU1pblZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgICAgICBtTWF4Vm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgICAgIG1NaW5Wb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICAgICAgbU1heFZvbHVtZUR1cmF0aW9uTnMgPSAwOwogCiAgICAgICAgIG1EZXZpY2VMYXRlbmN5TXMucmVzZXQoKTsKICAgICAgICAgbURldmljZVN0YXJ0dXBNcy5yZXNldCgpOwpAQCAtMjE0LDYgKzI0MCwxMiBAQAogICAgIGludDY0X3QgICAgICAgICAgIG1TdGFydFZvbHVtZVRpbWVOcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CiAgICAgaW50NjRfdCAgICAgICAgICAgbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOwogCisgICAgLy8gTWluL01heCB2b2x1bWUKKyAgICBkb3VibGUgICAgICAgICAgICBtTWluVm9sdW1lIEdVQVJERURfQlkobUxvY2spID0gQU1FRElBTUVUUklDU19JTklUSUFMX01JTl9WT0xVTUU7CisgICAgZG91YmxlICAgICAgICAgICAgbU1heFZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NQVhfVk9MVU1FOworICAgIGludDY0X3QgICAgICAgICAgIG1NaW5Wb2x1bWVEdXJhdGlvbk5zIEdVQVJERURfQlkobUxvY2spID0gMDsKKyAgICBpbnQ2NF90ICAgICAgICAgICBtTWF4Vm9sdW1lRHVyYXRpb25OcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisKICAgICAvLyBsYXRlbmN5IGFuZCBzdGFydHVwIGZvciBlYWNoIGludGVydmFsLgogICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbURldmljZUxhdGVuY3lNcyBHVUFSREVEX0JZKG1Mb2NrKTsKICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1EZXZpY2VTdGFydHVwTXMgR1VBUkRFRF9CWShtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IGQyYTMwYjEuLjYxMzUwMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yMzQsNyArMjM0LDExIEBACiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgbVRlZS5zZXQoc2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgZm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX1RSQUNLKTsKICNlbmRpZgotCisgICAgICAgIC8vIG1TdGF0ZSBpcyBtaXJyb3JlZCBmb3IgdGhlIGNsaWVudCB0byByZWFkLgorICAgICAgICBtU3RhdGUuc2V0TWlycm9yKCZtQ2Jsay0+bVN0YXRlKTsKKyAgICAgICAgLy8gZW5zdXJlIG91ciBzdGF0ZSBtYXRjaGVzIHVwIHVudGlsIHdlIGNvbnNvbGlkYXRlIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgICAgc3RhdGljX2Fzc2VydChDQkxLX1NUQVRFX0lETEUgPT0gSURMRSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQ0JMS19TVEFURV9QQVVTSU5HID09IFBBVVNJTkcpOwogICAgIH0KIH0KIApAQCAtNjI5LDcgKzYzMyw4IEBACiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5LAotICAgICAgICAgICAgZmxvYXQgc3BlZWQpCisgICAgICAgICAgICBmbG9hdCBzcGVlZCwKKyAgICAgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwogICAgICAgICAgICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCkBAIC02NjMsNyArNjY4LDggQEAKICAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSksCiAgICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKSwKICAgICBtRmxhZ3MoZmxhZ3MpLAotICAgIG1TcGVlZChzcGVlZCkKKyAgICBtU3BlZWQoc3BlZWQpLAorICAgIG1Jc1NwYXRpYWxpemVkKGlzU3BhdGlhbGl6ZWQpCiB7CiAgICAgLy8gY2xpZW50ID09IDAgaW1wbGllcyBzaGFyZWRCdWZmZXIgPT0gMAogICAgIEFMT0dfQVNTRVJUKCEoY2xpZW50ID09IDAgJiYgc2hhcmVkQnVmZmVyICE9IDApKTsKQEAgLTcwOSw4ICs3MTUsNyBAQAogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KIAotICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIKLSAgICAgICAgICAgIHx8IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRVUExJQ0FUSU5HOworICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKGZvcm1hdCwgZmxhZ3MpOwogI2lmZGVmIFRFRV9TSU5LCiAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKQogICAgICAgICAgICAgKyAiXyIgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9UIik7CkBAIC05MzMsNyArOTM4LDcgQEAKICAgICBidWZmZXItPnJhdyA9IGJ1Zi5tUmF3OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCAmJiAhaXNTdG9wcGluZygpICYmICFpc1N0b3BwZWQoKSAmJiAhaXNQYXVzZWQoKSAmJiAhaXNPZmZsb2FkZWQoKSkgewogICAgICAgICBBTE9HVigiJXMoJWQpOiB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCksIHN0YXRlOiAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmLm1GcmFtZUNvdW50LCBkZXNpcmVkRnJhbWVzLCBtU3RhdGUpOworICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgKGludCltU3RhdGUpOwogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKGRlc2lyZWRGcmFtZXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CkBAIC0xNDAxLDYgKzE0MDYsNjAgQEAKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBtQXR0ci5jb250ZW50X3R5cGUsCiAgICAgICAgICAgICAuZ2FpbiA9IG1GaW5hbFZvbHVtZSwKICAgICB9OworCisgICAgLy8gV2hlbiBhdHRyaWJ1dGVzIGFyZSB1bmRlZmluZWQsIGRlcml2ZSBkZWZhdWx0IHZhbHVlcyBmcm9tIHN0cmVhbSB0eXBlLgorICAgIC8vIFNlZSBBdWRpb0F0dHJpYnV0ZXMuamF2YSwgdXNhZ2VGb3JTdHJlYW1UeXBlKCkgYW5kIEJ1aWxkZXIuc2V0SW50ZXJuYWxMZWdhY3lTdHJlYW1UeXBlKCkKKyAgICBpZiAobUF0dHIudXNhZ2UgPT0gQVVESU9fVVNBR0VfVU5LTk9XTikgeworICAgICAgICBzd2l0Y2ggKG1TdHJlYW1UeXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX01FRElBOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQUxBUk07CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQ6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5UOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRTsKKyAgICAgICAgICAgIC8vIHVua25vd24gY29udGVudCB0eXBlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQ7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCiAgICAgbWV0YWRhdGEuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAogICAgIHN0cm5jcHkobWV0YWRhdGEudGFncywgbUF0dHIudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKICAgICAqYmFja0luc2VydGVyKysgPSBtZXRhZGF0YTsKQEAgLTE1OTAsNyArMTY0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU3RhdGUgPT0gU1RPUFBFRCkpKSkgewogICAgICAgICBBTE9HVygiJXMoJWQpOiBpbiBpbnZhbGlkIHN0YXRlICVkIG9uIHNlc3Npb24gJWQgJXMgbW9kZSwgZnJhbWVzUmVhZHkgJXp1IiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKLSAgICAgICAgICAgICAgbVN0YXRlLCBtU2Vzc2lvbklkLCAobVNoYXJlZEJ1ZmZlciAhPSAwKSA/ICJzdGF0aWMiIDogInN0cmVhbSIsIGZyYW1lc1JlYWR5KCkpOworICAgICAgICAgICAgICAoaW50KW1TdGF0ZSwgbVNlc3Npb25JZCwgKG1TaGFyZWRCdWZmZXIgIT0gMCkgPyAic3RhdGljIiA6ICJzdHJlYW0iLCBmcmFtZXNSZWFkeSgpKTsKICAgICAgICAgZXZlbnQtPmNhbmNlbCgpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMjU3OCw2ICsyNjM3LDggQEAKICAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOwogICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOwogICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAvLyBTdHJlYW0gaXMgZGlyZWN0LCByZXR1cm4gcHJvdmlkZWQgdGltZXN0YW1wIHdpdGggbm8gY29udmVyc2lvbgorICAgICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCAyZTQ5ZTcxLi40OTY1OTFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CkBAIC0zMSwzMCArMzIsNDIgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uIGludGVyZmFjZXMKLS8vIGJldHdlZW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBBbmRyb2lkIGdlbmVyaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIuCi0vLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgbXVzdCBpbXBsZW1lbnQgbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgY2xhc3MuCisvLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uCisvLyBpbnRlcmZhY2VzIGJldHdlZW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBBbmRyb2lkIGdlbmVyaWMgYXVkaW8gcG9saWN5CisvLyBtYW5hZ2VyLgorLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG11c3QgaW1wbGVtZW50IG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisvLyBjbGFzcy4KIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIHRoZSBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSB0byBjb250cm9sIHRoZSBhY3Rpdml0eSBhbmQKIC8vIGNvbmZpZ3VyYXRpb24gb2YgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgogLy8KIC8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBpbiBjaGFyZ2Ugb2YgdGhlIGF1ZGlvIHJvdXRpbmcgYW5kIHZvbHVtZSBjb250cm9sCiAvLyBwb2xpY2llcyBmb3IgYSBnaXZlbiBwbGF0Zm9ybS4KIC8vIFRoZSBtYWluIHJvbGVzIG9mIHRoaXMgbW9kdWxlIGFyZToKLS8vICAgLSBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgc3lzdGVtIHN0YXRlIChyZW1vdmFibGUgZGV2aWNlIGNvbm5lY3Rpb25zLCBwaG9uZSBzdGF0ZSwgdXNlciByZXF1ZXN0cy4uLikuCi0vLyAgIFN5c3RlbSBzdGF0ZSBjaGFuZ2VzIGFuZCB1c2VyIGFjdGlvbnMgYXJlIG5vdGlmaWVkIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpdGggbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UuCisvLyAgIC0ga2VlcCB0cmFjayBvZiBjdXJyZW50IHN5c3RlbSBzdGF0ZSAocmVtb3ZhYmxlIGRldmljZSBjb25uZWN0aW9ucywgcGhvbmUgc3RhdGUsCisvLyAgIHVzZXIgcmVxdWVzdHMuLi4pLgorLy8gICBTeXN0ZW0gc3RhdGUgY2hhbmdlcyBhbmQgdXNlciBhY3Rpb25zIGFyZSBub3RpZmllZCB0byBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRoIG1ldGhvZHMgb2YgdGhlCisvLyAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlLgogLy8gICAtIHByb2Nlc3MgZ2V0T3V0cHV0KCkgcXVlcmllcyByZWNlaXZlZCB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0cyBhcmUgY3JlYXRlZDogVGhvc2UgcXVlcmllcwotLy8gICByZXR1cm4gYSBoYW5kbGVyIG9uIGFuIG91dHB1dCB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb25maWd1cmVkIGFuZCBvcGVuZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCB0aGF0Ci0vLyAgIG11c3QgYmUgdXNlZCBieSB0aGUgQXVkaW9UcmFjayB3aGVuIHJlZ2lzdGVyaW5nIHRvIHRoZSBBdWRpb0ZsaW5nZXIgd2l0aCB0aGUgY3JlYXRlVHJhY2soKSBtZXRob2QuCi0vLyAgIFdoZW4gdGhlIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHJlbGVhc2VkLCBhIHB1dE91dHB1dCgpIHF1ZXJ5IGlzIHJlY2VpdmVkIGFuZCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGRlY2lkZQotLy8gICB0byBjbG9zZSBvciByZWNvbmZpZ3VyZSB0aGUgb3V0cHV0IGRlcGVuZGluZyBvbiBvdGhlciBzdHJlYW1zIHVzaW5nIHRoaXMgb3V0cHV0IGFuZCBjdXJyZW50IHN5c3RlbSBzdGF0ZS4KLS8vICAgLSBzaW1pbGFybHkgcHJvY2VzcyBnZXRJbnB1dCgpIGFuZCBwdXRJbnB1dCgpIHF1ZXJpZXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1JlY29yZCBvYmplY3RzIGFuZCBjb25maWd1cmUgYXVkaW8gaW5wdXRzLgotLy8gICAtIHByb2Nlc3Mgdm9sdW1lIGNvbnRyb2wgcmVxdWVzdHM6IHRoZSBzdHJlYW0gdm9sdW1lIGlzIGNvbnZlcnRlZCBmcm9tIGFuIGluZGV4IHZhbHVlIChyZWNlaXZlZCBmcm9tIFVJKSB0byBhIGZsb2F0IHZhbHVlCi0vLyAgIGFwcGxpY2FibGUgdG8gZWFjaCBvdXRwdXQgYXMgYSBmdW5jdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncyBhbmQgY3VycmVudCBvdXRwdXQgcm91dGUgKGRlc3RpbmF0aW9uIGRldmljZSkuIEl0Ci0vLyAgIGFsc28gbWFrZSBzdXJlIHRoYXQgc3RyZWFtcyBhcmUgbm90IG11dGVkIGlmIG5vdCBhbGxvd2VkIChlLmcuIGNhbWVyYSBzaHV0dGVyIHNvdW5kIGluIHNvbWUgY291bnRyaWVzKS4KKy8vICAgcmV0dXJuIGEgaGFuZGxlciBvbiBhbiBvdXRwdXQgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCwgY29uZmlndXJlZCBhbmQgb3BlbmVkIGJ5IHRoZSBhdWRpbworLy8gICBwb2xpY3kgbWFuYWdlciBhbmQgdGhhdCBtdXN0IGJlIHVzZWQgYnkgdGhlIEF1ZGlvVHJhY2sgd2hlbiByZWdpc3RlcmluZyB0byB0aGUgQXVkaW9GbGluZ2VyCisvLyAgIHdpdGggdGhlIGNyZWF0ZVRyYWNrKCkgbWV0aG9kLgorLy8gICBXaGVuIHRoZSBBdWRpb1RyYWNrIG9iamVjdCBpcyByZWxlYXNlZCwgYSBwdXRPdXRwdXQoKSBxdWVyeSBpcyByZWNlaXZlZCBhbmQgdGhlIGF1ZGlvIHBvbGljeQorLy8gICBtYW5hZ2VyIGNhbiBkZWNpZGUgdG8gY2xvc2Ugb3IgcmVjb25maWd1cmUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gb3RoZXIgc3RyZWFtcyB1c2luZyB0aGlzCisvLyAgIG91dHB1dCBhbmQgY3VycmVudCBzeXN0ZW0gc3RhdGUuCisvLyAgIC0gc2ltaWxhcmx5IHByb2Nlc3MgZ2V0SW5wdXQoKSBhbmQgcHV0SW5wdXQoKSBxdWVyaWVzIHJlY2VpdmVkIGZyb20gQXVkaW9SZWNvcmQgb2JqZWN0cyBhbmQKKy8vICAgY29uZmlndXJlIGF1ZGlvIGlucHV0cy4KKy8vICAgLSBwcm9jZXNzIHZvbHVtZSBjb250cm9sIHJlcXVlc3RzOiB0aGUgc3RyZWFtIHZvbHVtZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbmRleCB2YWx1ZQorLy8gICAocmVjZWl2ZWQgZnJvbSBVSSkgdG8gYSBmbG9hdCB2YWx1ZSBhcHBsaWNhYmxlIHRvIGVhY2ggb3V0cHV0IGFzIGEgZnVuY3Rpb24gb2YgcGxhdGZvcm0KKy8vICAgc3BlY2lmaWNzZXR0aW5ncyBhbmQgY3VycmVudCBvdXRwdXQgcm91dGUgKGRlc3RpbmF0aW9uIGRldmljZSkuIEl0IGFsc28gbWFrZSBzdXJlIHRoYXQgc3RyZWFtcworLy8gICBhcmUgbm90IG11dGVkIGlmIG5vdCBhbGxvd2VkIChlLmcuIGNhbWVyYSBzaHV0dGVyIHNvdW5kIGluIHNvbWUgY291bnRyaWVzKS4KIC8vCi0vLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgcHJvdmlkZWQgYXMgYSBzaGFyZWQgbGlicmFyeSBieSBwbGF0Zm9ybSB2ZW5kb3JzIChhcyBmb3IgbGliYXVkaW8uc28pCi0vLyBhbmQgaXMgbGlua2VkIHdpdGggbGliYXVkaW9mbGluZ2VyLnNvCi0KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBwcm92aWRlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5IGJ5IHBsYXRmb3JtIHZlbmRvcnMKKy8vIChhcyBmb3IgbGliYXVkaW8uc28pIGFuZCBpcyBsaW5rZWQgd2l0aCBsaWJhdWRpb2ZsaW5nZXIuc28KKy8vCisvLyBOT1RFOiBieSBjb252ZW50aW9uLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGluIEF1ZGlvUG9saWN5TWFuYWdlciBkb2VzCisvLyBub3QgaGF2ZSB0byBwZXJmb3JtIGFueSBudWxscHRyIGNoZWNrIG9uIGlucHV0IGFyZ3VtZW50czogVGhlIGNhbGxlciBvZiB0aGlzIEFQSSBpcworLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyBhbmQgaW4gY2hhcmdlIG9mIHZhbGlkYXRpbmcgYXJndW1lbnRzIHJlY2VpdmVkCisvLyBmcm9tIGluY29taW5nIGJpbmRlciBjYWxscyBiZWZvcmUgY2FsbGluZyBBdWRpb1BvbGljeU1hbmFnZXIuCiAKIC8vICAgIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIEludGVyZmFjZQogY2xhc3MgQXVkaW9Qb2xpY3lJbnRlcmZhY2UKQEAgLTkyLDE0ICsxMDUsMTIgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSA9IDA7CiAKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgLy8gcmV0cmlldmUgYSBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCkBAIC0xMzIsMTAgKzE0MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90ICpvdXRwdXRUeXBlKSA9IDA7Ci0gICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZworICAgIC8vIHN0cmVhbS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7Ci0gICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcKKyAgICAvLyBzdHJlYW0uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIG91dHB1dCwgcmV0dXJuIHRydWUgaWYgdGhlIG91dHB1dCBkZXNjcmlwdG9yIGlzIHJlb3BlbmVkLgogICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CkBAIC0xOTcsMTIgKzIxMSwxMCBAQAogICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKIAotICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotCiAgICAgLy8gcmV0cmlldmVzIHRoZSBsaXN0IG9mIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JWb2x1bWUpID0gMDsKIAogICAgIC8vIEF1ZGlvIGVmZmVjdCBtYW5hZ2VtZW50CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOwpAQCAtMjg1LDggKzI5NywxMCBAQAogCiAgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNVbHRyYXNvdW5kU3VwcG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIHNldEFwcFN0YXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgPSAwOwogCkBAIC0zMzMsOCArMzQ3LDY3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKLX07CiAKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGlmIHNvbWUga2luZCBvZiBzcGF0aWFsaXphdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBpZiB0aGUgYXVkaW8gcGxheWJhY2sgY29udGV4dAorICAgICAqIGRlc2NyaWJlZCBieSB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGlzIHByZXNlbnQuCisgICAgICogVGhlIGNvbnRleHQgaXMgbWFkZSBvZjoKKyAgICAgKiAtIFRoZSBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlLgorICAgICAqIC0gVGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxpbmcgcmF0ZSAuLi4KKyAgICAgKiAtIFRoZSBkZXZpY2VzIGRlc2NyaWJpbmcgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjay4KKyAgICAgKiBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbCBhbmQgb25seSB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogc3VwcG9ydGVkIGNyaXRlcmlhLiBGb3IgaW5zdGFuY2UsIHN1cHBseWluZyBubyBhcmd1bWVudCB3aWxsIHRlbGwgaWYgc3BhdGlhbGl6YXRpb24gaXMKKyAgICAgKiBzdXBwb3J0ZWQgb3Igbm90IGluIGdlbmVyYWwuCisgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQorICAgICAqIEBwYXJhbSBjb25maWcgYXVkaW8gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHRoZSBhdWRpbyBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGluZyByYXRlLi4uCisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzcGF0aWFsaXphdGlvbiBpcyBlbmFibGVkIGZvciB0aGlzIGNvbnRleHQsCisgICAgICogICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgICB2aXJ0dWFsIGJvb2wgY2FuQmVTcGF0aWFsaXplZChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIHNwZWNpYWxpemVkIHNwYXRpYWxpemVyIG91dHB1dCBpZiBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgorICAgICAqIElmIHNldmVyYWwgc3BhdGlhbGl6ZXIgb3V0cHV0IHByb2ZpbGVzIGV4aXN0LCB0aGUgb25lIHN1cHBvcnRpbmcgdGhlIHNpbmsgZGV2aWNlCisgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgYXVkaW8gYXR0cmlidXRlcyB3aWxsIGJlIHNlbGVjdGVkLgorICAgICAqIE9ubHkgb25lIHNwYXRpYWxpemVyIG91dHB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUgYW5kIGFuIGVycm9yIGlzIHJldHVybmVkCisgICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBwYXJhbSBjb25maWcgYXVkaW8gZm9ybWF0LCBjaGFubmVsIG1hc2sgYW5kIHNhbXBsaW5nIHJhdGUgdG8gYmUgdXNlZCBhcyB0aGUgbWl4ZXIKKyAgICAgKiAgICAgICAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwYXRpYWxpemVyIG1peGVyIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZSB0aGF0IHdpbGwgZHJpdmUgdGhlCisgICAgICogICAgICAgIHNpbmsgZGV2aWNlIHNlbGVjdGlvbgorICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIElPIGhhbmRsZSBvZiB0aGUgb3V0cHV0IG9wZW5lZAorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgYW4gb3V0cHV0IHdhcyBvcGVuZWQsIElOVkFMSURfT1BFUkFUSU9OIG9yIEJBRF9WQUxVRSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNwYXRpYWxpemVyT3V0cHV0KGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgYSBwcmV2aW91c2x5IG9wZW5lZCBzcGVjaWFsaXplZCBzcGF0aWFsaXplciBvdXRwdXQuCisgICAgICogQHBhcmFtIG91dHB1dCB0aGUgSU8gaGFuZGxlIG9mIHRoZSBvdXRwdXQgdG8gY2xvc2UuCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBhbiBvdXRwdXQgd2FzIGNsb3NlZCwgSU5WQUxJRF9PUEVSQVRJT04gb3IgQkFEX1ZBTFVFIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNwYXRpYWxpemVyT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworCisgICAgLyoqCisgICAgICogUXVlcnkgaG93IHRoZSBkaXJlY3QgcGxheWJhY2sgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgcGxheWJhY2sgdXNlIGNhc2UKKyAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwbGF5YmFjaworICAgICAqIEBwYXJhbSBkaXJlY3RNb2RlIG91dDogYSBzZXQgb2YgZmxhZ3MgZGVzY3JpYmluZyBob3cgdGhlIGRpcmVjdCBwbGF5YmFjayBpcyBjdXJyZW50bHkKKyAgICAgKiAgICAgICAgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGluIGNhc2Ugb2Ygc3VjY2VzcywgREVBRF9PQkpFQ1QsIE5PX0lOSVQsIEJBRF9WQUxVRSwgUEVSTUlTU0lPTl9ERU5JRUQKKyAgICAgKiAgICAgICAgIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19kaXJlY3RfbW9kZV90IGdldERpcmVjdFBsYXliYWNrU3VwcG9ydChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnKSA9IDA7CisKKyAgICAvLyByZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGRpcmVjdCBhdWRpbyBwcm9maWxlcyBmb3IgdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yJiBhdWRpb1Byb2ZpbGVzKSA9IDA7Cit9OwogCiAvLyBBdWRpbyBQb2xpY3kgY2xpZW50IEludGVyZmFjZQogY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UKQEAgLTM1MywyMyArNDI2LDI5IEBACiAgICAgLy8gQXVkaW8gb3V0cHV0IENvbnRyb2wgZnVuY3Rpb25zCiAgICAgLy8KIAotICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKLSAgICAvLyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUgb3V0cHV0IGJlaW5nIG9wZW5lZC4KLSAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgcGFyYW1ldGVyIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgYnkgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCi0gICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgLy8gb3BlbnMgYW4gYXVkaW8gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVyIHZhbHVlcyBjYW4gaW5kaWNhdGUgdG8KKyAgICAvLyB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIGluIGNhc2UgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGhhcyBubyBzcGVjaWZpYyByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgIC8vIG91dHB1dCBiZWluZyBvcGVuZWQuCisgICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbworICAgIC8vIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QKKyAgICAvLyBhY2NvcmRpbmdseS4KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOwotICAgIC8vIGNyZWF0ZXMgYSBzcGVjaWFsIG91dHB1dCB0aGF0IGlzIGR1cGxpY2F0ZWQgdG8gdGhlIHR3byBvdXRwdXRzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFRoZSBkdXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgYnkKLSAgICAvLyBhIHNwZWNpYWwgbWl4ZXIgdGhyZWFkIGluIHRoZSBBdWRpb0ZsaW5nZXIuCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpID0gMDsKKyAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLgorICAgIC8vIFRoZSBkdXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgYnkgYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSA9IDA7CiAgICAgLy8gY2xvc2VzIHRoZSBvdXRwdXQgc3RyZWFtCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKLSAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0gaXMgcGxhY2VkIGluCi0gICAgLy8gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsIHByb2Nlc3NlZCBidXQgdGhlIG91dHB1dCBtaXggaXMgZGlzY2FyZGVkLgorICAgIC8vIHN1c3BlbmRzIHRoZSBvdXRwdXQuIFdoZW4gYW4gb3V0cHV0IGlzIHN1c3BlbmRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gaGFyZHdhcmUgb3V0cHV0CisgICAgLy8gc3RyZWFtIGlzIHBsYWNlZCBpbiBzdGFuZGJ5IGFuZCB0aGUgQXVkaW9UcmFja3MgYXR0YWNoZWQgdG8gdGhlIG1peGVyIHRocmVhZCBhcmUgc3RpbGwKKyAgICAvLyBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgLy8gcmVzdG9yZXMgYSBzdXNwZW5kZWQgb3V0cHV0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKQEAgLTM5MiwxNiArNDcxLDIxIEBACiAgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucwogICAgIC8vCiAKLSAgICAvLyBzZXQgYSBzdHJlYW0gdm9sdW1lIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0LiBGb3IgdGhlIHNhbWUgdXNlciBzZXR0aW5nLCBhIGdpdmVuIHN0cmVhbSB0eXBlIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCisgICAgLy8gc2V0IGEgc3RyZWFtIHZvbHVtZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dC4gRm9yIHRoZSBzYW1lIHVzZXIgc2V0dGluZywgYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgIC8vIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCiAgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCkgPSAwOwogCiAgICAgLy8gaW52YWxpZGF0ZSBhIHN0cmVhbSB0eXBlLCBjYXVzaW5nIGEgcmVyb3V0ZSB0byBhbiB1bnNwZWNpZmllZCBuZXcgb3V0cHV0CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKLSAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byBzZW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRvIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZS4KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKSA9IDA7Ci0gICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0bworICAgIC8vIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApID0gMDsKKyAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZQorICAgIC8vIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CiAKICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KQEAgLTQ0OSw2ICs1MzMsMTAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCkgPSAwOwogCisgICAgLy8gVXNlZCB0byBub3RpZnkgQXVkaW9TZXJ2aWNlIHRoYXQgYW4gZXJyb3Igd2FzIGVuY291bnRlcmluZyB3aGVuIHJlYWRpbmcKKyAgICAvLyB0aGUgdm9sdW1lIHJhbmdlcywgYW5kIHRoYXQgdGhleSBzaG91bGQgYmUgcmUtaW5pdGlhbGl6ZWQKKyAgICB2aXJ0dWFsIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkgPSAwOworCiAgICAgLy8gVXNlZCB0byBub3RpZnkgdGhlIHNvdW5kIHRyaWdnZXIgbW9kdWxlIHRoYXQgYW4gYXVkaW8gY2FwdHVyZSBpcyBhYm91dCB0bwogICAgIC8vIHRha2UgcGxhY2UuIFRoaXMgc2hvdWxkIHR5cGljYWxseSByZXN1bHQgaW4gYW55IGFjdGl2ZSByZWNvZ25pdGlvbgogICAgIC8vIHNlc3Npb25zIHRvIGJlIHByZWVtcHRlZCBvbiBtb2R1bGVzIHRoYXQgZG8gbm90IHN1cHBvcnQgc291bmQgdHJpZ2dlcgpAQCAtNDU5LDEyICs1NDcsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3RlZFN0YXRlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0LCBib29sIGNvbm5lY3RlZCkgPSAwOwogfTsKIAogICAgIC8vIFRoZXNlIGFyZSB0aGUgc2lnbmF0dXJlcyBvZiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIvZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcgogICAgIC8vIG1ldGhvZHMgcmVzcGVjdGl2ZWx5LCBleHBlY3RlZCBieSBBdWRpb1BvbGljeVNlcnZpY2UsIG5lZWRzIHRvIGJlIGV4cG9zZWQgYnkKICAgICAvLyBsaWJhdWRpb3BvbGljeW1hbmFnZXJjdXN0b20uCi0gICAgdXNpbmcgQ3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgPSBBdWRpb1BvbGljeUludGVyZmFjZSogKCopKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlKik7CisgICAgdXNpbmcgQ3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgPQorICAgICAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqICgqKShBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSopOwogICAgIHVzaW5nIERlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXJJbnN0YW5jZSA9IHZvaWQgKCopKEF1ZGlvUG9saWN5SW50ZXJmYWNlKik7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwppbmRleCBlYjZjMTllLi5mMTMwZjdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCkBAIC0yLDYgKzIsMjMgQEAKICAgInByZXN1Ym1pdCI6IFsKICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXVkaW9wb2xpY3lfdGVzdHMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJHdHNHbXNjb3JlSG9zdFRlc3RDYXNlcyIsCisgICAgICAia2V5d29yZHMiOiBbInByaW1hcnktZGV2aWNlIl0sCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmd0cy5hdWRpby5BdWRpb0hvc3RUZXN0I3Rlc3RUd29DaGFubmVsQ2FwdHVyaW5nIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNOYXRpdmVNZWRpYUFBdWRpb1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8uQUF1ZGlvVGVzdHMjQUF1ZGlvQmFzaWMuKiIKKyAgICAgICAgfQorICAgICAgXQogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCA3MzZmOGIyLi5mMDYzNmEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTI3LDYgKzEyNyw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1Q6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCmluZGV4IDU3N2Y2NDEuLjNkM2UwY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCkBAIC0xMzMsNiArMTMzLDcgQEAKICAqIC0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCiAgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTgogICogLSBBVURJT19TT1VSQ0VfSE9UV09SRAorICogLSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORAogICoKICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgc291cmNlIHByaW9yaXR5IG9yIDAgaWYgcHJpb3JpdHkgaXMgaXJyZWxldmFudCBmb3IgdGhpcyBzb3VyY2UuCiAgKiAgICAgIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBzcGVjaWZpZWQgc291cmNlIGNhbm5vdCBzaGFyZSBhIGdpdmVuIGlucHV0IHN0cmVhbSAoZS5nIHJlbW90ZSBzdWJtaXgpCkBAIC0xNDIsMjIgKzE0MywyNCBAQAogewogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gOTsKKyAgICAgICAgcmV0dXJuIDEwOwogICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgcmV0dXJuIDg7CisgICAgICAgIHJldHVybiA5OwogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgotICAgICAgICByZXR1cm4gNzsKKyAgICAgICAgcmV0dXJuIDg7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6Ci0gICAgICAgIHJldHVybiA2OworICAgICAgICByZXR1cm4gNzsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6Ci0gICAgICAgIHJldHVybiA1OworICAgICAgICByZXR1cm4gNjsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKLSAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIHJldHVybiA1OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgotICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgcmV0dXJuIDQ7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046Ci0gICAgICAgIHJldHVybiAyOworICAgICAgICByZXR1cm4gMzsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgorICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EOgogICAgICAgICByZXR1cm4gMTsKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icAppbmRleCAyMjdjMmQ4Li4xZjIzYWUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCkBAIC0zMCw2ICszMCw3IEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCmluZGV4IGE0MGY2YWEuLmMyNmVhMTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC01NCw3ICs1NCw3IEBACiAgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdCAgewogICAgICAgICByZXR1cm4gbVByb2ZpbGUgIT0gbnVsbHB0ciA/IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkgOiAgRGV2aWNlVmVjdG9yKCk7IH0KIAotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBpbnB1dCBoYW5kbGUKICAgICB3cDxBdWRpb1BvbGljeU1peD4gIG1Qb2xpY3lNaXg7ICAgICAgICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CkBAIC05Myw4ICs5MywxMCBAQAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogICAgIGJvb2wgaXNNbWFwKCkgb3ZlcnJpZGUgewotICAgICAgICBpZiAoZ2V0UG9saWN5QXVkaW9Qb3J0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGdldFBvbGljeUF1ZGlvUG9ydCgpLT5pc01tYXAoKTsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gcG9saWN5UG9ydCA9IGdldFBvbGljeUF1ZGlvUG9ydCgpOyBwb2xpY3lQb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChjb25zdCBhdXRvIHBvcnQgPSBwb2xpY3lQb3J0LT5hc0F1ZGlvUG9ydCgpOyBwb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydC0+aXNNbWFwKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE0Miw2ICsxNDQsNyBAQAogICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKICAgICBpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAogICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190JiBtRmxhZ3MgPSBBdWRpb1BvcnRDb25maWc6Om1GbGFncy5pbnB1dDsKIH07CiAKIGNsYXNzIEF1ZGlvSW5wdXRDb2xsZWN0aW9uIDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCAxZjliNTM1Li43NWZhNTk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgICAgICAgIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpOwogCiAgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VzOyB9CkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKSB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOwotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwgYm9vbCBtdXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCkBAIC0yNzAsOCArMjcwLDEwIEBACiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAgICAgYm9vbCBpc01tYXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIGlmIChnZXRQb2xpY3lBdWRpb1BvcnQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UG9saWN5QXVkaW9Qb3J0KCktPmlzTW1hcCgpOworICAgICAgICBpZiAoY29uc3QgYXV0byBwb2xpY3lQb3J0ID0gZ2V0UG9saWN5QXVkaW9Qb3J0KCk7IHBvbGljeVBvcnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKGNvbnN0IGF1dG8gcG9ydCA9IHBvbGljeVBvcnQtPmFzQXVkaW9Qb3J0KCk7IHBvcnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3J0LT5pc01tYXAoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzAzLDE1ICszMDUsMTkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAhZGV2aWNlcygpLmlzRW1wdHkoKSA/IGRldmljZXMoKS5pdGVtQXQoMCktPmhhc0dhaW5Db250cm9sbGVyKCkgOiBmYWxzZTsKICAgICB9CisgICAgYm9vbCBpc1JvdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsgfQogCiAgICAgRGV2aWNlVmVjdG9yIG1EZXZpY2VzOyAvKio8IGN1cnJlbnQgZGV2aWNlcyB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8gKi8KICAgICB3cDxBdWRpb1BvbGljeU1peD4gbVBvbGljeU1peDsgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKIHByb3RlY3RlZDoKICAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+IG1Qb2xpY3lBdWRpb1BvcnQ7CiAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOwogICAgIHVpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2ZSBjb3VudAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190JiBtRmxhZ3MgPSBBdWRpb1BvcnRDb25maWc6Om1GbGFncy5vdXRwdXQ7CiAKICAgICAvLyBUaGUgQWN0aXZlQ2xpZW50cyBzaG93cyB0aGUgY2xpZW50cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIEBWb2x1bWVTb3VyY2UgY291bnRzCiAgICAgLy8gYW5kIG1heSBpbmNsdWRlIHVwc3RyZWFtIGNsaWVudHMgZnJvbSBhIGR1cGxpY2F0aW5nIHRocmVhZC4KQEAgLTMzMiw3ICszMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgICAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciogZXh0cmFJbmZvID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0OwogICAgIHZvaWQgc2V0RGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIHsgbURldmljZXMgPSBkZXZpY2VzOyB9CiAgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKQEAgLTM1Miw3ICszNTgsMjIgQEAKICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorCisgICAgLyoqCisgICAgICogQGJyaWVmIHNldFN3TXV0ZSBmb3IgU3dPdXRwdXQgcm91dGVkIG9uIGEgZGV2aWNlIHRoYXQgc3VwcG9ydHMgSHcgR2FpbiwgdGhpcyBmdW5jdGlvbiBhbGxvd3MKKyAgICAgKiB0byBtdXRlIHRoZSB0cmFja3MgYXNzb2NpYXRlZCB0byBhIGdpdmVuIHZvbHVtZSBzb3VyY2Ugb25seS4KKyAgICAgKiBBcyBhbiBvdXRwdXQgbWF5IGhvc3Qgb25lIG9yIG1vcmUgc291cmNlKHMpLCBhbmQgYXMgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1heSBkaXNwYXRjaCBvciBub3QKKyAgICAgKiB0aGUgdm9sdW1lIGNoYW5nZSByZXF1ZXN0IGFjY29yZGluZyB0byB0aGUgcHJpb3JpdHkgb2YgdGhlIHZvbHVtZSBzb3VyY2UgdG8gY29udHJvbCB0aGUKKyAgICAgKiB1bmlxdWUgaHcgZ2FpbiBjb250cm9sbGVyLCBhIHNlcGFyYXRlZCBBUEkgYWxsb3dzIHRvIGZvcmNlIGEgbXV0ZS91bm11dGUgb2YgYSB2b2x1bWUgc291cmNlLgorICAgICAqIEBwYXJhbSBtdXRlZCB0cnVlIHRvIG11dGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSB2cyB2b2x1bWUgc291cmNlIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZGV2aWNlIHNjb3BlZCBmb3IgdGhlIGNoYW5nZQorICAgICAqIEBwYXJhbSBkZWxheU1zIHBvdGVudGlhbGx5IGFwcGx5ZWQgdG8gcHJldmVudCBjdXQgc291bmRzLgorICAgICAqLworICAgIHZvaWQgc2V0U3dNdXRlKGJvb2wgbXV0ZWQsIFZvbHVtZVNvdXJjZSB2cywgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpOworCisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwgYm9vbCBtdXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLApAQCAtMzYyLDcgKzM4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CiAKLSAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpoYWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtNDE0LDE1ICs0MzYsMjAgQEAKICAgICAgKi8KICAgICBEZXZpY2VWZWN0b3IgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCisgICAgdWludDMyX3QgZ2V0UmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRUcmFja3NJbnZhbGlkYXRlZFN0YXR1c0J5U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KTsKKwogICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwotICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLworICAgIHVzaW5nIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bUZsYWdzOwogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50CiAgICAgYm9vbCBtUGVuZGluZ1Jlb3BlblRvUXVlcnlQcm9maWxlcyA9IGZhbHNlOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhbiBpbnB1dCBkZXZpY2UgZGlyZWN0bHkuCkBAIC00MzMsOSArNDYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLApAQCAtNDkxLDYgKzUxOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQGJyaWVmIGlzU3RyYXRlZ3lBY3RpdmUgY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJhdGVneSBpcyBhY3RpdmUKKyAgICAgKiBvbiB0aGUgZ2l2ZW4gb3V0cHV0CisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gYmUgY2hlY2tlZCB1cG9uIGFjdGl2aXR5IHN0YXR1cworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdXRwdXQgZm9sbG93aW5nIHRoZSBzdHJhdGVneSBpcyBhY3RpdmUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogQGJyaWVmIGNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZTogd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGFuZCBpZiB0aGlzIGRldmljZSBoYXMKICAgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKICAgICAgKiBwcmV2ZW50IGZyb20gdXNpbmcgdGhpcyBkZXZpY2UgYW55IG1vcmUgYnkgY2xlYXJpbmcgYWxsIHRoZSBzZXNzaW9uIHJvdXRlcyBpbnZvbHZpbmcgdGhpcwpAQCAtNTM1LDYgKzU3MCwxMSBAQAogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKKyAgICAvKioKKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBhbmQgcm91dGVkIHRvIGFueSBvZiB0aGUgc3BlY2lmaWVkIGRldmljZXMKKyAgICAgKi8KKyAgICBib29sIGlzQW55RGV2aWNlVHlwZUFjdGl2ZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3Q7CisKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCmluZGV4IGE1ZGU2NTUuLjk1NWIwY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1VaWQgPSB1aWQ7IH0KIAotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaAppbmRleCA3NGIzNDA1Li4wNDMxNjE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKQEAgLTE2LDE5ICsxNiwyMSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxWb2x1bWUuaD4KICNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCiAjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgpAQCAtNTIsOSArNTQsMTUgQEAKICAgICAgICAgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZShpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSl7fQogICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Q7Ci0KKyAgICAvKioKKyAgICAgKiBAYnJpZWYgaXNJbnRlcm5hbAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpZW50IGNvcnJlc3BvbmRzIHRvIGFuIGF1ZGlvIHBhdGNoIGNyZWF0ZWQgZnJvbSBjcmVhdGVBdWRpb1BhdGNoIEFQSSBvcgorICAgICAqIGZvciBjYWxsIGF1ZGlvIHJvdXRpbmcsIG9yIGZhbHNlIGlmIHRoZSBjbGllbnQgY29ycmVzcG9uZHMgdG8gYW4gQXVkaW9UcmFjaywgQXVkaW9SZWNvcmQgb3IKKyAgICAgKiBIVyBBdWRpbyBTb3VyY2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzSW50ZXJuYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfQogICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH07CkBAIC02Nyw4ICs3NSwxNiBAQAogICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlOyB9CiAgICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CiAgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgLyoqCisgICAgICogQGJyaWVmIGhhc1ByZWZlcnJlZERldmljZSBOb3RlIHRoYXQgYXMgaW50ZXJuYWwgY2xpZW50cyB1c2UgcHJlZmVycmVkIGRldmljZSBmb3IgY29udmVuaWVuY2UsCisgICAgICogd2UgZG8gaGlkZSB0aGlzIGludGVybmFsIGJlaGF2aW9yIHRvIHByZXZlbnQgZnJvbSByZWdyZXNzaW9uIChsaWtlIGludmFsaWRhdGluZyB0cmFjayBmb3IKKyAgICAgKiBjbGllbnRzIGZvbGxvd2luZyBzYW1lIHN0cmF0ZWdpZXMuLi4pCisgICAgICogQHBhcmFtIGFjdGl2ZU9ubHkKKyAgICAgKiBAcmV0dXJuCisgICAgICovCiAgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICAgICAgcmV0dXJuICFpc0ludGVybmFsKCkgJiYKKyAgICAgICAgICAgICAgICBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CiAgICAgfQogCiBwcml2YXRlOgpAQCAtMTAwLDcgKzExNiw3IEBACiAgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7Ci0gICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQpAQCAtMTQxLDYgKzE1NywxNCBAQAogICAgIH0KICAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2aXR5Q291bnQ7IH0KIAorICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzSW52YWxpZDsKKyAgICB9CisKKyAgICB2b2lkIHNldElzSW52YWxpZCgpIHsKKyAgICAgICAgbUlzSW52YWxpZCA9IHRydWU7CisgICAgfQorCiBwcml2YXRlOgogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKICAgICBjb25zdCBwcm9kdWN0X3N0cmF0ZWd5X3QgbVN0cmF0ZWd5OwpAQCAtMTUzLDYgKzE3Nyw3IEBACiAgICAgICogaW52b2x2ZWQgaW4gYSBkdXBsaWNhdGlvbi4KICAgICAgKi8KICAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7CisgICAgYm9vbCBtSXNJbnZhbGlkID0gZmFsc2U7CiB9OwogCiBjbGFzcyBSZWNvcmRDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgpAQCAtMTY4LDcgKzE5Myw3IEBACiAgICAgflJlY29yZENsaWVudERlc2NyaXB0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgICB1c2luZyBDbGllbnREZXNjcmlwdG9yOjpkdW1wOwotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkKCkgY29uc3QgeyByZXR1cm4gbVJJSWQ7IH0KICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtU291cmNlOyB9CkBAIC0yMDksNiArMjM0LDExIEBACiAgICAgICAgIG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICBtU2lua0RldmljZSA9IG51bGxwdHI7CiAgICAgfQorICAgIGJvb2wgYmVsb25nc1RvT3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmc3dPdXRwdXQpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN3T3V0cHV0ICE9IG51bGxwdHIgJiYgbVN3T3V0cHV0LnByb21vdGUoKSA9PSBzd091dHB1dDsKKyAgICB9CisgICAgdm9pZCBzZXRVc2VTd0JyaWRnZSgpIHsgbVVzZVN3QnJpZGdlID0gdHJ1ZTsgfQorICAgIGJvb2wgdXNlU3dCcmlkZ2UoKSBjb25zdCB7IHJldHVybiBtVXNlU3dCcmlkZ2U7IH0KICAgICBib29sIGlzQ29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOyB9CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH0KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9CkBAIC0yMTksNyArMjQ5LDcgQEAKICAgICB2b2lkIHNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpOwogCiAgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKQEAgLTIyNyw2ICsyNTcsMzUgQEAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU2lua0RldmljZTsKICAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OwogICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7CisgICAgYm9vbCBtVXNlU3dCcmlkZ2UgPSBmYWxzZTsKK307CisKKy8qKgorICogQGJyaWVmIFRoZSBJbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3IgY2xhc3MKKyAqIFNwZWNpYWxpemVkIENsaWVudCBEZXNjcmlwdG9yIGZvciBlaXRoZXIgYSByYXcgcGF0Y2ggY3JlYXRlZCBmcm9tIEBzZWUgY3JlYXRlQXVkaW9QYXRjaCBBUEkKKyAqIG9yIGZvciBpbnRlcm5hbCBhdWRpbyBwYXRjaGVzIG1hbmFnZWQgYnkgQVBNIChlLmcuIHBob25lIGNhbGwgcGF0Y2hlcykuCisgKiBXaGF0ZXZlciB0aGUgYnJpZGdlIGNyZWF0ZWQgKHNvZnR3YXJlIG9yIGhhcmR3YXJlKSwgd2UgbmVlZCBhIGNsaWVudCB0byB0cmFjayB0aGUgYWN0aXZpdHkKKyAqIGFuZCBtYW5hZ2Ugdm9sdW1lcy4KKyAqIFRoZSBBdWRpbyBQYXRjaCByZXF1ZXN0ZWQgc2luayBpcyBleHByZXNzZWQgYXMgYSBwcmVmZXJyZWQgZGV2aWNlIHdoaWNoIGFsbG93cyB0byByb3V0ZQorICogdGhlIFN3T3V0cHV0LiBUaGVuIEFQTSB3aWxsIHBlcmZvcm1zIGNoZWNrcyBvbiB0aGUgVUlEIChhZ2FpbnN0IFVJRCBvZiBBdWRpb3NlcnZlcikgb2YgdGhlCisgKiByZXF1ZXN0ZXIgdG8gcHJldmVudCByZXJvdXRpbmcgU3dPdXRwdXQgaW52b2x2ZWQgaW4gcmF3IHBhdGNoZXMuCisgKi8KK2NsYXNzIEludGVybmFsU291cmNlQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIFNvdXJjZUNsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBJbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAmY29uZmlnLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLAorICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBzaW5rRGV2aWNlLAorICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKSA6CisgICAgICAgIFNvdXJjZUNsaWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICBwb3J0SWQsIHVpZCwgYXR0cmlidXRlcywgY29uZmlnLCBzcmNEZXZpY2UsIEFVRElPX1NUUkVBTV9QQVRDSCwgc3RyYXRlZ3ksCisgICAgICAgICAgICB2b2x1bWVTb3VyY2UpCisgICAgeworICAgICAgICBzZXRQcmVmZXJyZWREZXZpY2VJZChzaW5rRGV2aWNlLT5nZXRJZCgpKTsKKyAgICB9CisgICAgYm9vbCBpc0ludGVybmFsKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIH5JbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiB9OwogCiBjbGFzcyBTb3VyY2VDbGllbnRDb2xsZWN0aW9uIDoKQEAgLTI2OSwxMCArMzI4LDEzIEBACiAgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgKHZvaWQpZXh0cmFJbmZvOwogICAgICAgICBzaXplX3QgaW5kZXggPSAwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgewotICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsICsraW5kZXgpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDIwYjQwNDQuLjRhZGM5MjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtNDMsNyArNDMsNyBAQAogICAgIERldmljZURlc2NyaXB0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lID0gIiIsCiAgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzID0gRm9ybWF0VmVjdG9ye30pOwogCi0gICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CisgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgdm9pZCBhZGRBdWRpb1Byb2ZpbGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkgewogICAgICAgICBhZGRBdWRpb1Byb2ZpbGVBbmRTb3J0KG1Qcm9maWxlcywgcHJvZmlsZSk7CkBAIC01MSw4ICs1MSw2IEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldFRhZ05hbWUoKSBjb25zdCB7IHJldHVybiBtVGFnTmFtZTsgfQogCi0gICAgY29uc3QgRm9ybWF0VmVjdG9yJiBlbmNvZGVkRm9ybWF0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmNvZGVkRm9ybWF0czsgfQotCiAgICAgYXVkaW9fZm9ybWF0X3QgZ2V0RW5jb2RlZEZvcm1hdCgpIHsgcmV0dXJuIG1DdXJyZW50RW5jb2RlZEZvcm1hdDsgfQogCiAgICAgdm9pZCBzZXRFbmNvZGVkRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtNjMsOCArNjEsNiBAQAogCiAgICAgYm9vbCBoYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpIGNvbnN0OwogCi0gICAgYm9vbCBzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwotCiAgICAgdm9pZCBzZXREeW5hbWljKCkgeyBtSXNEeW5hbWljID0gdHJ1ZTsgfQogICAgIGJvb2wgaXNEeW5hbWljKCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pYzsgfQogCkBAIC05NSw3ICs5MSw3IEBACiAKICAgICB2b2lkIHNldEVuY2Fwc3VsYXRpb25JbmZvRnJvbUhhbChBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKIAotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0Pjo6dmFsdWUKQEAgLTEwNiw3ICsxMDIsNiBAQAogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIG1UYWdOYW1lOyAvLyBVbmlxdWUgaHVtYW4gcmVhZGFibGUgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UgcG9ydCBmb3VuZCBpbiBjb25mIGZpbGUuCi0gICAgRm9ybWF0VmVjdG9yICAgICAgICBtRW5jb2RlZEZvcm1hdHM7CiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNEeW5hbWljID0gZmFsc2U7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgICBtRGVjbGFyZWRBZGRyZXNzOyAvLyBPcmlnaW5hbCBkZXZpY2UgYWRkcmVzcwpAQCAtMTY4LDYgKzE2MywxMCBAQAogICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKAogICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlVHlwZUFkZHJWZWN0b3IpIGNvbnN0OwogCisgICAgLy8gUmV0dXJuIHRoZSBkZXZpY2UgdmVjdG9yIHRoYXQgY29udGFpbnMgZGV2aWNlIGRlc2NyaXB0b3Igd2hvc2UgQXVkaW9EZXZpY2VUeXBlQWRkciBhcHBlYXJzCisgICAgLy8gaW4gdGhlIGdpdmVuIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIHRvVHlwZUFkZHJWZWN0b3IoKSBjb25zdDsKKwogICAgIC8vIElmIHRoZXJlIGFyZSBkZXZpY2VzIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIHRoZSBkZXZpY2VzIHRvIGFkZCBpcyBub3QgZW1wdHksCiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgZGV2aWNlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBhZGQgYWxsIHRoZSBkZXZpY2VzIHRvIGFkZC4KICAgICB2b2lkIHJlcGxhY2VEZXZpY2VzQnlUeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlVG9SZW1vdmUsIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlc1RvQWRkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggOWJhNzQ1YS4uNDM2ZmNjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTgwLDYgKzgwLDcgQEAKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldFJvdXRlU2lua0RldmljZShjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIGNvbnN0OwogICAgIERldmljZVZlY3RvciBnZXRSb3V0ZVNvdXJjZURldmljZXMoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSBjb25zdDsKKyAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yJiBnZXRSb3V0ZXMoKSBjb25zdCB7IHJldHVybiBtUm91dGVzOyB9CiAgICAgdm9pZCBzZXRSb3V0ZXMoY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmcm91dGVzKTsKIAogICAgIHN0YXR1c190IGFkZE91dHB1dFByb2ZpbGUoY29uc3Qgc3A8SU9Qcm9maWxlPiAmcHJvZmlsZSk7CkBAIC0xMTQsNyArMTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3Q7CiAKICAgICAvLyBUT0RPIHJlbW92ZSBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCi0gICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCByZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCmluZGV4IGE3NGNlZmEuLjkwYjgxMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKQEAgLTM3LDkgKzM3LDcgQEAKIHB1YmxpYzoKICAgICBJT1Byb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCiAgICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpLAotICAgICAgICAgIG1heE9wZW5Db3VudCgxKSwKICAgICAgICAgICBjdXJPcGVuQ291bnQoMCksCi0gICAgICAgICAgbWF4QWN0aXZlQ291bnQoMSksCiAgICAgICAgICAgY3VyQWN0aXZlQ291bnQoMCkge30KIAogICAgIHZpcnR1YWwgfklPUHJvZmlsZSgpID0gZGVmYXVsdDsKQEAgLTU5LDExICs1NywxMiBAQAogICAgIC8vIE9uY2UgY2FwdHVyZSBjbGllbnRzIGFyZSB0cmFja2VkIGluZGl2aWR1YWxseSBhbmQgbm90IHBlciBzZXNzaW9uIHRoaXMgY2FuIGJlIHJlbW92ZWQKICAgICAvLyBNTUFQIG5vIElSUSBpbnB1dCBzdHJlYW1zIGRvIG5vdCBoYXZlIHRoZSBkZWZhdWx0IGxpbWl0YXRpb24gb2Ygb25lIGFjdGl2ZSBjbGllbnQKICAgICAvLyBtYXggYXMgdGhleSBjYW4gYmUgdXNlZCBpbiBzaGFyZWQgbW9kZSBieSB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KKyAgICAvLyBOT1RFOiBQbGVhc2UgY29uc2lkZXIgbW92aW5nIHRvIEF1ZGlvUG9ydCB3aGVuIGFkZHJlc3NpbmcgdGhlIEZJWE1FCiAgICAgLy8gTk9URTogdGhpcyB3b3JrcyBmb3IgZXhwbGljaXQgdmFsdWVzIHNldCBpbiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYmVjYXVzZQogICAgIC8vIGZsYWdzIGFyZSBwYXJzZWQgYmVmb3JlIG1heEFjdGl2ZUNvdW50IGJ5IHRoZSBzZXJpYWxpemVyLgogICAgIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpIG92ZXJyaWRlCiAgICAgewotICAgICAgICBQb2xpY3lBdWRpb1BvcnQ6OnNldEZsYWdzKGZsYWdzKTsKKyAgICAgICAgQXVkaW9Qb3J0OjpzZXRGbGFncyhmbGFncyk7CiAgICAgICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgJiYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSB7CiAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCA9IDA7CiAgICAgICAgIH0KQEAgLTk4LDcgKzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA9IGZhbHNlKSBjb25zdDsKIAotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogICAgIHZvaWQgbG9nKCk7CiAKICAgICBib29sIGhhc1N1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiAhbVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpOyB9CkBAIC0xOTQsMTYgKzE5Myw4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBpbnB1dCBvciBvdXRwdXQgc3RyZWFtcyB0aGF0IGNhbiBiZSBzaW11bHRhbmVvdXNseSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZS4KLSAgICAvLyBCeSBjb252ZW50aW9uIDAgbWVhbnMgbm8gbGltaXQuIFRvIHJlc3BlY3QgbGVnYWN5IGJlaGF2aW9yLCBpbml0aWFsaXplZCB0byAxIGZvciBvdXRwdXQKLSAgICAvLyBwcm9maWxlcyBhbmQgMCBmb3IgaW5wdXQgcHJvZmlsZXMKLSAgICB1aW50MzJfdCAgICAgbWF4T3BlbkNvdW50OwogICAgIC8vIE51bWJlciBvZiBzdHJlYW1zIGN1cnJlbnRseSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZS4KICAgICB1aW50MzJfdCAgICAgY3VyT3BlbkNvdW50OwotICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhpcyBwcm9maWxlLgotICAgIC8vIEJ5IGNvbnZlbnRpb24gMCBtZWFucyBubyBsaW1pdC4gVG8gcmVzcGVjdCBsZWdhY3kgYmVoYXZpb3IsIGluaXRpYWxpemVkIHRvIDAgZm9yIG91dHB1dAotICAgIC8vIHByb2ZpbGVzIGFuZCAxIGZvciBpbnB1dCBwcm9maWxlcwotICAgIHVpbnQzMl90ICAgICBtYXhBY3RpdmVDb3VudDsKICAgICAvLyBOdW1iZXIgb2Ygc3RyZWFtcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIHByb2ZpbGUuIFRoaXMgaXMgbm90IHRoZSBudW1iZXIgb2YgYWN0aXZlIGNsaWVudHMKICAgICAvLyAoQXVkaW9UcmFjayBvciBBdWRpb1JlY29yZCkgYnV0IHRoZSBudW1iZXIgb2YgYWN0aXZlIEhBTCBzdHJlYW1zLgogICAgIHVpbnQzMl90ICAgICBjdXJBY3RpdmVDb3VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaAppbmRleCBhYjMzYjM4Li5hY2Y3ODdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oCkBAIC0zNiw3ICszNiw3IEBACiBjbGFzcyBQb2xpY3lBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wb3J0X2hhbmRsZV90PgogewogcHVibGljOgotICAgIFBvbGljeUF1ZGlvUG9ydCgpIDogbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHt9CisgICAgUG9saWN5QXVkaW9Qb3J0KCkgPSBkZWZhdWx0OwogCiAgICAgdmlydHVhbCB+UG9saWN5QXVkaW9Qb3J0KCkgPSBkZWZhdWx0OwogCkBAIC00OSwxOSArNDksNiBAQAogCiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGFzQXVkaW9Qb3J0KCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKQotICAgIHsKLSAgICAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQotICAgICAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZwotICAgICAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAgICBpZiAoYXNBdWRpb1BvcnQoKS0+Z2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgJiYKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgfQotICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0KICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKICAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CiAgICAgYm9vbCBpc0F0dGFjaGVkKCkgeyByZXR1cm4gbU1vZHVsZSAhPSAwOyB9CkBAIC0xMDUsMjIgKzkyLDYgQEAKICAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKCkgY29uc3Q7CiAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KIAotICAgIGlubGluZSBib29sIGlzRGlyZWN0T3V0cHV0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmCi0gICAgICAgICAgICAgICAgKGFzQXVkaW9Qb3J0KCktPmdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgotICAgICAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIGlzTW1hcCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKGFzQXVkaW9Qb3J0KCktPmdldFR5cGUoKSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKQotICAgICAgICAgICAgICAgICYmICgoKGFzQXVkaW9Qb3J0KCktPmdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKChhc0F1ZGlvUG9ydCgpLT5nZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkpKTsKLSAgICB9Ci0KICAgICB2b2lkIGFkZFJvdXRlKGNvbnN0IHNwPEF1ZGlvUm91dGU+ICZyb3V0ZSkgeyBtUm91dGVzLmFkZChyb3V0ZSk7IH0KICAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yICZnZXRSb3V0ZXMoKSBjb25zdCB7IHJldHVybiBtUm91dGVzOyB9CiAKQEAgLTEyOSw3ICsxMDAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxNYXNrU2V0ICZjaGFubmVsTWFza3MpIGNvbnN0OwogICAgIHZvaWQgcGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcmF0ZSwgY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxpbmdSYXRlcykgY29uc3Q7CiAKLSAgICB1aW50MzJfdCBtRmxhZ3M7IC8vIGF0dHJpYnV0ZSBmbGFncyBtYXNrIChlLmcgcHJpbWFyeSBvdXRwdXQsIGRpcmVjdCBvdXRwdXQuLi4pLgogICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQogICAgIEF1ZGlvUm91dGVWZWN0b3IgbVJvdXRlczsgLy8gUm91dGVzIGludm9sdmluZyB0aGlzIHBvcnQKIH07CkBAIC0xNDEsMjcgKzExMSwxOCBAQAogCiAgICAgdmlydHVhbCBzcDxQb2xpY3lBdWRpb1BvcnQ+IGdldFBvbGljeUF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKIAotICAgIHN0YXR1c190IHZhbGlkYXRpb25CZWZvcmVBcHBseUNvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgY29uc3Q7Ci0KLSAgICB2b2lkIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKLSAgICAgICAgICAgIG1GbGFncyA9IGNvbmZpZy0+ZmxhZ3M7Ci0gICAgICAgIH0KKyAgICBzdGF0dXNfdCB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIGNvbnN0IHsKKyAgICAgICAgc3A8UG9saWN5QXVkaW9Qb3J0PiBwb2xpY3lBdWRpb1BvcnQgPSBnZXRQb2xpY3lBdWRpb1BvcnQoKTsKKyAgICAgICAgcmV0dXJuIHBvbGljeUF1ZGlvUG9ydCA/IHBvbGljeUF1ZGlvUG9ydC0+Y2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShjb25maWcpIDogTk9fSU5JVDsKICAgICB9CiAKLSAgICB2b2lkIHRvUG9saWN5QXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotCi0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzU2FtZUh3TW9kdWxlQXMoY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0Q29uZmlnPiYgb3RoZXIpIGNvbnN0IHsKKyAgICBib29sIGhhc1NhbWVId01vZHVsZUFzKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAob3RoZXIuZ2V0KCkgIT0gbnVsbHB0cikgJiYgKG90aGVyLT5nZXRQb2xpY3lBdWRpb1BvcnQoKS5nZXQoKSAhPSBudWxscHRyKSAmJgogICAgICAgICAgICAgICAgIChnZXRQb2xpY3lBdWRpb1BvcnQoKS5nZXQoKSAhPSBudWxscHRyKSAmJgogICAgICAgICAgICAgICAgIChvdGhlci0+Z2V0UG9saWN5QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpID09CiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2xpY3lBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkpOwogICAgIH0KIAotICAgIHVuaW9uIGF1ZGlvX2lvX2ZsYWdzIG1GbGFncyA9IHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH07CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCmluZGV4IGNkMTAwMTAuLjU4MDkzOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Db2xsZWN0aW9ucyIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwogI2luY2x1ZGUgIkF1ZGlvQ29sbGVjdGlvbnMuaCIKICNpbmNsdWRlICJBdWRpb1JvdXRlLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKQEAgLTQwLDEwICs0MiwxMSBAQAogICAgIGlmIChhdWRpb1JvdXRlVmVjdG9yLmlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc0F1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIGF1ZGlvUm91dGVWZWN0b3Iuc2l6ZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdWRpbyBSb3V0ZXMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwgYXVkaW9Sb3V0ZVZlY3Rvci5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9Sb3V0ZVZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSAlenU6XG4iLCBzcGFjZXMsICIiLCBpICsgMSk7Ci0gICAgICAgIGF1ZGlvUm91dGVWZWN0b3IuaXRlbUF0KGkpLT5kdW1wKGRzdCwgNCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzICV6dS4gIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZChwcmVmaXguY19zdHIoKSk7CisgICAgICAgIGF1ZGlvUm91dGVWZWN0b3IuaXRlbUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggNzAxNmEwOC4uNmY3MWFjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsNiArMTcsOCBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvSW5wdXREZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCiAjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0F1ZGlvTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CkBAIC0zNyw2ICszOSw3IEBACiAgICAgICAgIGlmIChwcm9maWxlLT5nZXRHYWlucygpLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIHByb2ZpbGUtPmdldEdhaW5zKClbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKICAgICAgICAgfQorICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdClwcm9maWxlLT5nZXRGbGFncygpOwogICAgIH0KIH0KIApAQCAtNjIsNyArNjUsNiBAQAogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CiAgICAgaWYgKChzdGF0dXMgPSB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uZmlnKSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGJhY2t1cENvbmZpZyk7Ci0gICAgICAgIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgfQogCiAgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CkBAIC03NiwxNCArNzgsMTIgQEAKIHsKICAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLAogICAgICAgICAgICAgICAgICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7Ci0gICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQUxMOwogICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgewogICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CiAgICAgfQogCiAgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0gICAgdG9Qb2xpY3lBdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogCiAgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKQEAgLTUxMCwxNyArNTEwLDI1IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXMgJXNcbiIsIG1EZXZpY2UtPnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKLSAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOwotICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOwotICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKLSAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWwgPSB0b1N0cmluZyhtRmxhZ3MpOworICAgIGlmICghZmxhZ3NMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgZmxhZ3NMaXRlcmFsID0gIiAoIiArIGZsYWdzTGl0ZXJhbCArICIpIjsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlBvcnQgSUQ6ICVkOyAweCUwNHglcyVzJXNcbiIsCisgICAgICAgICAgICBnZXRJZCgpLCBtRmxhZ3MsIGZsYWdzTGl0ZXJhbC5jX3N0cigpLAorICAgICAgICAgICAgZXh0cmFJbmZvICE9IG51bGxwdHIgPyAiOyAiIDogIiIsIGV4dHJhSW5mbyAhPSBudWxscHRyID8gZXh0cmFJbmZvIDogIiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlczsgJWQ7IENoYW5uZWwgbWFzazogMHgleFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcobUZvcm1hdCksIG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RldmljZXM6ICVzXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgbURldmljZS0+dG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOworICAgIG1FbmFibGVkRWZmZWN0cy5kdW1wKGRzdCwgc3BhY2VzIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKKyAgICBpZiAoZ2V0Q2xpZW50Q291bnQoKSAhPSAwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNBdWRpb1JlY29yZCBDbGllbnRzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgZ2V0Q2xpZW50Q291bnQoKSk7CisgICAgICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICB9CiB9CiAKIGJvb2wgQXVkaW9JbnB1dENvbGxlY3Rpb246OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTYwOCwxMCArNjE2LDEyIEBACiAKIHZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbklucHV0cyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIElucHV0cyAoJXp1KTpcbiIsIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiICAlenUuICIsIGkgKyAxKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXh0cmFJbmZvID0gYmFzZTo6U3RyaW5nUHJpbnRmKCJJL08gaGFuZGxlOiAlZCIsIGtleUF0KGkpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSwgZXh0cmFJbmZvLmNfc3RyKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggNmIwOGY3Yy4uOGVlZmU3NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9PdXRwdXREZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KICNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeU1peC5oIgpAQCAtMTU1LDcgKzE1Nyw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwgYm9vbCAvKm11dGVkKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJi8qc3RyZWFtcyovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKQEAgLTE4OCw3ICsxOTAsNiBAQAogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CiAgICAgaWYgKChzdGF0dXMgPSB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uZmlnKSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGJhY2t1cENvbmZpZyk7Ci0gICAgICAgIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgfQogCiAgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CkBAIC0yMDEsMTMgKzIwMiwxMSBAQAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0FMTDsKICAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKICAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOwogICAgIH0KICAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKLSAgICB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CiAKICAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwogICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CkBAIC0yNDUsMzIgKzI0NCw0NSBAQAogICAgICAgICByZXR1cm4gY2xpZW50LT52b2x1bWVTb3VyY2UoKSAhPSB2b2x1bWVTb3VyY2VUb0lnbm9yZTsgfSkgIT0gZW5kKG1BY3RpdmVDbGllbnRzKTsKIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIG1JZCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOwotICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7Ci0gICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiUG9ydCBJRDogJWQlcyVzXG4iLAorICAgICAgICAgICAgbUlkLCBleHRyYUluZm8gIT0gbnVsbHB0ciA/ICI7ICIgOiAiIiwgZXh0cmFJbmZvICE9IG51bGxwdHIgPyBleHRyYUluZm8gOiAiIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzOyAlZDsgQ2hhbm5lbCBtYXNrOiAweCV4XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhtRm9ybWF0KSwgbVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRGV2aWNlczogJXNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBkZXZpY2VzKCkudG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHbG9iYWwgYWN0aXZlIGNvdW50OiAldVxuIiwgc3BhY2VzLCAiIiwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICBpZiAoIW1Sb3V0aW5nQWN0aXZpdGllcy5lbXB0eSgpKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByb2R1Y3QgU3RyYXRlZ2llcyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLAorICAgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5zaXplKCkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUm91dGluZ0FjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNpZCAlZDogIiwgc3BhY2VzICsgMSwgIiIsIGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDApOworICAgICAgICB9CiAgICAgfQotICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVBY3Rpdml0aWVzKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVm9sdW1lIEFjdGl2aXRpZXMgaWQ6ICVkIiwgaXRlci5maXJzdCk7Ci0gICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICBpZiAoIW1Wb2x1bWVBY3Rpdml0aWVzLmVtcHR5KCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVm9sdW1lIEFjdGl2aXRpZXMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwKKyAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5zaXplKCkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc2lkICVkOiAiLCBzcGFjZXMgKyAxLCAiIiwgaXRlci5maXJzdCk7CisgICAgICAgICAgICBpdGVyLnNlY29uZC5kdW1wKGRzdCwgMCk7CisgICAgICAgIH0KICAgICB9Ci0gICAgZHN0LT5hcHBlbmQoIiBBdWRpb1RyYWNrIENsaWVudHM6XG4iKTsKLSAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKLSAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBpZiAoZ2V0Q2xpZW50Q291bnQoKSAhPSAwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEF1ZGlvVHJhY2sgY2xpZW50cyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLCBnZXRDbGllbnRDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICB9CiAgICAgaWYgKCFtQWN0aXZlQ2xpZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBhY3RpdmUgKHN0cmVhbSkgY2xpZW50czpcbiIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdWRpb1RyYWNrIGFjdGl2ZSAoc3RyZWFtKSBjbGllbnRzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsCisgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudHMuc2l6ZSgpKTsKICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBtQWN0aXZlQ2xpZW50cykgewotICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlKnNpZCAlenU6ICIsIHNwYWNlcyArIDEsICIiLCBpbmRleCArIDEpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgICAgIH0KLSAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOwogICAgIH0KIH0KIApAQCAtMjg1LDcgKzI5Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKICAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBjbGllbnRJbnRlcmZhY2UpLAogICAgIG1Qcm9maWxlKHByb2ZpbGUpLCBtSW9IYW5kbGUoQVVESU9fSU9fSEFORExFX05PTkUpLCBtTGF0ZW5jeSgwKSwKLSAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKICAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CkBAIC0yOTQsMTEgKzMwNSwxOCBAQAogICAgIH0KIH0KIAotdm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciogZXh0cmFJbmZvKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CisgICAgU3RyaW5nOCBhbGxFeHRyYUluZm87CisgICAgaWYgKGV4dHJhSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGFsbEV4dHJhSW5mby5hcHBlbmRGb3JtYXQoIiVzOyAiLCBleHRyYUluZm8pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWwgPSB0b1N0cmluZyhtRmxhZ3MpOworICAgIGFsbEV4dHJhSW5mby5hcHBlbmRGb3JtYXQoIkxhdGVuY3k6ICVkOyAweCUwNHgiLCBtTGF0ZW5jeSwgbUZsYWdzKTsKKyAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIGFsbEV4dHJhSW5mby5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgIH0KKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGFsbEV4dHJhSW5mby5jX3N0cigpKTsKIH0KIAogRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VzKCkgY29uc3QKQEAgLTQzNSwxNCArNDUzLDM2IEBACiAgICAgICAgICAgICBtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUID8gQVVESU9fTEFURU5DWV9MT1cgOiBBVURJT19MQVRFTkNZX05PUk1BTDsKIH0KIAotYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0U3dNdXRlKAorICAgICAgICBib29sIG11dGVkLCBWb2x1bWVTb3VyY2UgdnMsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbVR5cGVzLAorICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywgdWludDMyX3QgZGVsYXlNcykgeworICAgIC8vIHZvbHVtZSBzb3VyY2UgYWN0aXZlIGFuZCBtb3JlIHRoYW4gb25lIHZvbHVtZSBzb3VyY2UgaXMgYWN0aXZlLCBvdGhlcndpc2UsIG5vLW9wIG9yIGxldAorICAgIC8vIHNldFZvbHVtZSBjb250cm9sbGluZyBTVyBhbmQvb3IgSFcgR2FpbnMKKyAgICBpZiAoIXN0cmVhbVR5cGVzLmVtcHR5KCkgJiYgaXNBY3RpdmUodnMpICYmIChnZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkuc2l6ZSgpID4gMSkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VQb3J0IDogZGV2aWNlcygpKSB7CisgICAgICAgICAgICBpZiAoaXNTaW5nbGVEZXZpY2VUeXBlKGRldmljZVR5cGVzLCBkZXZpY2VQb3J0LT50eXBlKCkpICYmCisgICAgICAgICAgICAgICAgICAgIGRldmljZVBvcnQtPmhhc0dhaW5Db250cm9sbGVyKHRydWUgLypjYW5Vc2VGb3JWb2x1bWUqLykpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWVBbXBsID0gbXV0ZWQgPyAwLjBmIDogVm9sdW1lOjpEYlRvQW1wbCgwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IG91dHB1dDogJWQsIHZzOiAlZCwgbXV0ZWQ6ICVkLCBhY3RpdmUgdnMgY291bnQ6ICV6dSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIG1Jb0hhbmRsZSwgdnMsIG11dGVkLCBnZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IHN0cmVhbVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLCBib29sIG11dGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2cywgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQogewogICAgIFN0cmVhbVR5cGVWZWN0b3Igc3RyZWFtcyA9IHN0cmVhbVR5cGVzOwotICAgIGlmICghQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lRGIsIHZzLCBzdHJlYW1UeXBlcywgZGV2aWNlVHlwZXMsIGRlbGF5TXMsIGZvcmNlKSkgeworICAgIGlmICghQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoCisgICAgICAgICAgICB2b2x1bWVEYiwgbXV0ZWQsIHZzLCBzdHJlYW1UeXBlcywgZGV2aWNlVHlwZXMsIGRlbGF5TXMsIGZvcmNlKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChzdHJlYW1zLmVtcHR5KCkpIHsKQEAgLTQ1OSwxMSArNDk5LDE3IEBACiAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgVm9sdW1lIFNvdXJjZSAob3IgaWYgd2UgYWxsb3cgc2V2ZXJhbCBjdXJ2ZXMgd2l0aGluIHNhbWUgdm9sdW1lIGdyb3VwKQogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIEB0b2RvOiBkZWZhdWx0IHN0cmVhbSB2b2x1bWUgdG8gbWF4ICgwKSB3aGVuIHVzaW5nIEhXIFBvcnQgZ2Fpbj8KLSAgICAgICAgICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBWb2x1bWU6OkRiVG9BbXBsKDApOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIC8vIEFsbG93cyB0byBzZXQgU1cgR2FpbiBvbiBBdWRpb0ZsaW5nZXIgaWY6CisgICAgICAgICAgICAvLyAgICAtdm9sdW1lIGdyb3VwIGhhcyBleHBsaWNpdCBzdHJlYW0ocykgYXNzb2NpYXRlZAorICAgICAgICAgICAgLy8gICAgLXZvbHVtZSBncm91cCB3aXRoIG5vIGV4cGxpY2l0IHN0cmVhbShzKSBpcyB0aGUgb25seSBhY3RpdmUgc291cmNlIG9uIHRoaXMgb3V0cHV0CisgICAgICAgICAgICAvLyBBbGxvd3MgdG8gbXV0ZSBTVyBHYWluIG9uIEF1ZGlvRmxpbmdlciBvbmx5IGZvciB2b2x1bWUgZ3JvdXAgd2l0aCBleHBsaWNpdCBzdHJlYW0ocykKKyAgICAgICAgICAgIGlmICghc3RyZWFtVHlwZXMuZW1wdHkoKSB8fCAoZ2V0QWN0aXZlVm9sdW1lU291cmNlcygpLnNpemUoKSA9PSAxKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgY2FuTXV0ZSA9IG11dGVkICYmICh2b2x1bWVEYiAhPSAwLjBmKSAmJiAhc3RyZWFtVHlwZXMuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWVBbXBsID0gY2FuTXV0ZSA/IDAuMGYgOiBWb2x1bWU6OkRiVG9BbXBsKDApOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgQXVkaW9HYWlucyBnYWlucyA9IGRldmljZVBvcnQtPmdldEdhaW5zKCk7CiAgICAgICAgICAgICBpbnQgZ2Fpbk1pblZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNaW5WYWx1ZUluTWIoKTsKICAgICAgICAgICAgIGludCBnYWluTWF4VmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldE1heFZhbHVlSW5NYigpOwpAQCAtNDkxLDcgKzUzNyw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCitzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqaGFsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtNTA0LDQyICs1NTEsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHRoZSByZXF1ZXN0ZWQgZGV2aWNlcywgYWxsIGRldmljZSB0eXBlczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGR1bXBEZXZpY2VUeXBlcyhkZXZpY2VzLnR5cGVzKCkpLmNfc3RyKCkpOwogCi0gICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZzsKLSAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgbENvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGxDb25maWcuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBsQ29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgYXVkaW9fY29uZmlnX3QgbEhhbENvbmZpZzsKKyAgICBpZiAoaGFsQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgbEhhbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgbEhhbENvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGxIYWxDb25maWcuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBsSGFsQ29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CisgICAgICAgIGxIYWxDb25maWcgPSAqaGFsQ29uZmlnOwogICAgIH0KIAogICAgIC8vIGlmIHRoZSBzZWxlY3RlZCBwcm9maWxlIGlzIG9mZmxvYWRlZCBhbmQgbm8gb2ZmbG9hZCBpbmZvIHdhcyBzcGVjaWZpZWQsCiAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKICAgICBpZiAoKG1Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgJiYKLSAgICAgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOwotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7Ci0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGxDb25maWcuZm9ybWF0OwotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5zdHJlYW1fdHlwZSA9IHN0cmVhbTsKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZHVyYXRpb25fdXMgPSAtMTsKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uaGFzX3ZpZGVvID0gdHJ1ZTsgLy8gY29uc2VydmF0aXZlCi0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7IC8vIGxpa2VseQotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5lbmNhcHN1bGF0aW9uX21vZGUgPSBsQ29uZmlnLm9mZmxvYWRfaW5mby5lbmNhcHN1bGF0aW9uX21vZGU7Ci0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmNvbnRlbnRfaWQgPSBsQ29uZmlnLm9mZmxvYWRfaW5mby5jb250ZW50X2lkOwotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5zeW5jX2lkID0gbENvbmZpZy5vZmZsb2FkX2luZm8uc3luY19pZDsKKyAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICBsSGFsQ29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGxIYWxDb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGxIYWxDb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBsSGFsQ29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBsSGFsQ29uZmlnLmZvcm1hdDsKKyAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW07CisgICAgfQorCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBsTWl4ZXJDb25maWc7CisgICAgaWYgKG1peGVyQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgbE1peGVyQ29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgICAgIGxNaXhlckNvbmZpZy5zYW1wbGVfcmF0ZSA9IGxIYWxDb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIGxNaXhlckNvbmZpZy5jaGFubmVsX21hc2sgPSBsSGFsQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgbE1peGVyQ29uZmlnLmZvcm1hdCA9IGxIYWxDb25maWcuZm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIGxNaXhlckNvbmZpZyA9ICptaXhlckNvbmZpZzsKICAgICB9CiAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKIAorICAgIC8vIElmIG5vIG1peGVyIGNvbmZpZyBpcyBzcGVjaWZpZWQgZm9yIGEgc3BhdGlhbGl6ZXIgb3V0cHV0LCBkZWZhdWx0IHRvIDUuMSBmb3IgcHJvcGVyCisgICAgLy8gY29uZmlndXJhdGlvbiBvZiB0aGUgZmluYWwgZG93bm1peGVyIG9yIHNwYXRpYWxpemVyCisgICAgaWYgKChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMAorICAgICAgICAgICAgJiYgbWl4ZXJDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICBsTWl4ZXJDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMTsKKyAgICB9CisKICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAogICAgICAgICAgIG1EZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuY19zdHIoKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxIYWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbE1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MYXRlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzKTsKQEAgLTU1MCw5ICs2MDksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ZWQgZGV2aWNlICVzIGZvciBvcGVuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICpvdXRwdXQsIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBsSGFsQ29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBsSGFsQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgbUZvcm1hdCA9IGxIYWxDb25maWcuZm9ybWF0OworICAgICAgICBtTWl4ZXJDaGFubmVsTWFzayA9IGxNaXhlckNvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgIG1JZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9ICpvdXRwdXQ7CiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQrKzsKQEAgLTY1MSw2ICs3MTEsMjMgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3VpbnQzMl90IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCkgY29uc3QKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KG1PdXRwdXQxLT5nZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCksCisgICAgICAgICAgICAgICAgbU91dHB1dDItPmdldFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMoKSk7CisgICAgfQorICAgIHJldHVybiBtUHJvZmlsZS0+cmVjb21tZW5kZWRNdXRlRHVyYXRpb25NczsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0VHJhY2tzSW52YWxpZGF0ZWRTdGF0dXNCeVN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgeworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gY2xpZW50LT5zdHJhdGVneSgpKSB7CisgICAgICAgICAgICBjbGllbnQtPnNldElzSW52YWxpZCgpOworICAgICAgICB9CisgICAgfQorfQorCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgogSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKQEAgLTY1OSwxMSArNzM2LDExIEBACiB7CiB9CiAKLXZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3QKIHsKLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKLSAgICBkc3QtPmFwcGVuZCgiU291cmNlOlxuIik7Ci0gICAgbVNvdXJjZS0+ZHVtcChkc3QsIDAsIDApOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgZXh0cmFJbmZvKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU291cmNlOlxuIiwgc3BhY2VzLCAiIik7CisgICAgbVNvdXJjZS0+ZHVtcChkc3QsIHNwYWNlcyk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKApAQCAtNjc5LDE0ICs3NTYsMTQgQEAKIH0KIAogCi1ib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCitib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoCi0gICAgICAgICAgICB2b2x1bWVEYiwgdm9sdW1lU291cmNlLCBzdHJlYW1zLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOworICAgICAgICAgICAgdm9sdW1lRGIsIG11dGVkLCB2b2x1bWVTb3VyY2UsIHN0cmVhbXMsIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSk7CiAKICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgLy8gVE9ETzogdXNlIGdhaW4gY29udHJvbGxlciBvbiBzb3VyY2UgZGV2aWNlIGlmIGFueSB0byBhZGp1c3Qgdm9sdW1lCkBAIC03NTgsNiArODM1LDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICh2YWx1ZUF0KGkpLT5pc1N0cmF0ZWd5QWN0aXZlKHBzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBhdWRpb19pb19oYW5kbGVfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0QTJkcE91dHB1dCgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewpAQCAtODMzLDEzICs5MjAsMjUgQEAKICAgICAgICAgfQogICAgIH0KIH0KK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQW55RGV2aWNlVHlwZUFjdGl2ZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKQorICAgICAgICAgICAgICAgICYmIG91dHB1dERlc2MtPmRldmljZXMoKS5jb250YWluc0RldmljZUFtb25nVHlwZXMoZGV2aWNlVHlwZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKIHZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBPdXRwdXRzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiICAlenUuICIsIGkgKyAxKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXh0cmFJbmZvID0gYmFzZTo6U3RyaW5nUHJpbnRmKCJJL08gaGFuZGxlOiAlZCIsIGtleUF0KGkpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSwgZXh0cmFJbmZvLmNfc3RyKCkpOwogICAgIH0KIH0KIApAQCAtODU4LDEwICs5NTcsMTIgQEAKIAogdm9pZCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIE91dHB1dHMgKCV6dSk6XG4iLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBleHRyYUluZm8gPSBiYXNlOjpTdHJpbmdQcmludGYoIkkvTyBoYW5kbGU6ICVkIiwga2V5QXQoaSkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpLCBleHRyYUluZm8uY19zdHIoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IGQ3OTExMGEuLjRmMDNkYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0yMCw3ICsyMCw5IEBACiAjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzcsMjAgKzM5LDIxIEBACiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICZjZmcgPSBjZmdzW2ldOwotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICBbJXMgJWRdICIsIHNwYWNlcywgIiIsIHByZWZpeCwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzWyVzICVkXSAiLCBzcGFjZXMsICIiLCBwcmVmaXgsIGkgKyAxKTsKICAgICAgICAgaWYgKGNmZy50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJEZXZpY2UgSUQgJWQgJXMiLCBjZmcuaWQsIHRvU3RyaW5nKGNmZy5leHQuZGV2aWNlLnR5cGUpLmNfc3RyKCkpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2UoY2ZnLmV4dC5kZXZpY2UudHlwZSwgY2ZnLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIFBvcnQgSUQ6ICVkOyB7JXN9IiwKKyAgICAgICAgICAgICAgICAgICAgY2ZnLmlkLCBkZXZpY2UudG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBQb3J0IElEOiAlZDsgSS9PIGhhbmRsZTogJWQ7IiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9CiAgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUGF0Y2ggJWQ6IG93bmVyIHVpZCAlNGQsIGhhbmRsZSAlMmQsIGFmIGhhbmRsZSAlMmRcbiIsCi0gICAgICAgICAgICBzcGFjZXMsICIiLCBpbmRleCArIDEsIG1VaWQsIG1IYW5kbGUsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgib3duZXIgdWlkICU0ZDsgaGFuZGxlICUyZDsgYWYgaGFuZGxlICUyZFxuIiwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOwogICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKICAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KQEAgLTEzNSw5ICsxMzgsMTEgQEAKIAogdm9pZCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUGF0Y2hlczpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBBdWRpbyBQYXRjaGVzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCBiMjA5YTg4Li41NDZmNTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC02NzUsNyArNjc1LDcgQEAKIAogdm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIFBvbGljeSBNaXg6XG4iKTsKKyAgICBkc3QtPmFwcGVuZCgiXG4gQXVkaW8gUG9saWN5IE1peDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCA4NjY0MTdlLi41M2NjNDczIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMjUsMTUgKzI1LDE2IEBACiAKIHZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlczsgU2luazogXCIlc1wiXG4iLAorICAgICAgICAgICAgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4IiwgbVNpbmstPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKICAgICBpZiAobVNvdXJjZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1NvdXJjZXM6ICIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXMgXG4iLCBzcGFjZXMgKyA0LCAiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcIiVzXCIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGkgKyAxIDwgbVNvdXJjZXMuc2l6ZSgpKSBkc3QtPmFwcGVuZCgiLCAiKTsKICAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKIGJvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZzcmNQb3J0LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcAppbmRleCBhZmM0ZDAxLi43MTNiMGFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcApAQCAtMTgsOSArMTgsMTIgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisKICNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKQEAgLTM5LDM1ICs0MiwzNiBAQAogICAgIHJldHVybiBzcy5zdHIoKTsKIH0KIAotdm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQ2xpZW50ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUG9ydCBJZDogJWQgU2Vzc2lvbiBJZDogJWQgVUlEOiAlZFxuIiwgc3BhY2VzLCAiIiwKLSAgICAgICAgICAgICBtUG9ydElkLCBtU2Vzc2lvbklkLCBtVWlkKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBGb3JtYXQ6ICUwOHggU2FtcGxpbmcgcmF0ZTogJWQgQ2hhbm5lbHM6ICUwOHhcbiIsIHNwYWNlcywgIiIsCi0gICAgICAgICAgICAgbUNvbmZpZy5mb3JtYXQsIG1Db25maWcuc2FtcGxlX3JhdGUsIG1Db25maWcuY2hhbm5lbF9tYXNrKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdHRyaWJ1dGVzOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobUF0dHJpYnV0ZXMpLmNfc3RyKCkpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiUG9ydCBJRDogJWQ7IFNlc3Npb24gSUQ6ICVkOyB1aWQgJWQ7IFN0YXRlOiAlc1xuIiwKKyAgICAgICAgICAgIG1Qb3J0SWQsIG1TZXNzaW9uSWQsIG1VaWQsIG1BY3RpdmUgPyAiQWN0aXZlIiA6ICJJbmFjdGl2ZSIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlczsgJWQ7IENoYW5uZWwgbWFzazogMHgleFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcobUNvbmZpZy5mb3JtYXQpLCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F0dHJpYnV0ZXM6ICVzXG4iLCBzcGFjZXMsICIiLCB0b1N0cmluZyhtQXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgaWYgKG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQcmVmZXJyZWQgRGV2aWNlIFBvcnQgSUQ6ICVkO1xuIiwgc3BhY2VzLCAiIiwgbVByZWZlcnJlZERldmljZUlkKTsKKyAgICB9CiB9CiAKLXZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTdHJlYW06ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU3RyZWFtLCBtRmxhZ3MpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJlZmNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2aXR5Q291bnQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERBUCBQcmltYXJ5IE1peDogJXBcbiIsIHNwYWNlcywgIiIsIG1QcmltYXJ5TWl4LnByb21vdGUoKS5nZXQoKSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gREFQIFNlY29uZGFyeSBPdXRwdXRzOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgZm9yIChhdXRvIGRlc2MgOiBtU2Vjb25kYXJ5T3V0cHV0cykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICAtICVkXG4iLCBzcGFjZXMsICIiLAotICAgICAgICAgICAgICAgIGRlc2MucHJvbW90ZSgpID09IG51bGxwdHIgPyAwIDogZGVzYy5wcm9tb3RlKCktPm1Jb0hhbmRsZSk7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1N0cmVhbTogJWQ7IEZsYWdzOiAlMDh4OyBSZWZjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBtU3RyZWFtLCBtRmxhZ3MsIG1BY3Rpdml0eUNvdW50KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzREFQIFByaW1hcnkgTWl4OiAlcFxuIiwgc3BhY2VzLCAiIiwgbVByaW1hcnlNaXgucHJvbW90ZSgpLmdldCgpKTsKKyAgICBpZiAoIW1TZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RBUCBTZWNvbmRhcnkgT3V0cHV0czogIiwgc3BhY2VzIC0gMiwgIiIpOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA6IG1TZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJWQsICIsIGRlc2MucHJvbW90ZSgpID09IG51bGxwdHIgPyAwIDogZGVzYy5wcm9tb3RlKCktPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQogfQogCiBzdGQ6OnN0cmluZyBUcmFja0NsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotCiAgICAgc3MgPDwgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIDw8ICIgU3RyZWFtOiAiIDw8IG1TdHJlYW07CiAgICAgcmV0dXJuIHNzLnN0cigpOwogfQpAQCAtODEsMTAgKzg1LDExIEBACiAgICAgfQogfQogCi12b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2U6ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU291cmNlLCBtRmxhZ3MpOworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTb3VyY2U6ICVkOyBGbGFnczogJTA4eDsgaXMgc291bmR0cmlnZ2VyOiAlZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIG1Tb3VyY2UsIG1GbGFncywgbUlzU291bmRUcmlnZ2VyKTsKICAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyArIDIgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOwogfQogCkBAIC05NSw3ICsxMDAsOCBAQAogICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCiAgICAgICAgIHtjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5jaGFubmVsX21hc2ssIGNvbmZpZy5mb3JtYXR9LCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAotICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8sIG51bGxwdHIpLCBtU3JjRGV2aWNlKHNyY0RldmljZSkKKyAgICAgICAge30gLyogU291cmNlcyBkbyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cyovLCBudWxscHRyKSwKKyAgICBtU3JjRGV2aWNlKHNyY0RldmljZSkKIHsKIH0KIApAQCAtMTA5LDE4ICsxMTUsMjEgQEAKICAgICBtSHdPdXRwdXQgPSBod091dHB1dDsKIH0KIAotdm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBEZXZpY2U6XG4iLCBzcGFjZXMsICIiKTsKLSAgICBtU3JjRGV2aWNlLT5kdW1wKGRzdCwgMiwgMCk7CisgICAgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqc0RldmljZTogIiwgc3BhY2VzLCAiIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgIG1TcmNEZXZpY2UtPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKIH0KIAogdm9pZCBTb3VyY2VDbGllbnRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBzb3VyY2VzOlxuIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIEF1ZGlvIHNvdXJjZXMgKCV6dSk6XG4iLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiAgJXp1LiAiLCBpICsgMSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCBhOTJkMzFlLi5hOTA5MzMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMTksMTAgKzE5LDExIEBACiAKICNpbmNsdWRlIDxzZXQ+CiAKLSNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKQEAgLTU0LDE5ICs1NSwxMCBAQAogRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2VUeXBlQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMpIDoKLSAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlVHlwZUFkZHIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKSwKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlVHlwZUFkZHIsIGVuY29kZWRGb3JtYXRzKSwgbVRhZ05hbWUodGFnTmFtZSksCiAgICAgICAgIG1EZWNsYXJlZEFkZHJlc3MoRGV2aWNlRGVzY3JpcHRvckJhc2U6OmFkZHJlc3MoKSkKIHsKICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAvKiBJZiBmcmFtZXdvcmsgcnVucyBhZ2FpbnN0IGEgcHJlIDUuMCBBdWRpbyBIQUwsIGVuY29kZWQgZm9ybWF0cyBhcmUgYWJzZW50IGZyb20gdGhlIGNvbmZpZy4KLSAgICAgKiBGSVhNRTogQVBNIHNob3VsZCBrbm93IHRoZSB2ZXJzaW9uIG9mIHRoZSBIQUwgYW5kIGRvbid0IGFkZCB0aGUgZm9ybWF0cyBmb3IgVjUuMC4KLSAgICAgKiBGb3Igbm93LCB0aGUgd29ya2Fyb3VuZCB0byByZW1vdmUgQUMzIGFuZCBJRUM2MTkzNyBzdXBwb3J0IG9uIEhETUkgaXMgdG8gZGVjbGFyZQotICAgICAqIHNvbWV0aGluZyBsaWtlICdlbmNvZGVkRm9ybWF0cz0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiJyBvbiB0aGUgSERNSSBkZXZpY2VQb3J0LgotICAgICAqLwotICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubVR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JICYmIG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7Ci0gICAgICAgIG1FbmNvZGVkRm9ybWF0cy5wdXNoX2JhY2soQVVESU9fRk9STUFUX0FDMyk7Ci0gICAgICAgIG1FbmNvZGVkRm9ybWF0cy5wdXNoX2JhY2soQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKLSAgICB9CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQpAQCAtMTE4LDIwICsxMTAsNiBAQAogICAgIHJldHVybiAobUN1cnJlbnRFbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKIH0KIAotYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjpzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi17Ci0gICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7Ci0gICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXR1c190IERldmljZURlc2NyaXB0b3I6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKIHsKQEAgLTE0MSw3ICsxMTksNiBAQAogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CiAgICAgaWYgKChzdGF0dXMgPSB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uZmlnKSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGJhY2t1cENvbmZpZyk7Ci0gICAgICAgIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgfQogCiAgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CkBAIC0xNTQsOCArMTMxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7CiAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKLSAgICB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0KICAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKQEAgLTIwMiwxNSArMTc3LDE1IEBACiAgICAgfQogfQogCi12b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKICAgICBTdHJpbmc4IGV4dHJhSW5mbzsKICAgICBpZiAoIW1UYWdOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLmNfc3RyKCkpOworICAgICAgICBleHRyYUluZm8uYXBwZW5kRm9ybWF0KCJcIiVzXCIiLCBtVGFnTmFtZS5jX3N0cigpKTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBkZXNjQmFzZUR1bXBTdHI7Ci0gICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmR1bXAoJmRlc2NCYXNlRHVtcFN0ciwgc3BhY2VzLCBpbmRleCwgZXh0cmFJbmZvLnN0cmluZygpLCB2ZXJib3NlKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6ZHVtcCgmZGVzY0Jhc2VEdW1wU3RyLCBzcGFjZXMsIGV4dHJhSW5mby5zdHJpbmcoKSwgdmVyYm9zZSk7CiAgICAgZHN0LT5hcHBlbmQoZGVzY0Jhc2VEdW1wU3RyLmNfc3RyKCkpOwogfQogCkBAIC00NTEsNiArNDI2LDE0IEBACiAgICAgcmV0dXJuIGRldmljZXM7CiB9CiAKK0F1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgRGV2aWNlVmVjdG9yOjp0b1R5cGVBZGRyVmVjdG9yKCkgY29uc3QgeworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhBdWRpb0RldmljZVR5cGVBZGRyKGRldmljZS0+dHlwZSgpLCBkZXZpY2UtPmFkZHJlc3MoKSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB2b2lkIERldmljZVZlY3Rvcjo6cmVwbGFjZURldmljZXNCeVR5cGUoCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlVG9SZW1vdmUsIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlc1RvQWRkKSB7CiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXNUb1JlbW92ZSA9IGdldERldmljZXNGcm9tVHlwZSh0eXBlVG9SZW1vdmUpOwpAQCAtNDY1LDkgKzQ0OCwxMSBAQAogICAgIGlmIChpc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSAlcyBkZXZpY2VzOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXMgZGV2aWNlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDIsIGksIHZlcmJvc2UpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpLCB2ZXJib3NlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKaW5kZXggODQzZjVkYS4uM2Y5YzhiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpFZmZlY3REZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKQEAgLTI0LDEzICsyNSwxMSBAQAogCiB2b2lkIEVmZmVjdERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJRDogJWRcbiIsIHNwYWNlcywgIiIsIG1JZCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0kvTzogJWRcbiIsIHNwYWNlcywgIiIsIG1Jbyk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc011c2ljIEVmZmVjdDogJXNcbiIsIHNwYWNlcywgIiIsIGlzTXVzaWNFZmZlY3QoKT8gInllcyIgOiAibm8iKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2Vzc2lvbjogJWRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTmFtZTogJXNcbiIsIHNwYWNlcywgIiIsICBtRGVzYy5uYW1lKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlc1xuIiwgc3BhY2VzLCAiIiwgIG1TdXNwZW5kZWQgPyAiU3VzcGVuZGVkIiA6ICJBY3RpdmUiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRWZmZWN0IElEOiAlZDsgQXR0YWNoZWQgdG8gSS9PIGhhbmRsZTogJWQ7IFNlc3Npb246ICVkO1xuIiwKKyAgICAgICAgICAgIG1JZCwgbUlvLCBtU2Vzc2lvbik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc011c2ljIEVmZmVjdD8gJXM7IFwiJXNcIjsgJXM7ICVzXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgaXNNdXNpY0VmZmVjdCgpPyAieWVzIiA6ICJubyIsIG1EZXNjLm5hbWUsCisgICAgICAgICAgICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsIG1TdXNwZW5kZWQgPyAiU3VzcGVuZGVkIiA6ICJBY3RpdmUiKTsKIH0KIAogRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OkVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCkgOgpAQCAtMjM3LDEwICsyMzYsMTQgQEAKICAgICAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnksCiAgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7CiAgICAgfQotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNFZmZlY3RzOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBFZmZlY3QgJWQ6XG4iLCBzcGFjZXMsICIiLCBrZXlBdChpKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICBpZiAoc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoc3BhY2VzID4gMSkgc3BhY2VzIC09IDI7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEVmZmVjdHMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCBzaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCmluZGV4IDNhMTQzYjAuLjQxOGI3ZWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKQEAgLTE3LDExICsxNywxMyBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06Okh3TW9kdWxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEh3TW9kdWxlOjpId01vZHVsZShjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBoYWxWZXJzaW9uTWFqb3IsIHVpbnQzMl90IGhhbFZlcnNpb25NaW5vcikKQEAgLTI0NywyOCArMjQ5LDI4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEh3TW9kdWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3ZvaWQgSHdNb2R1bGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gbmFtZTogJXNcbiIsIGdldE5hbWUoKSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIHZlcnNpb246ICV1LiV1XG4iLCBnZXRIYWxWZXJzaW9uTWFqb3IoKSwgZ2V0SGFsVmVyc2lvbk1pbm9yKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJIYW5kbGU6ICVkOyBcIiVzXCJcbiIsIG1IYW5kbGUsIGdldE5hbWUoKSk7CiAgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBvdXRwdXRzOlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIE91dHB1dCBNaXhQb3J0cyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBpbnB1dHM6XG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gSW5wdXQgTWl4UG9ydHMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgMiwgdHJ1ZSk7Ci0gICAgbUR5bmFtaWNEZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJEeW5hbWljIiksICAyLCB0cnVlKTsKLSAgICBkdW1wQXVkaW9Sb3V0ZVZlY3RvcihtUm91dGVzLCBkc3QsIDIpOworICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIi0gRGVjbGFyZWQiKSwgc3BhY2VzIC0gMiwgdHJ1ZSk7CisgICAgbUR5bmFtaWNEZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCItIER5bmFtaWMiKSwgIHNwYWNlcyAtIDIsIHRydWUpOworICAgIGR1bXBBdWRpb1JvdXRlVmVjdG9yKG1Sb3V0ZXMsIGRzdCwgc3BhY2VzKTsKIH0KIAogc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0CkBAIC00NjIsMTAgKzQ2NCwxMSBAQAogCiB2b2lkIEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIEhhcmR3YXJlIG1vZHVsZXMgKCV6dSk6XG4iLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiICAlenUuICIsIGkgKyAxKTsKKyAgICAgICAgZHN0LT5hcHBlbmQocHJlZml4LmNfc3RyKCkpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCmluZGV4IDA5YjYxNGQuLjIxZjIwMTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApAQCAtMTE2LDI3ICsxMTYsMzAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlID09IGRldmljZURlc2MgJiYgZGV2aWNlRGVzYy0+aGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKTsgfSkgPT0gMTsKIH0KIAotdm9pZCBJT1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBJT1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIHN0ZDo6c3RyaW5nIHBvcnRTdHI7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKCZwb3J0U3RyLCA0KTsKLSAgICBkc3QtPmFwcGVuZChwb3J0U3RyLmNfc3RyKCkpOwotCi0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIGZsYWdzOiAweCUwNHgiLCBnZXRGbGFncygpKTsKKyAgICBTdHJpbmc4IGV4dHJhSW5mbzsKKyAgICBleHRyYUluZm8uYXBwZW5kRm9ybWF0KCIweCUwNHgiLCBnZXRGbGFncygpKTsKICAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWwgPQogICAgICAgICAgICAgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8KICAgICAgICAgICAgIHRvU3RyaW5nKHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGdldEZsYWdzKCkpKSA6CiAgICAgICAgICAgICBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA/CiAgICAgICAgICAgICB0b1N0cmluZyhzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oZ2V0RmxhZ3MoKSkpIDogIiI7CiAgICAgaWYgKCFmbGFnc0xpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CisgICAgICAgIGV4dHJhSW5mby5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KLSAgICBkc3QtPmFwcGVuZCgiXG4iKTsKLSAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gICAgLSBtYXhPcGVuQ291bnQ6ICV1IC0gY3VyT3BlbkNvdW50OiAldVxuIiwKLSAgICAgICAgICAgICBtYXhPcGVuQ291bnQsIGN1ck9wZW5Db3VudCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKLSAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOworCisgICAgc3RkOjpzdHJpbmcgcG9ydFN0cjsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoJnBvcnRTdHIsIHNwYWNlcywgZXh0cmFJbmZvLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kKHBvcnRTdHIuY19zdHIoKSk7CisKKyAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiLSBTdXBwb3J0ZWQiKSwgc3BhY2VzIC0gMiwgZmFsc2UpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heE9wZW5Db3VudDogJXU7IGN1ck9wZW5Db3VudDogJXVcbiIsCisgICAgICAgICAgICBzcGFjZXMgLSAyLCAiIiwgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heEFjdGl2ZUNvdW50OiAldTsgY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAorICAgICAgICAgICAgc3BhY2VzIC0gMiwgIiIsIG1heEFjdGl2ZUNvdW50LCBjdXJBY3RpdmVDb3VudCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gcmVjb21tZW5kZWRNdXRlRHVyYXRpb25NczogJXUgbXNcbiIsCisgICAgICAgICAgICBzcGFjZXMgLSAyLCAiIiwgcmVjb21tZW5kZWRNdXRlRHVyYXRpb25Ncyk7CiB9CiAKIHZvaWQgSU9Qcm9maWxlOjpsb2coKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvUG9saWN5QXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1BvbGljeUF1ZGlvUG9ydC5jcHAKaW5kZXggOGM2MWI5MC4uY2U4MTc4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvUG9saWN5QXVkaW9Qb3J0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwCkBAIC0zMCw5ICszMCw5IEBACiAvLyAtLS0gUG9saWN5QXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCiB2b2lkIFBvbGljeUF1ZGlvUG9ydDo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQogeworICAgIG1Nb2R1bGUgPSBtb2R1bGU7CiAgICAgQUxPR1YoIiVzOiBhdHRhY2hpbmcgbW9kdWxlICVzIHRvIHBvcnQgJXMiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnZXRNb2R1bGVOYW1lKCksIGFzQXVkaW9Qb3J0KCktPmdldE5hbWUoKS5jX3N0cigpKTsKLSAgICBtTW9kdWxlID0gbW9kdWxlOwogfQogCiB2b2lkIFBvbGljeUF1ZGlvUG9ydDo6ZGV0YWNoKCkKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBzYW1wbGluZyByYXRlOiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCiAgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKICAgICAvLyBzaW5rCi0gICAgaWYgKGlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICBpZiAoYXNBdWRpb1BvcnQoKS0+aXNEaXJlY3RPdXRwdXQoKSkgewogICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBVSU5UX01BWDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvIHJhdGUgOiBzYW1wbGluZ1JhdGVzKSB7CiAgICAgICAgICAgICBpZiAoKHJhdGUgPCBzYW1wbGluZ1JhdGUpICYmIChyYXRlID4gMCkpIHsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIGNoYW5uZWwgY291bnQ6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKICAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAogICAgIC8vIHNpbmsKLSAgICBpZiAoaXNEaXJlY3RPdXRwdXQoKSkgeworICAgIGlmIChhc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CiAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IFVJTlRfTUFYOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8gY2hhbm5lbE1hc2sgOiBjaGFubmVsTWFza3MpIHsKICAgICAgICAgICAgIHVpbnQzMl90IGNubENvdW50OwpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSAtIDFdOwogICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIGJlc3QgbWl4ZXIgb3V0cHV0IGZvcm1hdC4KICAgICAvLyBEbyBub3QgbGltaXQgZm9ybWF0IG90aGVyd2lzZQotICAgIGlmICgoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8IGlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICBpZiAoKGFzQXVkaW9Qb3J0KCktPmdldFR5cGUoKSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB8fCBhc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CiAgICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICB9CiAKQEAgLTI2NiwyOSArMjY2LDQgQEAKICAgICAgICAgICAgIGFzQXVkaW9Qb3J0KCktPmdldE5hbWUoKS5jX3N0cigpLCBzYW1wbGluZ1JhdGUsIGNoYW5uZWxNYXNrLCBmb3JtYXQpOwogfQogCi0vLyAtLS0gUG9saWN5QXVkaW9Qb3J0Q29uZmlnIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLXN0YXR1c190IFBvbGljeUF1ZGlvUG9ydENvbmZpZzo6dmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgY29uc3QKLXsKLSAgICBzcDxQb2xpY3lBdWRpb1BvcnQ+IHBvbGljeUF1ZGlvUG9ydCA9IGdldFBvbGljeUF1ZGlvUG9ydCgpOwotICAgIHJldHVybiBwb2xpY3lBdWRpb1BvcnQgPyBwb2xpY3lBdWRpb1BvcnQtPmNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoY29uZmlnKSA6IE5PX0lOSVQ7Ci19Ci0KLXZvaWQgUG9saWN5QXVkaW9Qb3J0Q29uZmlnOjp0b1BvbGljeUF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKLXsKLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IG51bGxwdHIpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZsYWdzID0gc3JjQ29uZmlnLT5mbGFnczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+ZmxhZ3MgPSBtRmxhZ3M7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmZsYWdzID0geyBBVURJT19JTlBVVF9GTEFHX05PTkUgfTsKLSAgICB9Ci19Ci0KLQotCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCmluZGV4IDg0ZWQ2NTYuLmQ0NDZlOTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCkBAIC0xMjMsNiArMTIzLDcgQEAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmbGFncyA9ICJmbGFncyI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4T3BlbkNvdW50ID0gIm1heE9wZW5Db3VudCI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMgPSAicmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcyI7CiAgICAgfTsKIAogICAgIC8vIENoaWxkcmVuOiBHYWluVHJhaXRzCkBAIC00ODIsNyArNDgzLDE0IEBACiAgICAgaWYgKCFmbGFncy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIFNvdXJjZSByb2xlCiAgICAgICAgIGlmIChwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgbUZsYWdzU2VwYXJhdG9yLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIC8vVE9ETzogYi8xOTM0OTYxODAgdXNlIHNwYXRpYWxpemVyIGZsYWcgYXQgYXVkaW8gSEFMIHdoZW4gYXZhaWxhYmxlIHVudGlsIHRoZW4sCisgICAgICAgICAgICAvLyB1c2UgREVFUF9CVUZGRVIrRkFTVCBmbGFnIGNvbWJvIHRvIGluZGljYXRlIHRoZSBzcGF0aWFsaXplciBvdXRwdXQgcHJvZmlsZQorICAgICAgICAgICAgdWludDMyX3QgaW50RmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgbUZsYWdzU2VwYXJhdG9yLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGludEZsYWdzID09IChBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpKSB7CisgICAgICAgICAgICAgICAgaW50RmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKGludEZsYWdzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFNpbmsgcm9sZQogICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoSW5wdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgbUZsYWdzU2VwYXJhdG9yLmNfc3RyKCkpKTsKQEAgLTQ5Niw2ICs1MDQsMTMgQEAKICAgICBpZiAoIW1heEFjdGl2ZUNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heEFjdGl2ZUNvdW50LCBtaXhQb3J0LT5tYXhBY3RpdmVDb3VudCk7CiAgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmVjb21tZW5kZWRtdXRlRHVyYXRpb25Nc0xpdGVyYWwgPQorICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKTsKKyAgICBpZiAoIXJlY29tbWVuZGVkbXV0ZUR1cmF0aW9uTXNMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgY29udmVydFRvKHJlY29tbWVuZGVkbXV0ZUR1cmF0aW9uTXNMaXRlcmFsLCBtaXhQb3J0LT5yZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKTsKKyAgICB9CisKICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIEF1ZGlvR2FpblRyYWl0czo6Q29sbGVjdGlvbiBnYWluczsKICAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjaGlsZCwgJmdhaW5zLCBOVUxMKTsKQEAgLTg2MSwxMCArODc2LDEwIEBACiAgICAgICAgIEFMT0dFKCIlczogTm8gdmVyc2lvbiBmb3VuZCBpbiByb290IG5vZGUgJXMiLCBfX2Z1bmNfXywgcm9vdE5hbWUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAodmVyc2lvbiA9PSAiNy4wIikgeworICAgIGlmICh2ZXJzaW9uID09ICI3LjAiIHx8IHZlcnNpb24gPT0gIjcuMSIpIHsKICAgICAgICAgbUNoYW5uZWxNYXNrc1NlcGFyYXRvciA9IG1TYW1wbGluZ1JhdGVzU2VwYXJhdG9yID0gbUZsYWdzU2VwYXJhdG9yID0gIiAiOwogICAgIH0gZWxzZSBpZiAodmVyc2lvbiAhPSAiMS4wIikgewotICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdGVkIFwiMS4wXCIgb3IgXCI3LjBcIiBnb3QgXCIlc1wiIiwKKyAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3RlZCBcIjEuMFwiLCBcIjcuMFwiLCBvciBcIjcuMVwiIGdvdCBcIiVzXCIiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2ZXJzaW9uLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggOTg0MTViNy4uY2U3OGViMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTEwLDE4ICsxMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCwxNjAwMCIKICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgIDwvbWl4UG9ydD4KLSAgICAgICAgPCEtLSBMZSBBdWRpbyBBdWRpbyBQb3J0cyAtLT4KLSAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gb3V0cHV0IiByb2xlPSJzb3VyY2UiPgotICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgotICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgPC9taXhQb3J0PgogICAgIDwvbWl4UG9ydHM+CiAgICAgPGRldmljZVBvcnRzPgogICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CkBAIC00MiwxMyArMzAsNiBAQAogICAgICAgICA8L2RldmljZVBvcnQ+CiAgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgogICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KLSAgICAgICAgPCEtLSBCTEUgQXVkaW8gUG9ydHMgLS0+Ci0gICAgICAgIDwhLS0gTm90ZSB0aGF0IHRoZXNlIGRldmljZSB0eXBlcyBhcmUgbm90IHZhbGlkIGluIEhBTCB2ZXJzaW9ucyA8IDcuIEFueSBkZXZpY2UKLSAgICAgICAgICAgICBydW5uaW5nIHByZS1WNyBIQUwgYW5kIHVzaW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBwYXNzIFZUUy4gTmVlZCB0byB1c2UKLSAgICAgICAgICAgICBibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBpbnN0ZWFkLgotICAgICAgICAtLT4KLSAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+Ci0gICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgogICAgIDwvZGV2aWNlUG9ydHM+CiAgICAgPHJvdXRlcz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBPdXQiCkBAIC01OSw5ICs0MCw1IEBACiAgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBIZWFyaW5nIEFpZCBPdXQiCiAgICAgICAgICAgICAgICBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KLSAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IgotICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+Ci0gICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBTcGVha2VyIE91dCIKLSAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgogICAgIDwvcm91dGVzPgogPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKaW5kZXggZmJlNzU3MS4uMmRmZmUwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMTAsMTggKzEwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwIDE2MDAwIgogICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgPC9taXhQb3J0PgotICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIFBvcnRzIC0tPgotICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBvdXRwdXQiIHJvbGU9InNvdXJjZSI+Ci0gICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgotICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgotICAgICAgICA8L21peFBvcnQ+CiAgICAgPC9taXhQb3J0cz4KICAgICA8ZGV2aWNlUG9ydHM+CiAgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KQEAgLTQyLDkgKzMwLDYgQEAKICAgICAgICAgPC9kZXZpY2VQb3J0PgogICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgSGVhcmluZyBBaWQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEIiByb2xlPSJzaW5rIi8+Ci0gICAgICAgIDwhLS0gQkxFIEF1ZGlvIFBvcnRzIC0tPgotICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KLSAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CiAgICAgPC9kZXZpY2VQb3J0cz4KICAgICA8cm91dGVzPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKQEAgLTU1LDkgKzQwLDUgQEAKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgotICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiCi0gICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KLSAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgotICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgPC9yb3V0ZXM+CiA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfd2l0aF9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX3dpdGhfbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGNjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX3dpdGhfbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYmx1ZXRvb3RoIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJhMmRwIG91dHB1dCIgcm9sZT0ic291cmNlIi8+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCwxNjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPCEtLSBMZSBBdWRpbyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwLDQ4MDAwLDg4MjAwLDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIEhlYWRwaG9uZXMiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCw0ODAwMCw4ODIwMCw5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAsNDgwMDAsODgyMDAsOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPCEtLSBCTEUgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDwhLS0gTm90ZSB0aGF0IHRoZXNlIGRldmljZSB0eXBlcyBhcmUgbm90IHZhbGlkIGluIEhBTCB2ZXJzaW9ucyA8IDcuIEFueSBkZXZpY2UKKyAgICAgICAgICAgICBydW5uaW5nIHByZS1WNyBIQUwgYW5kIHVzaW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBwYXNzIFZUUy4gTmVlZCB0byB1c2UKKyAgICAgICAgICAgICBibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBpbnN0ZWFkLgorICAgICAgICAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VUIiByb2xlPSJzb3VyY2UiLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBTcGVha2VyIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJsZSBhdWRpbyBpbnB1dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9IkJMRSBIZWFkc2V0IEluIi8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBTcGVha2VyIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX3dpdGhfbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfd2l0aF9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTA4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX3dpdGhfbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBCbHVldG9vdGggQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImJsdWV0b290aCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iYTJkcCBvdXRwdXQiIHJvbGU9InNvdXJjZSIvPgorICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAgMTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDwhLS0gTGUgQXVkaW8gQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIG91dHB1dCIgcm9sZT0ic291cmNlIiAvPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAgODgyMDAgOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSGVhZHBob25lcyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIDg4MjAwIDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIFNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCA4ODIwMCA5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgICAgICA8IS0tIEJMRSBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VUIiByb2xlPSJzb3VyY2UiLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBTcGVha2VyIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJsZSBhdWRpbyBpbnB1dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9IkJMRSBIZWFkc2V0IEluIi8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBTcGVha2VyIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCBhM2RjNzJiLi5kY2RkODA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTcsMTMgKzcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklULEFVRElPX0ZPUk1BVF9QQ01fMjRfQklULEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KICAgICA8L21peFBvcnRzPgogICAgIDxkZXZpY2VQb3J0cz4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VUIiByb2xlPSJzb3VyY2UiLz4KICAgICA8L2RldmljZVBvcnRzPgogICAgIDxyb3V0ZXM+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBTcGVha2VyIE91dCIgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImxlIGF1ZGlvIGlucHV0IiBzb3VyY2VzPSJCTEUgSGVhZHNldCBJbiIvPgogICAgIDwvcm91dGVzPgogPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaAppbmRleCAwZjhiMGE1Li43ZDIxYWUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKQEAgLTg3LDEwICs4NywxNyBAQAogCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgY29uc3Qgb3ZlcnJpZGU7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCByZW1vdmFibGUgZGV2aWNlIHR5cGVzIG9yZGVyZWQgZnJvbSBtb3N0IHJlY2VudGx5CisgICAgICogY29ubmVjdGVkIHRvIGxlYXN0IHJlY2VudGx5IGNvbm5lY3RlZC4KKyAgICAgKiBAcGFyYW0gZ3JvdXAgdGhlIGRldmljZSBncm91cCB0byBjb25zaWRlcjogd2lyZWQsIGEyZHAuLi4gSWYgbm9uZSwgY29uc2lkZXIgYWxsIGdyb3Vwcy4KKyAgICAgKiBAcGFyYW0gZXhjbHVkZWREZXZpY2VzIGxpc3Qgb2YgZGV2aWNlIHR5cGVzIHRvIGlnbm9yZQorICAgICAqIEByZXR1cm4gYSBwb3RlbnRpYWxseSBlbXB0eSBvcmRlcmVkIGxpc3Qgb2YgY29ubmVjdGVkIHJlbW92YWJsZSBkZXZpY2VzLgorICAgICAqLwogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygKLSAgICAgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbUxhc3RSZW1vdmFibGVNZWRpYURldmljZXMuZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcyhncm91cCk7CisgICAgICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAgPSBHUk9VUF9OT05FLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBleGNsdWRlZERldmljZXMgPSB7fSkgY29uc3QgeworICAgICAgICByZXR1cm4gbUxhc3RSZW1vdmFibGVNZWRpYURldmljZXMuZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcyhncm91cCwgZXhjbHVkZWREZXZpY2VzKTsKICAgICB9CiAKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oCmluZGV4IGQ3ZjhiMWUuLjI2NjJjZDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaApAQCAtMzUsNyArMzUsOCBAQAogcHVibGljOgogICAgIHZvaWQgc2V0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKHNwPERldmljZURlc2NyaXB0b3I+IGRlc2MsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKAotICAgICAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSkgY29uc3Q7CisgICAgICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAgPSBHUk9VUF9OT05FLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBleGNsdWRlZERldmljZXMgPSB7fSkgY29uc3Q7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlKAogICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBleGNsdWRlZERldmljZXMsIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCmluZGV4IDE1MGE5YTguLjk5NTA3ZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCkBAIC03MSw3ICs3MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldkRlc2MtPnR5cGUoKTsKLSAgICBpZiAoKGRldmljZVR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpICYmIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKKyAgICBpZiAoKGRldmljZVR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpICYmIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZSkKKyAgICAgICAgICAgICYmIGRldmljZVR5cGUgIT0gQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVAorICAgICAgICAgICAgJiYgZGV2aWNlVHlwZSAhPSBBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QpIHsKKyAgICAgICAgLy8gVVNCIGRvY2sgZG9lcyBub3QgZm9sbG93IHRoZSBydWxlIG9mIGxhc3QgcmVtb3ZhYmxlIGRldmljZSBjb25uZWN0ZWQgd2lucy4KKyAgICAgICAgLy8gSXQgaXMgb25seSB1c2VkIGlmIG5vIHJlbW92YWJsZSBkZXZpY2UgaXMgY29ubmVjdGVkIG9yIGlmIHNldCBhcyBwcmVmZXJyZWQgZGV2aWNlCisgICAgICAgIC8vIExFIGF1ZGlvIGJyb2FkY2FzdCBkZXZpY2UgaGFzIGEgc3BlY2lmaWMgcG9saWN5IGRlcGVuZGluZyBvbiBhY3RpdmUgc3RyYXRlZ2llcyBhbmQKKyAgICAgICAgLy8gZGV2aWNlcyBhbmQgZG9lcyBub3QgZm9sbG93IHRoZSBydWxlIG9mIGxhc3QgY29ubmVjdGVkIHJlbW92YWJsZSBkZXZpY2UuCiAgICAgICAgIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLnNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhkZXZEZXNjLCBzdGF0ZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKaW5kZXggZDM5ZWZmNi4uYjAzNmUxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApAQCAtNjksMTIgKzY5LDYgQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKICAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifQogICAgICAgICAgIH0KQEAgLTEyOCw4ICsxMjIsMTIgQEAKICAgICB7IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIsCiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1RUUywgIkFVRElPX1NUUkVBTV9UVFMiLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAotICAgICAgICAgICAgQVVESU9fRkxBR19CRUFDT04sICIifX0KKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgQVVESU9fRkxBR19CRUFDT04sICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5ELCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifQorICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCmluZGV4IGIzZjg5NDcuLjkzMTIyZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCkBAIC00NCwxMiArNDQsMTUgQEAKIH0KIAogc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzOjpnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKAotICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXApIGNvbnN0CisgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCwgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBleGNsdWRlZERldmljZXMpIGNvbnN0CiB7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiByZXQ7CiAgICAgZm9yIChhdXRvIGl0ZXIgPSBtTWVkaWFEZXZpY2VzLmJlZ2luKCk7IGl0ZXIgIT0gbU1lZGlhRGV2aWNlcy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICAgIGlmICgoZ3JvdXAgPT0gR1JPVVBfTk9ORSkgfHwgKGdyb3VwID09IGdldERldmljZU91dEdyb3VwKChpdGVyLT5kZXNjKS0+dHlwZSgpKSkpIHsKLSAgICAgICAgICAgIHJldC5wdXNoX2JhY2soKGl0ZXItPmRlc2MpLT50eXBlKCkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IChpdGVyLT5kZXNjKS0+dHlwZSgpOworICAgICAgICBpZiAoKGdyb3VwID09IEdST1VQX05PTkUgfHwgZ3JvdXAgPT0gZ2V0RGV2aWNlT3V0R3JvdXAodHlwZSkpCisgICAgICAgICAgICAgICAgJiYgc3RkOjpmaW5kKGV4Y2x1ZGVkRGV2aWNlcy5iZWdpbigpLCBleGNsdWRlZERldmljZXMuZW5kKCksIHR5cGUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZERldmljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoX2JhY2sodHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKQEAgLTg1LDYgKzg4LDcgQEAKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0JST0FEQ0FTVDoKICAgICAgICAgcmV0dXJuIEdST1VQX0JUX0EyRFA7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEdST1VQX05PTkU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcAppbmRleCBiM2QxNDRmLi5mYmZjZjcyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTE1MCwxMiArMTUwLDggQEAKIHZvaWQgUHJvZHVjdFN0cmF0ZWd5OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnMtJXMgKGlkOiAlZClcbiIsIHNwYWNlcywgIiIsIG1OYW1lLmNfc3RyKCksIG1JZCk7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKLSAgICBpZiAoIWRldmljZVR5cGVzVG9TdHJpbmcobUFwcGxpY2FibGVEZXZpY2VzLCBkZXZpY2VMaXRlcmFsKSkgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IGRldmljZSAlcyIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZHVtcERldmljZVR5cGVzKG1BcHBsaWNhYmxlRGV2aWNlcykuY19zdHIoKSk7Ci0gICAgfQotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZWxlY3RlZCBEZXZpY2U6IHt0eXBlOiVzLCBAOiVzfVxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbCA9IGRldmljZVR5cGVzVG9TdHJpbmcobUFwcGxpY2FibGVEZXZpY2VzKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2VsZWN0ZWQgRGV2aWNlOiB7JXMsIEA6JXN9XG4iLCBzcGFjZXMgKyAyLCAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGl0ZXJhbC5jX3N0cigpLCBtRGV2aWNlQWRkcmVzcy5jX3N0cigpKTsKIAogICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CkBAIC0zMzMsNCArMzI5LDMgQEAKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCmluZGV4IGM1NjU5MjYuLjJlYmI3ZGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKQEAgLTcwLDcgKzcwLDcgQEAKIAogdXNpbmcgUHJvZHVjdFN0cmF0ZWdpZXMgPSBzdGQ6OnZlY3RvcjxQcm9kdWN0U3RyYXRlZ3k+OwogCi11c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpciA9IHN0ZDo6dHVwbGU8dWludDY0X3QsIHVpbnQzMl90LCBzdGQ6OnN0cmluZz47CiB1c2luZyBWYWx1ZVBhaXJzID0gc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPjsKIAogc3RydWN0IENyaXRlcmlvblR5cGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCmluZGV4IDgxZTgwM2YuLjZmNTYwZDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApAQCAtODAsNiArODAsNyBAQAogICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsaXRlcmFsID0gImxpdGVyYWwiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm51bWVyaWNhbCA9ICJudW1lcmljYWwiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFuZHJvaWRUeXBlID0gImFuZHJvaWRfdHlwZSI7CiAgICAgfTsKIAogICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LApAQCAtMzQ5LDcgKzM1MCwxNiBAQAogICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHVpbnQzMl90IG51bWVyaWNhbCA9IDA7CisgICAgdWludDMyX3QgYW5kcm9pZFR5cGUgPSAwOworICAgIHN0ZDo6c3RyaW5nIGFuZHJvaWRUeXBlbGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6YW5kcm9pZFR5cGUpOworICAgIGlmICghYW5kcm9pZFR5cGVsaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBhbmRyb2lkVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgYW5kcm9pZFR5cGVsaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBpZiAoIWNvbnZlcnRUbyhhbmRyb2lkVHlwZWxpdGVyYWwsIGFuZHJvaWRUeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiA6IEludmFsaWQgdHlwZXNldCB2YWx1ZSglcykiLCBfX0ZVTkNUSU9OX18sIGFuZHJvaWRUeXBlbGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgbnVtZXJpY2FsID0gMDsKICAgICBzdGQ6OnN0cmluZyBudW1lcmljYWxUYWcgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om51bWVyaWNhbCk7CiAgICAgaWYgKG51bWVyaWNhbFRhZy5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKQEAgLTM1OSw3ICszNjksNyBAQAogICAgICAgICBBTE9HRSgiJXM6IDogSW52YWxpZCB2YWx1ZSglcykiLCBfX0ZVTkNUSU9OX18sIG51bWVyaWNhbFRhZy5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgdmFsdWVzLnB1c2hfYmFjayh7bnVtZXJpY2FsLCBsaXRlcmFsfSk7CisgICAgdmFsdWVzLnB1c2hfYmFjayh7bnVtZXJpY2FsLCAgYW5kcm9pZFR5cGUsIGxpdGVyYWx9KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKaW5kZXggYTc0NzgyMi4uZGM4ZDljZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKQEAgLTQxLDggKzQxLDkgQEAKICAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlX3Bmd3dyYXBwZXIiLAogCiAgICAgXSwKLSAgICBzaGFyZWRfbGliczogWworICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAppbmRleCBiYzMyNDE2Li4wZGRmNjZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTU3LDkgKzU3LDYgQEAKICAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICA8L1Byb2R1Y3RTdHJhdGVneT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaAppbmRleCAxZmMyMjY0Li45ZmQ4YjhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCkBAIC03NywxMiArNzcsMTIgQEAKICAgICAgKiBTZXQgdGhlIGlucHV0IGRldmljZSB0byBiZSB1c2VkIGJ5IGFuIGlucHV0IHNvdXJjZS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2U6IG5hbWUgb2YgdGhlIGlucHV0IHNvdXJjZSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczsgbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UuCisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOiBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZS4KICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgaW5wdXQgc291cmNlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkZXZpY2UpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgPSAwOwpAQCAtOTEsMTIgKzkxLDEyIEBACiAgICAgICogU2V0IHRoZSBkZXZpY2UgdG8gYmUgdXNlZCBieSBhIHByb2R1Y3Qgc3RyYXRlZ3kuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5OiBuYW1lIG9mIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczogbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyYXRlZ3ksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkZXZpY2VzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sLmluCmluZGV4IDJlOWYzN2UuLjJjNGM3YjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbgorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwuaW4KQEAgLTEwLDggKzEwLDggQEAKICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgogCiAgICAgPCEtLSBBdXRvbWF0aWNhbGx5IGZpbGxlZCBmcm9tIGF1ZGlvLWJhc2UuaCBmaWxlIC0tPgotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iMzJ0aCBiaXQgaXMgbm90IGFsbG93ZWQgYXMgZGVkaWNhdGVkIGZvciBpbnB1dCBkZXZpY2VzIGRldGVjdGlvbiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RGV2aWNlc01hc2siIERlc2NyaXB0aW9uPSI2NGJpdCByZXByZXNlbnRhdGlvbiBvZiBkZXZpY2VzIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjY0Ij4KICAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KICAgICA8L0NvbXBvbmVudFR5cGU+CiAKQEAgLTE5LDggKzE5LDggQEAKICAgICBwcm9maWxlLiBJdCBtdXN0IG1hdGNoIHdpdGggdGhlIElucHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KICAgICAtLT4KICAgICA8IS0tIEF1dG9tYXRpY2FsbHkgZmlsbGVkIGZyb20gYXVkaW8tYmFzZS5oIGZpbGUgLS0+Ci0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXREZXZpY2VzTWFzayI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjY0Yml0IHJlcHJlc2VudGF0aW9uIG9mIGRldmljZXMiPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iNjQiPgogICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKaW5kZXggZjhhNmZjMC4uZGY0ZTNlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCkBAIC00NSw3ICs0NSw3IEBACiAKIGJvb2wgSW5wdXRTb3VyY2U6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXBwbGljYWJsZUlucHV0RGV2aWNlOworICAgIHVpbnQ2NF90IGFwcGxpY2FibGVJbnB1dERldmljZTsKICAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZUlucHV0RGV2aWNlLCBzaXplb2YoYXBwbGljYWJsZUlucHV0RGV2aWNlKSk7CiAgICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvcklucHV0U291cmNlKG1JZCwgYXBwbGljYWJsZUlucHV0RGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaAppbmRleCA2YzhlYjY1Li5lNjU5NDZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0zMiw3ICszMiw3IEBACiAKICAgICBzdHJ1Y3QgRGV2aWNlCiAgICAgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXBwbGljYWJsZURldmljZTsgLyoqPCBhcHBsaWNhYmxlIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KKyAgICAgICAgdWludDY0X3QgYXBwbGljYWJsZURldmljZTsgLyoqPCBhcHBsaWNhYmxlIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KICAgICAgICAgY2hhciBkZXZpY2VBZGRyZXNzW21NYXhTdHJpbmdTaXplXTsgLyoqPCBkZXZpY2UgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJhdGVneS4gKi8KICAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKaW5kZXggYjBjMzc2YS4uM2Q3NDkyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcApAQCAtMzYsNiArMzYsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCisjaW5jbHVkZSA8Y2ludHR5cGVzPgorCiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6bWFwOwogCkBAIC0xNjYsMTYgKzE2OCwxMyBAQAogc3RhdHVzX3QgRW5naW5lOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewotICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICBkZXZpY2UtPnR5cGUoKSwgZGV2aWNlLT5hZGRyZXNzKCkuY19zdHIoKSwgc3RhdGUpOworICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UtPnR5cGUoKSwgZGV2aWNlLT5hZGRyZXNzKCksIHN0YXRlKTsKICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKLSAgICAgICAgLy8gRklYTUU6IFVzZSBEZXZpY2VUeXBlU2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyByZWFkeQogICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZXNUb0JpdE1hc2soZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpOwogICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZS0+dHlwZSgpKSkgewotICAgICAgICAvLyBGSVhNRTogVXNlIERldmljZVR5cGVTZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIHJlYWR5CiAgICAgICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRBdmFpbGFibGVJbnB1dERldmljZXMoCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVR5cGVzVG9CaXRNYXNrKGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLnR5cGVzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkudHlwZXMoKSk7CiAgICAgfQogICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiB9CkBAIC0yOTksOCArMjk4LDEzIEBACiAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKICAgICB9CisgICAgcmV0dXJuIGZyb21DYWNoZT8gZ2V0Q2FjaGVkRGV2aWNlcyhzdHJhdGVneSkgOiBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KIAotICAgIHJldHVybiBmcm9tQ2FjaGU/IG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5hdChzdHJhdGVneSkgOiBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KTsKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldENhY2hlZERldmljZXMocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIHJldHVybiBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuZmluZChwcykgIT0gbURldmljZXNGb3JTdHJhdGVnaWVzLmVuZCgpID8KKyAgICAgICAgICAgICAgICBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQocHMpIDogRGV2aWNlVmVjdG9ye307CiB9CiAKIERldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdApAQCAtMzY5LDE3ICszNzMsMjggQEAKICAgICBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmF0KHN0cmF0ZWd5KS0+c2V0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKTsKIH0KIAotYm9vbCBFbmdpbmU6OnNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpCitib29sIEVuZ2luZTo6c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCB1aW50NjRfdCBkZXZpY2VzKQogewogICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXQgZGV2aWNlICVkIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXQgZGV2aWNlICUiIFBSSWQ2NCAiIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHN0cmF0ZWd5KTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAvLyBGSVhNRTogc3RvcCB1c2luZyBkZXZpY2VUeXBlc0Zyb21CaXRNYXNrIHdoZW4gdGhlIGludGVyZmFjZSBpcyByZWFkeQotICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VUeXBlcyhkZXZpY2VUeXBlc0Zyb21CaXRNYXNrKGRldmljZXMpKTsKKyAgICAvLyBIZXJlIGRldmljZSBtYXRjaGVzIHRoZSBjcml0ZXJpb24gdmFsdWUsIG5lZWQgdG8gcmVidWl0ZCBhbmRyb2lkIGRldmljZSB0eXBlczsKKyAgICBEZXZpY2VUeXBlU2V0IHR5cGVzID0KKyAgICAgICAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmNvbnZlcnREZXZpY2VDcml0ZXJpb25WYWx1ZVRvRGV2aWNlVHlwZXMoZGV2aWNlcywgdHJ1ZSAvKmlzT3V0Ki8pOworICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VUeXBlcyh0eXBlcyk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgRW5naW5lOjpzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsIHVpbnQ2NF90IGRldmljZSkKK3sKKyAgICBEZXZpY2VUeXBlU2V0IHR5cGVzID0gbVBvbGljeVBhcmFtZXRlck1nci0+Y29udmVydERldmljZUNyaXRlcmlvblZhbHVlVG9EZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBkZXZpY2UsIGZhbHNlIC8qaXNPdXQqLyk7CisgICAgQUxPR19BU1NFUlQodHlwZXMuc2l6ZSgpIDw9IDEsICJvbmUgaW5wdXQgZGV2aWNlIGV4cGVjdGVkIGF0IG1vc3QiKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IHR5cGVzLmVtcHR5KCkgPyBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCA6ICp0eXBlcy5iZWdpbigpOworICAgIHJldHVybiBzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2VUeXBlLCBpbnB1dFNvdXJjZSk7Cit9CisKIHRlbXBsYXRlIDw+CiBFbmdpbmVJbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKaW5kZXggZDhlMjc0Mi4uNGI1NTlmMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCkBAIC04MiwxNSArODIsMTIgQEAKICAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKSBvdmVycmlkZTsKIAotICAgIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwgaW5wdXRTb3VyY2UpOwotICAgIH0KKyAgICBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwgdWludDY0X3QgZGV2aWNlKSBvdmVycmlkZTsKKwogICAgIHZvaWQgc2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIG92ZXJyaWRlOwogCi0gICAgYm9vbCBzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgdWludDY0X3QgZGV2aWNlcykgb3ZlcnJpZGU7CiAKICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBvdmVycmlkZQogICAgIHsKQEAgLTEyNiw2ICsxMjMsNyBAQAogICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOwogCiAgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0Q2FjaGVkRGV2aWNlcyhwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUG9saWN5IFBhcmFtZXRlciBNYW5hZ2VyIGhpZGRlbiB0aHJvdWdoIGEgd3JhcHBlci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKaW5kZXggZjQ2NDVlNi4uNmZkMmI3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKQEAgLTI2LDcgKzI2LDggQEAKIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpCiB7CiAgICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TT1VSQ0VfTUFYICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQKLSAgICAgICAgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpIHsKKyAgICAgICAgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UKKyAgICAgICAgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7CkBAIC00NiwxMiArNDcsNiBAQAogdGVtcGxhdGUgPD4KIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpzZXQoYXVkaW9fZGV2aWNlc190IGRldmljZXMpCiB7Ci0gICAgaWYgKGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgLy8gUmVzZXQKLSAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBkZXZpY2VzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihkZXZpY2VzIHwgQVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlcykpIHsKICAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CmluZGV4IDQzYjNkZDIuLjg2YWM3NmYgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB3aGlsZSBpIDwgZGVjaW1hbDoKICAgICAgICAgaSA9IGkgPDwgMQogICAgICAgICBwb3MgPSBwb3MgKyAxCi0gICAgICAgIGlmIHBvcyA9PSAzMjoKKyAgICAgICAgaWYgcG9zID09IDY0OgogICAgICAgICAgICAgcmV0dXJuIC0xCiAKICAgICAjIFRPRE86IGIvMTY4MDY1NzA2LiBUaGlzIGlzIGp1c3QgdG8gZml4IHRoZSBidWlsZC4gVGhhdCB0aGUgcHJvYmxlbSBvZiBkZXZpY2VzIHdpdGgKQEAgLTEzMiw2ICsxMzIsOSBAQAogCiAgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQogCisgICAgbXVsdGlfYml0X291dHB1dF9kZXZpY2Vfc2hpZnQgPSAzMgorICAgIG11bHRpX2JpdF9pbnB1dF9kZXZpY2Vfc2hpZnQgPSAzMgorCiAgICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGVudW1lcmF0ZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CiAgICAgICAgIG1hdGNoID0gY3JpdGVyaWFfcGF0dGVybi5tYXRjaChsaW5lKQogICAgICAgICBpZiBtYXRjaDoKQEAgLTE0MywxNiArMTQ2LDM2IEBACiAKICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSA9IG1hdGNoLmdyb3VwZGljdCgpWyd2YWx1ZXMnXQogCi0gICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0IC8gcmVuYW1lIGRlZmF1bHQgdG8gc3R1YgorICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiByZW5hbWUgZGVmYXVsdCB0byBzdHViCiAgICAgICAgICAgICBpZiBjb21wb25lbnRfdHlwZV9uYW1lID09ICJJbnB1dERldmljZXNNYXNrIjoKLSAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgMCkgJiB+MjE0NzQ4MzY0OCkKKyAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgMCkpCiAgICAgICAgICAgICAgICAgaWYgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCA9PSAiZGVmYXVsdCI6CiAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX2xpdGVyYWwgPSAic3R1YiIKIAorICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSBpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgICAgIG51bV9iaXRzID0gYmluKHN0cmluZ19pbnQpLmNvdW50KCIxIikKKyAgICAgICAgICAgICAgICBpZiBudW1fYml0cyA+IDE6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9IGlzIGZvciBjcml0ZXJpb24ge30gYmluYXJ5IHJlcCB7fSBoYXMge30gYml0cyBzZXRzIgorICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIGNvbXBvbmVudF90eXBlX25hbWUsIGJpbihzdHJpbmdfaW50KSwgbnVtX2JpdHMpKQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gMioqbXVsdGlfYml0X2lucHV0X2RldmljZV9zaGlmdAorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIm5ldyB2YWwgYXNzaWduZWQgaXMge30ge30iIC5mb3JtYXQoc3RyaW5nX2ludCwgYmluKHN0cmluZ19pbnQpKSkKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlfYml0X2lucHV0X2RldmljZV9zaGlmdCArPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSA9IHN0cihzdHJpbmdfaW50KQorCiAgICAgICAgICAgICBpZiBjb21wb25lbnRfdHlwZV9uYW1lID09ICJPdXRwdXREZXZpY2VzTWFzayI6CiAgICAgICAgICAgICAgICAgaWYgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCA9PSAiZGVmYXVsdCI6CiAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX2xpdGVyYWwgPSAic3R1YiIKIAorICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSBpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgICAgIG51bV9iaXRzID0gYmluKHN0cmluZ19pbnQpLmNvdW50KCIxIikKKyAgICAgICAgICAgICAgICBpZiBudW1fYml0cyA+IDE6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9IGlzIGZvciBjcml0ZXJpb24ge30gYmluYXJ5IHJlcCB7fSBoYXMge30gYml0cyBzZXRzIgorICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIGNvbXBvbmVudF90eXBlX25hbWUsIGJpbihzdHJpbmdfaW50KSwgbnVtX2JpdHMpKQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gMioqbXVsdGlfYml0X291dHB1dF9kZXZpY2Vfc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJuZXcgdmFsIGFzc2lnbmVkIGlzIHt9IHt9IiAuZm9ybWF0KHN0cmluZ19pbnQsIGJpbihzdHJpbmdfaW50KSkpCisgICAgICAgICAgICAgICAgICAgIG11bHRpX2JpdF9vdXRwdXRfZGV2aWNlX3NoaWZ0ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlID0gc3RyKHN0cmluZ19pbnQpCisKICAgICAgICAgICAgICMgUmVtb3ZlIGR1cGxpY2F0ZWQgbnVtZXJpY2FsIHZhbHVlcwogICAgICAgICAgICAgaWYgaW50KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgMCkgaW4gYWxsX2NvbXBvbmVudF90eXBlc1tjb21wb25lbnRfdHlwZV9uYW1lXS52YWx1ZXMoKToKICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fTp7fSBpcyBkdXBsaWNhdGVkIGZvciBjcml0ZXJpb24ge30sIEtFRVBJTkcgTEFURVNUIi5mb3JtYXQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCBjb21wb25lbnRfdHlwZV9saXRlcmFsLCBjb21wb25lbnRfdHlwZV9uYW1lKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKaW5kZXggNzZjMzVjMS4uYTE1YTZiYSAxMDA3NTUKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKQEAgLTg1LDYgKzg1LDkgQEAKICAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQogCiAKK291dHB1dF9kZXZpY2VzX3R5cGVfdmFsdWUgPSB7fQoraW5wdXRfZGV2aWNlc190eXBlX3ZhbHVlID0ge30KKwogZGVmIGdlbmVyYXRlWG1sQ3JpdGVyaW9uVHlwZXNGaWxlKGNyaXRlcmlvblR5cGVzLCBhZGRyZXNzQ3JpdGVyaWEsIGNyaXRlcmlvblR5cGVzRmlsZSwgb3V0cHV0RmlsZSk6CiAKICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25UeXBlc0ZpbGUge30iLmZvcm1hdChjcml0ZXJpb25UeXBlc0ZpbGUpKQpAQCAtMTAyLDYgKzEwNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbnVtZXJpY2FsJywgc3RyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2xpdGVyYWwnLCBrZXkpCiAKKyAgICAgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gIk91dHB1dERldmljZXNNYXNrVHlwZSI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnYW5kcm9pZF90eXBlJywgb3V0cHV0X2RldmljZXNfdHlwZV92YWx1ZVtrZXldKQorICAgICAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZS5nZXQoJ25hbWUnKSA9PSAiSW5wdXREZXZpY2VzTWFza1R5cGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2FuZHJvaWRfdHlwZScsIGlucHV0X2RldmljZXNfdHlwZV92YWx1ZVtrZXldKQorCiAgICAgaWYgYWRkcmVzc0NyaXRlcmlhOgogICAgICAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19saXN0IGluIGFkZHJlc3NDcml0ZXJpYS5pdGVtcygpOgogICAgICAgICAgICAgZm9yIGNyaXRlcmlvbl90eXBlIGluIGNyaXRlcmlvbl90eXBlc19yb290LmZpbmRhbGwoJ2NyaXRlcmlvbl90eXBlJyk6CkBAIC0yMDAsMTAgKzIwOCw4IEBACiAgICAgIwogICAgIGlnbm9yZWRfdmFsdWVzID0gWydDTlQnLCAnTUFYJywgJ0FMTCcsICdOT05FJ10KIAotICAgICMKLSAgICAjIFJlYWNoaW5nIDMyIGJpdCBsaW1pdCBmb3IgaW5jbHVzaXZlIGNyaXRlcmlvbiBvdXQgZGV2aWNlczogcmVtb3ZpbmcKLSAgICAjCi0gICAgaWdub3JlZF9vdXRwdXRfZGV2aWNlX3ZhbHVlcyA9IFsnQmxlU3BlYWtlcicsICdCbGVIZWFkc2V0J10KKyAgICBtdWx0aV9iaXRfb3V0cHV0ZGV2aWNlX3NoaWZ0ID0gMzIKKyAgICBtdWx0aV9iaXRfaW5wdXRkZXZpY2Vfc2hpZnQgPSAzMgogCiAgICAgY3JpdGVyaWFfcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgIHIiXHMqVlwoKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXApAQCAtMjIzLDI4ICsyMjksNTkgQEAKICAgICAgICAgICAgICAgICAnJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBtYXRjaC5ncm91cGRpY3QoKVsnbGl0ZXJhbCddLnNwbGl0KCdfJykpKQogICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IG1hdGNoLmdyb3VwZGljdCgpWyd2YWx1ZXMnXQogCi0gICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0IC8gcmVuYW1lIGRlZmF1bHQgdG8gc3R1YgorICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiByZW5hbWUgZGVmYXVsdCB0byBzdHViCiAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbmFtZSA9PSAiSW5wdXREZXZpY2VzTWFza1R5cGUiOgogICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9saXRlcmFsID09ICJEZWZhdWx0IjoKICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoIjB4NDAwMDAwMDAiLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGV2aWNlc190eXBlX3ZhbHVlW2NyaXRlcmlvbl9saXRlcmFsXSA9ICIweEMwMDAwMDAwIgogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQXBwZW5kIEFVRElPX0RFVklDRV9JTiBmb3IgYW5kcm9pZCB0eXBlIHRhZworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGV2aWNlc190eXBlX3ZhbHVlW2NyaXRlcmlvbl9saXRlcmFsXSA9IGhleChzdHJpbmdfaW50IHwgMjE0NzQ4MzY0OCkKKworICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBiaW4oc3RyaW5nX2ludCkuY291bnQoIjEiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVtX2JpdHMgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9Ont9IGlzIGZvciBjcml0ZXJpb24ge30gYmluYXJ5IHJlcCB7fSBoYXMge30gYml0cyBzZXRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsLCBjcml0ZXJpb25fbmFtZSwgYmluKHN0cmluZ19pbnQpLCBudW1fYml0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IDIqKm11bHRpX2JpdF9pbnB1dGRldmljZV9zaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygibmV3IHZhbCBhc3NpZ25lZCBpcyB7fSB7fSIgLmZvcm1hdChzdHJpbmdfaW50LCBiaW4oc3RyaW5nX2ludCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpX2JpdF9pbnB1dGRldmljZV9zaGlmdCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihzdHJpbmdfaW50KQorCiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJ2YWx1ZSB7fTp7fSBmb3IgY3JpdGVyaW9uIHt9IGlzIG5vdCBhIG51bWJlciwgaWdub3JpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCwgY3JpdGVyaW9uX25hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkgJiB+MjE0NzQ4MzY0OCkKIAogICAgICAgICAgICAgaWYgY3JpdGVyaW9uX25hbWUgPT0gIk91dHB1dERldmljZXNNYXNrVHlwZSI6CiAgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX2xpdGVyYWwgPT0gIkRlZmF1bHQiOgogICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludCgiMHg0MDAwMDAwMCIsIDApKQotICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9saXRlcmFsIGluIGlnbm9yZWRfb3V0cHV0X2RldmljZV92YWx1ZXM6Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiT3V0cHV0RGV2aWNlc01hc2tUeXBlIHNraXBwaW5nIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX2xpdGVyYWwpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGV2aWNlc190eXBlX3ZhbHVlW2NyaXRlcmlvbl9saXRlcmFsXSA9ICIweDQwMDAwMDAwIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kZXZpY2VzX3R5cGVfdmFsdWVbY3JpdGVyaW9uX2xpdGVyYWxdID0gY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZQorCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fYml0cyA9IGJpbihzdHJpbmdfaW50KS5jb3VudCgiMSIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1fYml0cyA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZm9yIGNyaXRlcmlvbiB7fSBiaW5hcnkgcmVwIHt9IGhhcyB7fSBiaXRzIHNldHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwsIGNyaXRlcmlvbl9uYW1lLCBiaW4oc3RyaW5nX2ludCksIG51bV9iaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gMioqbXVsdGlfYml0X291dHB1dGRldmljZV9zaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygibmV3IHZhbCBhc3NpZ25lZCBpcyB7fSB7fSIgLmZvcm1hdChzdHJpbmdfaW50LCBiaW4oc3RyaW5nX2ludCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpX2JpdF9vdXRwdXRkZXZpY2Vfc2hpZnQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoc3RyaW5nX2ludCkKKworICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9Ont9IGlzIGZvciBjcml0ZXJpb24ge30gaXMgbm90IGEgbnVtYmVyLCBpZ25vcmluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsLCBjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKQorCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAjIEhhbmRsZSB0aGUgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZm9yIGNyaXRlcmlvbiB7fSBpcyBub3QgYSBudW1iZXIsIGlnbm9yaW5nIgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAKaW5kZXggM2UwNGI2OC4uMGVmMGI4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw3IEBACiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAppbmRleCA2Mzk5MGFjLi4wOTlkNTVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KQEAgLTMxLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMTI0LDkgKzEyNiwyMiBAQAogCiAgICAgZm9yIChhdXRvIHBhaXIgOiBwYWlycykgewogICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKLSAgICAgICAgQUxPR1YoIiVzOiBBZGRpbmcgcGFpciAlZCwlcyBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgcGFpci5maXJzdCwKLSAgICAgICAgICAgICAgcGFpci5zZWNvbmQuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgY3JpdGVyaW9uVHlwZS0+YWRkVmFsdWVQYWlyKHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kLCBlcnJvcik7CisgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIHBhaXIgJSIgUFJJdTY0IiwgJXMgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX2Z1bmNfXywgc3RkOjpnZXQ8MD4ocGFpciksCisgICAgICAgICAgICAgIHN0ZDo6Z2V0PDI+KHBhaXIpLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihzdGQ6OmdldDwwPihwYWlyKSwgc3RkOjpnZXQ8Mj4ocGFpciksIGVycm9yKTsKKworICAgICAgICBpZiAobmFtZSA9PSBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBBZGRpbmcgbU91dHB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcCAlZCAlIiBQUkl1NjQiIGZvciBjcml0ZXJpb25UeXBlICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGQ6OmdldDwxPihwYWlyKSwgc3RkOjpnZXQ8MD4ocGFpciksIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYW5kcm9pZFR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHN0ZDo6Z2V0PDE+KHBhaXIpKTsKKyAgICAgICAgICAgIG1PdXRwdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXBbYW5kcm9pZFR5cGVdID0gc3RkOjpnZXQ8MD4ocGFpcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBBZGRpbmcgbUlucHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwICVkICUiIFBSSXU2NCIgZm9yIGNyaXRlcmlvblR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0ZDo6Z2V0PDE+KHBhaXIpLCBzdGQ6OmdldDwwPihwYWlyKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhbmRyb2lkVHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3RkOjpnZXQ8MT4ocGFpcikpOworICAgICAgICAgICAgbUlucHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwW2FuZHJvaWRUeXBlXSA9IHN0ZDo6Z2V0PDA+KHBhaXIpOworICAgICAgICB9CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKG5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKICAgICAgICAgICAgICAgICAiJXM6IENyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCkpOwpAQCAtMTM1LDcgKzE1MCw3IEBACiAgICAgbVBvbGljeUNyaXRlcmlhW25hbWVdID0gY3JpdGVyaW9uOwogCiAgICAgaWYgKG5vdCBkZWZhdWx0VmFsdWUuZW1wdHkoKSkgewotICAgICAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOworICAgICAgICB1aW50NjRfdCBudW1lcmljYWxWYWx1ZSA9IDA7CiAgICAgICAgIGlmIChub3QgY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdFZhbHVlLmNfc3RyKCksIG51bWVyaWNhbFZhbHVlKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOyB0cnlpbmcgdG8gYXBwbHkgaW52YWxpZCBkZWZhdWx0IGxpdGVyYWwgdmFsdWUgKCVzKSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5jX3N0cigpKTsKQEAgLTI2Myw3ICsyNzgsNyBAQAogfQogCiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgYWRkcmVzcywgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKICAgICBzdGQ6OnN0cmluZyBjcml0ZXJpb25OYW1lID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/CiAgICAgICAgICAgICAgICAgZ091dHB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lIDogZ0lucHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWU7CkBAIC0yNzksNyArMjk0LDcgQEAKICAgICB9CiAKICAgICBhdXRvIGNyaXRlcmlvblR5cGUgPSBjcml0ZXJpb24tPmdldENyaXRlcmlvblR5cGUoKTsKLSAgICBpbnQgZGV2aWNlQWRkcmVzc0lkOworICAgIHVpbnQ2NF90IGRldmljZUFkZHJlc3NJZDsKICAgICBpZiAobm90IGNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGFkZHJlc3MuY19zdHIoKSwgZGV2aWNlQWRkcmVzc0lkKSkgewogICAgICAgICBBTE9HVygiJXM6IHVua25vd24gZGV2aWNlIGFkZHJlc3MgcmVwb3J0ZWQgKCVzKSBmb3IgY3JpdGVyaW9uICVzIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIGNyaXRlcmlvbk5hbWUuY19zdHIoKSk7CkBAIC0yOTYsMjggKzMxMSwyOCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VzKQorc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcyhjb25zdCBEZXZpY2VUeXBlU2V0ICZ0eXBlcykKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQogICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9Ci0gICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShpbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShjb252ZXJ0RGV2aWNlVHlwZXNUb0NyaXRlcmlvblZhbHVlKHR5cGVzKSk7CiAgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VzKQorc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoY29uc3QgRGV2aWNlVHlwZVNldCAmdHlwZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KICAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUob3V0cHV0RGV2aWNlcyk7CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShjb252ZXJ0RGV2aWNlVHlwZXNUb0NyaXRlcmlvblZhbHVlKHR5cGVzKSk7CiAgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zMjcsNSArMzQyLDQ1IEBACiAgICAgbVBmd0Nvbm5lY3Rvci0+YXBwbHlDb25maWd1cmF0aW9ucygpOwogfQogCit1aW50NjRfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Y29udmVydERldmljZVR5cGVUb0NyaXRlcmlvblZhbHVlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdCB7CisgICAgYm9vbCBpc091dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpOworICAgIHVpbnQzMl90IHR5cGVNYXNrID0gaXNPdXQgPyB0eXBlIDogKHR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CisKKyAgICBjb25zdCBhdXRvICZhZGFwdGVycyA9IGlzT3V0ID8gbU91dHB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcCA6IG1JbnB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcDsKKyAgICAvLyBPbmx5IG11bHRpYml0IGRldmljZXMgbmVlZCBhZGFwdGF0aW9uLgorICAgIGlmIChwb3Bjb3VudCh0eXBlTWFzaykgPiAxKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJmFkYXB0ZXIgPSBhZGFwdGVycy5maW5kKHR5cGUpOworICAgICAgICBpZiAoYWRhcHRlciAhPSBhZGFwdGVycy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBtdWx0aWJpdCBkZXZpY2UgJWQgY29udmVydGVkIHRvIGNyaXRlcmlvbiAlIiBQUkl1NjQsIF9fZnVuY19fLCB0eXBlLAorICAgICAgICAgICAgICAgICAgYWRhcHRlci0+c2Vjb25kKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gZmluZCBtYXAgZm9yIG11bHRpYml0IGRldmljZSAlZCIsIF9fZnVuY19fLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiB0eXBlTWFzazsKK30KKwordWludDY0X3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmNvbnZlcnREZXZpY2VUeXBlc1RvQ3JpdGVyaW9uVmFsdWUoCisgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQgJnR5cGVzKSBjb25zdCB7CisgICAgdWludDY0X3QgY3JpdGVyaW9uVmFsdWUgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmdHlwZSA6IHR5cGVzKSB7CisgICAgICAgIGNyaXRlcmlvblZhbHVlICs9IGNvbnZlcnREZXZpY2VUeXBlVG9Dcml0ZXJpb25WYWx1ZSh0eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIGNyaXRlcmlvblZhbHVlOworfQorCitEZXZpY2VUeXBlU2V0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpjb252ZXJ0RGV2aWNlQ3JpdGVyaW9uVmFsdWVUb0RldmljZVR5cGVzKAorICAgICAgICB1aW50NjRfdCBjcml0ZXJpb25WYWx1ZSwgYm9vbCBpc091dCkgY29uc3QgeworICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXM7CisgICAgY29uc3QgYXV0byAmYWRhcHRlcnMgPSBpc091dCA/IG1PdXRwdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXAgOiBtSW5wdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXA7CisgICAgZm9yIChjb25zdCBhdXRvICZhZGFwdGVyIDogYWRhcHRlcnMpIHsKKyAgICAgICAgaWYgKChhZGFwdGVyLnNlY29uZCAmIGNyaXRlcmlvblZhbHVlKSA9PSBhZGFwdGVyLnNlY29uZCkgeworICAgICAgICAgICAgZGV2aWNlVHlwZXMuaW5zZXJ0KGFkYXB0ZXIuZmlyc3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VUeXBlczsKK30KKwogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKaW5kZXggNjJiMTI5YS4uZmE0YWUxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaApAQCAtMTYsNiArMTYsNyBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTM1LDcgKzM2LDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCi11c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpciA9IHN0ZDo6dHVwbGU8dWludDY0X3QsIHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBEZXZpY2VUb0NyaXRlcmlvblR5cGVBZGFwdGVyID0gc3RkOjptYXA8YXVkaW9fZGV2aWNlc190LCB1aW50NjRfdD47CiB1c2luZyBWYWx1ZVBhaXJzID0gc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPjsKIAogY2xhc3MgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIKQEAgLTEwNSw3ICsxMDcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBkZXZpY2VzIGNyaXRlcmlvbiB1cGRhdGVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZXMpOworICAgIHN0YXR1c190IHNldEF2YWlsYWJsZUlucHV0RGV2aWNlcyhjb25zdCBEZXZpY2VUeXBlU2V0ICZpbnB1dERldmljZVR5cGVzKTsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzIGkuZS4gc2V0IHRoZSBhc3NvY2lhdGVkIHBvbGljeSBwYXJhbWV0ZXIgZnJhbWV3b3JrIGNyaXRlcmlvbgpAQCAtMTE0LDcgKzExNiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGRldmljZXMgY3JpdGVyaW9uIHVwZGF0ZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VzKTsKKyAgICBzdGF0dXNfdCBzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGNvbnN0IERldmljZVR5cGVTZXQgJm91dHB1dERldmljZVR5cGVzKTsKIAogICAgIC8qKgogICAgICAqIEBicmllZiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUgcHJvcGFnYXRlcyBhIHN0YXRlIGV2ZW50IG9uIGEgZ2l2ZW4gZGV2aWNlKHMpCkBAIC0xMjQsNyArMTI2LDcgQEAKICAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIG5ldyBzdGF0ZSBjb3JyZXRseSBwcm9wYWdhdGVkIHRvIEVuZ2luZSBQYXJhbWV0ZXItRnJhbWV3b3JrLCBlcnJvcgogICAgICAqIGNvZGUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgYWRkcmVzcywKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgLyoqCkBAIC0xMzgsNiArMTQwLDEzIEBACiAgICAgc3RhdHVzX3QgYWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBib29sIGlzSW5jbHVzaXZlLCBWYWx1ZVBhaXJzIHBhaXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlKTsKIAorICAgIHVpbnQ2NF90IGNvbnZlcnREZXZpY2VUeXBlVG9Dcml0ZXJpb25WYWx1ZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3Q7CisKKyAgICB1aW50NjRfdCBjb252ZXJ0RGV2aWNlVHlwZXNUb0NyaXRlcmlvblZhbHVlKGNvbnN0IERldmljZVR5cGVTZXQgJnR5cGVzKSBjb25zdDsKKworICAgIERldmljZVR5cGVTZXQgY29udmVydERldmljZUNyaXRlcmlvblZhbHVlVG9EZXZpY2VUeXBlcygKKyAgICAgICAgICAgIHVpbnQ2NF90IGNyaXRlcmlvblZhbHVlLCBib29sIGlzT3V0KSBjb25zdDsKKwogcHJpdmF0ZToKICAgICAvKioKICAgICAgKiBBcHBseSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcGxhdGZvcm0gb24gdGhlIHBvbGljeSBwYXJhbWV0ZXIgbWFuYWdlci4KQEAgLTIxMSw2ICsyMjAsOSBAQAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIHN0cnVjdCBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDsKIAorICAgIERldmljZVRvQ3JpdGVyaW9uVHlwZUFkYXB0ZXIgbU91dHB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcDsKKyAgICBEZXZpY2VUb0NyaXRlcmlvblR5cGVBZGFwdGVyIG1JbnB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcDsKKwogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZTsgLyoqPCBEZWZhdWx0IFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLwogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lOyAvKio8IFZlbmRvciBQb2xpY3kgUEZXIHRvcCBmaWxlIG5hbWUuKi8KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggN2Y5YzBhYy4uNDY3MWZlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icApAQCAtMzEsNiArMzEsNyBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAppbmRleCBiYzMyNDE2Li4wZGRmNjZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtNTcsOSArNTcsNiBAQAogICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiPgogICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJub3RpZmljYXRpb24iPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QiLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKaW5kZXggYzczYzE3ZC4uZDRkNTE0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0yNzAsOSArMjcwLDEwIEBACiAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKTsKICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7CiAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKEdST1VQX05PTkUsIHtBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUfSkpOwogICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKLSAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOworICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0V9KTsKICAgICB9IGJyZWFrOwogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CkBAIC0zNDMsNiArMzQ0LDMwIEBACiAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7CiAgICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CiAgICAgICAgIH0KKworICAgICAgICAvLyBMRSBhdWRpbyBicm9hZGNhc3QgZGV2aWNlIGlzIG9ubHkgdXNlZCBpZjoKKyAgICAgICAgLy8gLSBObyBjYWxsIGlzIGFjdGl2ZQorICAgICAgICAvLyAtIGVpdGhlciBNRURJQSBvciBTT05JRklDQVRJT05fUkVTUEVDVEZVTCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgc3RyYXRlZ3kKKyAgICAgICAgLy8gICBPUiB0aGUgTEUgYXVkaW8gdW5pY2FzdCBkZXZpY2UgaXMgbm90IGFjdGl2ZQorICAgICAgICBpZiAoZGV2aWNlczIuaXNFbXB0eSgpICYmICFpc0luQ2FsbCgpCisgICAgICAgICAgICAgICAgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBIHx8IHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgeworICAgICAgICAgICAgbGVnYWN5X3N0cmF0ZWd5IHRvcEFjdGl2ZVN0cmF0ZWd5ID0gU1RSQVRFR1lfTk9ORTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHMgOiBnZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmUocHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHRvcEFjdGl2ZVN0cmF0ZWd5ID0gIG1MZWdhY3lTdHJhdGVneU1hcC5maW5kKHBzKSAhPSBlbmQobUxlZ2FjeVN0cmF0ZWd5TWFwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwLmF0KHBzKSA6IFNUUkFURUdZX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRvcEFjdGl2ZVN0cmF0ZWd5ID09IFNUUkFURUdZX05PTkUgfHwgdG9wQWN0aXZlU3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEKKyAgICAgICAgICAgICAgICAgICAgfHwgdG9wQWN0aXZlU3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwKKyAgICAgICAgICAgICAgICAgICAgfHwgIW91dHB1dHMuaXNBbnlEZXZpY2VUeXBlQWN0aXZlKGdldEF1ZGlvRGV2aWNlT3V0TGVBdWRpb1VuaWNhc3RTZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzMiA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKGRldmljZXMyLmlzRW1wdHkoKSAmJiAoZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygpLnNpemUoKSA+IDApKSB7CiAgICAgICAgICAgICBpZiAoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSkgewogICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBjb25uZWN0ZWQgZGV2aWNlIG9mIHdpcmVkIGFuZCBibHVldG9vdGggYTJkcApAQCAtMzY0LDcgKzM4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXZpY2VzMi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoeworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSfSk7CiAgICAgICAgIH0KICAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXMzOwogICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKQEAgLTQ2MCw2ICs0ODYsNyBAQAogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EOgogICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNDgyLDcgKzUwOSw3IEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7Ci0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKICAgICAgICAgYnJlYWs7CkBAIC01MzYsNyArNTYzLDcgQEAKICAgICAgICAgLy8gYmVjYXVzZSBzb21ldGltZXMgdXNlciB3YW50IHRvIGRvIHZvaWNlIHNlYXJjaCBieSBidCByZW1vdGUKICAgICAgICAgLy8gZXZlbiBpZiBCVUlMRElOX01JQyBpcyBhdmFpbGFibGUuCiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7Ci0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKIApAQCAtNTUyLDcgKzU3OSw3IEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7Ci0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogICAgICAgICBicmVhazsKQEAgLTU4Niw2ICs2MTMsMTAgQEAKICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EOgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQywgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDfSk7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICBicmVhazsKQEAgLTY0NSw3ICs2NzYsNyBAQAogICAgICAgICAvLyB0aGVyZSBpcyBhIHByZWZlcnJlZCBkZXZpY2UsIGlzIGl0IGF2YWlsYWJsZT8KICAgICAgICAgcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjID0KICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMocHJlZmVycmVkU3RyYXRlZ3lEZXZpY2VzKTsKLSAgICAgICAgaWYgKHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy5zaXplKCkgPT0gcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnNpemUoKSkgeworICAgICAgICBpZiAocHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnNpemUoKSA9PSBwcmVmZXJyZWRTdHJhdGVneURldmljZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIHVzaW5nIHByZWYgZGV2aWNlICVzIGZvciBzdHJhdGVneSAldSIsCiAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy50b1N0cmluZygpLmNfc3RyKCksIHN0cmF0ZWd5KTsKICAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9BbmRyb2lkLmJwCmluZGV4IGZhZjE1ZDYuLjlmNmI3MDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9BbmRyb2lkLmJwCkBAIC02Miw0ICs2Miw3IEBACiAgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZGF0YTogWyI6YXVkaW9wb2xpY3lmdXp6ZXJfY29uZmlndXJhdGlvbl9maWxlcyJdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgY2M6IFsibW5hZ2Fub3ZAZ29vZ2xlLmNvbSJdLAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvYXVkaW9wb2xpY3lfZnV6emVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIuY3BwCmluZGV4IDcwMDBjZDkuLjQ4Zjc0MTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmg+CiAKQEAgLTEyNiwxMyArMTI3LDIwIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0oKTsKIAorLyoqCisgKiBBdWRpb1NvdXJjZSAtIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIGFuZCBBVURJT19TT1VSQ0VfSE9UV09SRAorICogYXJlIGV4Y2x1ZGVkIGZyb20ga0F1ZGlvU291cmNlc1tdIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBhYm9ydCB0cmlnZ2VyZWQKKyAqIGZvciB0aGVzZSB0d28gdHlwZXMgb2YgQXVkaW9Tb3VyY2UgaW4gRW5naW5lOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpCisgKi8KIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19zb3VyY2VfdD4ga0F1ZGlvU291cmNlcyA9IFtdIHsKICAgICBzdGQ6OnZlY3RvcjxhdWRpb19zb3VyY2VfdD4gcmVzdWx0OwogICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9Tb3VyY2U+e30pIHsKICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2VIYWw7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGF1ZGlvU291cmNlID0gdG9TdHJpbmcoZW51bVZhbCk7Ci0gICAgICAgIGlmIChhdWRpb19zb3VyY2VfZnJvbV9zdHJpbmcoYXVkaW9Tb3VyY2UuY19zdHIoKSwgJmF1ZGlvU291cmNlSGFsKSkgewotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhhdWRpb1NvdXJjZUhhbCk7CisgICAgICAgIGlmIChlbnVtVmFsICE9IHhzZDo6QXVkaW9Tb3VyY2U6OkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OICYmCisgICAgICAgICAgICBlbnVtVmFsICE9IHhzZDo6QXVkaW9Tb3VyY2U6OkFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfZnJvbV9zdHJpbmcoYXVkaW9Tb3VyY2UuY19zdHIoKSwgJmF1ZGlvU291cmNlSGFsKSkgeworICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soYXVkaW9Tb3VyY2VIYWwpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xNjMsNyArMTcxLDkgQEAKICAgICBBVURJT19GTEFHX0JZUEFTU19NVVRFLCAgICBBVURJT19GTEFHX0xPV19MQVRFTkNZLAogICAgIEFVRElPX0ZMQUdfREVFUF9CVUZGRVIsICAgIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiwKICAgICBBVURJT19GTEFHX01VVEVfSEFQVElDLCAgICBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFLAotICAgIEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFfTsKKyAgICBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSwgQVVESU9fRkxBR19DT05URU5UX1NQQVRJQUxJWkVELAorICAgIEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRSwKKyAgICB9OwogCiBzdGQ6OnZlY3RvcjxhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Q+IGtBdWRpb1BvbGljeURldmljZVN0YXRlcyA9IHsKICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLApAQCAtMjQ4LDEzICsyNTgsMTQgQEAKICAgICBpZiAoIXBvcnRJZCkgcG9ydElkID0gJmxvY2FsUG9ydElkOwogICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpvdXRwdXRfdHlwZV90IG91dHB1dFR5cGU7CisgICAgYm9vbCBpc1NwYXRpYWxpemVkOwogCiAgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCiAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSAwOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKICAgICBpZiAobU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoJmF0dHIsIG91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmc3RyZWFtLCBhdHRyaWJ1dGlvblNvdXJjZSwKLSAgICAgICAgICAgICZjb25maWcsICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSwgJm91dHB1dFR5cGUpICE9IE9LKSB7CisgICAgICAgICAgICAmY29uZmlnLCAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30sICZvdXRwdXRUeXBlLCAmaXNTcGF0aWFsaXplZCkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fCAqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKQEAgLTgzOSw2ICs4NTAsOSBAQAogICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcldpdGhDb25maWd1cmF0aW9uRmlsZShmZHApe307CiAgICAgdm9pZCBwcm9jZXNzKCkgb3ZlcnJpZGU7CiAKKyAgICB2b2lkIGZ1enpHZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoKTsKKyAgICB2b2lkIGZ1enpHZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoKTsKKwogICAgcHJvdGVjdGVkOgogICAgIHZvaWQgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk7CiAgICAgdm9pZCBleHBsaWNpdGx5Um91dGluZ0FmdGVyQ29ubmVjdGlvbigpOwpAQCAtODg5LDEwICs5MDMsNDEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRGV2aWNlQ29ubmVjdGlvbjo6ZnV6ekdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgpIHsKKyAgICBjb25zdCB1aW50MzJfdCBudW1UZXN0Q2FzZXMgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigxLCAxMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UZXN0Q2FzZXM7ICsraSkgeworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgICAgIGF0dHIuY29udGVudF90eXBlID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2NvbnRlbnRfdHlwZV90PihtRmRwLCBrQXVkaW9Db250ZW50VHlwZXMpOworICAgICAgICBhdHRyLnVzYWdlID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX3VzYWdlX3Q+KG1GZHAsIGtBdWRpb1VzYWdlcyk7CisgICAgICAgIGF0dHIuc291cmNlID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX3NvdXJjZV90PihtRmRwLCBrQXVkaW9Tb3VyY2VzKTsKKyAgICAgICAgYXR0ci5mbGFncyA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19mbGFnc19tYXNrX3Q+KG1GZHAsIGtBdWRpb0ZsYWdNYXNrcyk7CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4obUZkcCwga0F1ZGlvQ2hhbm5lbE91dE1hc2tzKTsKKyAgICAgICAgY29uZmlnLmZvcm1hdCA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19mb3JtYXRfdD4obUZkcCwga0F1ZGlvRm9ybWF0cyk7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGdldFZhbHVlRnJvbVZlY3Rvcjx1aW50MzJfdD4obUZkcCwga1NhbXBsaW5nUmF0ZXMpOworICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmY29uZmlnKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRGV2aWNlQ29ubmVjdGlvbjo6ZnV6ekdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygpIHsKKyAgICBjb25zdCB1aW50MzJfdCBudW1UZXN0Q2FzZXMgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigxLCAxMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UZXN0Q2FzZXM7ICsraSkgeworICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlczsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgICAgICBhdHRyLmNvbnRlbnRfdHlwZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jb250ZW50X3R5cGVfdD4obUZkcCwga0F1ZGlvQ29udGVudFR5cGVzKTsKKyAgICAgICAgYXR0ci51c2FnZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb191c2FnZV90PihtRmRwLCBrQXVkaW9Vc2FnZXMpOworICAgICAgICBhdHRyLnNvdXJjZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19zb3VyY2VfdD4obUZkcCwga0F1ZGlvU291cmNlcyk7CisgICAgICAgIGF0dHIuZmxhZ3MgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZmxhZ3NfbWFza190PihtRmRwLCBrQXVkaW9GbGFnTWFza3MpOworICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCZhdHRyLCBhdWRpb1Byb2ZpbGVzKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRGV2aWNlQ29ubmVjdGlvbjo6cHJvY2VzcygpIHsKICAgICBpZiAoaW5pdGlhbGl6ZSgpKSB7CiAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOwogICAgICAgICBleHBsaWNpdGx5Um91dGluZ0FmdGVyQ29ubmVjdGlvbigpOworICAgICAgICBmdXp6R2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCk7CisgICAgICAgIGZ1enpHZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoKTsKICAgICAgICAgZnV6elBhdGNoQ3JlYXRpb24oKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icAppbmRleCAwMTY1ZGM4Li40YjQ4MTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTM2LDYgKzM2LDggQEAKICAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lZGVmYXVsdCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGNjMmQ4ZTguLjc0NDYwOWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPFNlcmlhbGl6ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgpAQCAtNTMsNiArNTQsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VBZGRyZXNzOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRFeHQ7CiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCkBAIC05Nyw0NCArMTAyLDgwIEBACiAvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoc3RhdGUsIHBvcnQsIGVuY29kZWRGb3JtYXQpOwogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBhaWRsUG9ydDsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlVG9BdWRpb1BvcnQoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsICZhaWRsUG9ydCk7CisgICAgICAgIHN0YXR1cyA9PSBPSykgeworICAgICAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKHN0YXRlLCBhaWRsUG9ydC5oYWwsIGVuY29kZWRGb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29udmVydCB0byBBdWRpb1BvcnQgUGFyY2VsYWJsZTogJXMiLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0oU3RyaW5nOChkZXZpY2UtPmFkZHJlc3MoKS5jX3N0cigpKSk7Ci0gICAgY29uc3QgU3RyaW5nOCBrZXkoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgPwotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyOjprZXlEZXZpY2VDb25uZWN0IDogQXVkaW9QYXJhbWV0ZXI6OmtleURldmljZURpc2Nvbm5lY3QpOwotICAgIHBhcmFtLmFkZEludChrZXksIGRldmljZS0+dHlwZSgpKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisgICAgYXVkaW9fcG9ydF92NyBkZXZpY2VQb3J0OworICAgIGRldmljZS0+dG9BdWRpb1BvcnQoJmRldmljZVBvcnQpOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICZkZXZpY2VQb3J0LCBzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yICVkIHdoaWxlIHNldHRpbmcgY29ubmVjdGVkIHN0YXRlIGZvciBkZXZpY2UgJXMiLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgZGV2aWNlLT5nZXREZXZpY2VUeXBlQWRkcigpLnRvU3RyaW5nKGZhbHNlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KAorICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIHsKKyAgICAvLyBUT0RPOiBiLzIxMTYwMTE3OCBGb3J3YXJkICdwb3J0JyB0byBBdWRpbyBIQUwgdmlhIG1Id01vZHVsZXMuIEZvciBub3csIG9ubHkgZGV2aWNlX3R5cGUsCisgICAgLy8gZGV2aWNlX2FkZHJlc3MgYW5kIGRldmljZV9uYW1lIGFyZSBmb3J3YXJkZWQuCisgICAgaWYgKHBvcnQuZXh0LmdldFRhZygpICE9IEF1ZGlvUG9ydEV4dDo6ZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VfdHlwZTsKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzczsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICAgICAgICAgIHBvcnQuZXh0LmdldDxBdWRpb1BvcnRFeHQ6OmRldmljZT4oKS5kZXZpY2UsICZkZXZpY2VfdHlwZSwgJmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfTsKKyAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSA9IHBvcnQubmFtZS5jX3N0cigpOworICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VfdHlwZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VfdHlwZSkpCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICBkZXZpY2VfdHlwZSwgZGV2aWNlX2FkZHJlc3MuY19zdHIoKSwgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICBzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7CisgICAgcmV0dXJuIGRldmljZSA/IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlKSA6IElOVkFMSURfT1BFUkFUSU9OOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQotewotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMgZm9ybWF0IDB4JVgiLAotICAgICAgICAgICAgZGV2aWNlVHlwZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7Ci0KLSAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VUeXBlKSkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlVHlwZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICByZXR1cm4gZGV2aWNlID8gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUpIDogSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFBvcnQ7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IGRldmljZVRvQXVkaW9Qb3J0KGRldmljZVR5cGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgJmFpZGxQb3J0KTsKKyAgICAgICAgc3RhdHVzID09IE9LKSB7CisgICAgICAgIHJldHVybiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoc3RhdGUsIGFpZGxQb3J0LmhhbCwgZW5jb2RlZEZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb252ZXJ0IHRvIEF1ZGlvUG9ydCBQYXJjZWxhYmxlOiAlcyIsIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLApAQCAtMTQ5LDYgKzE5MCw5IEBACiAgICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKICAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKICAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworCisgICAgICAgIGJvb2wgd2FzTGVVbmljYXN0QWN0aXZlID0gaXNMZVVuaWNhc3RBY3RpdmUoKTsKKwogICAgICAgICBzd2l0Y2ggKHN0YXRlKQogICAgICAgICB7CiAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KQEAgLTI0Niw5ICsyOTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUKICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAvLyAib3V0cHV0cyIgdmVjdG9yIG5ldmVyIGNvbnRhaW5zIGR1cGxpY2F0ZWQgb3V0cHV0cworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzT3V0cHV0T25seUF2YWlsYWJsZVJvdXRlVG9Tb21lRGV2aWNlKGRlc2MpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBdWRpb1NvdXJjZXNGb3JPdXRwdXQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMxMiw2ICszNTksOCBAQAogICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZpY2UpOwogICAgICAgICB9CiAKKyAgICAgICAgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyh3YXNMZVVuaWNhc3RBY3RpdmUsIG51bGxwdHIsIDApOworCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gIC8vIGVuZCBpZiBpcyBvdXRwdXQgZGV2aWNlCkBAIC0zOTksNiArNDQ4LDE0IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VUb0F1ZGlvUG9ydChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQqIGFpZGxQb3J0KSB7CisgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UgZGV2RGVzY3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7CisgICAgZGV2RGVzY3Iuc2V0TmFtZShkZXZpY2VfbmFtZSk7CisgICAgcmV0dXJuIGRldkRlc2NyLndyaXRlVG9QYXJjZWxhYmxlKGFpZGxQb3J0KTsKK30KKwogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVuZ2luZURldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkgewogCkBAIC01MjUsMTAgKzU4MiwxMCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCiB7Ci0gICAgQUxPR1YoImdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoKSIpOworICAgIEFMT0dWKCJnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoKSIpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0U2V0OwogICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5TW9kdWxlID0KQEAgLTUzNyw4ICs1OTQsMjMgQEAKICAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBwcmltYXJ5IG1vZHVsZSIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCisgICAgRGV2aWNlVHlwZVNldCBhdWRpb0RldmljZVNldDsKKworICAgIHN3aXRjaChkZXZpY2UpIHsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CisgICAgICAgIGF1ZGlvRGV2aWNlU2V0ID0gZ2V0QXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVDoKKyAgICAgICAgYXVkaW9EZXZpY2VTZXQgPSBnZXRBdWRpb0RldmljZU91dEFsbEJsZVNldCgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMoKSBkZXZpY2UgdHlwZSAweCUwOHggbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLCBkZXZpY2UpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBwcmltYXJ5TW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VzRnJvbVR5cGVzKAotICAgICAgICAgICAgZ2V0QXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0KCkpOworICAgICAgICAgICAgYXVkaW9EZXZpY2VTZXQpOwogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGVjbGFyZWREZXZpY2VzKSB7CiAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZGV2aWNlLT5lbmNvZGVkRm9ybWF0cygpLmJlZ2luKCksIGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5lbmQoKSk7CiAgICAgfQpAQCAtNjAwLDEyICs2NzIsOCBAQAogICAgIEFMT0dWKCIlcyBkZXZpY2UgcnhEZXZpY2UgJXMgdHhEZXZpY2UgJXMiLCBfX2Z1bmNfXywKICAgICAgICAgICByeERldmljZXMuaXRlbUF0KDApLT50b1N0cmluZygpLmNfc3RyKCksIHR4U291cmNlRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCi0gICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKLSAgICAvLyByZWxlYXNlIFRYIHBhdGNoIGlmIGFueQotICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsVHhQYXRjaC0+Z2V0SGFuZGxlKCkpOwotICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKLSAgICB9CisgICAgZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKG1DYWxsUnhTb3VyY2VDbGllbnQpOworICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFR4U291cmNlQ2xpZW50KTsKIAogICAgIGF1dG8gdGVsZXBob255UnhNb2R1bGUgPQogICAgICAgICBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZVR5cGUoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwpAQCAtNjYzLDcgKzczMSw3IEBACiAgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVDbGllbnRzKGFjdGl2ZURlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1DYWxsVHhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGZhbHNlIC8qaXNSeCovLCB0eFNvdXJjZURldmljZSwgZGVsYXlNcyk7CisgICAgICAgIGNvbm5lY3RUZWxlcGhvbnlUeEF1ZGlvU291cmNlKHR4U291cmNlRGV2aWNlLCB0eFNpbmtEZXZpY2UsIGRlbGF5TXMpOwogICAgIH0KICAgICBpZiAod2FpdE1zICE9IG51bGxwdHIpIHsKICAgICAgICAgKndhaXRNcyA9IG11dGVXYWl0TXM7CkBAIC02NzEsMzYgKzczOSw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxBdWRpb1BhdGNoPiBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZVRlbGVwaG9ueVBhdGNoKAotICAgICAgICBib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKLSAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwotCi0gICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEBUT0RPOiBzdGlsbCBpZ25vcmluZyB0aGUgYWRkcmVzcywgb3Igbm90IGRlYWxpbmcgcGxhdGZvcm0gd2l0aCBtdWx0aXBsZSB0ZWxlcGhvbnkgZGV2aWNlcwotICAgIGlmIChpc1J4KSB7Ci0gICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGRldmljZSkuCi0gICAgICAgICAgICAgICAgYWRkU291cmNlKG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShkZXZpY2UpLgotICAgICAgICAgICAgICAgIGFkZFNpbmsobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwotICAgIH0KLQotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChwYXRjaEJ1aWxkZXIucGF0Y2goKSwgJnBhdGNoSGFuZGxlLCBtVWlkQ2FjaGVkLCBkZWxheU1zKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KHBhdGNoSGFuZGxlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygiJXMoKSBlcnJvciAlZCBjcmVhdGluZyAlcyBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMsIGlzUnggPyAiUlgiIDogIlRYIik7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLX0KLQogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGV2aWNlT2ZNb2R1bGUoCiAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgewogICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKQEAgLTcxNSwyMCArNzUzLDU1IEBACiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpCiB7Ci0gICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKKyAgICBkaXNjb25uZWN0VGVsZXBob255QXVkaW9Tb3VyY2UobUNhbGxSeFNvdXJjZUNsaWVudCk7CiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZSA9IHsKICAgICAgICAgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCiAgICAgICAgIC5leHQuZGV2aWNlLnR5cGUgPSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAuZXh0LmRldmljZS5hZGRyZXNzID0gIiIKICAgICB9OwogICAgIGNvbnN0IGF1dG8gYWEgPSBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYWEsICZtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCwgMC8qdWlkKi8pOwotICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzIGZhaWxlZCB0byBzdGFydCBUZWxlcGhvbnkgUnggQXVkaW9Tb3VyY2UiLCBfX2Z1bmNfXyk7CisgICAgbUNhbGxSeFNvdXJjZUNsaWVudCA9IHN0YXJ0QXVkaW9Tb3VyY2VJbnRlcm5hbCgmc291cmNlLCAmYWEsIDAvKnVpZCovKTsKKyAgICBBTE9HRV9JRihtQ2FsbFJ4U291cmNlQ2xpZW50ID09IG51bGxwdHIsCisgICAgICAgICAgICAgIiVzIGZhaWxlZCB0byBzdGFydCBUZWxlcGhvbnkgUnggQXVkaW9Tb3VyY2UiLCBfX2Z1bmNfXyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ICZjbGllbnREZXNjKQogewotICAgIHN0b3BBdWRpb1NvdXJjZShtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCk7Ci0gICAgbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGlmIChjbGllbnREZXNjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HV19JRihzdG9wQXVkaW9Tb3VyY2UoY2xpZW50RGVzYy0+cG9ydElkKCkpICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIiVzIGVycm9yIHN0b3BwaW5nIGF1ZGlvIHNvdXJjZSIsIF9fZnVuY19fKTsKKyAgICBjbGllbnREZXNjLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0VGVsZXBob255VHhBdWRpb1NvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNyY0RldmljZSwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKG1DYWxsVHhTb3VyY2VDbGllbnQpOworICAgIGlmIChzcmNEZXZpY2UgPT0gbnVsbHB0ciB8fCBzaW5rRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBjcmVhdGUgcGF0Y2gsIGludmFsaWQgc2luayBhbmQvb3Igc291cmNlIGRldmljZShzKSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc3JjRGV2aWNlKS5hZGRTaW5rKHNpbmtEZXZpY2UpOworICAgIEFMT0dWKCIlcyBiZXR3ZWVuIHNvdXJjZSAlcyBhbmQgc2luayAlcyIsIF9fZnVuY19fLAorICAgICAgICAgICAgc3JjRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgYXV0byBjYWxsVHhTb3VyY2VDbGllbnRQb3J0SWQgPSBQb2xpY3lBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhYSA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIH07CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZSA9IHt9OworICAgIHNyY0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJnNvdXJjZSk7CisgICAgbUNhbGxUeFNvdXJjZUNsaWVudCA9IG5ldyBJbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgY2FsbFR4U291cmNlQ2xpZW50UG9ydElkLCBtVWlkQ2FjaGVkLCBhYSwgc291cmNlLCBzcmNEZXZpY2UsIHNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3ksIHRvVm9sdW1lU291cmNlKGFhKSk7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0QXVkaW9Tb3VyY2VUb1NpbmsoCisgICAgICAgICAgICAgICAgbUNhbGxUeFNvdXJjZUNsaWVudCwgc2lua0RldmljZSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIHBhdGNoSGFuZGxlLCBtVWlkQ2FjaGVkLAorICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgVFggYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKGNhbGxUeFNvdXJjZUNsaWVudFBvcnRJZCwgbUNhbGxUeFNvdXJjZUNsaWVudCk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC03MzYsNiArODA5LDcgQEAKICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOwogICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdwogICAgIGludCBvbGRTdGF0ZSA9IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKyAgICBib29sIHdhc0xlVW5pY2FzdEFjdGl2ZSA9IGlzTGVVbmljYXN0QWN0aXZlKCk7CiAKICAgICBpZiAobUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShzdGF0ZSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIG9yIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7CkBAIC03OTYsMTEgKzg3MCw4IEBACiAgICAgICAgICAgICAgICAgcnhEZXZpY2VzID0gbVByaW1hcnlPdXRwdXQtPmRldmljZXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsVHhQYXRjaC0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKG1DYWxsUnhTb3VyY2VDbGllbnQpOworICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFR4U291cmNlQ2xpZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICB9CkBAIC04MTAsMTEgKzg4MSwxNSBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgaWYgKHN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCB8fCBkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSB7Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgMCAvKmRlbGF5TXMqLyk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQgJiYgIWlzVGVsZXBob255UnhPclR4KGRlc2MpKSkgeworICAgICAgICAgICAgYm9vbCBmb3JjZVJvdXRpbmcgPSAhbmV3RGV2aWNlcy5pc0VtcHR5KCk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsIGZvcmNlUm91dGluZywgMCAvKmRlbGF5TXMqLywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnJlcXVpcmVzTXV0ZUNoZWNrKi8sICFmb3JjZVJvdXRpbmcgLypyZXF1aXJlc1ZvbHVtZUNoZWNrKi8pOwogICAgICAgICB9CiAgICAgfQogCisgICAgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyh3YXNMZVVuaWNhc3RBY3RpdmUsIG51bGxwdHIsIGRlbGF5TXMpOworCiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0YXJ0cwpAQCAtODcxLDYgKzk0NiwzMiBAQAogICAgIEFMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7CiB9CiAKKy8vIEZpbmQgYW4gTVNEIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuCisvLyBXaGVuICJkaXJlY3RPbmx5IiBpcyBzZXQsIHJlc3RyaWN0IHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkUHJvZmlsZUZvck91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpCit7CisgICAgZmxhZ3MgPSBnZXRSZWxldmFudEZsYWdzKGZsYWdzLCBkaXJlY3RPbmx5KTsKKworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBmb3IgdGhlIG1zZCBtb2R1bGUgY2hlY2sgaWYgdGhlcmUgYXJlIHBhdGNoZXMgdG8gdGhlIG91dHB1dCBkZXZpY2VzCisgICAgICAgIGlmIChtc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGRldmljZXMudG9UeXBlQWRkclZlY3RvcigpKSkgeworICAgICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1vZHVsZXM7CisgICAgICAgICAgICBtb2R1bGVzLmFkZChtc2RNb2R1bGUpOworICAgICAgICAgICAgcmV0dXJuIHNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzKAorICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLCBnZXRNc2RBdWRpb091dERldmljZXMoKSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgZGlyZWN0T25seSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIC8vIEZpbmQgYW4gb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZC4gV2hlbiAiZGlyZWN0T25seSIgaXMgc2V0LCByZXN0cmljdAogLy8gc2VhcmNoIHRvIHByb2ZpbGVzIGZvciBkaXJlY3Qgb3V0cHV0cy4KIHNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yT3V0cHV0KApAQCAtODgxLDUwICs5ODIsOTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQogeworICAgIGZsYWdzID0gZ2V0UmVsZXZhbnRGbGFncyhmbGFncywgZGlyZWN0T25seSk7CisKKyAgICByZXR1cm4gc2VhcmNoQ29tcGF0aWJsZVByb2ZpbGVId01vZHVsZXMoCisgICAgICAgICAgICBtSHdNb2R1bGVzLCBkZXZpY2VzLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBkaXJlY3RPbmx5KTsKK30KKworYXVkaW9fb3V0cHV0X2ZsYWdzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRSZWxldmFudEZsYWdzICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsIGJvb2wgZGlyZWN0T25seSkgewogICAgIGlmIChkaXJlY3RPbmx5KSB7Ci0gICAgICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgotICAgICAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGV2YW50RmxhZ3MgPQorICAgICAgICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCisgICAgICAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KICAgICAgICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAotICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSk7Ci0gICAgICAgIGZsYWdzID0KLSAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSk7CisgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICB9CisgICAgcmV0dXJuIGZsYWdzOworfQogCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VhcmNoQ29tcGF0aWJsZVByb2ZpbGVId01vZHVsZXMgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh3TW9kdWxlQ29sbGVjdGlvbiYgaHdNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSkgewogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IGh3TW9kdWxlcykgewogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGN1clByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgewotICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qdXBkYXRlZEZvcm1hdCovLAotICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgTlVMTCAvKnVwZGF0ZWRDaGFubmVsTWFzayovLAotICAgICAgICAgICAgICAgICAgICBmbGFncykpIHsKKyAgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgTlVMTCAvKnVwZGF0ZWRGb3JtYXQqLywKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBOVUxMIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCisgICAgICAgICAgICAgICAgICAgICBmbGFncykpIHsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCisgICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSkgeworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIGlmIGNvbm5lY3RlZCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjb2RlYworICAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhkZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAoIWRpcmVjdE9ubHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VyUHJvZmlsZTsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyBmb3IgZGlyZWN0IG91dHB1dHMsIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkKKyAgICAgICAgICAgICAvLyB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKKyAgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAwICYmIAorICAgICAgICAgICAgICAgICAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgZGV2aWNlIGN1cnJlbnRseSBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBpZiBjb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29kZWMKLSAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhkZXZpY2VzLnR5cGVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpcmVjdE9ubHkpIHJldHVybiBjdXJQcm9maWxlOwotICAgICAgICAgICAgLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGRpcmVjdCBvdXRwdXRzLCBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5Ci0gICAgICAgICAgICAvLyB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKLSAgICAgICAgICAgIGlmIChwcm9maWxlICE9IDAgJiYgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2ZpbGUgPSBjdXJQcm9maWxlOwotICAgICAgICAgICAgaWYgKChwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBwcm9maWxlID0gY3VyUHJvZmlsZTsKKyAgICAgICAgICAgICBpZiAoKHByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNwYXRpYWxpemVyT3V0cHV0UHJvZmlsZSgKKyAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZyBfX3VudXNlZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGN1clByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgeworICAgICAgICAgICAgaWYgKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgIT0gQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCisgICAgICAgICAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcyA9IGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKHN1cHBvcnRlZERldmljZXMpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRldmljZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoZGV2aWNlcykuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBkZXZpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXMgZm91bmQgcHJvZmlsZSAlcyIsIF9fZnVuY19fLCBjdXJQcm9maWxlLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gY3VyUHJvZmlsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CkBAIC05ODYsNyArMTEzMyw4IEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAogICAgICAgICBzdGQ6OnZlY3RvcjxzcDxBdWRpb1BvbGljeU1peD4+ICpzZWNvbmRhcnlNaXhlcywKLSAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSkKKyAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSwKKyAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCkKIHsKICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlczsKICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZFBvcnRJZCA9ICpzZWxlY3RlZERldmljZUlkOwpAQCAtOTk1LDYgKzExNDMsOCBAQAogICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocmVxdWVzdGVkUG9ydElkKTsKIAogICAgICpvdXRwdXRUeXBlID0gQVBJX09VVFBVVF9JTlZBTElEOworICAgICppc1NwYXRpYWxpemVkID0gZmFsc2U7CisKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXMocmVzdWx0QXR0ciwgYXR0ciwgKnN0cmVhbSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMTA5NCw3ICsxMjQ0LDcgQEAKIAogICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBpZiAoIW1zZERldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2VzKG1zZERldmljZXMsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywgZmxhZ3MpOworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhtc2REZXZpY2VzLCBzZXNzaW9uLCByZXN1bHRBdHRyLCBjb25maWcsIGZsYWdzLCBpc1NwYXRpYWxpemVkKTsKICAgICAgICAgaWYgKCpvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2V0TXNkT3V0cHV0UGF0Y2hlcygmb3V0cHV0RGV2aWNlcykgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dWKCIlcygpIFVzaW5nIE1TRCBkZXZpY2VzICVzIGluc3RlYWQgb2YgZGV2aWNlcyAlcyIsCiAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKQEAgLTExMDMsOCArMTI1Myw4IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMob3V0cHV0RGV2aWNlcywgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLAotICAgICAgICAgICAgICAgIGZsYWdzLCByZXN1bHRBdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfTVVURV9IQVBUSUMpOworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhvdXRwdXREZXZpY2VzLCBzZXNzaW9uLCByZXN1bHRBdHRyLCBjb25maWcsCisgICAgICAgICAgICAgICAgZmxhZ3MsIGlzU3BhdGlhbGl6ZWQsIHJlc3VsdEF0dHItPmZsYWdzICYgQVVESU9fRkxBR19NVVRFX0hBUFRJQyk7CiAgICAgfQogICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTExMzksNyArMTI4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKQogewogICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCiAgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewpAQCAtMTE2MSw3ICsxMzEyLDcgQEAKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgYXR0ciwgc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICBjb25maWcsIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCi0gICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzICE9IG51bGxwdHIgPyAmc2Vjb25kYXJ5TWl4ZXMgOiBudWxscHRyLCBvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMgIT0gbnVsbHB0ciA/ICZzZWNvbmRhcnlNaXhlcyA6IG51bGxwdHIsIG91dHB1dFR5cGUsIGlzU3BhdGlhbGl6ZWQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CkBAIC0xMjY1LDcgKzE0MTYsOCBAQAogICAgIC8vIGFsbCBNU0QgcGF0Y2hlcyB0byBwcmlvcml0aXplIHRoaXMgcmVxdWVzdCBvdmVyIGFueSBhY3RpdmUgb3V0cHV0IG9uIE1TRC4KICAgICByZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhkZXZpY2VzKTsKIAotICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4oY29uZmlnLCBkZXZpY2VzLCBzdHJlYW0sIGZsYWdzLCBvdXRwdXQpOworICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgbnVsbHB0ciAvKiBtaXhlckNvbmZpZyAqLywgZGV2aWNlcywgc3RyZWFtLCBmbGFncywgb3V0cHV0KTsKIAogICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKQEAgLTEzMDAsOSArMTQ1MiwxMCBAQAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2VzKAogICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQsCiAgICAgICAgIGJvb2wgZm9yY2VNdXRpbmdIYXB0aWMpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0xMzIyLDYgKzE0NzUsOSBAQAogICAgIGlmICgoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgfQorCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqYXR0cik7CisKICAgICAvLyBvbmx5IGFsbG93IGRlZXAgYnVmZmVyaW5nIGZvciBtdXNpYyBzdHJlYW0gdHlwZQogICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CiAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzICZ+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOwpAQCAtMTM0MSw2ICsxNDk3LDE4IEBACiAgICAgICAgIEFMT0dWKCJTZXQgVm9JUCBhbmQgRGlyZWN0IG91dHB1dCBmbGFncyBmb3IgUENNIGZvcm1hdCIpOwogICAgIH0KIAorICAgIC8vIEF0dGFjaCB0aGUgVWx0cmFzb3VuZCBmbGFnIGZvciB0aGUgQVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQKKyAgICBpZiAoYXR0ci0+Y29udGVudF90eXBlID09IEFVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5EKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORCk7CisgICAgfQorCisgICAgKmlzU3BhdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAobVNwYXRpYWxpemVyT3V0cHV0ICE9IG51bGxwdHIKKyAgICAgICAgICAgICYmIGNhbkJlU3BhdGlhbGl6ZWRJbnQoYXR0ciwgY29uZmlnLCBkZXZpY2VzLnRvVHlwZUFkZHJWZWN0b3IoKSkpIHsKKyAgICAgICAgKmlzU3BhdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gbVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGU7CisgICAgfQorCiAgICAgYXVkaW9fY29uZmlnX3QgZGlyZWN0Q29uZmlnID0gKmNvbmZpZzsKICAgICBkaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlbkRpcmVjdE91dHB1dChzdHJlYW0sIHNlc3Npb24sICZkaXJlY3RDb25maWcsICpmbGFncywgZGV2aWNlcywgJm91dHB1dCk7CkBAIC0xNDA1LDYgKzE1NzMsMjcgQEAKICAgICByZXR1cm4gbXNkUGF0Y2hlczsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzTXNkUGF0Y2goY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgJmhhbmRsZSkgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaC0+bVBhdGNoLnNpbmtzWzBdOworICAgIGlmIChnZXRNc2RBdWRpb091dERldmljZXMoKS5jb250YWlucyhtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoc2luay0+aWQpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW5kZXggPSBnZXRNc2RPdXRwdXRQYXRjaGVzKCkuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RQcm9maWxlcyhib29sIGh3QXZTeW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMsCkBAIC0xNjA0LDYgKzE3OTMsMjggQEAKICAgICB9CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlc1RvQ2hlY2sgPSBtT3V0cHV0RGV2aWNlc0FsbC5nZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKGRldmljZXMpOworICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RPdXRwdXRQYXRjaGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtc2RQYXRjaGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoID0gbXNkUGF0Y2hlc1tpXTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmsgPSAmcGF0Y2gtPm1QYXRjaC5zaW5rc1tqXTsKKyAgICAgICAgICAgIGlmIChzaW5rLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBmb3VuZERldmljZSA9IGRldmljZXNUb0NoZWNrLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgc2luay0+ZXh0LmRldmljZS50eXBlLCBTdHJpbmc4KHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcyksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzVG9DaGVjay5yZW1vdmUoZm91bmREZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlc1RvQ2hlY2suaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTE2MzMsNyArMTg0NCw4IEBACiAgICAgLy8gb3RoZXIgY3JpdGVyaWEKICAgICBzdGF0aWMgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qga0Z1bmN0aW9uYWxGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfCBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMgfAotICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVFRTIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSk7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19UVFMgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1RfUENNIHwgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORCB8CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUik7CiAgICAgLy8gRmxhZ3MgZXhwcmVzc2luZyBhIHBlcmZvcm1hbmNlIHJlcXVlc3Q6IGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiBzZXJ2aW5nCiAgICAgLy8gcmVxdWVzdGVkIHNhbXBsaW5nIHJhdGUgb3IgY2hhbm5lbCBtYXNrCiAgICAgc3RhdGljIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGtQZXJmb3JtYW5jZUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQpAQCAtMTY1Miw2ICsxODY0LDggQEAKICAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKICAgICAvLyAxOiB0aGUgb3V0cHV0IHN1cHBvcnRpbmcgaGFwdGljIHBsYXliYWNrIHdoZW4gcmVxdWVzdGluZyBoYXB0aWMgcGxheWJhY2sKICAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBmdW5jdGlvbmFsIGZsYWdzCisgICAgLy8gICAgd2l0aCB0aWVicmVhayBwcmVmZXJyaW5nIHRoZSBtaW5pbXVtIG51bWJlciBvZiBleHRyYSBmdW5jdGlvbmFsIGZsYWdzCisgICAgLy8gICAgKHNlZSBiLzIwMDI5MzEyNCwgdGhlIGluY29ycmVjdCBzZWxlY3Rpb24gb2YgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCkuCiAgICAgLy8gMzogdGhlIG91dHB1dCBzdXBwb3J0aW5nIHRoZSBleGFjdCBjaGFubmVsIG1hc2sKICAgICAvLyA0OiB0aGUgb3V0cHV0IHdpdGggYSBoaWdoZXIgY2hhbm5lbCBjb3VudCB0aGFuIHJlcXVlc3RlZAogICAgIC8vIDU6IHRoZSBvdXRwdXQgd2l0aCBhIGhpZ2hlciBzYW1wbGluZyByYXRlIHRoYW4gcmVxdWVzdGVkCkBAIC0xNjkzLDcgKzE5MDcsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZ1bmN0aW9uYWwgZmxhZ3MgbWF0Y2gKLSAgICAgICAgY3VycmVudE1hdGNoQ3JpdGVyaWFbMV0gPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBmdW5jdGlvbmFsRmxhZ3MpOworICAgICAgICBjb25zdCBpbnQgbWF0Y2hpbmdGdW5jdGlvbmFsRmxhZ3MgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9wb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBmdW5jdGlvbmFsRmxhZ3MpOworICAgICAgICBjb25zdCBpbnQgdG90YWxGdW5jdGlvbmFsRmxhZ3MgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9wb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBrRnVuY3Rpb25hbEZsYWdzKTsKKyAgICAgICAgLy8gUHJlZmVyIG1hdGNoaW5nIGZ1bmN0aW9uYWwgZmxhZ3MsIGJ1dCBzdWJ0cmFjdCB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsIGZsYWdzLgorICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVsxXSA9IDEwMCAqIChtYXRjaGluZ0Z1bmN0aW9uYWxGbGFncyArIDEpIC0gdG90YWxGdW5jdGlvbmFsRmxhZ3M7CiAKICAgICAgICAgLy8gY2hhbm5lbCBtYXNrIGFuZCBjaGFubmVsIGNvdW50IG1hdGNoCiAgICAgICAgIHVpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKQEAgLTE3NzcsNiArMTk5NiwyMiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0xlVW5pY2FzdEFjdGl2ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGlzQW55RGV2aWNlVHlwZUFjdGl2ZShnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCkpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNBbnlEZXZpY2VUeXBlQWN0aXZlKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSBjb25zdCB7CisgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoZGV2aWNlVHlwZXMpLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgYWN0aXZlID0gbU91dHB1dHMuaXNBbnlEZXZpY2VUeXBlQWN0aXZlKGRldmljZVR5cGVzKTsKKyAgICBBTE9HVigiJXMgYWN0aXZlICVkIiwgX19mdW5jX18sIGFjdGl2ZSk7CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCkBAIC0xNzkyLDcgKzIwMjcsNyBAQAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwogICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKSAvKnNvdXJjZVRvSWdub3JlKi8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTLCBmYWxzZSkgLypzb3VyY2VUb0lnbm9yZSovKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19CRUFDT04pOwpAQCAtMTgwNCw4ICsyMDM5LDcgQEAKIAogICAgIC8vIGZvcmNlIGRldmljZSBjaGFuZ2UgaWYgdGhlIG91dHB1dCBpcyBpbmFjdGl2ZSBhbmQgbm8gYXVkaW8gcGF0Y2ggaXMgYWxyZWFkeSBwcmVzZW50LgogICAgIC8vIGNoZWNrIGFjdGl2ZSBiZWZvcmUgaW5jcmVtZW50aW5nIHVzYWdlIGNvdW50Ci0gICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmCi0gICAgICAgICAgICAob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSk7CisgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmICFvdXRwdXREZXNjLT5pc1JvdXRlZCgpOwogCiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOwpAQCAtMTgyOSw2ICsyMDYzLDcgQEAKICAgICAvLyBhbmQgbXV0aW5nIHdvdWxkIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBkZWxheSBhbmQgZHJvcHBlZCBhdWRpby4KICAgICBjb25zdCB1aW50MzJfdCBvdXRwdXRMYXRlbmN5TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCk7CiAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IG91dHB1dERlc2MtPmlzQWN0aXZlKG91dHB1dExhdGVuY3lNcyAqIDIpOyAgLy8gYWNjb3VudCBmb3IgZHJhaW4KKyAgICBib29sIHdhc0xlVW5pY2FzdEFjdGl2ZSA9IGlzTGVVbmljYXN0QWN0aXZlKCk7CiAKICAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgogICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKQEAgLTE5MDcsMTEgKzIxNDIsMTUgQEAKIAogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjbGllbnQtPmF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCksIDAgLypkZWxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAvKmZvcmNlKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAvKmZvcmNlKi8pKSB7CisgICAgICAgICAgICAvLyByZXF1ZXN0IEF1ZGlvU2VydmljZSB0byByZWluaXRpYWxpemUgdGhlIHZvbHVtZSBjdXJ2ZXMgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIEFMT0dFKCJjaGVja0FuZFNldFZvbHVtZSBmYWlsZWQsIHJlcXVlc3Rpbmcgdm9sdW1lIHJhbmdlIGluaXQiKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKKyAgICAgICAgfTsKIAogICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RhcnRpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbgogICAgICAgICAvLyByb3V0aW5nCkBAIC0xOTUyLDkgKzIxOTEsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9CiAKKyAgICBjaGVja0xlQnJvYWRjYXN0Um91dGVzKHdhc0xlVW5pY2FzdEFjdGl2ZSwgb3V0cHV0RGVzYywgKmRlbGF5TXMpOworCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tMZUJyb2FkY2FzdFJvdXRlcyhib29sIHdhc1VuaWNhc3RBY3RpdmUsCisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBpZ25vcmVkT3V0cHV0LCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgYm9vbCBpc1VuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOworCisgICAgaWYgKHdhc1VuaWNhc3RBY3RpdmUgIT0gaXNVbmljYXN0QWN0aXZlKSB7CisgICAgICAgIC8vcmVyb3V0ZSBhbGwgb3V0cHV0cyByb3V0ZWQgdG8gTEUgYnJvYWRjYXN0IGlmIExFIHVuaWNhc3QgYWN0aXZ5IGNoYW5nZWQgb24gYW55IG91dHB1dAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBpZ25vcmVkT3V0cHV0ICYmIGRlc2MtPmlzQWN0aXZlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKChpc1VuaWNhc3RBY3RpdmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGVzYy0+ZGV2aWNlcygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfQkxFX0JST0FEQ0FTVCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHdhc1VuaWNhc3RBY3RpdmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGVzYy0+ZGV2aWNlcygpLmdldERldmljZXNGcm9tVHlwZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCkpLmlzRW1wdHkoKSkpKSB7CisgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2VzKCkgIT0gbmV3RGV2aWNlczsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAvLyByZS1hcHBseSBkZXZpY2Ugc3BlY2lmaWMgdm9sdW1lIGlmIG5vdCBkb25lIGJ5IHNldE91dHB1dERldmljZSgpCisgICAgICAgICAgICAgICAgaWYgKCFmb3JjZSkgeworICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwpAQCAtMTk4Myw2ICsyMjUxLDcgQEAKICAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKICAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisgICAgYm9vbCB3YXNMZVVuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOwogCiAgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwogCkBAIC0yMDE0LDEyICsyMjgzLDIwIEBACiAgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgewogICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RvcFRpbWUoY2xpZW50LCBzeXN0ZW1UaW1lKCkpOwogICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworCisgICAgICAgICAgICAvLyBJZiB0aGUgcm91dGluZyBkb2VzIG5vdCBjaGFuZ2UsIGlmIGFuIG91dHB1dCBpcyByb3V0ZWQgb24gYSBkZXZpY2UgdXNpbmcgSHdHYWluCisgICAgICAgICAgICAvLyAoYWthIHNldEF1ZGlvUG9ydENvbmZpZykgYW5kIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgY2xpZW50cyBmb2xsb3dpbmcgZGlmZmVyZW50CisgICAgICAgICAgICAvLyB2b2x1bWUgZ3JvdXAocyksIGZvcmNlIHJlYXBwbHkgdm9sdW1lCisgICAgICAgICAgICBib29sIHJlcXVpcmVzVm9sdW1lQ2hlY2sgPSBvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAmJiBvdXRwdXREZXNjLT5pc0FueUFjdGl2ZShWT0xVTUVfU09VUkNFX05PTkUpOworCiAgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCiAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgogICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAogICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCiAgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB0cnVlIC8qcmVxdWlyZXNNdXRlQ2hlY2sqLywgcmVxdWlyZXNWb2x1bWVDaGVjayk7CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCiAgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CkBAIC0yMDUzLDYgKzIzMzAsOSBAQAogICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudC0+YXR0cmlidXRlcygpLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9CisKKyAgICAgICAgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyh3YXNMZVVuaWNhc3RBY3RpdmUsIG91dHB1dERlc2MsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSByZWZjb3VudCBpcyBhbHJlYWR5IDAiKTsKQEAgLTIxMjMsMTEgKzI0MDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBBTE9HVigiJXMoKSBzb3VyY2UgJWQsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIHNlc3Npb24gJWQsICIKLSAgICAgICAgICAiZmxhZ3MgJSN4IGF0dHJpYnV0ZXM9JXMiLCBfX2Z1bmNfXywgYXR0ci0+c291cmNlLCBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MsIHRvU3RyaW5nKCphdHRyKS5jX3N0cigpKTsKKyAgICAgICAgICAiZmxhZ3MgJSN4IGF0dHJpYnV0ZXM9JXMgcmVxdWVzdGVkIGRldmljZSBJRCAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgIHNlc3Npb24sIGZsYWdzLCB0b1N0cmluZygqYXR0cikuY19zdHIoKSwgKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7CiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSAqYXR0cjsKICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKQEAgLTIxNDcsNyArMjQyNyw3IEBACiAgICAgfQogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPSAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPQogICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBtbWFwIGNhcHR1cmU6IGlmIGFuIGlucHV0IElPIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHdlIHJldXNlIHRoaXMgaW5wdXQgaWYKQEAgLTIxOTgsOCArMjQ3OCw2IEBACiAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOwogCi0gICAgaGFsSW5wdXRTb3VyY2UgPSBhdHRyaWJ1dGVzLnNvdXJjZTsKLQogICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgogICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOwpAQCAtMjMxMyw2ICsyNTkxLDEwIEBACiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CiAKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX1VMVFJBU09VTkQpOworICAgIH0KKwogICAgIC8vIGZpbmQgYSBjb21wYXRpYmxlIGlucHV0IHByb2ZpbGUgKG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwgaW4gcGFyYW1ldGVycykKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CiAgICAgLy8gc2FtcGxpbmcgcmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCkBAIC0yMzI5LDExICsyNjExLDExIEBACiAgICAgICAgICAgICBicmVhazsgLy8gc3VjY2VzcwogICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSB7CiAgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKHByb2ZpbGVGbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX1JBVyk7IC8vIHJldHJ5Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUgJiYgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgICAgIHByb2ZpbGVGbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsgLy8gcmV0cnkKICAgICAgICAgfSBlbHNlIHsgLy8gZmFpbAogICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAlcywgc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgotICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIAorICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzKTsKICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICAgfQpAQCAtMjc3NSw2ICszMDU3LDggQEAKICAgICAgICAgLy8gSFcgR2FpbiBtYW5hZ2VtZW50LCBkbyBub3QgY2hhbmdlIHRoZSB2b2x1bWUKICAgICAgICAgaWYgKGRlc2MtPnVzZUh3R2FpbigpKSB7CiAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IGZhbHNlOworICAgICAgICAgICAgLy8gSWYgdGhlIHZvbHVtZSBzb3VyY2UgaXMgYWN0aXZlIHdpdGggaGlnaGVyIHByaW9yaXR5IHNvdXJjZSwgZW5zdXJlIGF0IGxlYXN0IFN3IE11dGVkCisgICAgICAgICAgICBkZXNjLT5zZXRTd011dGUoKGluZGV4ID09IDApLCB2cywgY3VydmVzLmdldFN0cmVhbVR5cGVzKCksIGN1ckRldmljZXMsIDAgLypkZWxheU1zKi8pOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgewogICAgICAgICAgICAgICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIHByb2R1Y3RTdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnByZWZlcnJlZERldmljZSovKTsKQEAgLTI4MTQsNyArMzA5OCw3IEBACiAgICAgICAgIC8vIGhhbmRsZWQgYnkgc3lzdGVtIFVJCiAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKAogICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMsIHZzLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgKCh2cyA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKSk/CisgICAgICAgICAgICAgICAgICAgICgodnMgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSwgZmFsc2UpKT8KICAgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApKTsKICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOwpAQCAtMjk3Niw5ICszMjYwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzZXNzaW9uLCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpKTsKKyAgICBib29sIGlzTXVzaWNFZmZlY3QgPSAoc2Vzc2lvbiAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHN0cmF0ZWd5ID09IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSk7CisgICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzZXNzaW9uLCBpZCwgaXNNdXNpY0VmZmVjdCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCkBAIC0zMDE2LDEyICszMzAxLDE0IEBACiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKKyAgICBhdXRvIHZzID0gdG9Wb2x1bWVTb3VyY2Uoc3RyZWFtLCBmYWxzZSk7CisgICAgcmV0dXJuIHZzICE9IFZPTFVNRV9TT1VSQ0VfTk9ORSA/IG1PdXRwdXRzLmlzQWN0aXZlKHZzLCBpblBhc3RNcykgOiBmYWxzZTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIHJldHVybiBtT3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKKyAgICBhdXRvIHZzID0gdG9Wb2x1bWVTb3VyY2Uoc3RyZWFtLCBmYWxzZSk7CisgICAgcmV0dXJuIHZzICE9IFZPTFVNRV9TT1VSQ0VfTk9ORSA/IG1PdXRwdXRzLmlzQWN0aXZlUmVtb3RlbHkodnMsIGluUGFzdE1zKSA6IGZhbHNlOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMzM1Miw2ICszNjM5LDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhib29sIGZvcmNlVm9sdW1lUmVldmFsLCB1aW50MzJfdCBkZWxheU1zKQogewogICAgIHVpbnQzMl90IHdhaXRNcyA9IDA7CisgICAgYm9vbCB3YXNMZVVuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOwogICAgIGlmICh1cGRhdGVDYWxsUm91dGluZyh0cnVlIC8qZnJvbUNhY2hlKi8sIGRlbGF5TXMsICZ3YWl0TXMpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIE9ubHkgYXBwbHkgc3BlY2lhbCB0b3VjaCBzb3VuZCBkZWxheSBvbmNlCiAgICAgICAgIGRlbGF5TXMgPSAwOwpAQCAtMzM1OSwxMSArMzY0NywxNSBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0RGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpIHsKKyAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fAorICAgICAgICAgICAgICAgIChvdXRwdXREZXNjICE9IG1QcmltYXJ5T3V0cHV0ICYmICFpc1RlbGVwaG9ueVJ4T3JUeChvdXRwdXREZXNjKSkpIHsKICAgICAgICAgICAgIC8vIEFzIGRvbmUgaW4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlLCB3ZSBjb3VsZCBhbHNvIGZpeCBkZWZhdWx0IGRldmljZSBpc3N1ZSBieQogICAgICAgICAgICAgLy8gcHJldmVudGluZyB0aGUgZm9yY2UgcmUtcm91dGluZyBpbiBjYXNlIG9mIGRlZmF1bHQgZGV2IHRoYXQgZGlzdGluZ3Vpc2hlcyBvbiBhZGRyZXNzLgogICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBiYWNrIHRvIGVuZ2luZSBmdWxsIGRldmljZSBjaG9pY2UgZGVjaXNpb24gaG93ZXZlci4KLSAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgIW5ld0RldmljZXMuaXNFbXB0eSgpLCBkZWxheU1zKTsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VSb3V0aW5nID0gIW5ld0RldmljZXMuaXNFbXB0eSgpOworICAgICAgICAgICAgd2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLCBmb3JjZVJvdXRpbmcsIGRlbGF5TXMsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypyZXF1aXJlc011dGVDaGVjayovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9yY2VSb3V0aW5nIC8qcmVxdWlyZXNWb2x1bWVDaGVjayovKTsKICAgICAgICAgICAgIC8vIE9ubHkgYXBwbHkgc3BlY2lhbCB0b3VjaCBzb3VuZCBkZWxheSBvbmNlCiAgICAgICAgICAgICBkZWxheU1zID0gMDsKICAgICAgICAgfQpAQCAtMzM3MSw2ICszNjYzLDcgQEAKICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLnR5cGVzKCksIHdhaXRNcywgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyh3YXNMZVVuaWNhc3RBY3RpdmUsIG51bGxwdHIsIGRlbGF5TXMpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlSW5wdXRSb3V0aW5nKCkgewpAQCAtMzUzMiw3ICszODI1LDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLAorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJpbWFyeSBPdXRwdXQgSS9PIGhhbmRsZTogJWRcbiIsCiAgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKICAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CiAgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CkBAIC0zNTU0LDE1ICszODQ3LDE3IEBACiAgICAgfQogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29tbXVubmljYXRpb24gU3RyYXRlZ3k6ICVkXG4iLCBtQ29tbXVubmljYXRpb25TdHJhdGVneSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDb21tdW5pY2F0aW9uIFN0cmF0ZWd5IGlkOiAlZFxuIiwgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29uZmlnIHNvdXJjZTogJXNcbiIsIG1Db25maWcuZ2V0U291cmNlKCkuY19zdHIoKSk7IC8vIGdldENvbmZpZyBub3QgY29uc3QKIAotICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpLCAxKTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSwgMSk7CiAgICAgbUh3TW9kdWxlc0FsbC5kdW1wKGRzdCk7CiAgICAgbU91dHB1dHMuZHVtcChkc3QpOwogICAgIG1JbnB1dHMuZHVtcChkc3QpOwotICAgIG1FZmZlY3RzLmR1bXAoZHN0KTsKKyAgICBtRWZmZWN0cy5kdW1wKGRzdCwgMSk7CiAgICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGRzdCk7CiAgICAgbVBvbGljeU1peGVzLmR1bXAoZHN0KTsKICAgICBtQXVkaW9Tb3VyY2VzLmR1bXAoZHN0KTsKQEAgLTM2MDIsNTMgKzM4OTcsNyBAQAogICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSwgb2ZmbG9hZEluZm8uYml0X3JhdGUsIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzLAogICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8pOwogCi0gICAgaWYgKG1NYXN0ZXJNb25vKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7IC8vIG5vIG9mZmxvYWRpbmcgaWYgbW9ubyBpcyBzZXQuCi0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLykpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIEFVRElPX09GRkxPQURfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgotICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCi0gICAgewotICAgICAgICBBTE9HVigiJXM6IHN0cmVhbV90eXBlICE9IE1VU0lDLCByZXR1cm5pbmcgZmFsc2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKLSAgICBjb25zdCBib29sIGFsbG93T2ZmbG9hZFdpdGhWaWRlbyA9Ci0gICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC52aWRlbyIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOwotICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8gJiYgIWFsbG93T2ZmbG9hZFdpdGhWaWRlbykgewotICAgICAgICBBTE9HVigiJXM6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKLSAgICBjb25zdCBpbnQgbWluX2R1cmF0aW9uX3NlY3MgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCi0gICAgICAgICAgICAiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIC0xIC8qIGRlZmF1bHRfdmFsdWUgKi8pOwotICAgIGlmIChtaW5fZHVyYXRpb25fc2VjcyA+PSAwKSB7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IE9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1pbl9kdXJhdGlvbl9zZWNzKTsKLSAgICAgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgewotICAgICAgICBBTE9HVigiJXM6IE9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyk7Ci0gICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCi0gICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKLSAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgotICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcwotICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgIGlmIChtRWZmZWN0cy5pc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgaWYgKCFpc09mZmxvYWRQb3NzaWJsZShvZmZsb2FkSW5mbykpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX09GRkxPQURfTk9UX1NVUFBPUlRFRDsKICAgICB9CiAKQEAgLTM2NzYsNyArMzkyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0X2ZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MoYXR0cmlidXRlcy5mbGFncywgJm91dHB1dF9mbGFncyk7Ci0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChEZXZpY2VWZWN0b3IoKSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KG91dHB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKQEAgLTM2ODcsNyArMzkzNywxOTcgQEAKICAgICAgICAgX19GVU5DVElPTl9fLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIiwKICAgICAgICAgKHByb2ZpbGUgIT0gMCA/IHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpIDogIm51bGwiKSwKICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOwotICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKKworICAgIC8vIGFsc28gdHJ5IHRoZSBNU0QgbW9kdWxlIGlmIGNvbXBhdGlibGUgcHJvZmlsZSBub3QgZm91bmQKKyAgICBpZiAocHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHByb2ZpbGUgPSBnZXRNc2RQcm9maWxlRm9yT3V0cHV0KG91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKKyAgICAgICAgQUxPR1YoIiVzKCkgTVNEIHByb2ZpbGUgJXNmb3VuZCB3aXRoIG5hbWU6ICVzLCAiCisgICAgICAgICAgICAic2FtcGxlIHJhdGU6ICV1LCBmb3JtYXQ6IDB4JXgsIGNoYW5uZWxfbWFzazogMHgleCwgb3V0cHV0IGZsYWdzOiAweCV4IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIsCisgICAgICAgICAgICAocHJvZmlsZSAhPSAwID8gcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkgOiAibnVsbCIpLAorICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gKHByb2ZpbGUgIT0gbnVsbHB0cik7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc09mZmxvYWRQb3NzaWJsZShjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmb2ZmbG9hZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkdXJhdGlvbklnbm9yZWQpIHsKKyAgICBpZiAobU1hc3Rlck1vbm8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBvZmZsb2FkaW5nIGlmIG1vbm8gaXMgc2V0LgorICAgIH0KKworICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7CisgICAgICAgIEFMT0dWKCIlczogb2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgorICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCisgICAgeworICAgICAgICBBTE9HVigiJXM6IHN0cmVhbV90eXBlICE9IE1VU0lDLCByZXR1cm5pbmcgZmFsc2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL1RPRE86IGVuYWJsZSBhdWRpbyBvZmZsb2FkaW5nIHdpdGggdmlkZW8gd2hlbiByZWFkeQorICAgIGNvbnN0IGJvb2wgYWxsb3dPZmZsb2FkV2l0aFZpZGVvID0KKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLnZpZGVvIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKG9mZmxvYWRJbmZvLmhhc192aWRlbyAmJiAhYWxsb3dPZmZsb2FkV2l0aFZpZGVvKSB7CisgICAgICAgIEFMT0dWKCIlczogaGFzX3ZpZGVvID09IHRydWUsIHJldHVybmluZyBmYWxzZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCisgICAgY29uc3QgaW50IG1pbl9kdXJhdGlvbl9zZWNzID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKKyAgICBpZiAoIWR1cmF0aW9uSWdub3JlZCkgeworICAgICAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgeworICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgbWluX2R1cmF0aW9uX3NlY3MgKiAxMDAwMDAwTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IE9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbWluX2R1cmF0aW9uX3NlY3MpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBkZWZhdWx0IG1pbig9JXUpIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorICAgIGlmIChtRWZmZWN0cy5pc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYXVkaW9fZGlyZWN0X21vZGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERpcmVjdFBsYXliYWNrU3VwcG9ydChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcpIHsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgb2ZmbG9hZEluZm8uZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CisgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOworICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKmF0dHIpOworICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyA9IGZhbHNlOworICAgIG9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgb2ZmbG9hZFBvc3NpYmxlID0gaXNPZmZsb2FkUG9zc2libGUob2ZmbG9hZEluZm8sIHRydWUgLypkdXJhdGlvbklnbm9yZWQqLyk7CisKKyAgICBhdWRpb19kaXJlY3RfbW9kZV90IGRpcmVjdE1vZGUgPSBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRDsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHItPmZsYWdzLCAmZmxhZ3MpOworICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSBjb21wcmVzc2VkIG9mZmxvYWQgb3IgcGFzc3Rocm91Z2gKKyAgICB1aW50MzJfdCByZWxldmFudEZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBpZiAob2ZmbG9hZFBvc3NpYmxlKSB7CisgICAgICAgIHJlbGV2YW50RmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICB9CisgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIHJlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKworICAgIERldmljZVZlY3RvciBlbmdpbmVPdXRwdXREZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoKmF0dHIpOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gZW5naW5lT3V0cHV0RGV2aWNlczsKKyAgICAgICAgLy8gdGhlIE1TRCBtb2R1bGUgY2hlY2tzIGZvciBkaWZmZXJlbnQgY29uZGl0aW9ucyBhbmQgb3V0cHV0IGRldmljZXMKKyAgICAgICAgaWYgKHN0cmNtcChod01vZHVsZS0+Z2V0TmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1zZEhhc1BhdGNoZXNUb0FsbERldmljZXMoZW5naW5lT3V0cHV0RGV2aWNlcy50b1R5cGVBZGRyVmVjdG9yKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXREZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShvdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBudWxscHRyIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAorICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwgbnVsbHB0ciAvKnVwZGF0ZWRGb3JtYXQqLywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssIG51bGxwdHIgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRpcmVjdE1vZGUgJiBBVURJT19ESVJFQ1RfT0ZGTE9BRF9HQVBMRVNTX1NVUFBPUlRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgcmVwb3J0cyBvZmZsb2FkIGdhcGxlc3Mgc3VwcG9ydGVkLiBObyBuZWVkIHRvIHJlcG9ydCBvZmZsb2FkIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19HQVBMRVNTX09GRkxPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG9mZmxvYWQgZ2FwbGVzcyBpcyByZXBvcnRlZCwgbm8gbmVlZCB0byByZXBvcnQgb2ZmbG9hZCBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICBkaXJlY3RNb2RlID0gKGF1ZGlvX2RpcmVjdF9tb2RlX3QpICgoZGlyZWN0TW9kZSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkFVRElPX0RJUkVDVF9PRkZMT0FEX1NVUFBPUlRFRCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RJUkVDVF9PRkZMT0FEX0dBUExFU1NfU1VQUE9SVEVEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkaXJlY3RNb2RlID0gKGF1ZGlvX2RpcmVjdF9tb2RlX3QpKGRpcmVjdE1vZGUgfCBBVURJT19ESVJFQ1RfT0ZGTE9BRF9TVVBQT1JURUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlyZWN0TW9kZSA9IChhdWRpb19kaXJlY3RfbW9kZV90KSAoZGlyZWN0TW9kZSB8IEFVRElPX0RJUkVDVF9CSVRTVFJFQU1fU1VQUE9SVEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGlyZWN0TW9kZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yJiBhdWRpb1Byb2ZpbGVzVmVjdG9yKSB7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JBdHRyaWJ1dGVzKCphdHRyLCAmZGV2aWNlcywgZmFsc2UgLyogZm9yVm9sdW1lICovKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIEFMT0dWKCIlczogZm91bmQgJXp1IG91dHB1dCBkZXZpY2VzIGZvciBhdHRyaWJ1dGVzLiIsIF9fZnVuY19fLCBkZXZpY2VzLnNpemUoKSk7CisgICAgaWYgKGRldmljZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gT0s7IC8vIG5vIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgYXR0cmlidXRlcworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIC8vIHRoZSBNU0QgbW9kdWxlIGNoZWNrcyBmb3IgZGlmZmVyZW50IGNvbmRpdGlvbnMKKyAgICAgICAgaWYgKHN0cmNtcChod01vZHVsZS0+Z2V0TmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dHB1dFByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgeworICAgICAgICAgICAgaWYgKCFvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhbGxvdyBvbmx5IHByb2ZpbGVzIHRoYXQgc3VwcG9ydCBhbGwgdGhlIGF2YWlsYWJsZSBhbmQgcm91dGVkIGRldmljZXMKKyAgICAgICAgICAgIGlmIChvdXRwdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21EZXZpY2VUeXBlQWRkclZlYyhkZXZpY2VzKS5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgIT0gZGV2aWNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXNWZWN0b3IuYWRkQWxsVmFsaWRQcm9maWxlcygKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvZmlsZS0+YXNBdWRpb1BvcnQoKS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkZCB0aGUgZGlyZWN0IHByb2ZpbGVzIGZyb20gTVNEIGlmIHByZXNlbnQgYW5kIGhhcyBhdWRpbyBwYXRjaGVzIHRvIGFsbCB0aGUgb3V0cHV0KHMpCisgICAgY29uc3QgYXV0byYgbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1zZEhhc1BhdGNoZXNUb0FsbERldmljZXMoZGV2aWNlcykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogTVNEIGF1ZGlvIHBhdGNoZXMgc2V0IHRvIGFsbCBvdXRwdXQgZGV2aWNlcy4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dHB1dFByb2ZpbGUgOiBtc2RNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXNWZWN0b3IuYWRkQWxsVmFsaWRQcm9maWxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IE1TRCBhdWRpbyBwYXRjaGVzIE5PVCBzZXQgdG8gYWxsIG91dHB1dCBkZXZpY2VzLiIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLApAQCAtMzc4NywxNyArNDIyNywxNSBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlQXVkaW9QYXRjaEludGVybmFsKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCB1aW50MzJfdCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKIHsKICAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQUxPR1YoIiVzIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIF9fZnVuY19fLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOwotCiAgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0zODA1LDcgKzQyNDMsNiBAQAogICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zODE1LDYgKzQyNTIsODYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgaWYgKHNyY0RldmljZSA9PSBudWxscHRyIHx8IHNpbmtEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IGNyZWF0ZSBwYXRjaCwgaW52YWxpZCBzaW5rIGFuZC9vciBzb3VyY2UgZGV2aWNlKHMpIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXMgYmV0d2VlbiBzb3VyY2UgJXMgYW5kIHNpbmsgJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgIHNyY0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gUG9saWN5QXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICAvLyBEZWZhdWx0IGF0dHJpYnV0ZXMsIGRlZmF1bHQgdm9sdW1lIHByaW9yaXR5LCBub3QgdG8gaW5mZXIgd2l0aCBub24gcmF3IGF1ZGlvIHBhdGNoZXMuCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKTsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSA9ICZwYXRjaC0+c291cmNlc1swXTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0KKyAgICAgICAgICAgIG5ldyBJbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgcG9ydElkLCB1aWQsIGF0dHJpYnV0ZXMsICpzb3VyY2UsIHNyY0RldmljZSwgc2lua0RldmljZSwKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCB0b1ZvbHVtZVNvdXJjZShhdHRyaWJ1dGVzKSk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlVG9TaW5rKHNvdXJjZURlc2MsIHNpbmtEZXZpY2UsIHBhdGNoLCAqaGFuZGxlLCB1aWQsIDAgLyogZGVsYXlNcyAqLyk7CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbUF1ZGlvU291cmNlcy5hZGQocG9ydElkLCBzb3VyY2VEZXNjKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlVG9TaW5rKAorICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICZoYW5kbGUsCisgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcykKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2gsICZoYW5kbGUsIHVpZCwgZGVsYXlNcywgc291cmNlRGVzYyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKSA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzb3VyY2VEZXNjLT5jb25uZWN0KGhhbmRsZSwgc2lua0RldmljZSk7CisgICAgaWYgKGlzTXNkUGF0Y2goaGFuZGxlKSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIC8vIFNXIEJyaWRnZT8gKEB0b2RvOiBIVyBicmlkZ2UsIGtlZXAgdHJhY2sgb2YgSHdPdXRwdXQgZm9yIGRldmljZSBzZWxlY3Rpb24gInJlY29uc2lkZXJhdGlvbiIpCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0ID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CisgICAgQUxPR19BU1NFUlQoc3dPdXRwdXQgIT0gbnVsbHB0ciwgIiVzOiBhIHN3T3V0cHV0IHNoYWxsIGFsd2F5cyBiZSBhc3NvY2lhdGVkIiwgX19mdW5jX18pOworICAgIGlmIChzd091dHB1dC0+Z2V0Q2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgcG9ydElkIGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0RGVzYyIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBGYWlsdXJlUGF0Y2hBZGRlZDsKKyAgICB9CisgICAgc3RhdHVzID0gc3dPdXRwdXQtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBnb3RvIEZhaWx1cmVTb3VyY2VBZGRlZDsKKyAgICB9CisgICAgc3dPdXRwdXQtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKKyAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShzd091dHB1dCwgc291cmNlRGVzYywgJmRlbGF5TXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzIGZhaWxlZCB0byBzdGFydCBzb3VyY2UsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICBnb3RvIEZhaWx1cmVTb3VyY2VBY3RpdmU7CisgICAgfQorICAgIGlmIChkZWxheU1zICE9IDApIHsKKyAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworCitGYWlsdXJlU291cmNlQWN0aXZlOgorICAgIHN3T3V0cHV0LT5zdG9wKCk7CisgICAgcmVsZWFzZU91dHB1dChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CitGYWlsdXJlU291cmNlQWRkZWQ6CisgICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQobnVsbHB0cik7CitGYWlsdXJlUGF0Y2hBZGRlZDoKKyAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKGhhbmRsZSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQoreworICAgIEFMT0dWKCIlcyBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKIApAQCAtNDAwMyw3ICs0NTIwLDcgQEAKICAgICAgICAgICAgICAgICAvLyBpbiBjb25maWcgWE1MIHRvIHJlYWNoIHRoZSBzaW5rIHNvIHRoYXQgaXMgY2FuIGJlIGRlY2xhcmVkIGFzIGF2YWlsYWJsZS4KICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmICghc291cmNlRGVzYy0+aXNJbnRlcm5hbCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiBkeW5hbWljIHJvdXRpbmcgZm9yIFN3T3V0cHV0IHNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc291cmNlRGVzYy0+c3RyZWFtKCk7CkBAIC00MDE2LDEwICs0NTMzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOworICAgICAgICAgICAgICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQ7CiAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwgc291cmNlRGVzYy0+dWlkKCksICZjb25maWcsICZmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmb3V0cHV0VHlwZSwgJmlzU3BhdGlhbGl6ZWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwpAQCAtNDAzMSw0NCArNDU0OSw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgZm9yICJyYXcgcGF0Y2hlcyIgYWthIGNyZWF0ZWQgZnJvbSBjcmVhdGVBdWRpb1BhdGNoIEFQSQorICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihzaW5rRGV2aWNlKSwgbU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2luayBkZXZpY2UgaXMgcmVhY2hhYmxlIHZpYSBhbiBvcGVuZWQgb3V0cHV0IHN0cmVhbSwgcmVxdWVzdCB0bworICAgICAgICAgICAgICAgICAgICAvLyBnbyB2aWEgdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoCisgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIG5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGludGVybmFsIHBhdGNoIHNpbmsiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICVzIGlzIGR1cGxpY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQob3V0cHV0RGVzYyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgogICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAogICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wIGJ1dCBubyByb3V0ZSBoYXMgYmVlbiBkZWNsYXJlZCBiZXR3ZWVuIGRldmljZXMKLSAgICAgICAgICAgICAgICAvLyAtIGNhbGxlZCBmcm9tIHN0YXJ0QXVkaW9Tb3VyY2UgKGFrYSBzb3VyY2VEZXNjICE9IG51bGxwdHIpIGFuZCBzb3VyY2UgZGV2aWNlIGRvZXMKLSAgICAgICAgICAgICAgICAvLyAgIG5vdCBoYXZlIGEgZ2FpbiBjb250cm9sbGVyCisgICAgICAgICAgICAgICAgLy8gLSBjYWxsZWQgZnJvbSBzdGFydEF1ZGlvU291cmNlIChha2Egc291cmNlRGVzYyBpcyBub3QgaW50ZXJuYWwpIGFuZCBzb3VyY2UgZGV2aWNlCisgICAgICAgICAgICAgICAgLy8gICBkb2VzIG5vdCBoYXZlIGEgZ2FpbiBjb250cm9sbGVyCiAgICAgICAgICAgICAgICAgaWYgKCFzcmNEZXZpY2UtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2UpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAhc3JjRGV2aWNlLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2UsIHNpbmtEZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoc291cmNlRGVzYyAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIXNvdXJjZURlc2MtPmlzSW50ZXJuYWwoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RldmljZS0+Z2V0QXVkaW9Qb3J0KCktPmdldEdhaW5zKCkuc2l6ZSgpID09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBkZXZpY2UgZm9yIG5vdyB0byBzaW1wbGlmeSBvdXRwdXQgc2VsZWN0aW9uIGxvZ2ljCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEZXNjID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihzaW5rRGV2aWNlKSwgbU91dHB1dHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHZpYSB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlcyBpcyBkdXBsaWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnNldFVzZVN3QnJpZGdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNyY01peFBvcnRDb25maWcgPSB7fTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzcmNNaXhQb3J0Q29uZmlnLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnNyY01peFBvcnRDb25maWcsIG51bGxwdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHZvbHVtZSBjb250cm9sLCB3ZSBtYXkgbmVlZCBhIHZhbGlkIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgc3JjTWl4UG9ydENvbmZpZy5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gc291cmNlRGVzYyAhPSBudWxscHRyID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnN0cmVhbSgpIDogQVVESU9fU1RSRUFNX1BBVENIOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjTWl4UG9ydENvbmZpZy5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gIXNvdXJjZURlc2MtPmlzSW50ZXJuYWwoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9QQVRDSDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc3JjTWl4UG9ydENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC00MDkxLDExICs0NjE0LDkgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKQogewotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoICVkIiwgaGFuZGxlKTsKLQorICAgIEFMT0dWKCIlcyBwYXRjaCAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKIAogICAgIGlmIChpbmRleCA8IDApIHsKQEAgLTQxMDcsMTEgKzQ2MjgsMjEgQEAKICAgICBpZiAocGF0Y2hEZXNjLT5nZXRVaWQoKSAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPmdldFVpZCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgcmV0dXJuIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoaGFuZGxlKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIHNvdXJjZURlc2MtPmdldFBhdGNoSGFuZGxlKCkgPT0gaGFuZGxlKSB7CisgICAgICAgICAgICBwb3J0SWQgPSBzb3VyY2VEZXNjLT5wb3J0SWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSA/CisgICAgICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHBvcnRJZCkgOiByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKGhhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewogICAgIEFMT0dWKCIlcyBwYXRjaCAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwogICAgIGlmIChtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKSA8IDApIHsKQEAgLTQxNTIsMjYgKzQ2ODMsMjkgQEAKICAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5nZXRIYW5kbGUoKSk7CiAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIC8vIFNXIEJyaWRnZQorICAgICAgICAgICAgLy8gU1cgb3IgSFcgQnJpZGdlCisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG51bGxwdHI7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDEgJiYgcGF0Y2gtPnNvdXJjZXNbMV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzFdLmlkKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIF9fZnVuY19fLCBwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VPdXRwdXQgaGFzIGFscmVhZHkgY2FsbGVkIGNsb3NlT3VwdXQgaW4gY2FzZSBvZiBkaXJlY3Qgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+Z2V0SGFuZGxlKCkgIT0gb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBTd091dHB1dCBwYXRjaCByZW1vdmFsIGFzIEFGIGNvdW50ZXIgcGFydCBwYXRjaCBoYXMgYWxyZWFkeSBnb25lLgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgcmVzZXQgcGF0Y2ggaGFuZGxlIG9uIE91dHB1dCBhcyBkaWZmZXJlbnQgZnJvbSBTV0JyaWRnZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQXVkaW9QYXRjaChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0UGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMV0uaWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMSAmJiBzb3VyY2VEZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIG5vIG91dHB1dCBmb3IgaWQgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VPdXRwdXQgaGFzIGFscmVhZHkgY2FsbGVkIGNsb3NlT3V0cHV0IGluIGNhc2Ugb2YgZGlyZWN0IG91dHB1dAorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAhc291cmNlRGVzYy0+dXNlU3dCcmlkZ2UoKSkgeworICAgICAgICAgICAgICAgIHJlc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZXVzZSBwYXRjaCBoYW5kbGUgaWYgc3RpbGwgdmFsaWQgLyBkbyBub3QgZm9yY2UgcmVyb3V0aW5nIGlmIHN0aWxsIHJvdXRlZAorICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlID0gb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKTsKICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvKmZvcmNlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCAvKmZvcmNlKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FID8gbnVsbHB0ciA6ICZwYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNDQxNyw2ICs0OTUxLDE4IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydEF1ZGlvU291cmNlSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCAmcG9ydElkLCB1aWQpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywgIiVzOiBmYWlsZWQgdG8gc3RhcnQgYXVkaW8gc291cmNlICglZCkiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICByZXR1cm4gbUF1ZGlvU291cmNlcy52YWx1ZUZvcihwb3J0SWQpOworfQorCisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewogICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKQEAgLTQ0NDEsNTIgKzQ5ODcsOSBAQAogICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CiAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoc2lua0RldmljZSkuYWRkU291cmNlKHNyY0RldmljZSk7CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChwYXRjaEJ1aWxkZXIucGF0Y2goKSwgJmhhbmRsZSwgbVVpZENhY2hlZCwgMCwgc291cmNlRGVzYyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKSA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBzb3VyY2VEZXNjLT5jb25uZWN0KGhhbmRsZSwgc2lua0RldmljZSk7Ci0gICAgLy8gU1cgQnJpZGdlPyAoQHRvZG86IEhXIGJyaWRnZSwga2VlcCB0cmFjayBvZiBId091dHB1dCBmb3IgZGV2aWNlIHNlbGVjdGlvbiAicmVjb25zaWRlcmF0aW9uIikKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXQgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKLSAgICBpZiAoc3dPdXRwdXQgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzd091dHB1dC0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWRkZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN3T3V0cHV0LT5nZXRDbGllbnQoc291cmNlRGVzYy0+cG9ydElkKCkpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgcG9ydElkIGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0RGVzYyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGdvdG8gRmFpbHVyZVJlbGVhc2VQYXRjaDsKLSAgICAgICAgfQotICAgICAgICBzd091dHB1dC0+YWRkQ2xpZW50KHNvdXJjZURlc2MpOwotICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLSAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uoc3dPdXRwdXQsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIiVzIGZhaWxlZCB0byBzdGFydCBzb3VyY2UsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotICAgICAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWN0aXZlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWxheU1zICE9IDApIHsKLSAgICAgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+aHdPdXRwdXQoKS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChod091dHB1dERlc2MgIT0gMCkgewotICAgICAgICAgIC8vICAgY3JlYXRlIEh3b3V0cHV0IGFuZCBhZGQgdG8gbUh3T3V0cHV0cwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbmVpdGhlciBTVyBub3IgSFcgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiAKLUZhaWx1cmVTb3VyY2VBY3RpdmU6Ci0gICAgc3dPdXRwdXQtPnN0b3AoKTsKLSAgICByZWxlYXNlT3V0cHV0KHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKLUZhaWx1cmVTb3VyY2VBZGRlZDoKLSAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChudWxscHRyKTsKLUZhaWx1cmVSZWxlYXNlUGF0Y2g6Ci0gICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChoYW5kbGUpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gY29ubmVjdEF1ZGlvU291cmNlVG9TaW5rKAorICAgICAgICAgICAgICAgIHNvdXJjZURlc2MsIHNpbmtEZXZpY2UsIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBoYW5kbGUsIG1VaWRDYWNoZWQsIDAgLypkZWxheU1zKi8pOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTQ3NDksNiArNTI1MiwzNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpCit7CisgICAgYm9vbCBoYXNVbHRyYXNvdW5kT3V0cHV0ID0gZmFsc2U7CisgICAgYm9vbCBoYXNVbHRyYXNvdW5kSW5wdXQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICAgICAgaWYgKCFoYXNVbHRyYXNvdW5kT3V0cHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORCkgeworICAgICAgICAgICAgICAgICAgICBoYXNVbHRyYXNvdW5kT3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmaW5wdXRQcm9maWxlcyA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgICAgIGlmICghaGFzVWx0cmFzb3VuZElucHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmlucHV0UHJvZmlsZSA6IGlucHV0UHJvZmlsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19VTFRSQVNPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1VsdHJhc291bmRJbnB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNVbHRyYXNvdW5kT3V0cHV0ICYmIGhhc1VsdHJhc291bmRJbnB1dCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCkKIHsKICAgICByZXR1cm4gZ2V0Q29uZmlnKCkuaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpOwpAQCAtNDc4MSw3ICs1MzE1LDcgQEAKICAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5laXRoZXIgU1cgbm9yIEhXIG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKHNvdXJjZURlc2MtPmdldFBhdGNoSGFuZGxlKCksIDAsIHNvdXJjZURlc2MpOwogICAgIHNvdXJjZURlc2MtPmRpc2Nvbm5lY3QoKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNDgwMiw2ICs1MzM2LDE4NiBAQAogICAgIHJldHVybiBzb3VyY2U7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjYW5CZVNwYXRpYWxpemVkSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgIGNvbnN0Cit7CisgICAgLy8gVGhlIGNhbGxlciBjYW4gaGF2ZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBjcml0ZXJpYSBpZ25vcmVkIGJ5IGVpdGhlciBwYXNzaW5nIGEgbnVsbCBwdHIgb3IKKyAgICAvLyB0aGUgQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUiB2YWx1ZS4KKyAgICAvLyBJZiBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQsIGN1cnJlbnQgcG9saWN5IGlzIHRvIG9ubHkgYWxsb3cgc3BhdGlhbGl6YXRpb24gZm9yIG1lZGlhCisgICAgLy8gYW5kIGdhbWUgdXNhZ2VzLgorICAgIGlmIChhdHRyICE9IG51bGxwdHIgJiYgKmF0dHIgIT0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUikgeworICAgICAgICBpZiAoYXR0ci0+dXNhZ2UgIT0gQVVESU9fVVNBR0VfTUVESUEgJiYgYXR0ci0+dXNhZ2UgIT0gQVVESU9fVVNBR0VfR0FNRSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiAoQVVESU9fRkxBR19DT05URU5UX1NQQVRJQUxJWkVEIHwgQVVESU9fRkxBR19ORVZFUl9TUEFUSUFMSVpFKSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIGNhbGxlciBjYW4gaGF2ZSB0aGUgZGV2aWNlcyBjcml0ZXJpYSBpZ25vcmVkIGJ5IHBhc3NpbmcgYW5kIGVtcHR5IHZlY3RvciwgYW5kCisgICAgLy8gZ2V0U3BhdGlhbGl6ZXJPdXRwdXRQcm9maWxlKCkgd2lsbCBpZ25vcmUgdGhlIGRldmljZXMgd2hlbiBsb29raW5nIGZvciBhIG1hdGNoLgorICAgIC8vIE90aGVyd2lzZSBhbiBvdXRwdXQgcHJvZmlsZSBzdXBwb3J0aW5nIGEgc3BhdGlhbGl6ZXIgZWZmZWN0IHRoYXQgY2FuIGJlIHJvdXRlZAorICAgIC8vIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlcyBtdXN0IGV4aXN0LgorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9CisgICAgICAgICAgICBnZXRTcGF0aWFsaXplck91dHB1dFByb2ZpbGUoY29uZmlnLCBkZXZpY2VzKTsKKyAgICBpZiAocHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUgY2FsbGVyIGNhbiBoYXZlIHRoZSBhdWRpbyBjb25maWcgY3JpdGVyaWEgaWdub3JlZCBieSBlaXRoZXIgcGFzc2luZyBhIG51bGwgcHRyIG9yCisgICAgLy8gdGhlIEFVRElPX0NPTkZJR19JTklUSUFMSVpFUiB2YWx1ZS4KKyAgICAvLyBJZiBhbiBhdWRpbyBjb25maWcgaXMgc3BlY2lmaWVkLCBjdXJyZW50IHBvbGljeSBpcyB0byBvbmx5IGFsbG93IHNwYXRpYWxpemF0aW9uIGZvcgorICAgIC8vIHNvbWUgcG9zaXRpb25hbCBjaGFubmVsIG1hc2tzLgorCisgICAgaWYgKGNvbmZpZyAhPSBudWxscHRyICYmICpjb25maWcgIT0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfY2hhbm5lbF9tYXNrX3NwYXRpYWxpemVkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tWaXJ0dWFsaXplckNsaWVudFJvdXRlcygpIHsKKyAgICBzdGQ6OnNldDxhdWRpb19zdHJlYW1fdHlwZV90PiBzdHJlYW1zVG9JbnZhbGlkYXRlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjID0gbU91dHB1dHNbaV07CisgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50IDogZGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBjbGllbnQtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZmFsc2UpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzVHlwZUFkZHJlc3MgPSBkZXZpY2VzLnRvVHlwZUFkZHJWZWN0b3IoKTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IGF1ZGlvX2NvbmZpZ19pbml0aWFsaXplcigmY2xpZW50Q29uZmlnKTsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IG1TcGF0aWFsaXplck91dHB1dAorICAgICAgICAgICAgICAgICAgICAmJiBjYW5CZVNwYXRpYWxpemVkSW50KCZhdHRyLCAmY29uZmlnLCBkZXZpY2VzVHlwZUFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIDogc3RyZWFtc1RvSW52YWxpZGF0ZSkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworICAgIH0KK30KKworCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNPdXRwdXRPbmx5QXZhaWxhYmxlUm91dGVUb1NvbWVEZXZpY2UoCisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykgeworICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZGVzYyA9PSBvdXRwdXREZXNjIHx8IGRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3Igc2hhcmVkRGV2aWNlcyA9IGRlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7CisgICAgICAgIGlmICghc2hhcmVkRGV2aWNlcy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiAoZGVzYy0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhzaGFyZWREZXZpY2VzLnR5cGVzKCkpCisgICAgICAgICAgICAgICAgICAgID09IG91dHB1dERlc2MtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoc2hhcmVkRGV2aWNlcy50eXBlcygpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNwYXRpYWxpemVyT3V0cHV0KGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpIHsKKyAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCphdHRyLCBudWxscHRyLCBmYWxzZSk7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzVHlwZUFkZHJlc3MgPSBkZXZpY2VzLnRvVHlwZUFkZHJWZWN0b3IoKTsKKyAgICBhdWRpb19jb25maWdfdCAqY29uZmlnUHRyID0gbnVsbHB0cjsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWc7CisgICAgaWYgKG1peGVyQ29uZmlnICE9IG51bGxwdHIpIHsKKyAgICAgICAgY29uZmlnID0gYXVkaW9fY29uZmlnX2luaXRpYWxpemVyKG1peGVyQ29uZmlnKTsKKyAgICAgICAgY29uZmlnUHRyID0gJmNvbmZpZzsKKyAgICB9CisgICAgaWYgKCFjYW5CZVNwYXRpYWxpemVkSW50KGF0dHIsIGNvbmZpZ1B0ciwgZGV2aWNlc1R5cGVBZGRyZXNzKSkgeworICAgICAgICBBTE9HVigiJXMgcHJvdmlkZWQgYXR0cmlidXRlcyBvciBtaXhlciBjb25maWcgY2Fubm90IGJlIHNwYXRpYWxpemVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9CisgICAgICAgICAgICBnZXRTcGF0aWFsaXplck91dHB1dFByb2ZpbGUoY29uZmlnUHRyLCBkZXZpY2VzVHlwZUFkZHJlc3MpOworICAgIGlmIChwcm9maWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIG5vIHN1aXRhYmxlIG91dHB1dCBwcm9maWxlIGZvciBwcm92aWRlZCBhdHRyaWJ1dGVzIG9yIG1peGVyIGNvbmZpZyIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNwYXRpYWxpemVyT3V0cHV0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICYmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMCkgeworICAgICAgICAgICAgc3BhdGlhbGl6ZXJPdXRwdXRzLnB1c2hfYmFjayhkZXNjKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBhZGRpbmcgb3BlbmVkIHNwYXRpYWxpemVyIE91dHB1dCAlZCIsIF9fZnVuY19fLCBkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorICAgIG1TcGF0aWFsaXplck91dHB1dC5jbGVhcigpOworICAgIGJvb2wgb3V0cHV0c0NoYW5nZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRlc2MgOiBzcGF0aWFsaXplck91dHB1dHMpIHsKKyAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnUHRyID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICB8fCBjb25maWdQdHItPmNoYW5uZWxfbWFzayA9PSBkZXNjLT5tTWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIG1TcGF0aWFsaXplck91dHB1dCA9IGRlc2M7CisgICAgICAgICAgICBBTE9HVigiJXMgcmV1c2luZyBjdXJyZW50IHNwYXRpYWxpemVyIG91dHB1dCAlZCIsIF9fZnVuY19fLCBkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIiVzIGNsb3Npbmcgc3BhdGlhbGl6ZXJPdXRwdXQgb3V0cHV0ICVkIHRvIG1hdGNoIGNoYW5uZWwgbWFzayAlI3giCisgICAgICAgICAgICAgICAgICAgICIgYW5kIGRldmljZXMgJXMiLCBfX2Z1bmNfXywgZGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBjb25maWdQdHIgIT0gbnVsbHB0ciA/IGNvbmZpZ1B0ci0+Y2hhbm5lbF9tYXNrIDogMCwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgY2xvc2VPdXRwdXQoZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIG91dHB1dHNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3BhdGlhbGl6ZXJPdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9CisgICAgICAgICAgICAgICAgb3Blbk91dHB1dFdpdGhQcm9maWxlQW5kRGV2aWNlKHByb2ZpbGUsIGRldmljZXMsIG1peGVyQ29uZmlnKTsKKyAgICAgICAgaWYgKGRlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNwYXRpYWxpemVyT3V0cHV0ID0gZGVzYzsKKyAgICAgICAgICAgIG91dHB1dHNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNoZWNrVmlydHVhbGl6ZXJDbGllbnRSb3V0ZXMoKTsKKworICAgIGlmIChvdXRwdXRzQ2hhbmdlZCkgeworICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB9CisKKyAgICBpZiAobVNwYXRpYWxpemVyT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGNvdWxkIG5vdCBvcGVuIHNwYXRpYWxpemVyIG91dHB1dCB3aXRoIHJlcXVlc3RlZCBjb25maWciLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgICpvdXRwdXQgPSBtU3BhdGlhbGl6ZXJPdXRwdXQtPm1Jb0hhbmRsZTsKKyAgICBBTE9HVigiJXMgcmV0dXJuaW5nIG5ldyBzcGF0aWFsaXplciBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgKm91dHB1dCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VTcGF0aWFsaXplck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKKyAgICBpZiAobVNwYXRpYWxpemVyT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAobVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGUgIT0gb3V0cHV0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKCFpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShtU3BhdGlhbGl6ZXJPdXRwdXQpKSB7CisgICAgICAgIEFMT0dWKCIlcyBjbG9zaW5nIHNwYXRpYWxpemVyIG91dHB1dCAlZCIsIF9fZnVuY19fLCBtU3BhdGlhbGl6ZXJPdXRwdXQtPm1Jb0hhbmRsZSk7CisgICAgICAgIGNsb3NlT3V0cHV0KG1TcGF0aWFsaXplck91dHB1dC0+bUlvSGFuZGxlKTsKKyAgICAgICAgLy9mcm9tIG5vdyBvbiBtU3BhdGlhbGl6ZXJPdXRwdXQgaXMgbnVsbAorICAgICAgICBjaGVja1ZpcnR1YWxpemVyQ2xpZW50Um91dGVzKCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBdWRpb1BvbGljeU1hbmFnZXIKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ4NzQsNiArNTU4OCw3IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgbUVuZ2luZS0+dXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKTsKICAgICBtQ29tbXVubmljYXRpb25TdHJhdGVneSA9IG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCiAgICAgICAgIG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSk7CiAKQEAgLTQ5NTMsOSArNTY2OCw4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBtSHdNb2R1bGVzLnB1c2hfYmFjayhod01vZHVsZSk7Ci0gICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5Ci0gICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KKyAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzLgorICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0cyBhcmUgY2xvc2VkIGltbWVkaWF0ZWx5IGFmdGVyIGNoZWNraW5nIHRoZSBhdmFpbGFiaWxpdHkgb2YgYXR0YWNoZWQgZGV2aWNlcwogICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKICAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKQEAgLTQ5NjcsNyArNTY4MSw4IEBACiAgICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1RUUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfVFRTKSAhPSAwIHx8CisgICAgICAgICAgICAgICAgKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19VTFRSQVNPVU5EKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbVR0c091dHB1dEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAKQEAgLTQ5OTAsNyArNTcwNSw4IEBACiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyIC8qIGhhbENvbmZpZyAqLywgbnVsbHB0ciAvKiBtaXhlckNvbmZpZyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTUwNzIsNiArNTc4OCwyMSBAQAogICAgICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3BhdGlhbGl6ZXIgb3V0cHV0cyBjYW4gYmUgY2xvc2VkIHVudGlsIHVzZWQuCisgICAgLy8gbU91dHB1dHMgdmVjdG9yIG5ldmVyIGNvbnRhaW5zIGR1cGxpY2F0ZWQgb3V0cHV0cyBhdCB0aGlzIHBvaW50LgorICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzQ2xvc2VkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgIWlzT3V0cHV0T25seUF2YWlsYWJsZVJvdXRlVG9Tb21lRGV2aWNlKGRlc2MpKSB7CisgICAgICAgICAgICBvdXRwdXRzQ2xvc2VkLnB1c2hfYmFjayhkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8gb3V0cHV0IDogb3V0cHV0c0Nsb3NlZCkgeworICAgICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtNTM1MSw3ICs2MDgyLDcgQEAKICAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAogCiAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCAgCisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKQEAgLTU0NDUsNiArNjE3Niw5IEBACiAKICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgaWYgKGNsb3NpbmdPdXRwdXQgPT0gbVNwYXRpYWxpemVyT3V0cHV0KSB7CisgICAgICAgIG1TcGF0aWFsaXplck91dHB1dC5jbGVhcigpOworICAgIH0KIAogICAgIC8vIE1TRCBwYXRjaGVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgdG8gc3VwcG9ydCBhIG5vbi1NU0QgZGlyZWN0IG91dHB1dC4gUmVzZXQgTVNEIHBhdGNoIGlmCiAgICAgLy8gbm8gZGlyZWN0IG91dHB1dHMgYXJlIG9wZW4uCkBAIC01NTU1LDcgKzYyODksNyBAQAogICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwogICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpCiAgICAgICAgICAgICAgICAgJiYgc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORQotICAgICAgICAgICAgICAgICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZURlc2MpKSB7CisgICAgICAgICAgICAgICAgJiYgIWlzQ2FsbFJ4QXVkaW9Tb3VyY2Uoc291cmNlRGVzYykgJiYgIXNvdXJjZURlc2MtPmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogICAgICAgICB9CiAgICAgfQpAQCAtNTY2OCw3ICs2NDAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChzcmNPdXQsIGF0dHIpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZSkpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0ciAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2UpICYmICFzb3VyY2UtPmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NjgyLDYgKzY0MTYsMTIgQEAKICAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHNJZCkpIHsKICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzcmNPdXQgOiBzcmNPdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlRm9yKHNyY091dCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbHB0cikgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZXNjLT5zZXRUcmFja3NJbnZhbGlkYXRlZFN0YXR1c0J5U3RyYXRlZ3kocHNJZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01NzIwLDE0ICs2NDYwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy5iZWdpbigpLCBzZWNvbmRhcnlEZXNjcy5lbmQoKSkpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHdlYWtTZWNvbmRhcnlEZXNjczsKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0SWRzOwotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2Vjb25kYXJ5RGVzYyA6IHNlY29uZGFyeURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dElkcy5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgd2Vha1NlY29uZGFyeURlc2NzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjKTsKKyAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oY2xpZW50LT5jb25maWcoKS5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmb3JtYXQgaXMgbm90IFBDTSwgdGhlIHRyYWNrcyBzaG91bGQgYmUgaW52YWxpZGF0ZWQgdG8gZ2V0IGNvcnJlY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVoYXZpb3Igd2hlbiB0aGUgc2Vjb25kYXJ5IG91dHB1dCBpcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICBzdHJlYW1zVG9JbnZhbGlkYXRlLmluc2VydChjbGllbnQtPnN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHdlYWtTZWNvbmRhcnlEZXNjczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dElkczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzZWNvbmRhcnlEZXNjOiBzZWNvbmRhcnlEZXNjcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0SWRzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Vha1NlY29uZGFyeURlc2NzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cmFja1NlY29uZGFyeU91dHB1dHMuZW1wbGFjZShjbGllbnQtPnBvcnRJZCgpLCBzZWNvbmRhcnlPdXRwdXRJZHMpOworICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNldFNlY29uZGFyeU91dHB1dHMoc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlEZXNjcykpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cmFja1NlY29uZGFyeU91dHB1dHMuZW1wbGFjZShjbGllbnQtPnBvcnRJZCgpLCBzZWNvbmRhcnlPdXRwdXRJZHMpOwotICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0U2Vjb25kYXJ5T3V0cHV0cyhzdGQ6Om1vdmUod2Vha1NlY29uZGFyeURlc2NzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01NzUxLDYgKzY0OTcsMTggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0hlYXJpbmdBaWRVc2VkRm9yQ29tbSgpIGNvbnN0IHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKQEAgLTU4NDEsOSArNjU5OSwxMCBAQAogCiAgICAgICAgIGF1dG8gZG9HZXRPdXRwdXREZXZpY2VzRm9yVm9pY2UgPSBbJl0oKSB7CiAgICAgICAgICAgICByZXR1cm4gaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYgKG91dHB1dERlc2MgPT0gbVByaW1hcnlPdXRwdXQgfHwKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBmYWxzZSkpKSAmJgogICAgICAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8Ci0gICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSk7CisgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkgJiYKKyAgICAgICAgICAgICAgICAhaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsIDApOwogICAgICAgICB9OwogCiAgICAgICAgIC8vIFdpdGggbG93LWxhdGVuY3kgcGxheWluZyBvbiBzcGVha2VyLCBtdXNpYyBvbiBXRkQsIHdoZW4gdGhlIGZpcnN0IGxvdy1sYXRlbmN5CkBAIC01ODk1LDExICs2NjU0LDExIEBACiAgICAgdWlkX3QgdWlkOwogICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5Q2xpZW50KCk7CiAgICAgaWYgKHRvcENsaWVudCAhPSBudWxscHRyKSB7Ci0gICAgICBhdHRyaWJ1dGVzID0gdG9wQ2xpZW50LT5hdHRyaWJ1dGVzKCk7Ci0gICAgICB1aWQgPSB0b3BDbGllbnQtPnVpZCgpOworICAgICAgICBhdHRyaWJ1dGVzID0gdG9wQ2xpZW50LT5hdHRyaWJ1dGVzKCk7CisgICAgICAgIHVpZCA9IHRvcENsaWVudC0+dWlkKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGF0dHJpYnV0ZXMgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCB9OwotICAgICAgdWlkID0gMDsKKyAgICAgICAgYXR0cmlidXRlcyA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUIH07CisgICAgICAgIHVpZCA9IDA7CiAgICAgfQogCiAgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKQEAgLTU5MTcsNjYgKzY2NzYsNzEgQEAKICAgICByZXR1cm4gKHN0cmVhbTEgPT0gc3RyZWFtMik7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0ncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLgotICAgIC8vIGVuZ2luZSdzIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0gd291bGQgZmFsbGJhY2sgb24gaXRzIGRlZmF1bHQgYmVoYXZpb3IgKG1vc3QgcHJvYmFibHkKLSAgICAvLyBkZXZpY2UgZm9yIG11c2ljIHN0cmVhbSksIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgotICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgfQotICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOwotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoaW50IGkgPSBBVURJT19TVFJFQU1fTUlOOyBpIDwgQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQ7ICsraSkgewotICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IGN1clN0cmVhbXtzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKX07Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGN1clN0cmVhbSwgZmFsc2UvKmZyb21DYWNoZSovKTsKLSAgICAgICAgZGV2aWNlcy5tZXJnZShjdXJEZXZpY2VzKTsKLSAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlcyhjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoY3VyU3RyZWFtKSkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVEZXZpY2VzLm1lcmdlKG91dHB1dERlc2MtPmRldmljZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGYXZvciBkZXZpY2VzIHNlbGVjdGVkIG9uIGFjdGl2ZSBzdHJlYW1zIGlmIGFueSB0byByZXBvcnQgY29ycmVjdCBkZXZpY2UgaW4gY2FzZSBvZgotICAgIC8vIGV4cGxpY2l0IGRldmljZSBzZWxlY3Rpb24KLSAgICBpZiAoIWFjdGl2ZURldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOwotICAgIH0KLSAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKLSAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCi0gICAgRGV2aWNlVmVjdG9yIHNwZWFrZXJTYWZlRGV2aWNlcyA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKTsKLSAgICBpZiAoIXNwZWFrZXJTYWZlRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgZGV2aWNlcy5tZXJnZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7Ci0gICAgICAgIGRldmljZXMucmVtb3ZlKHNwZWFrZXJTYWZlRGV2aWNlcyk7Ci0gICAgfQotICAgIC8vIEZJWE1FOiB1c2UgRGV2aWNlVHlwZVNldCB3aGVuIEphdmEgbGF5ZXIgaXMgcmVhZHkgZm9yIGl0LgotICAgIHJldHVybiBkZXZpY2VUeXBlc1RvQml0TWFzayhkZXZpY2VzLnR5cGVzKCkpOwotfQotCisvLyBUT0RPIC0gY29uc2lkZXIgTVNEIHJvdXRlcyBiLzIxNDk3MTc4MAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yQXR0cmlidXRlcygKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcywgYm9vbCBmb3JWb2x1bWUpIHsKICAgICBpZiAoZGV2aWNlcyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCisgICAgLy8gRGV2aWNlcyBhcmUgZGV0ZXJtaW5lZCBpbiB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6CisgICAgLy8KKyAgICAvLyAxKSBEZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGR5bmFtaWMgcG9saWN5IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBvZnRlbgorICAgIC8vICAgIGEgcmVtb3RlIHN1Ym1peCBmcm9tIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSy4KKyAgICAvLworICAgIC8vIElmIG5vIHN1Y2ggZHluYW1pYyBwb2xpY3kgdGhlbgorICAgIC8vIDIpIERldmljZXMgY29udGFpbmluZyBhbiBhY3RpdmUgY2xpZW50IHVzaW5nIHNldFByZWZlcnJlZERldmljZQorICAgIC8vICAgIHdpdGggc2FtZSBzdHJhdGVneSBhcyB0aGUgYXR0cmlidXRlcy4KKyAgICAvLyAgICAoZnJvbSB0aGUgZGVmYXVsdCBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgaW1wbGVtZW50YXRpb24pLgorICAgIC8vCisgICAgLy8gSWYgbm8gY29ycmVzcG9uZGluZyBhY3RpdmUgY2xpZW50IHdpdGggc2V0UHJlZmVycmVkRGV2aWNlIHRoZW4KKyAgICAvLyAzKSBEZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyYXRlZ3kgZGV0ZXJtaW5lZCBieSB0aGUgYXR0cmlidXRlcworICAgIC8vICAgIChmcm9tIHRoZSBkZWZhdWx0IEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoKSBpbXBsZW1lbnRhdGlvbikuCisgICAgLy8KKyAgICAvLyBTZWUgcmVsYXRlZCBnZXRPdXRwdXRGb3JBdHRySW50KCkuCisKICAgICAvLyBjaGVjayBkeW5hbWljIHBvbGljaWVzIGJ1dCBvbmx5IGZvciBwcmltYXJ5IGRlc2NyaXB0b3JzIChzZWNvbmRhcnkgbm90IHVzZWQgZm9yIGF1ZGlibGUKICAgICAvLyBhdWRpbyByb3V0aW5nLCBvbmx5IHVzZWQgZm9yIGR1cGxpY2F0aW9uIGZvciBwbGF5YmFjayBjYXB0dXJlKQogICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoYXR0ciwgMCAvKnVpZCB1bmtub3duIGhlcmUqLywKLSAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIHBvbGljeU1peCwgbnVsbHB0cik7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCBwb2xpY3lNaXgsIG51bGxwdHIgLyogc2Vjb25kYXJ5TWl4ZXMgKi8pOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyICYmIHBvbGljeU1peC0+Z2V0T3V0cHV0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZShwb2xpY3lNaXgtPm1EZXZpY2VUeXBlLCBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLmNfc3RyKCkpOwotICAgICAgICBkZXZpY2VzLT5wdXNoX2JhY2soZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXM7CisgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyICYmIHBvbGljeU1peC0+Z2V0T3V0cHV0KCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgLy8gRm9yIHZvbHVtZSBjb250cm9sLCBza2lwIExPT1BCQUNLIG1peGVzIHdoaWNoIHVzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgIC8vIGFzIHRoZXkgYXJlIHVuYWZmZWN0ZWQgYnkgZGV2aWNlL3N0cmVhbSB2b2x1bWUKKyAgICAgICAgICAgIC8vIChwZXIgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoKSkuCisgICAgICAgICAgICAoIWZvclZvbHVtZSB8fCBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkKKyAgICAgICAgICAgICkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgIHBvbGljeU1peC0+bURldmljZVR5cGUsIHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgY3VyRGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIHVzZXMgZmluZFByZWZlcnJlZERldmljZSgpCisgICAgICAgIC8vIHdoaWNoIHNlbGVjdHMgc2V0UHJlZmVycmVkRGV2aWNlIGlmIGFjdGl2ZS4gIFRoaXMgbWVhbnMgZm9yVm9sdW1lIGNhbGwKKyAgICAgICAgLy8gd2lsbCB0YWtlIGFuIGFjdGl2ZSBzZXRQcmVmZXJyZWREZXZpY2UsIGlmIHN1Y2ggZXhpc3RzLgorCisgICAgICAgIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyLCBudWxscHRyIC8qIHByZWZlcnJlZERldmljZSAqLywgZmFsc2UgLyogZnJvbUNhY2hlICovKTsKICAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmYWxzZSk7CisKKyAgICBpZiAoZm9yVm9sdW1lKSB7CisgICAgICAgIC8vIFdlIGFsaWFzIHRoZSBkZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUgdG8gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICAgIC8vIGZvciBzaW5nbGUgdm9sdW1lIGNvbnRyb2wgaW4gQXVkaW9TZXJ2aWNlIChzdWNoIHJlbGF0aW9uc2hpcCBzaG91bGQgZXhpc3QgaWYKKyAgICAgICAgLy8gU1BFQUtFUl9TQUZFIGlzIHByZXNlbnQpLgorICAgICAgICAvLworICAgICAgICAvLyAoVGhpcyBpcyB1bnJlbGF0ZWQgdG8gYSBkaWZmZXJlbnQgZGV2aWNlIGdyb3VwaW5nIGFzIFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkpCisgICAgICAgIERldmljZVZlY3RvciBzcGVha2VyU2FmZURldmljZXMgPQorICAgICAgICAgICAgICAgIGN1ckRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKTsKKyAgICAgICAgaWYgKCFzcGVha2VyU2FmZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjdXJEZXZpY2VzLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7CisgICAgICAgICAgICBjdXJEZXZpY2VzLnJlbW92ZShzcGVha2VyU2FmZURldmljZXMpOworICAgICAgICB9CisgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogY3VyRGV2aWNlcykgewogICAgICAgICBkZXZpY2VzLT5wdXNoX2JhY2soZGV2aWNlLT5nZXREZXZpY2VUeXBlQWRkcigpKTsKICAgICB9CkBAIC02MDM3LDcgKzY4MDEsMTEgQEAKICAgICAgICAgLy8gbXV0ZS91bm11dGUgQVVESU9fU1RSRUFNX1RUUyBvbiBhbGwgb3V0cHV0cwogICAgICAgICBBTE9HVigiXHQgbXV0aW5nICVkIiwgbXV0ZSk7CiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOwotICAgICAgICBhdXRvIHR0c1ZvbHVtZVNvdXJjZSA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9UVFMpOworICAgICAgICBhdXRvIHR0c1ZvbHVtZVNvdXJjZSA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9UVFMsIGZhbHNlKTsKKyAgICAgICAgaWYgKHR0c1ZvbHVtZVNvdXJjZSA9PSBWT0xVTUVfU09VUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdCBubyB0dHMgdm9sdW1lIHNvdXJjZSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUodHRzVm9sdW1lU291cmNlLCBtdXRlLypvbiovLCBkZXNjLCAwIC8qZGVsYXkqLywgRGV2aWNlVHlwZVNldCgpKTsKQEAgLTYxMTksMTEgKzY4ODcsMTggQEAKICAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCiAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMgIT0gcHJldkRldmljZXMpKSB7CiAgICAgICAgIHVpbnQzMl90IHRlbXBNdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKLSAgICAgICAgLy8gdGVtcG9yYXJ5IG11dGUgZHVyYXRpb24gaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDQgdGltZXMgdGhlIHJlcG9ydGVkIGxhdGVuY3kKLSAgICAgICAgdWludDMyX3QgdGVtcE11dGVEdXJhdGlvbk1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogNDsKKwogICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IHRlbXBNdXRlV2FpdE1zKSB7CiAgICAgICAgICAgICBtdXRlV2FpdE1zID0gdGVtcE11dGVXYWl0TXM7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiByZWNvbW1lbmRlZCBkdXJhdGlvbiBpcyBkZWZpbmVkLCByZXBsYWNlIHRlbXBvcmFyeSBtdXRlIGR1cmF0aW9uIHRvIGF2b2lkCisgICAgICAgIC8vIHRydW5jYXRlZCBub3RpZmljYXRpb25zIGF0IGJlZ2lubmluZywgd2hpY2ggZGVwZW5kcyBvbiBkdXJhdGlvbiBvZiBjaGFuZ2luZyBwYXRoIGluIEhBTC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB0ZW1wb3JhcnkgbXV0ZSBkdXJhdGlvbiBpcyBjb25zZXJ2YXRpdmVseSBzZXQgdG8gNCB0aW1lcyB0aGUgcmVwb3J0ZWQgbGF0ZW5jeS4KKyAgICAgICAgdWludDMyX3QgdGVtcFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uID0gb3V0cHV0RGVzYy0+Z2V0UmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcygpOworICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZUR1cmF0aW9uTXMgPSB0ZW1wUmVjb21tZW5kZWRNdXRlRHVyYXRpb24gPiAwID8KKyAgICAgICAgICAgICAgICB0ZW1wUmVjb21tZW5kZWRNdXRlRHVyYXRpb24gOiBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiA0OworCiAgICAgICAgIGZvciAoY29uc3QgYXV0byAmYWN0aXZlVnMgOiBvdXRwdXREZXNjLT5nZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkpIHsKICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdGFydCB0aGUgdGVtcG9yYXJ5IG11dGUgcGVyaW9kIHRvbyBlYXJseSBpbiBjYXNlIG9mCiAgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKQEAgLTYxNDcsNyArNjkyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrLCBib29sIHJlcXVpcmVzVm9sdW1lQ2hlY2spCiB7CiAgICAgQUxPR1YoIiVzIGRldmljZSAlcyBkZWxheU1zICVkIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBkZWxheU1zKTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zOwpAQCAtNjE2Myw2ICs2OTM4LDcgQEAKICAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCiAgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IG91dHB1dERlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7CiAgICAgRGV2aWNlVmVjdG9yIHByZXZEZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIERldmljZVZlY3RvciBhdmFpbFByZXZEZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKHByZXZEZXZpY2VzKTsKIAogICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2VzKCkgcHJldkRldmljZSAlcyIsIHByZXZEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKQEAgLTYxNzgsMTEgKzY5NTQsMTIgQEAKICAgICAgICAgbXV0ZVdhaXRNcyA9IDA7CiAgICAgfQogCisgICAgYm9vbCBvdXRwdXRSb3V0ZWQgPSBvdXRwdXREZXNjLT5pc1JvdXRlZCgpOworCiAgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKICAgICAvLyBvdXRwdXQgcHJvZmlsZSBvciBpZiBuZXcgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgQU5EIHByZXZpb3VzIGRldmljZShzKSBpcyhhcmUpIHN0aWxsCiAgICAgLy8gYXZhaWxhYmxlIChvdGhlcndpc2UgcmVzZXQgZGV2aWNlIG11c3QgYmUgZG9uZSBvbiB0aGUgb3V0cHV0KQotICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihwcmV2RGV2aWNlcykuZW1wdHkoKSkgeworICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJiAhYXZhaWxQcmV2RGV2aWNlcy5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dWKCIlczogdW5zdXBwb3J0ZWQgZGV2aWNlICVzIGZvciBvdXRwdXQiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAvLyByZXN0b3JlIHByZXZpb3VzIGRldmljZSBhZnRlciBldmFsdWF0aW5nIHN0cmF0ZWd5IG11dGUgc3RhdGUKICAgICAgICAgb3V0cHV0RGVzYy0+c2V0RGV2aWNlcyhwcmV2RGV2aWNlcyk7CkBAIC02MTk1LDE3ICs2OTcyLDIwIEBACiAgICAgLy8gIEFORCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkCiAgICAgLy8gIEFORCB0aGUgb3V0cHV0IGlzIGNvbm5lY3RlZCBieSBhIHZhbGlkIGF1ZGlvIHBhdGNoLgogICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZXMoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgZmlsdGVyZWREZXZpY2VzID09IHByZXZEZXZpY2VzKSAmJgotICAgICAgICAgICAgIWZvcmNlICYmIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gMCkgeworICAgIGlmICgoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSB8fCBmaWx0ZXJlZERldmljZXMgPT0gcHJldkRldmljZXMpICYmICFmb3JjZSAmJiBvdXRwdXRSb3V0ZWQpIHsKICAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2UgJXMgb3IgbnVsbCBkZXZpY2UsIGZvcmNlPSVkLCBwYXRjaCBoYW5kbGU9JWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZm9yY2UsIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICBpZiAocmVxdWlyZXNWb2x1bWVDaGVjayAmJiAhZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2Ugb24gcm91dGVkIG91dHB1dCwgZm9yY2UgYXBwbHkgdm9sdW1lcyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBmaWx0ZXJlZERldmljZXMudHlwZXMoKSwgZGVsYXlNcywgdHJ1ZSAvKmZvcmNlKi8pOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KIAogICAgIEFMT0dWKCIlcyBjaGFuZ2luZyBkZXZpY2UgdG8gJXMiLCBfX2Z1bmNfXywgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyBkbyB0aGUgcm91dGluZwotICAgIGlmIChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgaWYgKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKGZpbHRlcmVkRGV2aWNlcykuZW1wdHkoKSkgewogICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZWxheU1zLCBOVUxMKTsKICAgICB9IGVsc2UgewogICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwpAQCAtNjIzMiw2ICs3MDEyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQogewogICAgIHNzaXplX3QgaW5kZXg7CisgICAgaWYgKHBhdGNoSGFuZGxlID09IG51bGxwdHIgJiYgIW91dHB1dERlc2MtPmlzUm91dGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKICAgICB9IGVsc2UgewpAQCAtNjM2OSwxMSArNzE1MiwxMSBAQAogICAgIC8vIGxvdWRlciB0aGFuIHRoZSBhY2Nlc3NpYmlsaXR5IHByb21wdCwgdGhlIHByb21wdCBjYW5ub3QgYmUgaGVhcmQsIHRodXMgbWFza2luZyB0aGUgdG91Y2gKICAgICAvLyBleHBsb3JhdGlvbiBvZiB0aGUgZGlhbGVyIFVJLiBJbiB0aGlzIHNpdHVhdGlvbiwgYnJpbmcgdGhlIGFjY2Vzc2liaWxpdHkgdm9sdW1lIGNsb3NlciB0bwogICAgIC8vIHRoZSByaW5ndG9uZSB2b2x1bWUKLSAgICBjb25zdCBhdXRvIGNhbGxWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgY29uc3QgYXV0byByaW5nVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpOwotICAgIGNvbnN0IGF1dG8gbXVzaWNWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpOwotICAgIGNvbnN0IGF1dG8gYWxhcm1Wb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pOwotICAgIGNvbnN0IGF1dG8gYTExeVZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICBjb25zdCBhdXRvIGNhbGxWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZmFsc2UpOworICAgIGNvbnN0IGF1dG8gcmluZ1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HLCBmYWxzZSk7CisgICAgY29uc3QgYXV0byBtdXNpY1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQywgZmFsc2UpOworICAgIGNvbnN0IGF1dG8gYWxhcm1Wb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0sIGZhbHNlKTsKKyAgICBjb25zdCBhdXRvIGExMXlWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgZmFsc2UpOwogCiAgICAgaWYgKHZvbHVtZVNvdXJjZSA9PSBhMTF5Vm9sdW1lU3JjCiAgICAgICAgICAgICAmJiAoQVVESU9fTU9ERV9SSU5HVE9ORSA9PSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpICYmCkBAIC02Mzg2LDEyICs3MTY5LDEyIEBACiAgICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KICAgICBpZiAoKHZvbHVtZVNvdXJjZSAhPSBjYWxsVm9sdW1lU3JjICYmIChpc0luQ2FsbCgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KGNhbGxWb2x1bWVTcmMpKSkgJiYKLSAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkgfHwKKyAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSwgZmFsc2UpIHx8CiAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IG11c2ljVm9sdW1lU3JjIHx8CiAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IGFsYXJtVm9sdW1lU3JjIHx8Ci0gICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAotICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRFRNRikgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0RUTUYsIGZhbHNlKSB8fAogICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSBhMTF5Vm9sdW1lU3JjKSkgewogICAgICAgICBhdXRvICZ2b2ljZUN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjYWxsVm9sdW1lU3JjKTsKICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPSB2b2ljZUN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2VUeXBlcyk7CkBAIC02NDI5LDkgKzcyMTIsOSBAQAogICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVR9KS5lbXB0eSgpICYmCiAgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAogICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKLSAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fAotICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpIHx8Ci0gICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgZmFsc2UpKSB8fAorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSwgZmFsc2UpKSB8fAorICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCBmYWxzZSkpICYmCiAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKICAgICAgICAgICAgIGN1cnZlcy5jYW5CZU11dGVkKCkpIHsKIApAQCAtNjUxNywxOSArNzMwMCwyMSBAQAogICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0TXV0ZUNvdW50KHZvbHVtZVNvdXJjZSksIG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIFZvbHVtZVNvdXJjZSBjYWxsVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIFZvbHVtZVNvdXJjZSBidFNjb1ZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKTsKLSAgICBib29sIGlzVm9pY2VWb2xTcmMgPSBjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKLSAgICBib29sIGlzQnRTY29Wb2xTcmMgPSBidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CisgICAgVm9sdW1lU291cmNlIGNhbGxWb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZmFsc2UpOworICAgIFZvbHVtZVNvdXJjZSBidFNjb1ZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCBmYWxzZSk7CisgICAgYm9vbCBpc1ZvaWNlVm9sU3JjID0gKHZvbHVtZVNvdXJjZSAhPSBWT0xVTUVfU09VUkNFX05PTkUpICYmIChjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZSk7CisgICAgYm9vbCBpc0J0U2NvVm9sU3JjID0gKHZvbHVtZVNvdXJjZSAhPSBWT0xVTUVfU09VUkNFX05PTkUpICYmIChidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2UpOwogCiAgICAgYm9vbCBpc1Njb1JlcXVlc3RlZCA9IGlzU2NvUmVxdWVzdGVkRm9yQ29tbSgpOworICAgIGJvb2wgaXNIQVVzZWQgPSBpc0hlYXJpbmdBaWRVc2VkRm9yQ29tbSgpOworCiAgICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCiAgICAgLy8gaWYgc2NvIGFuZCBjYWxsIGZvbGxvdyBzYW1lIGN1cnZlcywgYnlwYXNzIGZvcmNlVXNlRm9yQ29tbQogICAgIGlmICgoY2FsbFZvbFNyYyAhPSBidFNjb1ZvbFNyYykgJiYKICAgICAgICAgICAgICgoaXNWb2ljZVZvbFNyYyAmJiBpc1Njb1JlcXVlc3RlZCkgfHwKLSAgICAgICAgICAgICAoaXNCdFNjb1ZvbFNyYyAmJiAhaXNTY29SZXF1ZXN0ZWQpKSkgeworICAgICAgICAgICAgIChpc0J0U2NvVm9sU3JjICYmICEoaXNTY29SZXF1ZXN0ZWQgfHwgaXNIQVVzZWQpKSkpIHsKICAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aGVuIGlzJXNyZXF1ZXN0ZWQgZm9yIGNvbW0iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIGlzU2NvUmVxdWVzdGVkID8gIiAiIDogIm4gb3QgIik7CisgICAgICAgICAgICAgdm9sdW1lU291cmNlLCBpc1Njb1JlcXVlc3RlZCA/ICIgIiA6ICIgbm90ICIpOwogICAgICAgICAvLyBEbyBub3QgcmV0dXJuIGFuIGVycm9yIGhlcmUgYXMgQXVkaW9TZXJ2aWNlIHdpbGwgYWx3YXlzIHNldCBib3RoIHZvaWNlIGNhbGwKICAgICAgICAgLy8gYW5kIGJsdWV0b290aCBTQ08gdm9sdW1lcyBkdWUgdG8gc3RyZWFtIGFsaWFzaW5nLgogICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02NTM4LDYgKzczMjMsMTEgQEAKICAgICAgICAgZGV2aWNlVHlwZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKICAgICB9CiAKKyAgICBpZiAoY3VydmVzLmdldFZvbHVtZUluZGV4TWluKCkgPCAwIHx8IGN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpIDwgMCkgeworICAgICAgICBBTE9HRSgiaW52YWxpZCB2b2x1bWUgaW5kZXggcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIGluZGV4LCBkZXZpY2VUeXBlcyk7CiAgICAgaWYgKG91dHB1dERlc2MtPmlzRml4ZWRWb2x1bWUoZGV2aWNlVHlwZXMpIHx8CiAgICAgICAgICAgICAvLyBGb3JjZSBWb0lQIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gZGV2aWNlIGV4Y2VwdCBpZiBtdXRlZApAQCAtNjU0NSwxMCArNzMzNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZURldmljZVR5cGUoZGV2aWNlVHlwZXMsIGF1ZGlvX2lzX2JsdWV0b290aF9vdXRfc2NvX2RldmljZSkpKSB7CiAgICAgICAgIHZvbHVtZURiID0gMC4wZjsKICAgICB9CisgICAgY29uc3QgYm9vbCBtdXRlZCA9IChpbmRleCA9PSAwKSAmJiAodm9sdW1lRGIgIT0gMC4wZik7CiAgICAgb3V0cHV0RGVzYy0+c2V0Vm9sdW1lKAotICAgICAgICAgICAgdm9sdW1lRGIsIHZvbHVtZVNvdXJjZSwgY3VydmVzLmdldFN0cmVhbVR5cGVzKCksIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSk7CisgICAgICAgICAgICB2b2x1bWVEYiwgbXV0ZWQsIHZvbHVtZVNvdXJjZSwgY3VydmVzLmdldFN0cmVhbVR5cGVzKCksIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSk7CiAKLSAgICBpZiAoaXNWb2ljZVZvbFNyYyB8fCBpc0J0U2NvVm9sU3JjKSB7CisgICAgaWYgKG91dHB1dERlc2MgPT0gbVByaW1hcnlPdXRwdXQgJiYgKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykpIHsKICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CiAgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggb3IgbXV0ZSBmb3IgQmx1ZXRvb3RoIFNDTyBhcyBvdGhlciBhdHRlbnVhdGlvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKICAgICAgICAgaWYgKGlzVm9pY2VWb2xTcmMpIHsKQEAgLTY1ODgsOCArNzM3OSwxMCBAQAogICAgIGZvciAoYXV0byBhdHRyaWJ1dGVzOiBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KSkgewogICAgICAgICBBTE9HVlYoIiVzKCkgYXR0cmlidXRlcyAlcywgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpLCBvbiwgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7Ci0gICAgICAgIFZvbHVtZVNvdXJjZSBzb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShhdHRyaWJ1dGVzKTsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzb3VyY2VzVG9NdXRlKSwgZW5kKHNvdXJjZXNUb011dGUpLCBzb3VyY2UpID09IGVuZChzb3VyY2VzVG9NdXRlKSkgeworICAgICAgICBWb2x1bWVTb3VyY2Ugc291cmNlID0gdG9Wb2x1bWVTb3VyY2UoYXR0cmlidXRlcywgZmFsc2UpOworICAgICAgICBpZiAoKHNvdXJjZSAhPSBWT0xVTUVfU09VUkNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKHN0ZDo6ZmluZChiZWdpbihzb3VyY2VzVG9NdXRlKSwgZW5kKHNvdXJjZXNUb011dGUpLCBzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBlbmQoc291cmNlc1RvTXV0ZSkpKSB7CiAgICAgICAgICAgICBzb3VyY2VzVG9NdXRlLnB1c2hfYmFjayhzb3VyY2UpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjYxMiw3ICs3NDA1LDcgQEAKICAgICBpZiAob24pIHsKICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc011dGVkKHZvbHVtZVNvdXJjZSkpIHsKICAgICAgICAgICAgIGlmIChjdXJ2ZXMuY2FuQmVNdXRlZCgpICYmCi0gICAgICAgICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgIT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgIT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsIGZhbHNlKSB8fAogICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PQogICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKICAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIHZvbHVtZVNvdXJjZSwgMCwgb3V0cHV0RGVzYywgZGV2aWNlVHlwZXMsIGRlbGF5TXMpOwpAQCAtNjY3OSwxMyArNzQ3MiwxMSBAQAogICAgIHJldHVybiBtRW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0luQ2FsbCgpCi17Citib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNJbkNhbGwoKSBjb25zdCB7CiAgICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKQoteworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKSBjb25zdCB7CiAgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpOwogfQogCkBAIC02NjkzLDggKzc0ODQsOCBAQAogewogICAgIGF1ZGlvX21vZGVfdCBtb2RlID0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOwogICAgIHJldHVybiAobW9kZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpCi0gICAgICAgICAgICB8fCAobW9kZSA9PSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04pCi0gICAgICAgICAgICB8fCAobW9kZSA9PSBBVURJT19NT0RFX0NBTExfU0NSRUVOKTsKKyAgICAgICAgICAgIHx8IChtb2RlID09IEFVRElPX01PREVfQ0FMTF9TQ1JFRU4pCisgICAgICAgICAgICB8fCAobW9kZSA9PSBBVURJT19NT0RFX0NBTExfUkVESVJFQ1QpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzYykKQEAgLTY5NzMsNyArNzc2NCwxMCBAQAogICAgICAgICByb3V0ZWREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgIH0KICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGFjdGl2ZUNsaWVudHMpIHsKLSAgICAgICAgLy8gVE9ETzogYi8xNzUzNDMwOTkgb25seSB0cmF2ZWwgdGhlIHZhbGlkIGNsaWVudAorICAgICAgICBpZiAoY2xpZW50LT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQgaW52YWxpZGF0ZWQgY2xpZW50cy4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHByZWZlcnJlZERldmljZSA9CiAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CiAgICAgICAgIGlmIChtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKQEAgLTY5ODUsNyArNzc3OSw4IEBACiB9CiAKIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6Om9wZW5PdXRwdXRXaXRoUHJvZmlsZUFuZERldmljZSgKLSAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQorICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnKQogewogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewogICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBiZSBjaGVja2luZyBpZiB0aGUgcHJvZmlsZSBzdXBwb3J0cyB0aGUgZGV2aWNlIGNvbWJvLgpAQCAtNjk5NSw3ICs3NzkwLDcgQEAKICAgICB9CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgZGV2aWNlcywKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIgLyogaGFsQ29uZmlnICovLCBtaXhlckNvbmZpZywgZGV2aWNlcywKICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtNzAyNSw3ICs3ODIwLDcgQEAKICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CiAKLSAgICAgICAgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBkZXZpY2VzLAorICAgICAgICBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIG1peGVyQ29uZmlnLCBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC03MDMzLDYgKzc4MjgsNyBAQAogICAgIH0KIAogICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOworCiAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZVR5cGUpICYmIGFkZHJlc3MgIT0gIjAiKSB7CiAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CiAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoZGV2aWNlVHlwZSwgYWRkcmVzcywgcG9saWN5TWl4KSA9PSBOT19FUlJPUikgewpAQCAtNzA0Myw5ICs3ODM5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICB9CiAKLSAgICB9IGVsc2UgaWYgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yIGRpcmVjdCBvdXRwdXRzIGFuZAotICAgICAgICAvLyBvdXRwdXRzIHVzZWQgYnkgZHluYW1pYyBwb2xpY3kgbWl4ZXMKKyAgICB9IGVsc2UgaWYgKGhhc1ByaW1hcnlPdXRwdXQoKSAmJiBwcm9maWxlLT5nZXRNb2R1bGUoKQorICAgICAgICAgICAgICAgICE9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpCisgICAgICAgICAgICAmJiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkpIHsKKyAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yOgorICAgICAgICAvLyAtIGRpcmVjdCBvdXRwdXRzCisgICAgICAgIC8vIC0gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCisgICAgICAgIC8vIC0gb3V0cHV0cyBvcGVuZWQgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAogICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKaW5kZXggOThmOTZkMS4uZGIwZWUxNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPFBvbGljeUF1ZGlvUG9ydC5oPgpAQCAtOTUsMTEgKzk2LDggQEAKICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CiAKICAgICAgICAgLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCkBAIC0xMjQsNyArMTIyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKSBvdmVycmlkZTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKQEAgLTE5MiwxMiArMTkxLDM3IEBACiAgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgdmVjdG9yIG9mIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIGF0dHJpYnV0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEFuIEF1ZGlvVHJhY2sgb3BlbmVkIHdpdGggc3BlY2lmaWVkIGF0dHJpYnV0ZXMgc2hvdWxkIHBsYXkgb24gdGhlIHJldHVybmVkIGRldmljZXMuCisgICAgICAgICAqIElmIGZvclZvbHVtZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGNhbGxlciBpcyBBdWRpb1NlcnZpY2UsIGRldGVybWluaW5nIHRoZSBwcm9wZXIKKyAgICAgICAgICogZGV2aWNlIHZvbHVtZSB0byBhZGp1c3QuCisgICAgICAgICAqCisgICAgICAgICAqIERldmljZXMgYXJlIGRldGVybWluZWQgaW4gdGhlIGZvbGxvd2luZyBwcmVjZWRlbmNlOgorICAgICAgICAgKiAxKSBEZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGR5bmFtaWMgcG9saWN5IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBvZnRlbgorICAgICAgICAgKiAgICBhIHJlbW90ZSBzdWJtaXggZnJvbSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0suICBTZWNvbmRhcnkgbWl4ZXMgZnJvbSBhCisgICAgICAgICAqICAgIGR5bmFtaWMgcG9saWN5IGFyZSBub3QgaW5jbHVkZWQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIG5vIHN1Y2ggZHluYW1pYyBwb2xpY3kgdGhlbgorICAgICAgICAgKiAyKSBEZXZpY2VzIGNvbnRhaW5pbmcgYW4gYWN0aXZlIGNsaWVudCB1c2luZyBzZXRQcmVmZXJyZWREZXZpY2UKKyAgICAgICAgICogICAgd2l0aCBzYW1lIHN0cmF0ZWd5IGFzIHRoZSBhdHRyaWJ1dGVzLgorICAgICAgICAgKiAgICAoZnJvbSB0aGUgZGVmYXVsdCBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgaW1wbGVtZW50YXRpb24pLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBubyBjb3JyZXNwb25kaW5nIGFjdGl2ZSBjbGllbnQgd2l0aCBzZXRQcmVmZXJyZWREZXZpY2UgdGhlbgorICAgICAgICAgKiAzKSBEZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyYXRlZ3kgZGV0ZXJtaW5lZCBieSB0aGUgYXR0cmlidXRlcworICAgICAgICAgKiAgICAoZnJvbSB0aGUgZGVmYXVsdCBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgaW1wbGVtZW50YXRpb24pLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBkZXZpY2VzICAgIGFuIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgY29udGFpbmVyIHBhc3NlZCBpbiB0aGF0CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZmlsbGVkIG9uIHN1Y2Nlc3MuCisgICAgICAgICAqIEBwYXJhbSBmb3JWb2x1bWUgIHRydWUgaWYgdGhlIGRldmljZXMgYXJlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGRldmljZSB2b2x1bWUuCisgICAgICAgICAqIEByZXR1cm4gICAgICAgICAgIE5PX0VSUk9SIG9uIHN1Y2Nlc3MuCisgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JBdHRyaWJ1dGVzKAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKTsKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzLAorICAgICAgICAgICAgICAgIGJvb2wgZm9yVm9sdW1lKTsKIAogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjID0gTlVMTCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKQEAgLTI0MCwxMCArMjY0LDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChwYXRjaCwgaGFuZGxlLCB1aWQpOwotICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKQEAgLTMyMCwxMyArMzQxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKIAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNVbHRyYXNvdW5kU3VwcG9ydGVkKCk7CisKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOwpAQCAtMzU2LDYgKzM3OSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBCQURfVkFMVUUgOiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5CZVNwYXRpYWxpemVkKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNhbkJlU3BhdGlhbGl6ZWRJbnQoYXR0ciwgY29uZmlnLCBkZXZpY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3BhdGlhbGl6ZXJPdXRwdXQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU3BhdGlhbGl6ZXJPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RpcmVjdF9tb2RlX3QgZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3ImIGF1ZGlvUHJvZmlsZXMpOworCiAgICAgICAgIGJvb2wgaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpIG92ZXJyaWRlOwogCiAgICAgICAgIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSBvdmVycmlkZTsKQEAgLTQyMSwxMyArNDYyLDMwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHZvbHVtZUdyb3VwKTsKICAgICAgICAgfQotICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSBjb25zdAorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHRvVm9sdW1lU291cmNlIGNvbnZlcnRzIGFuIGF1ZGlvIGF0dHJpYnV0ZXMgaW50byBhIHZvbHVtZSBzb3VyY2UKKyAgICAgICAgICogKGVpdGhlciBhIGxlZ2FjeSBzdHJlYW0gb3IgYSB2b2x1bWUgZ3JvdXApLiBJZiBmYWxsYmFjayBvbiBkZWZhdWx0IGlzIGFsbG93ZWQsIGFuZCBpZgorICAgICAgICAgKiB0aGUgYXVkaW8gYXR0cmlidXRlcyBkbyBub3QgZm9sbG93IGFueSBzcGVjaWZpYyBwcm9kdWN0IHN0cmF0ZWd5J3MgcnVsZSwgaXQgd2lsbCBiZQorICAgICAgICAgKiBhc3NvY2lhdGVkIHRvIGRlZmF1bHQgdm9sdW1lIHNvdXJjZSwgZS5nLiBtdXNpYy4gVGh1cywgYW55IG9mIGNhbGwgb2Ygdm9sdW1lIEFQSQorICAgICAgICAgKiB1c2luZyB0aGlzIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIG1heSBhZmZlY3QgdGhlIGRlZmF1bHQgdm9sdW1lIHNvdXJjZS4KKyAgICAgICAgICogSWYgZmFsbGJhY2sgaXMgbm90IGFsbG93ZWQgYW5kIG5vIG1hdGNoaW5nIHJ1bGUgaXMgaWRlbnRpZmllZCBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZXMsCisgICAgICAgICAqIHRoZSB2b2x1bWUgc291cmNlIHdpbGwgYmUgdW5kZWZpbmVkLCB0aHVzLCBubyB2b2x1bWUgd2lsbCBiZSBhbHRlcmVkL21vZGlmaWVkLgorICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBmYWxsYmFja09uRGVmYXVsdAorICAgICAgICAgKiBAcmV0dXJuIHZvbHVtZSBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGF0dHJpYnV0ZXMsIG90aGVyd2lzZSBlaXRoZXIgbXVzaWMgaWYKKyAgICAgICAgICogZmFsbGJhY2tPbkRlZmF1bHQgaXMgc2V0IG9yIG5vbmUuCisgICAgICAgICAqLworICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQgPSB0cnVlKSBjb25zdAogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcywgZmFsbGJhY2tPbkRlZmF1bHQpKTsKICAgICAgICAgfQotICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZSgKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIGZhbGxiYWNrT25EZWZhdWx0ID0gdHJ1ZSkgY29uc3QKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoCisgICAgICAgICAgICAgICAgc3RyZWFtLCBmYWxsYmFja09uRGVmYXVsdCkpOwogICAgICAgICB9CiAgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKQogICAgICAgICB7CkBAIC00NTMsMTQgKzUxMSwyNyBAQAogICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKLSAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KLSAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBzZXRPdXRwdXREZXZpY2VzIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIGRldmljZSB0byBiZSBjb25zaWRlcmVkIHRvIHJvdXRlIHRoZSBvdXRwdXQKKyAgICAgICAgICogQHBhcmFtIGZvcmNlIGlmIHRydWUsIGZvcmNlIHRoZSByb3V0aW5nIGV2ZW4gaWYgbm8gY2hhbmdlLgorICAgICAgICAgKiBAcGFyYW0gZGVsYXlNcyBpZiBzcGVjaWZpZWQsIGRlbGF5IHRvIGFwcGx5IGZvciBtdXRlL3ZvbHVtZSBvcCB3aGVuIGNoYW5naW5nIGRldmljZQorICAgICAgICAgKiBAcGFyYW0gcGF0Y2hIYW5kbGUgaWYgc3BlY2lmaWVkLCB0aGUgcGF0Y2ggaGFuZGxlIHRoaXMgb3V0cHV0IGlzIGNvbm5lY3RlZCB0aHJvdWdoLgorICAgICAgICAgKiBAcGFyYW0gcmVxdWlyZXNNdXRlQ2hlY2sgaWYgc3BlY2lmaWVkLCBmb3IgZS5nLiB3aGVuIGFub3RoZXIgb3V0cHV0IGlzIG9uIGEgc2hhcmVkIGRldmljZQorICAgICAgICAgKiAgICAgICAgYW5kIGN1cnJlbnRseSBhY3RpdmUsIGFsbG93IHRvIGhhdmUgcHJvcGVyIGRyYWluIGFuZCBhdm9pZCBwb3BzCisgICAgICAgICAqIEBwYXJhbSByZXF1aXJlc1ZvbHVtZUNoZWNrIHRydWUgaWYgY2FsbGVkIHJlcXVpcmVzIHRvIHJlYXBwbHkgdm9sdW1lIGlmIHRoZSByb3V0aW5nIGRpZAorICAgICAgICAgKiBub3QgY2hhbmdlIChidXQgdGhlIG91dHB1dCBpcyBzdGlsbCByb3V0ZWQpLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0byBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluCisgICAgICAgICAqIGNhc2VzLgorICAgICAgICAgKi8KICAgICAgICAgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2sgPSB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzVm9sdW1lQ2hlY2sgPSBmYWxzZSk7CiAgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CkBAIC01MjcsOSArNTk4LDkgQEAKICAgICAgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKIAogICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKLSAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luQ2FsbCgpIGNvbnN0OwogICAgICAgICAvLyB0cnVlIGlmIGdpdmVuIHN0YXRlIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0YXRlSW5DYWxsKGludCBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkgY29uc3Q7CiAgICAgICAgIC8vIHRydWUgaWYgcGxheWJhY2sgdG8gY2FsbCBUWCBvciBjYXB0dXJlIGZyb20gY2FsbCBSWCBpcyBwb3NzaWJsZQogICAgICAgICBib29sIGlzQ2FsbEF1ZGlvQWNjZXNzaWJsZSgpOwogCkBAIC01NjUsMTMgKzYzNiwyMiBAQAogICAgICAgICB2b2lkIHVwZGF0ZUNhbGxBbmRPdXRwdXRSb3V0aW5nKGJvb2wgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlLCB1aW50MzJfdCBkZWxheU1zID0gMCk7CiAKICAgICAgICAgYm9vbCBpc0NhbGxSeEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ICZzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FCi0gICAgICAgICAgICAgICAgJiYgc291cmNlID09IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IobUNhbGxSeFNvdXJjZUNsaWVudFBvcnQpOworICAgICAgICAgICAgcmV0dXJuIG1DYWxsUnhTb3VyY2VDbGllbnQgIT0gbnVsbHB0ciAmJiBzb3VyY2UgPT0gbUNhbGxSeFNvdXJjZUNsaWVudDsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKIAotICAgICAgICB2b2lkIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CisgICAgICAgIHZvaWQgZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ICZjbGllbnREZXNjKTsKKworICAgICAgICB2b2lkIGNvbm5lY3RUZWxlcGhvbnlUeEF1ZGlvU291cmNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzcmNkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisKKyAgICAgICAgYm9vbCBpc1RlbGVwaG9ueVJ4T3JUeChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUNhbGxSeFNvdXJjZUNsaWVudCAhPSBudWxscHRyICYmIG1DYWxsUnhTb3VyY2VDbGllbnQtPmJlbG9uZ3NUb091dHB1dChkZXNjKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1DYWxsVHhTb3VyY2VDbGllbnQgIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAmJiAgbUNhbGxUeFNvdXJjZUNsaWVudC0+YmVsb25nc1RvT3V0cHV0KGRlc2MpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAYnJpZWYgdXBkYXRlcyByb3V0aW5nIGZvciBhbGwgaW5wdXRzLgpAQCAtNjg5LDYgKzc2OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSk7CisgICAgICAgIC8qKgorICAgICAgICAqIFNhbWUgYXMgZ2V0UHJvZmlsZUZvck91dHB1dCwgYnV0IGl0IGxvb2tzIGZvciBhbiBNU0QgcHJvZmlsZQorICAgICAgICAqLworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldE1zZFByb2ZpbGVGb3JPdXRwdXQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIApAQCAtNzc4LDYgKzg2NywxMiBAQAogICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCisgICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZVRvU2luayhjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzaW5rRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICZoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMpOworCiAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOwogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzRm9yT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CkBAIC03OTIsMTEgKzg4NywyOCBAQAogICAgICAgICB2b2lkIGNsb3NlQWN0aXZlQ2xpZW50cyhjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0KTsKICAgICAgICAgdm9pZCBjbG9zZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBpc0FueURldmljZVR5cGVBY3RpdmU6IHJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgYWN0aXZlIGNsaWVudCBpcyByb3V0ZWQgdG8KKyAgICAgICAgICogb25lIG9mIHRoZSBzcGVjaWZpZWQgZGV2aWNlcworICAgICAgICAgKiBAcGFyYW0gZGV2aWNlVHlwZXMgbGlzdCBvZiBkZXZpY2VzIHRvIGNvbnNpZGVyCisgICAgICAgICAqLworICAgICAgICBib29sIGlzQW55RGV2aWNlVHlwZUFjdGl2ZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3Q7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaXNMZVVuaWNhc3RBY3RpdmU6IHJldHVybnMgdHJ1ZSBpZiBhIGNhbGwgaXMgYWN0aXZlIG9yIGF0IGxlYXN0IG9uZSBhY3RpdmUgY2xpZW50CisgICAgICAgICAqIGlzIHJvdXRlZCB0byBhIExFIHVuaWNhc3QgZGV2aWNlCisgICAgICAgICAqLworICAgICAgICBib29sIGlzTGVVbmljYXN0QWN0aXZlKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBjaGVja0xlQnJvYWRjYXN0Um91dGVzKGJvb2wgd2FzVW5pY2FzdEFjdGl2ZSwKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaWdub3JlZE91dHB1dCwgdWludDMyX3QgZGVsYXlNcyk7CisKICAgICAgICAgY29uc3QgdWlkX3QgbVVpZENhY2hlZDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUlEX0FVRElPU0VSVkVSCiAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptcENsaWVudEludGVyZmFjZTsgIC8vIGF1ZGlvIHBvbGljeSBjbGllbnQgaW50ZXJmYWNlCiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtUHJpbWFyeU91dHB1dDsgICAgIC8vIHByaW1hcnkgb3V0cHV0IGRlc2NyaXB0b3IKICAgICAgICAgLy8gbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb3V0cHV0cyBjdXJyZW50bHkgb3BlbmVkCiAKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1TcGF0aWFsaXplck91dHB1dDsKKwogICAgICAgICBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtT3V0cHV0czsKICAgICAgICAgLy8gY29weSBvZiBtT3V0cHV0cyBiZWZvcmUgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgb3BlbnMgbmV3IG91dHB1dHMKICAgICAgICAgLy8gcmVzZXQgdG8gbU91dHB1dHMgd2hlbiB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KQEAgLTgyNiw4ICs5MzgsNiBAQAogCiAgICAgICAgIFNvdW5kVHJpZ2dlclNlc3Npb25Db2xsZWN0aW9uIG1Tb3VuZFRyaWdnZXJTZXNzaW9uczsKIAotICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFR4UGF0Y2g7Ci0KICAgICAgICAgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gbUh3T3V0cHV0czsKICAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwogCkBAIC04NDIsNyArOTUyLDggQEAKICAgICAgICAgdWludDMyX3QgbUJlYWNvbk11dGVSZWZDb3VudDsgICAvLyByZWYgY291bnQgZm9yIHN0cmVhbSB0aGF0IHdvdWxkIG11dGUgYmVhY29uCiAgICAgICAgIHVpbnQzMl90IG1CZWFjb25QbGF5aW5nUmVmQ291bnQ7Ly8gcmVmIGNvdW50IGZvciB0aGUgcGxheWluZyBiZWFjb24gc3RyZWFtcwogICAgICAgICBib29sIG1CZWFjb25NdXRlZDsgICAgICAgICAgICAgIC8vIGhhcyBTVFJFQU1fVFRTIGJlZW4gbXV0ZWQKLSAgICAgICAgYm9vbCBtVHRzT3V0cHV0QXZhaWxhYmxlOyAgICAgICAvLyB0cnVlIGlmIGEgZGVkaWNhdGVkIG91dHB1dCBmb3IgVFRTIHN0cmVhbSBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8gdHJ1ZSBpZiBhIGRlZGljYXRlZCBvdXRwdXQgZm9yIFRUUyBzdHJlYW0gb3IgVWx0cmFzb3VuZCBpcyBhdmFpbGFibGUKKyAgICAgICAgYm9vbCBtVHRzT3V0cHV0QXZhaWxhYmxlOwogCiAgICAgICAgIGJvb2wgbU1hc3Rlck1vbm87ICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiB3ZSB3aXNoIHRvIGZvcmNlIGFsbCBvdXRwdXRzIHRvIG1vbm8KICAgICAgICAgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uIG1Qb2xpY3lNaXhlczsgLy8gbGlzdCBvZiByZWdpc3RlcmVkIG1peGVzCkBAIC04NjcsNyArOTc4LDggQEAKIAogICAgICAgICAvLyBUaGUgcG9ydCBoYW5kbGUgb2YgdGhlIGhhcmR3YXJlIGF1ZGlvIHNvdXJjZSBjcmVhdGVkIGludGVybmFsbHkgZm9yIHRoZSBDYWxsIFJYIGF1ZGlvCiAgICAgICAgIC8vIGVuZCBwb2ludC4KLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1DYWxsUnhTb3VyY2VDbGllbnQ7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1DYWxsVHhTb3VyY2VDbGllbnQ7CiAKICAgICAgICAgLy8gU3VwcG9ydCBmb3IgTXVsdGktU3RyZWFtIERlY29kZXIgKE1TRCkgbW9kdWxlCiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdDsKQEAgLTg4OCw3ICsxMDAwLDI0IEBACiAgICAgICAgIFBhdGNoQnVpbGRlciBidWlsZE1zZFBhdGNoKGJvb2wgbXNkSXNTb3VyY2UsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpIGNvbnN0OwogICAgICAgICBzdGF0dXNfdCBzZXRNc2RPdXRwdXRQYXRjaGVzKGNvbnN0IERldmljZVZlY3RvciAqb3V0cHV0RGV2aWNlcyA9IG51bGxwdHIpOwogICAgICAgICB2b2lkIHJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzKGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcyk7CisgICAgICAgIGJvb2wgbXNkSGFzUGF0Y2hlc1RvQWxsRGV2aWNlcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKKworICAgICAgICAvLyBPdmVybG9hZCBvZiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciogZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKKworICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgc3RhdHVzX3QgZGV2aWNlVG9BdWRpb1BvcnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsIGNvbnN0IGNoYXIqIGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwgbWVkaWE6OkF1ZGlvUG9ydCogYWlkUG9ydCk7CisgICAgICAgIGJvb2wgaXNNc2RQYXRjaChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCAmaGFuZGxlKSBjb25zdDsKKwogcHJpdmF0ZToKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc3RhcnRBdWRpb1NvdXJjZUludGVybmFsKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKwogICAgICAgICB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlSW50KERldmljZVZlY3RvciAqbmV3RGV2aWNlcyk7CiAKICAgICAgICAgLy8gQWRkIG9yIHJlbW92ZSBBQzMgRFRTIGVuY29kaW5ncyBiYXNlZCBvbiB1c2VyIHByZWZlcmVuY2VzLgpAQCAtOTI4LDE0ICsxMDU3LDE2IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICBib29sICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxBdWRpb1BvbGljeU1peD4+ICpzZWNvbmRhcnlNaXhlcywKLSAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90ICpvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90ICpvdXRwdXRUeXBlLAorICAgICAgICAgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQpOwogICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlcygKICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQsCiAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZU11dGluZ0hhcHRpYyA9IGZhbHNlKTsKIAogICAgICAgICAvLyBJbnRlcm5hbCBtZXRob2QgY2hlY2tpbmcgaWYgYSBkaXJlY3Qgb3V0cHV0IGNhbiBiZSBvcGVuZWQgbWF0Y2hpbmcgdGhlIHJlcXVlc3RlZApAQCAtOTQ4LDYgKzEwNzksNDEgQEAKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBRdWVyaWVzIGlmIHNvbWUga2luZCBvZiBzcGF0aWFsaXphdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBpZiB0aGUgYXVkaW8gcGxheWJhY2sKKyAgICAgICAgICogY29udGV4dCBkZXNjcmliZWQgYnkgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBpcyBwcmVzZW50LgorICAgICAgICAgKiBUaGUgY29udGV4dCBpcyBtYWRlIG9mOgorICAgICAgICAgKiAtIFRoZSBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlLgorICAgICAgICAgKiAtIFRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsaW5nIHJhdGUgLi4uCisgICAgICAgICAqIC0gVGhlIGRldmljZXMgZGVzY3JpYmluZyB0aGUgc2luayBhdWRpbyBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHBsYXliYWNrLgorICAgICAgICAgKiBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbCBhbmQgb25seSB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0CisgICAgICAgICAqIHN1cHBvcnRlZCBjcml0ZXJpYS4gRm9yIGluc3RhbmNlLCBzdXBwbHlpbmcgbm8gYXJndW1lbnQgd2lsbCB0ZWxsIGlmIHNwYXRpYWxpemF0aW9uIGlzCisgICAgICAgICAqIHN1cHBvcnRlZCBvciBub3QgaW4gZ2VuZXJhbC4KKyAgICAgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxlIHJhdGUuLi4KKyAgICAgICAgICogQHBhcmFtIGRldmljZXMgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjaworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3BhdGlhbGl6YXRpb24gaXMgcG9zc2libGUgZm9yIHRoaXMgY29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBib29sIGNhbkJlU3BhdGlhbGl6ZWRJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFNwYXRpYWxpemVyT3V0cHV0UHJvZmlsZShjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgICAgICB2b2lkIGNoZWNrVmlydHVhbGl6ZXJDbGllbnRSb3V0ZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGNhbiBvbmx5IGJlIHJlYWNoZWQgdmlhIHRoZSBvdXRwdXQgcGFzc2VkCisgICAgICAgICAqIGFzIGFyZ3VtZW50LiBBbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgZHVwbGljYXRlZCBvdXRwdXRzLgorICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlY2lkZSBpZiBhbiBvdXRwdXQgY2FuIGJlIGNsb3NlZCB3aXRob3V0IGZvcmJpZGRpbmcKKyAgICAgICAgICogcGxheWJhY2sgdG8gYW55IGdpdmVuIGRldmljZS4KKyAgICAgICAgICogQHBhcmFtIG91dHB1dERlc2MgdGhlIG91dHB1dCB0byBjb25zaWRlcgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBjYW4gb25seSBiZSByZWFjaGVkIHZpYSB0aGUgb3V0cHV0LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAYnJpZWYgZ2V0SW5wdXRGb3JEZXZpY2Ugc2VsZWN0cyBhbiBpbnB1dCBoYW5kbGUgZm9yIGEgZ2l2ZW4gaW5wdXQgZGV2aWNlIGFuZAogICAgICAgICAgKiByZXF1ZXN0ZXIgY29udGV4dApAQCAtOTc1LDYgKzExNDEsOSBAQAogICAgICAgICBib29sICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CiAKICAgICAgICAgLy8gQ2FsbGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLgorICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKQEAgLTk5OCwyMSArMTE2NywyNSBAQAogICAgICAgICAgKiBAcGFyYW1bb3V0XSBoYW5kbGUgcGF0Y2ggaGFuZGxlIHRvIGJlIHByb3ZpZGVkIGlmIHBhdGNoIGluc3RhbGxlZCBjb3JyZWN0bHkKICAgICAgICAgICogQHBhcmFtW2luXSB1aWQgb2YgdGhlIGNsaWVudAogICAgICAgICAgKiBAcGFyYW1baW5dIGRlbGF5TXMgaWYgcmVxdWlyZWQKLSAgICAgICAgICogQHBhcmFtW2luXSBzb3VyY2VEZXNjIFtvcHRpb25hbF0gaW4gY2FzZSBvZiBleHRlcm5hbCBzb3VyY2UsIHNvdXJjZSBjbGllbnQgdG8gYmUKLSAgICAgICAgICogY29uZmlndXJlZCBieSB0aGUgcGF0Y2gsIGkuZS4gYXNzaWduaW5nIGFuIE91dHB1dCAoSFcgb3IgU1cpCisgICAgICAgICAqIEBwYXJhbVtpbl0gc291cmNlRGVzYyBzb3VyY2UgY2xpZW50IHRvIGJlIGNvbmZpZ3VyZWQgd2hlbiBjcmVhdGluZyB0aGUgcGF0Y2gsIGkuZS4KKyAgICAgICAgICogICAgICAgICAgICBhc3NpZ25pbmcgYW4gT3V0cHV0IChIVyBvciBTVykgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wuCiAgICAgICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgcGF0Y2ggaW5zdGFsbGVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MgPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBicmllZiByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbiBhdWRpbyBwYXRjaAogICAgICAgICAgKiBAcGFyYW1baW5dIGhhbmRsZSBvZiB0aGUgcGF0Y2ggdG8gYmUgcmVtb3ZlZAogICAgICAgICAgKiBAcGFyYW1baW5dIGRlbGF5TXMgaWYgcmVxdWlyZWQKKyAgICAgICAgICogQHBhcmFtW2luXSBzb3VyY2VEZXNjIFtvcHRpb25hbF0gaW4gY2FzZSBvZiBleHRlcm5hbCBzb3VyY2UsIHNvdXJjZSBjbGllbnQgdG8gYmUKKyAgICAgICAgICogdW5yb3V0ZWQgZnJvbSB0aGUgcGF0Y2gsIGkuZS4gYXNzaWduaW5nIGFuIE91dHB1dCAoSFcgb3IgU1cpCiAgICAgICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgcGF0Y2ggcmVtb3ZlZCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MgPSBudWxscHRyKTsKIAogICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAogICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKQEAgLTEwMzQsMTEgKzEyMDcsNDcgQEAKIAogICAgICAgICBib29sIGlzU2NvUmVxdWVzdGVkRm9yQ29tbSgpIGNvbnN0OwogCisgICAgICAgIGJvb2wgaXNIZWFyaW5nQWlkVXNlZEZvckNvbW0oKSBjb25zdDsKKwogICAgICAgICBib29sIGFyZUFsbEFjdGl2ZVRyYWNrc1Jlcm91dGVkKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0KTsKIAotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3Blbk91dHB1dFdpdGhQcm9maWxlQW5kRGV2aWNlKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBPcGVucyBhbiBvdXRwdXQgc3RyZWFtIGZyb20gdGhlIHN1cHBsaWVkIElPUHJvZmlsZSBhbmQgcm91dGUgaXQgdG8gdGhlCisgICAgICAgICAqIHN1cHBsaWVkIGF1ZGlvIGRldmljZXMuIElmIGEgbWl4ZXIgY29uZmlnIGlzIHNwZWNpZmllZCwgaXQgaXMgZm9yd2FyZGVkIHRvIGF1ZGlvCisgICAgICAgICAqIGZsaW5nZXIuIElmIG5vdCwgYSBkZWZhdWx0IGNvbmZpZyBpcyBkZXJpdmVkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gY29uZmlnLgorICAgICAgICAgKiBBbHNvIG9wZW5zIGEgZHVwbGljYXRpbmcgb3V0cHV0IGlmIG5lZWRlZCBhbmQgcXVlcmllcyB0aGUgYXVkaW8gSEFMIGZvciBzdXBwb3J0ZWQKKyAgICAgICAgICogYXVkaW8gcHJvZmlsZXMgaWYgdGhlIElPUHJvZmlsZSBpcyBkeW5hbWljLgorICAgICAgICAgKiBAcGFyYW1baW5dIHByb2ZpbGUgSU9Qcm9maWxlIHRvIHVzZSBhcyB0ZW1wbGF0ZQorICAgICAgICAgKiBAcGFyYW1baW5dIGRldmljZXMgaW5pdGlhbCByb3V0ZSB0byBhcHBseSB0byB0aGlzIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICogQHBhcmFtW2luXSBtaXhlckNvbmZpZyBpZiBub3QgbnVsbCwgdXNlIHRoaXMgdG8gY29uZmlndXJlIHRoZSBtaXhlcgorICAgICAgICAgKiBAcmV0dXJuIGFuIG91dHB1dCBkZXNjcmlwdG9yIGZvciB0aGUgbmV3bHkgb3BlbmVkIHN0cmVhbSBvciBudWxsIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3Blbk91dHB1dFdpdGhQcm9maWxlQW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZyA9IG51bGxwdHIpOwogCisgICAgICAgIGJvb2wgaXNPZmZsb2FkUG9zc2libGUoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZHVyYXRpb25JZ25vcmVkID0gZmFsc2UpOworCisgICAgICAgIC8vIGFkZHMgdGhlIHByb2ZpbGVzIGZyb20gdGhlIG91dHB1dFByb2ZpbGUgdG8gdGhlIHBhc3NlZCBhdWRpb1Byb2ZpbGVzVmVjdG9yCisgICAgICAgIC8vIHdpdGhvdXQgZHVwbGljYXRpbmcgdGhlbSBpZiBhbHJlYWR5IHByZXNlbnQKKyAgICAgICAgdm9pZCBhZGRQb3J0UHJvZmlsZXNUb1ZlY3RvcihzcDxJT1Byb2ZpbGU+IG91dHB1dFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3ImIGF1ZGlvUHJvZmlsZXNWZWN0b3IpOworCisgICAgICAgIC8vIFNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgcHJvZmlsZSB3aXRoIHRoZSBzYW1wbGUgcmF0ZSwgYXVkaW8gZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sKKyAgICAgICAgLy8gaW4gdGhlIGxpc3Qgb2YgcGFzc2VkIEh3TW9kdWxlKHMpLgorICAgICAgICAvLyByZXR1cm5zIGEgY29tcGF0aWJsZSBwcm9maWxlIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAgICBzcDxJT1Byb2ZpbGU+IHNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHdNb2R1bGVDb2xsZWN0aW9uJiBod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKKworICAgICAgICAvLyBGaWx0ZXJzIG9ubHkgdGhlIHJlbGV2YW50IGZsYWdzIGZvciBnZXRQcm9maWxlRm9yT3V0cHV0CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldFJlbGV2YW50RmxhZ3MgKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLCBib29sIGRpcmVjdE9ubHkpOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icAppbmRleCA0NTRjMDIwLi5jZGFkOWE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLmJwCkBAIC0xNiw2ICsxNiw4IEBACiAgICAgICAgICJBdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIiwKICAgICAgICAgIkF1ZGlvUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiQ2FwdHVyZVN0YXRlTm90aWZpZXIuY3BwIiwKKyAgICAgICAgIlNwYXRpYWxpemVyLmNwcCIsCisgICAgICAgICJTcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmNwcCIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMjcsNiArMjksNyBAQAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb2hhbCIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLApAQCAtMzQsMTkgKzM3LDI3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZWZmZWN0c2NvbmZpZyIsCiAgICAgICAgICJsaWJoYXJkd2FyZV9sZWdhY3kiLAorICAgICAgICAibGliaGVhZHRyYWNraW5nIiwKKyAgICAgICAgImxpYmhlYWR0cmFja2luZy1iaW5kaW5nIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlicGVybWlzc2lvbiIsCisgICAgICAgICJsaWJzZW5zb3IiLAogICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCisgICAgICAgICJzcGF0aWFsaXplci1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC01NSw2ICs2Niw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKICAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCkBAIC03MCw2ICs4Miw4IEBACiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJhY3Rpdml0eW1hbmFnZXJfYWlkbCIsCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmciLAorICAgICAgICAibGliaGVhZHRyYWNraW5nLWJpbmRpbmciLAogICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCBjZDUzMDczLi5jNzY2YTE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC00MCw3ICs0MCw4IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKQEAgLTU1LDE0ICs1NiwxOCBAQAogICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVzcG9uc2UgcmVzcG9uc2U7CiAKICAgICByZXF1ZXN0Lm1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobW9kdWxlKSk7Ci0gICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcpKTsKKyAgICByZXF1ZXN0LmhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqaGFsQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOworICAgIHJlcXVlc3QubWl4ZXJDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKm1peGVyQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShkZXZpY2UpKTsKICAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuT3V0cHV0KHJlcXVlc3QsICZyZXNwb25zZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAqb3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJlc3BvbnNlLm91dHB1dCkpOwotICAgICAgICAqY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXNwb25zZS5jb25maWcpKTsKKyAgICAgICAgKmhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVzcG9uc2UuY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgICAgICAqbGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KHJlc3BvbnNlLmxhdGVuY3lNcykpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMTMxLDkgKzEzNiwxMCBAQAogICAgIG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0IHJlcXVlc3Q7CiAgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOwogICAgIHJlcXVlc3QuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoKmlucHV0KSk7Ci0gICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcpKTsKKyAgICByZXF1ZXN0LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgcmVxdWVzdC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoZGV2aWNlVHlwZUFkZHIpKTsKLSAgICByZXF1ZXN0LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKHNvdXJjZSkpOworICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShzb3VyY2UpKTsKICAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOwogCiAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlIHJlc3BvbnNlOwpAQCAtMjcxLDYgKzI3NywxMSBAQAogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uUm91dGluZ1VwZGF0ZWQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworfQorCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpCiB7CiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKHVzZSk7CkBAIC0zMDEsNCArMzEyLDE1IEBACiAgICAgcmV0dXJuIGFmLT51cGRhdGVTZWNvbmRhcnlPdXRwdXRzKHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldERldmljZUNvbm5lY3RlZFN0YXRlKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIHsKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5zZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShwb3J0LCBjb25uZWN0ZWQpOworfQorCisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCAzZjAxZGU5Li43MGZkZmNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0zNDUsNyArMzQ1LDggQEAKICAgICAgICAgICAgIChzb3VyY2UgPiBBVURJT19TT1VSQ0VfTUFYICYmCiAgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCiAgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJgotICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORCkpIHsKICAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogVW5zdXBwb3J0ZWQgc291cmNlIHR5cGUgJWQiLCBzb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTM4Niw3ICszODcsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKLSAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgZGVzY3JpcHRvci50eXBlLCBvcFBhY2thZ2VOYW1lLCBkZXNjcmlwdG9yLnV1aWQsIHByaW9yaXR5LCAqaWQpOwogICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOwogICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KIApAQCAtNDUxLDcgKzQ1Miw3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAotICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCBkZXNjcmlwdG9yLnR5cGUsIG9wUGFja2FnZU5hbWUsIGRlc2NyaXB0b3IudXVpZCwgcHJpb3JpdHksICppZCk7CiAgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CiAgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgogCkBAIC01NDQsNiArNTQ1LDcgQEAKICAgICBDQU1DT1JERVJfU1JDX1RBRywKICAgICBWT0lDRV9SRUNfU1JDX1RBRywKICAgICBWT0lDRV9DT01NX1NSQ19UQUcsCisgICAgUkVNT1RFX1NVQk1JWF9TUkNfVEFHLAogICAgIFVOUFJPQ0VTU0VEX1NSQ19UQUcsCiAgICAgVk9JQ0VfUEVSRk9STUFOQ0VfU1JDX1RBRwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCA3NzIyM2I2Li5kZjQ5YmJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0zMiw2ICszMiw5IEBACiAgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBhaWRsX3V0aWxzOjpiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChfdG1wLmVycm9yKCkpOyBcCiAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7IH0pCiAKKyNkZWZpbmUgUkVUVVJOX0JJTkRFUl9TVEFUVVNfSUZfRVJST1IoeCkgXAorICAgIGlmIChzdGF0dXNfdCBfdG1wID0gKHgpOyBfdG1wICE9IE9LKSByZXR1cm4gYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoX3RtcCk7CisKICNkZWZpbmUgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUih4KSAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgYmluZGVyOjpTdGF0dXMgX3RtcCA9ICh4KTsgICAgIFwKQEAgLTQ0LDYgKzQ3LDE5IEBACiB1c2luZyBiaW5kZXI6OlN0YXR1czsKIHVzaW5nIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUOwogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VBZGRyZXNzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50OwogCiBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb191c2FnZV90PiYgU1lTVEVNX1VTQUdFUyA9IHsKICAgICBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVCwKQEAgLTYzLDE3ICs3OSwyNCBAQAogICAgICAgICAhPSBzdGQ6OmVuZChtU3VwcG9ydGVkU3lzdGVtVXNhZ2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp2YWxpZGF0ZVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKLSAgICAgcmV0dXJuIHZhbGlkYXRlVXNhZ2UodXNhZ2UsIGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dmFsaWRhdGVVc2FnZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIpIHsKKyAgICAgcmV0dXJuIHZhbGlkYXRlVXNhZ2UoYXR0ciwgZ2V0Q2FsbGluZ0F0dHJpYnV0aW9uU291cmNlKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSwKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dmFsaWRhdGVVc2FnZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCiAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgaWYgKGlzU3lzdGVtVXNhZ2UodXNhZ2UpKSB7Ci0gICAgICAgIGlmIChpc1N1cHBvcnRlZFN5c3RlbVVzYWdlKHVzYWdlKSkgewotICAgICAgICAgICAgaWYgKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCgicGVybWlzc2lvbiBkZW5pZWQ6IG1vZGlmeSBhdWRpbyByb3V0aW5nIG5vdCBhbGxvd2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgImZvciBhdHRyaWJ1dGlvblNvdXJjZSAlcyIpLCBhdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGlmIChpc1N5c3RlbVVzYWdlKGF0dHIudXNhZ2UpKSB7CisgICAgICAgIGlmIChpc1N1cHBvcnRlZFN5c3RlbVVzYWdlKGF0dHIudXNhZ2UpKSB7CisgICAgICAgICAgICBpZiAoYXR0ci51c2FnZSA9PSBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVAorICAgICAgICAgICAgICAgICAgICAmJiAoKGF0dHIuZmxhZ3MgJiBBVURJT19GTEFHX0NBTExfUkVESVJFQ1RJT04pICE9IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjYWxsQXVkaW9JbnRlcmNlcHRpb25BbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbGwgYXVkaW8gaW50ZXJjZXB0aW9uIG5vdCBhbGxvd2VkIGZvciBhdHRyaWJ1dGlvbiBzb3VyY2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChhdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG1vZGlmeSBhdWRpbyByb3V0aW5nIG5vdCBhbGxvd2VkIGZvciBhdHRyaWJ1dGlvbiBzb3VyY2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTk2LDE2ICsxMTksMTMgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZUFpZGwsCiAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlIHN0YXRlQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZU5hbWVBaWRsLAotICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdEFpZGwpIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsLnR5cGUpKTsKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKKyAgICAgICAgY29uc3QgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgZW5jb2RlZEZvcm1hdEFpZGwpIHsKICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9saWN5RGV2aWNlU3RhdGVfYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90KHN0YXRlQWlkbCkpOwogICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGVuY29kZWRGb3JtYXRBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGVuY29kZWRGb3JtYXRBaWRsKSk7CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKQEAgLTEyMSwzOSArMTQxLDQ1IEBACiAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUFpZGwuYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWVBaWRsLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgIHN0YXRlLCBwb3J0LCBlbmNvZGVkRm9ybWF0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBkZXZpY2VBaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IEF1ZGlvRGV2aWNlJiBkZXZpY2VBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsLnR5cGUpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3M7CisgICAgUkVUVVJOX0JJTkRFUl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoZGV2aWNlQWlkbCwgJmRldmljZSwgJmFkZHJlc3MpKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3RfQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQWlkbC5hZGRyZXNzLmNfc3RyKCkpKSk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3MuY19zdHIoKSkpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2UmIGRldmljZUFpZGwsCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VOYW1lQWlkbCwKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXRBaWRsKSB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CisgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGVuY29kZWRGb3JtYXRBaWRsKSB7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIFJFVFVSTl9CSU5ERVJfU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKGRldmljZUFpZGwsICZkZXZpY2UsICZhZGRyZXNzKSk7CiAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoZW5jb2RlZEZvcm1hdEFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoZW5jb2RlZEZvcm1hdEFpZGwpKTsKIAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwpAQCAtMTY1LDEyICsxOTEsMTYgQEAKICAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgZGV2aWNlQWlkbC5hZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZUFpZGwuY19zdHIoKSwgZW5jb2RlZEZvcm1hdCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9ICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoCisgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3MuY19zdHIoKSwgZGV2aWNlTmFtZUFpZGwuY19zdHIoKSwgZW5jb2RlZEZvcm1hdCk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgb25DaGVja1NwYXRpYWxpemVyX2woKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUobWVkaWE6OkF1ZGlvTW9kZSBzdGF0ZUFpZGwsIGludDMyX3QgdWlkQWlkbCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoQXVkaW9Nb2RlIHN0YXRlQWlkbCwgaW50MzJfdCB1aWRBaWRsKQogewogICAgIGF1ZGlvX21vZGVfdCBzdGF0ZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChzdGF0ZUFpZGwpKTsKQEAgLTE5Miw3ICsyMjIsMTUgQEAKICAgICAvLyBjYW4gYmUgaW50ZXJsZWF2ZWQpLgogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgotICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKKworICAgIC8vIEF1ZGlvIEhBTCBtb2RlIGNvbnZlcnNpb24gZm9yIGNhbGwgcmVkaXJlY3QgbW9kZXMKKyAgICBhdWRpb19tb2RlX3QgaGFsTW9kZSA9IHN0YXRlOworICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX0NBTExfUkVESVJFQ1QpIHsKKyAgICAgICAgaGFsTW9kZSA9IEFVRElPX01PREVfQ0FMTF9TQ1JFRU47CisgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1QpIHsKKyAgICAgICAgaGFsTW9kZSA9IEFVRElPX01PREVfTk9STUFMOworICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShoYWxNb2RlKTsKIAogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UGhvbmVTdGF0ZShzdGF0ZSk7CkBAIC0yMDIsNyArMjQwLDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUqIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZShBdWRpb01vZGUqIF9haWRsX3JldHVybikgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZGVfdF9BdWRpb01vZGUobVBob25lU3RhdGUpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwpAQCAtMjM0LDYgKzI3Miw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIApAQCAtMjU3LDcgKzI5Niw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pCiB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKQEAgLTI4MSw3ICszMjAsNyBAQAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnJiBjb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyYgY29uZmlnQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFnc0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZEFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpHZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UqIF9haWRsX3JldHVybikKQEAgLTI5Miw3ICszMzEsNyBAQAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3Qoc2Vzc2lvbkFpZGwpKTsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uZmlnQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uZmlnQWlkbCwgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9tYXNrKGZsYWdzQWlkbCkpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMzA4LDcgKzM0Nyw3IEBACiAKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKAogICAgICAgICAgICAgYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHIsICI2ODk1Mzk1MCIpKSk7Ci0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHIudXNhZ2UsIGF0dHJpYnV0aW9uU291cmNlKSkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyLCBhdHRyaWJ1dGlvblNvdXJjZSkpKTsKIAogICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0zMzMsMTUgKzM3MiwyNiBAQAogICAgICAgICBhdHRyLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKICAgICAgICAgICAgICAgICBhdHRyLmZsYWdzICYgfihBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZfEFVRElPX0ZMQUdfQllQQVNTX01VVEUpKTsKICAgICB9CisKKyAgICBpZiAoYXR0ci5jb250ZW50X3R5cGUgPT0gQVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQpIHsKKyAgICAgICAgaWYgKCFhY2Nlc3NVbHRyYXNvdW5kQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQ6IHVsdHJhc291bmQgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQpOworICAgICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6Om91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKKyAgICBib29sIGlzU3BhdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCAmb3V0cHV0LCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU3BhdGlhbGl6ZWQpOwogCiAgICAgLy8gRklYTUU6IEludHJvZHVjZSBhIHdheSB0byBjaGVjayBmb3IgdGhlIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGJlZm9yZSBvcGVuaW5nIHRoZSBvdXRwdXQKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CkBAIC0zNTAsNyArNDAwLDEyIEBACiAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9PVVRQVVRfTEVHQUNZOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9PVVRQVVRfVEVMRVBIT05ZX1RYOgotICAgICAgICAgICAgaWYgKCFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgIGlmICgoKGF0dHIuZmxhZ3MgJiBBVURJT19GTEFHX0NBTExfUkVESVJFQ1RJT04pICE9IDApCisgICAgICAgICAgICAgICAgJiYgIWNhbGxBdWRpb0ludGVyY2VwdGlvbkFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgcGVybWlzc2lvbiBkZW5pZWQ6IGNhbGwgcmVkaXJlY3Rpb24gbm90IGFsbG93ZWQgZm9yIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS51aWQpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgfSBlbHNlIGlmICghbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgcGVybWlzc2lvbiBkZW5pZWQ6IG1vZGlmeSBwaG9uZSBzdGF0ZSBub3QgYWxsb3dlZCBmb3IgdWlkICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUEVSTUlTU0lPTl9ERU5JRUQ7CkBAIC0zNzMsNyArNDI4LDcgQEAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9CiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUGxheWJhY2tDbGllbnQoYXR0ciwgb3V0cHV0LCBhZGpBdHRyaWJ1dGlvblNvdXJjZSwgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgcG9ydElkLCBzZWxlY3RlZERldmljZUlkLCBzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBwb3J0SWQsIHNlbGVjdGVkRGV2aWNlSWQsIHN0cmVhbSwgaXNTcGF0aWFsaXplZCk7CiAgICAgICAgIG1BdWRpb1BsYXliYWNrQ2xpZW50cy5hZGQocG9ydElkLCBjbGllbnQpOwogCiAgICAgICAgIF9haWRsX3JldHVybi0+b3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0zODcsNiArNDQyLDcgQEAKICAgICAgICAgX2FpZGxfcmV0dXJuLT5zZWNvbmRhcnlPdXRwdXRzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4oc2Vjb25kYXJ5T3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KSk7CisgICAgICAgIF9haWRsX3JldHVybi0+aXNTcGF0aWFsaXplZCA9IGlzU3BhdGlhbGl6ZWQ7CiAgICAgfQogICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChyZXN1bHQpOwogfQpAQCAtNDMyLDYgKzQ4OCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQocG9ydElkKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgb25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc19sKCk7CiAgICAgfQogICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQpAQCAtNDY5LDYgKzUyNiw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChwb3J0SWQpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgb25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc19sKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC00OTksOCArNTU3LDEwIEBACiAgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2xpZW50ICE9IG51bGxwdHIgJiYgY2xpZW50LT5hY3RpdmUpIHsKKyAgICAgICAgb25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc19sKCk7CisgICAgfQogICAgIG1BdWRpb1BsYXliYWNrQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7Ci0KICAgICAvLyBjYWxsZWQgZnJvbSBpbnRlcm5hbCB0aHJlYWQ6IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5CiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQpAQCAtNTEwLDcgKzU3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByaWlkQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZ0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWdCYXNlJiBjb25maWdBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3NBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZEFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkdldElucHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKQEAgLTUyMyw3ICs1ODMsNyBAQAogICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uQWlkbCkpOwogICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25maWdBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25maWdBaWRsLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soZmxhZ3NBaWRsKSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC01NDgsNyArNjA4LDggQEAKICAgICAgICAgICAgIHx8IChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UCiAgICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQKICAgICAgICAgICAgICAgICAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIKLSAgICAgICAgICAgICAgICAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CisgICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCisgICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KIApAQCAtNTc3LDMyICs2MzgsNDMgQEAKICAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UucGlkID0gY2FsbGluZ1BpZDsKICAgICB9CiAKLSAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0ci51c2FnZSwKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0ciwKICAgICAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlKSkpOwogCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucy4KLSAgICAvLyBDYXB0dXJpbmcgZnJvbSBGTV9UVU5FUiBzb3VyY2UgaXMgY29udHJvbGxlZCBieSBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZCgpIGFuZAotICAgIC8vIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKSAoZGVwcmVjYXRlZCkgYXMgdGhpcyBkb2VzIG5vdCBhZmZlY3QgdXNlcnMgcHJpdmFjeQotICAgIC8vIGFzIGRvZXMgY2FwdHVyaW5nIGZyb20gYW4gYWN0dWFsIG1pY3JvcGhvbmUuCi0gICAgaWYgKCEocmVjb3JkaW5nQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSwgYXR0ci5zb3VyY2UpCi0gICAgICAgICAgICB8fCBhdHRyLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpKSB7CisgICAgLy8gQ2FwdHVyaW5nIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzIGRvZXMgbm90IHJlcXVpcmUgcGVybWlzc2lvbiBSRUNPUkRfQVVESU8KKyAgICAvLyBhcyB0aGUgY2FwdHVyZWQgYXVkaW8gZG9lcyBub3QgY29tZSBmcm9tIGEgbWljcm9waG9uZToKKyAgICAvLyAtIEZNX1RVTkVSIHNvdXJjZSBpcyBjb250cm9sbGVkIGJ5IGNhcHR1cmVUdW5lckF1ZGlvSW5wdXRBbGxvd2VkKCkgb3IKKyAgICAvLyBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCkgKGRlcHJlY2F0ZWQpLgorICAgIC8vIC0gUkVNT1RFX1NVQk1JWCBzb3VyY2UgaXMgY29udHJvbGxlZCBieSBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCkgaWYgdGhlIGlucHV0CisgICAgLy8gdHlwZSBpcyBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURSBhbmQgYnkgQXVkaW9TZXJ2aWNlIGlmIGEgbWVkaWEgcHJvamVjdGlvbgorICAgIC8vIGlzIHVzZWQgYW5kIGlucHV0IHR5cGUgaXMgQVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSworICAgIC8vIC0gRUNIT19SRUZFUkVOQ0Ugc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpCisgICAgaWYgKCEocmVjb3JkaW5nQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSwgaW5wdXRTb3VyY2UpCisgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIKKyAgICAgICAgICAgIHx8IGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIGZvciAlcyIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFkakF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQogCiAgICAgYm9vbCBjYW5DYXB0dXJlT3V0cHV0ID0gY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIHx8Ci0gICAgICAgIGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyB8fAotICAgICAgICBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCB8fAotICAgICAgICBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpCi0gICAgICAgICYmICFjYW5DYXB0dXJlT3V0cHV0KSB7CisgICAgYm9vbCBjYW5JbnRlcmNlcHRDYWxsQXVkaW8gPSBjYWxsQXVkaW9JbnRlcmNlcHRpb25BbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBib29sIGlzQ2FsbEF1ZGlvU291cmNlID0gaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSworICAgICAgICAgICAgIHx8IGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSworICAgICAgICAgICAgIHx8IGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOworCisgICAgaWYgKGlzQ2FsbEF1ZGlvU291cmNlICYmICFjYW5JbnRlcmNlcHRDYWxsQXVkaW8gJiYgIWNhbkNhcHR1cmVPdXRwdXQpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9Ci0KKyAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCisgICAgICAgICAgICAmJiAhY2FuQ2FwdHVyZU91dHB1dCkgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOworICAgIH0KICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCi0gICAgICAgICYmICFjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkKLSAgICAgICAgJiYgIWNhbkNhcHR1cmVPdXRwdXQpIHsKKyAgICAgICAgJiYgIWNhbkNhcHR1cmVPdXRwdXQKKyAgICAgICAgJiYgIWNhcHR1cmVUdW5lckF1ZGlvSW5wdXRBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIApAQCAtNjE4LDYgKzY5MCwxNCBAQAogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIAorICAgIGlmIChhdHRyLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORCkgeworICAgICAgICBpZiAoIWFjY2Vzc1VsdHJhc291bmRBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZDogdWx0cmFzb3VuZCBub3QgYWxsb3dlZCBmb3IgdWlkICVkIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS51aWQsIGFkakF0dHJpYnV0aW9uU291cmNlLnBpZCk7CisgICAgICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOworICAgICAgICB9CisgICAgfQorCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIHN0YXR1c190IHN0YXR1czsKQEAgLTY0NCwyMyArNzI0LDMwIEBACiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTEVHQUNZOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX1RFTEVQSE9OWV9SWDoKKyAgICAgICAgICAgICAgICBpZiAoKGF0dHIuZmxhZ3MgJiBBVURJT19GTEFHX0NBTExfUkVESVJFQ1RJT04pICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhbkludGVyY2VwdENhbGxBdWRpbykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHVzZSB0aGUgc2FtZSBwZXJtaXNzaW9uIGFzIGZvciByZW1vdGUgc3VibWl4IGZvciBub3cuCisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTUlYX0NBUFRVUkU6CiAgICAgICAgICAgICAgICAgaWYgKCFjYW5DYXB0dXJlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogY2FwdHVyZSBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IGNhcHR1cmUgbm90IGFsbG93ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOgotICAgICAgICAgICAgICAgIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldElucHV0Rm9yQXR0cigpIHBlcm1pc3Npb24gZGVuaWVkOiBtb2RpZnkgYXVkaW8gcm91dGluZyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICAgIGlmICghKG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGF0dHIuZmxhZ3MgJiBBVURJT19GTEFHX0NBTExfUkVESVJFQ1RJT04pICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjYW5JbnRlcmNlcHRDYWxsQXVkaW8pKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQgZm9yIHJlbW90ZSBzdWJtaXggY2FwdHVyZSIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0lOVkFMSUQ6CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImdldElucHV0Rm9yQXR0cigpIGVuY291bnRlcmVkIGFuIGludmFsaWQgaW5wdXQgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KWlucHV0VHlwZSk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMgZW5jb3VudGVyZWQgYW4gaW52YWxpZCBpbnB1dCB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAoaW50KWlucHV0VHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzMwLDggKzgxNywxMCBAQAogCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwogICAgIGlmICghKHN0YXJ0UmVjb3JkaW5nKGNsaWVudC0+YXR0cmlidXRpb25Tb3VyY2UsIFN0cmluZzE2KG1zZy5zdHIoKS5jX3N0cigpKSwKLSAgICAgICAgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkKLSAgICAgICAgICAgIHx8IGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpCisgICAgICAgICAgICB8fCBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUgorICAgICAgICAgICAgfHwgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgfHwgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIGZvciBhdHRyaWJ1dGlvbiBzb3VyY2UgJXMiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPmF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CkBAIC05MDEsNyArOTkwLDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXhNaW5BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4TWF4QWlkbCkgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC05MjQsMTMgKzEwMTMsMTQgQEAKICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fRVJST1IpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUFpZGwsIGludDMyX3QgaW5kZXhBaWRsKSB7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4QWlkbCkgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CiAgICAgaW50IGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CkBAIC05NDgsMTIgKzEwMzgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKICAgICBpbnQgaW5kZXg7CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC05NzEsMTIgKzEwNjIsMTMgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLCBpbnQzMl90IGRldmljZUFpZGwsIGludDMyX3QgaW5kZXhBaWRsKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ckFpZGwsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZUFpZGwsIGludDMyX3QgaW5kZXhBaWRsKSB7CiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOwogICAgIGludCBpbmRleCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4QWlkbCkpOwogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAogICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICIxNjk1NzI2NDEiKSkpOwogCkBAIC05OTMsMTEgKzEwODUsMTIgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLCBpbnQzMl90IGRldmljZUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJBaWRsKSk7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOwogICAgIGludCBpbmRleDsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAogICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICIxNjk1NzI2NDEiKSkpOwpAQCAtMTA1MSw3ICsxMTQ0LDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CkBAIC0xMDczLDMwICsxMTY2LDkgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi0vL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKLQotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7Ci0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoQVVESU9fREVWSUNFX05PTkUpKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSkpKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXgmIGF0dHJBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikKIHsKICAgICBBdWRpb0F0dHJpYnV0ZXMgYWEgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0V4X0F1ZGlvQXR0cmlidXRlcyhhdHRyQWlkbCkpOwpAQCAtMTEwOCwxMCArMTE4MCwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYWEuZ2V0QXR0cmlidXRlcygpLCAmZGV2aWNlcykpKTsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICBhYS5nZXRBdHRyaWJ1dGVzKCksICZkZXZpY2VzLCBmb3JWb2x1bWUpKSk7CiAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIApAQCAtMTE5Nyw3ICsxMjcwLDcgQEAKICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobUF1ZGlvUG9saWN5TWFuYWdlci0+bW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90IGluUGFzdE1zQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90IGluUGFzdE1zQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CkBAIC0xMjE2LDcgKzEyODksNyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpblBhc3RNc0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0xMjM2LDkgKzEzMDksOSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlQWlkbCwgYm9vbCogX2FpZGxfcmV0dXJuKSB7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShBdWRpb1NvdXJjZSBzb3VyY2VBaWRsLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChzb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChzb3VyY2VBaWRsKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQpAQCAtMTI2Niw3ICsxMzM5LDcgQEAKIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZygKICAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb25BaWRsLAotICAgICAgICBtZWRpYTo6SW50KiBjb3VudEFpZGwsCisgICAgICAgIEludCogY291bnRBaWRsLAogICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGF1ZGlvU2Vzc2lvbkFpZGwpKTsKQEAgLTEyOTAsMTEgKzEzNjMsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHR5cGVBaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBBdWRpb1V1aWQmIHR5cGVBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHV1aWRBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1V1aWQmIHV1aWRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlIHNvdXJjZUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIGVmZmVjdF91dWlkX3QgdHlwZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdCh0eXBlQWlkbCkpOwpAQCAtMTMwMyw3ICsxMzc2LDcgQEAKICAgICBlZmZlY3RfdXVpZF90IHV1aWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodXVpZEFpZGwpKTsKICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChzb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChzb3VyY2VBaWRsKSk7CiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQ7CiAKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwpAQCAtMTMxNywxMCArMTM5MCwxMCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IEF1ZGlvVXVpZCYgdHlwZUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdXVpZEFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksIG1lZGlhOjpBdWRpb1VzYWdlIHVzYWdlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9VdWlkJiB1dWlkQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgQXVkaW9Vc2FnZSB1c2FnZUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIGVmZmVjdF91dWlkX3QgdHlwZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdCh0eXBlQWlkbCkpOwpAQCAtMTM2OCw3ICsxNDQxLDcgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Vc2FnZT4mIHN5c3RlbVVzYWdlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9Vc2FnZT4mIHN5c3RlbVVzYWdlc0FpZGwpIHsKICAgICBzaXplX3Qgc2l6ZSA9IHN5c3RlbVVzYWdlc0FpZGwuc2l6ZSgpOwogICAgIGlmIChzaXplID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CiAgICAgICAgIHNpemUgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CkBAIC0xNDA3LDcgKzE0ODAsNyBAQAogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkLCBjYXB0dXJlUG9saWN5KSk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvJiBpbmZvQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IEF1ZGlvT2ZmbG9hZEluZm8mIGluZm9BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGUqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvT2ZmbG9hZEluZm9fYXVkaW9fb2ZmbG9hZF9pbmZvX3QoaW5mb0FpZGwpKTsKQEAgLTE0MjMsMTEgKzE0OTYsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZ0FpZGwsCisgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnQWlkbCwKICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyaWJ1dGVzQWlkbCwKICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbmZpZ0FpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbmZpZ0FpZGwsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyaWJ1dGVzQWlkbCkpOwogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCkBAIC0xNDM4LDcgKzE1MTEsNyBAQAogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogCi0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMudXNhZ2UpKSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMpKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICpfYWlkbF9yZXR1cm4gPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOwpAQCAtMTQ0Nyw3ICsxNTIwLDcgQEAKIAogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGVBaWRsLCBtZWRpYTo6SW50KiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGVBaWRsLCBJbnQqIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUG9ydD4qIHBvcnRzQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTE0NzksMTIgKzE1NTIsOSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwb3J0QWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChpbnQgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQqIF9haWRsX3JldHVybikgewotICAgIGF1ZGlvX3BvcnRfdjcgcG9ydCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcocG9ydEFpZGwpKTsKLSAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydChwb3J0KSkpOwotCisgICAgYXVkaW9fcG9ydF92NyBwb3J0eyAuaWQgPSBwb3J0SWQgfTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwpAQCAtMTUzNSw3ICsxNjA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9QYXRjaGVzKG1lZGlhOjpJbnQqIGNvdW50LAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUGF0Y2hlcyhJbnQqIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4qIHBhdGNoZXNBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICB1bnNpZ25lZCBpbnQgbnVtX3BhdGNoZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTE2MDIsNyArMTY3Miw3IEBACiAgICAgX2FpZGxfcmV0dXJuLT5pb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOwogICAgIF9haWRsX3JldHVybi0+ZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTE2NzIsNyArMTc0Miw3IEBACiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVpZERldmljZUFmZmluaXRpZXMoCiAgICAgICAgIGludDMyX3QgdWlkQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgewogICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QodWlkQWlkbCkpOwogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPihkZXZpY2VzQWlkbCwKQEAgLTE3MDUsNyArMTc3NSw3IEBACiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVzZXJJZERldmljZUFmZmluaXRpZXMoCiAgICAgICAgIGludDMyX3QgdXNlcklkQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgewogICAgIGludCB1c2VySWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8aW50Pih1c2VySWRBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KGRldmljZXNBaWRsLApAQCAtMTc1NCw3ICsxODI0LDcgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KIAotICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyaWJ1dGVzLnVzYWdlKSkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyaWJ1dGVzKSkpOwogCiAgICAgLy8gc3RhcnRBdWRpb1NvdXJjZSBzaG91bGQgYmUgY3JlYXRlZCBhcyB0aGUgY2FsbGluZyB1aWQKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwpAQCAtMTgwMiwxMyArMTg3MiwxNCBAQAogfQogCiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZURCKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCBpbmRleEFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUFpZGwsIGZsb2F0KiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZURCKAorICAgICAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCBpbmRleEFpZGwsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZUFpZGwsIGZsb2F0KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwogICAgIGludCBpbmRleCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4QWlkbCkpOwogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKIAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwpAQCAtMTgxOSw4ICsxODkwLDggQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdXJyb3VuZEZvcm1hdHMobWVkaWE6OkludCogY291bnQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIGZvcm1hdHMsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdXJyb3VuZEZvcm1hdHMoSW50KiBjb3VudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4qIGZvcm1hdHMsCiAgICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+KiBmb3JtYXRzRW5hYmxlZCkgewogICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGNvdW50LT52YWx1ZSkpOwpAQCAtMTg0Miw3ICsxOTEzLDggQEAKICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBzdGQ6Om1pbihudW1TdXJyb3VuZEZvcm1hdHMsIG51bVN1cnJvdW5kRm9ybWF0c1JlcSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShzdXJyb3VuZEZvcm1hdHMuZ2V0KCksIHN1cnJvdW5kRm9ybWF0cy5nZXQoKSArIG51bVN1cnJvdW5kRm9ybWF0c1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKmZvcm1hdHMpLCBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKmZvcm1hdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24pKSk7CiAgICAgZm9ybWF0c0VuYWJsZWQtPmluc2VydCgKICAgICAgICAgICAgIGZvcm1hdHNFbmFibGVkLT5iZWdpbigpLAogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZC5nZXQoKSwKQEAgLTE4NTIsNyArMTkyNCw3IEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKAotICAgICAgICBtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cykgeworICAgICAgICBJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiogZm9ybWF0cykgewogICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGNvdW50LT52YWx1ZSkpOwogICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKQEAgLTE4NzIsMTMgKzE5NDQsMTUgQEAKICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBzdGQ6Om1pbihudW1TdXJyb3VuZEZvcm1hdHMsIG51bVN1cnJvdW5kRm9ybWF0c1JlcSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShzdXJyb3VuZEZvcm1hdHMuZ2V0KCksIHN1cnJvdW5kRm9ybWF0cy5nZXQoKSArIG51bVN1cnJvdW5kRm9ybWF0c1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKmZvcm1hdHMpLCBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKmZvcm1hdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24pKSk7CiAgICAgY291bnQtPnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPHVpbnQzMl90PihudW1TdXJyb3VuZEZvcm1hdHMpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlQWlkbCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4qIF9haWRsX3JldHVybikgewogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtMTg4NiwxOSArMTk2MCwyMSBAQAogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOwogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCZmb3JtYXRzKSkpOworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKGRldmljZSwgJmZvcm1hdHMpKSk7CiAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+PigKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4+KAogICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKAotICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXRBaWRsLCBib29sIGVuYWJsZWQpIHsKKyAgICAgICAgY29uc3QgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgYXVkaW9Gb3JtYXRBaWRsLCBib29sIGVuYWJsZWQpIHsKICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYXVkaW9Gb3JtYXRBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGF1ZGlvRm9ybWF0QWlkbCkpOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KQEAgLTE5MDgsMzQgKzE5ODQsNDMgQEAKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCkpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBc3Npc3RhbnRVaWQoaW50MzJfdCB1aWRBaWRsKQotewotICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QodWlkQWlkbCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVVpZFBvbGljeS0+c2V0QXNzaXN0YW50VWlkKHVpZCk7CitTdGF0dXMgY29udmVydEludDMyVmVjdG9yVG9VaWRWZWN0b3JXaXRoTGltaXQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzQWlkbCwgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSB7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgY29udmVydFJhbmdlV2l0aExpbWl0KHVpZHNBaWRsLmJlZ2luKCksCisgICAgICAgICAgICB1aWRzQWlkbC5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih1aWRzKSwKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QsCisgICAgICAgICAgICBNQVhfSVRFTVNfUEVSX0xJU1QpKSk7CisKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZChpbnQzMl90IHVpZEFpZGwpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHVpZHNBaWRsKQogewotICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QodWlkQWlkbCkpOworICAgIHN0ZDo6dmVjdG9yPHVpZF90PiB1aWRzOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoY29udmVydEludDMyVmVjdG9yVG9VaWRWZWN0b3JXaXRoTGltaXQodWlkc0FpZGwsIHVpZHMpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVVpZFBvbGljeS0+c2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBc3Npc3RhbnRVaWRzKHVpZHMpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFjdGl2ZVVpZHNBaWRsKSB7CisgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IGFjdGl2ZVVpZHM7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihjb252ZXJ0SW50MzJWZWN0b3JUb1VpZFZlY3RvcldpdGhMaW1pdChhY3RpdmVVaWRzQWlkbCwgYWN0aXZlVWlkcykpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBY3RpdmVBc3Npc3RhbnRVaWRzKGFjdGl2ZVVpZHMpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHVpZHNBaWRsKQogewotICAgIHNpemVfdCBzaXplID0gdWlkc0FpZGwuc2l6ZSgpOwotICAgIGlmIChzaXplID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgIHNpemUgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgfQogICAgIHN0ZDo6dmVjdG9yPHVpZF90PiB1aWRzOwotICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBjb252ZXJ0UmFuZ2UodWlkc0FpZGwuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aWRzQWlkbC5iZWdpbigpICsgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodWlkcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCkpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGNvbnZlcnRJbnQzMlZlY3RvclRvVWlkVmVjdG9yV2l0aExpbWl0KHVpZHNBaWRsLCB1aWRzKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1VaWRQb2xpY3ktPnNldEExMXlVaWRzKHVpZHMpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CkBAIC0xOTYwLDYgKzIwNDUsMTcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1VsdHJhc291bmRTdXBwb3J0ZWQoYm9vbCogX2FpZGxfcmV0dXJuKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgKl9haWRsX3JldHVybiA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKAogICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9kdWN0U3RyYXRlZ3k+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciBzdHJhdGVnaWVzOwpAQCAtMjA0OSw3ICsyMTQ1LDcgQEAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koCiAgICAgICAgIGludDMyX3Qgc3RyYXRlZ3lBaWRsLAogICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgewogICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3Qoc3RyYXRlZ3lBaWRsKSk7CiAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0yMDYyLDggKzIxNTgsMTEgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgb25DaGVja1NwYXRpYWxpemVyX2woKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7CiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koaW50MzJfdCBzdHJhdGVneUFpZGwsCkBAIC0yMDc2LDE0ICsyMTc1LDE3IEBACiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlKSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KAogICAgICAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgeworICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgewogICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3Qoc3RyYXRlZ3lBaWRsKSk7CiAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0yMDk3LDggKzIxOTksOCBAQAogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTIxMDksMTEgKzIyMTEsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsLAogICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgewogICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOwogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMjEyOSwxMSArMjIzMSwxMSBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCi0gICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsLAorICAgICAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwsCiAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0yMTQ5LDExICsyMjUxLDExIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwsCisgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CiAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VSb2xlX2RldmljZV9yb2xlX3Qocm9sZUFpZGwpKTsKICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTIxNjgsMTAgKzIyNzAsMTAgQEAKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAKQEAgLTIxODQsMTEgKzIyODYsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsLAogICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOwpAQCAtMjIwMCw4ICsyMzAyLDkxIEBACiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpKTsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTcGF0aWFsaXplcigKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIG1lZGlhOjpHZXRTcGF0aWFsaXplclJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBfYWlkbF9yZXR1cm4tPnNwYXRpYWxpemVyID0gbnVsbHB0cjsKKyAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgaWYgKG1TcGF0aWFsaXplciAhPSBudWxscHRyKSB7CisgICAgICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoCisgICAgICAgICAgICAgICAgYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobVNwYXRpYWxpemVyLT5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKSkpOworICAgICAgICBfYWlkbF9yZXR1cm4tPnNwYXRpYWxpemVyID0gbVNwYXRpYWxpemVyOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjYW5CZVNwYXRpYWxpemVkKAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbD4mIGF0dHJBaWRsLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPEF1ZGlvQ29uZmlnPiYgY29uZmlnQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCwKKyAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICBpZiAoYXR0ckFpZGwuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgYXR0ciA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJBaWRsLnZhbHVlKCkpKTsKKyAgICB9CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGlmIChjb25maWdBaWRsLmhhc192YWx1ZSgpKSB7CisgICAgICAgIGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uZmlnQWlkbC52YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICB9CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KGRldmljZXNBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICpfYWlkbF9yZXR1cm4gPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jYW5CZVNwYXRpYWxpemVkKCZhdHRyLCAmY29uZmlnLCBkZXZpY2VzKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsICZhdHRyQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyAmY29uZmlnQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlICpfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKKyAgICB9CisgICAgaWYgKF9haWRsX3JldHVybiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJBaWRsKSk7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25maWdBaWRsLCBmYWxzZSAvKmlzSW5wdXQqLykpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU+KAorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9pbnQzMl90X21hc2soCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmNvbmZpZykpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiogX2FpZGxfcmV0dXJuKSB7CisgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKKyAgICB9CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCZhdHRyLCBhdWRpb1Byb2ZpbGVzKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4+KAorICAgICAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXMsIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZV9jb21tb24sIGZhbHNlIC8qaXNJbnB1dCovKSk7CisKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggNGQwZTFmMS4uZTdkOTQ1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgpAQCAtNjAsNiArNjEsMTIwIEBACiAKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTWFuYWdlQXVkaW9Qb2xpY3lQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0FVRElPX1BPTElDWSIpOwogCisvLyBDcmVhdGVzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gQmluZGVyIGNvZGUgdG8gbmFtZSBmb3IgSUF1ZGlvUG9saWN5U2VydmljZS4KKyNkZWZpbmUgSUFVRElPUE9MSUNZU0VSVklDRV9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QgXAorQklOREVSX01FVEhPRF9FTlRSWShvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRQaG9uZVN0YXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEZvcmNlVXNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEZvcmNlVXNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRPdXRwdXRGb3JBdHRyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0YXJ0T3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0b3BPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZU91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRJbnB1dEZvckF0dHIpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3RhcnRJbnB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdG9wSW5wdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZUlucHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGluaXRTdHJlYW1Wb2x1bWUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0U3RyZWFtVm9sdW1lSW5kZXgpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0U3RyZWFtVm9sdW1lSW5kZXgpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERldmljZXNGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE91dHB1dEZvckVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlckVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWSh1bnJlZ2lzdGVyRWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEVmZmVjdEVuYWJsZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobW92ZUVmZmVjdHNUb0lvKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzU3RyZWFtQWN0aXZlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoaXNTb3VyY2VBY3RpdmUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZykgXAorQklOREVSX01FVEhPRF9FTlRSWShhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGFkZFN0cmVhbURlZmF1bHRFZmZlY3QpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRPZmZsb2FkU3VwcG9ydCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc0RpcmVjdE91dHB1dFN1cHBvcnRlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9Qb3J0cykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBdWRpb1BvcnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9QYXRjaGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvUG9ydENvbmZpZykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlckNsaWVudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFBob25lU3RhdGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVnaXN0ZXJQb2xpY3lNaXhlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRVaWREZXZpY2VBZmZpbml0aWVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbW92ZVVpZERldmljZUFmZmluaXRpZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0YXJ0QXVkaW9Tb3VyY2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3RvcEF1ZGlvU291cmNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1hc3Rlck1vbm8pIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWFzdGVyTW9ubykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRTdHJlYW1Wb2x1bWVEQikgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRTdXJyb3VuZEZvcm1hdHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEExMXlTZXJ2aWNlc1VpZHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0Q3VycmVudEltZVVpZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzVWx0cmFzb3VuZFN1cHBvcnRlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGxpc3RBdWRpb1ZvbHVtZUdyb3VwcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0UnR0RW5hYmxlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCkgXAorQklOREVSX01FVEhPRF9FTlRSWShhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFNwYXRpYWxpemVyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNhbkJlU3BhdGlhbGl6ZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcykgXAorCisvLyBzaW5nbGV0b24gZm9yIEJpbmRlciBNZXRob2QgU3RhdGlzdGljcyBmb3IgSUF1ZGlvUG9saWN5U2VydmljZQorc3RhdGljIGF1dG8mIGdldElBdWRpb1BvbGljeVNlcnZpY2VTdGF0aXN0aWNzKCkgeworICAgIHVzaW5nIENvZGUgPSBpbnQ7CisKKyNwcmFnbWEgcHVzaF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisjdW5kZWYgQklOREVSX01FVEhPRF9FTlRSWQorI2RlZmluZSBCSU5ERVJfTUVUSE9EX0VOVFJZKEVOVFJZKSBcCisgICAgICAgIHsoQ29kZSltZWRpYTo6Qm5BdWRpb1BvbGljeVNlcnZpY2U6OlRSQU5TQUNUSU9OXyMjRU5UUlksICNFTlRSWX0sCisKKyAgICBzdGF0aWMgbWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxDb2RlPiBtZXRob2RTdGF0aXN0aWNzeworICAgICAgICBJQVVESU9QT0xJQ1lTRVJWSUNFX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAorICAgICAgICBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDb2RlKQorICAgIH07CisjcHJhZ21hIHBvcF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisKKyAgICByZXR1cm4gbWV0aG9kU3RhdGlzdGljczsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQpAQCAtMTE0LDYgKzIyOSwxMyBAQAogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25GaXJzdFJlZigpCiB7CisgICAgLy8gTG9nIGFuIEF1ZGlvUG9saWN5ICJjb25zdHJ1Y3RvciIgbWVkaWFtZXRyaWNzIGV2ZW50IG9uIGZpcnN0IHJlZi4KKyAgICAvLyBUaGlzIHJlY29yZHMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gbG9hZCB0aGUgYXVkaW8gbW9kdWxlcyBhbmQgZGV2aWNlcy4KKyAgICBtZWRpYW1ldHJpY3M6OkRlZmVyIGRlZmVyKFtiZWdpbk5zID0gc3lzdGVtVGltZSgpXSB7CisgICAgICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShBTUVESUFNRVRSSUNTX0tFWV9BVURJT19QT0xJQ1kpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NUT1IpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FWEVDVVRJT05USU1FTlMsIChpbnQ2NF90KShzeXN0ZW1UaW1lKCkgLSBiZWdpbk5zKSkKKyAgICAgICAgICAgIC5yZWNvcmQoKTsgfSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC0xMjcsNiArMjQ5LDcgQEAKICAgICAgICAgbG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpOwogICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyID0gbUNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihtQXVkaW9Qb2xpY3lDbGllbnQpOwogICAgIH0KKwogICAgIC8vIGxvYWQgYXVkaW8gcHJvY2Vzc2luZyBtb2R1bGVzCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBhdWRpb1BvbGljeUVmZmVjdHMgPSBuZXcgQXVkaW9Qb2xpY3lFZmZlY3RzKCk7CiAgICAgc3A8VWlkUG9saWN5PiB1aWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwpAQCAtMTM5LDYgKzI2MiwxOCBAQAogICAgIH0KICAgICB1aWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogICAgIHNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworCisgICAgLy8gQ3JlYXRlIHNwYXRpYWxpemVyIGlmIHN1cHBvcnRlZAorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKTsKKyAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICBib29sIGhhc1NwYXRpYWxpemVyID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2FuQmVTcGF0aWFsaXplZCgmYXR0ciwgbnVsbHB0ciwgZGV2aWNlcyk7CisgICAgICAgIGlmIChoYXNTcGF0aWFsaXplcikgeworICAgICAgICAgICAgbVNwYXRpYWxpemVyID0gU3BhdGlhbGl6ZXI6OmNyZWF0ZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6YXVkaW9Qb2xpY3lSZWFkeSgpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dW5sb2FkQXVkaW9Qb2xpY3lNYW5hZ2VyKCkKQEAgLTM1Myw2ICs0ODgsMTE0IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+dm9sUmFuZ2VJbml0UmVxQ29tbWFuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25DaGVja1NwYXRpYWxpemVyKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpCit7CisgICAgaWYgKG1TcGF0aWFsaXplciAhPSBudWxscHRyKSB7CisgICAgICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5jaGVja1NwYXRpYWxpemVyQ29tbWFuZCgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25DaGVja1NwYXRpYWxpemVyKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgQUxPR0koIiVzIG1TcGF0aWFsaXplciAlcCBsZXZlbCAlZCIsIF9fZnVuY19fLCBtU3BhdGlhbGl6ZXIuZ2V0KCksIChpbnQpbVNwYXRpYWxpemVyLT5nZXRMZXZlbCgpKTsKKworICAgIGlmIChtU3BhdGlhbGl6ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBOb3RlOiBtU3BhdGlhbGl6ZXIgIT0gbnVsbHB0ciA9PiAgbUF1ZGlvUG9saWN5TWFuYWdlciAhPSBudWxscHRyCisgICAgICAgIGlmIChtU3BhdGlhbGl6ZXItPmdldExldmVsKCkgIT0gbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUpIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1cnJlbnRPdXRwdXQgPSBtU3BhdGlhbGl6ZXItPmdldE91dHB1dCgpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbmV3T3V0cHV0OworICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gbVNwYXRpYWxpemVyLT5nZXRBdWRpb0luQ29uZmlnKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTcGF0aWFsaXplck91dHB1dCgmY29uZmlnLCAmYXR0ciwgJm5ld091dHB1dCk7CisgICAgICAgICAgICBBTE9HVigiJXMgY3VycmVudE91dHB1dCAlZCBuZXdPdXRwdXQgJWQgY2hhbm5lbF9tYXNrICUjeCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjdXJyZW50T3V0cHV0LCBuZXdPdXRwdXQsIGNvbmZpZy5jaGFubmVsX21hc2spOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBjdXJyZW50T3V0cHV0ID09IG5ld091dHB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBudW1BY3RpdmVUcmFja3MgPSBjb3VudEFjdGl2ZUNsaWVudHNPbk91dHB1dF9sKG5ld091dHB1dCk7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIEl0IGlzIE9LIHRvIGNhbGwgZGV0YWNoT3V0cHV0KCkgaXMgbm9uZSBpcyBhbHJlYWR5IGF0dGFjaGVkLgorICAgICAgICAgICAgbVNwYXRpYWxpemVyLT5kZXRhY2hPdXRwdXQoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbmV3T3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG1TcGF0aWFsaXplci0+YXR0YWNoT3V0cHV0KG5ld091dHB1dCwgbnVtQWN0aXZlVHJhY2tzKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlU3BhdGlhbGl6ZXJPdXRwdXQobmV3T3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtU3BhdGlhbGl6ZXItPmdldExldmVsKCkgPT0gbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU3BhdGlhbGl6ZXItPmdldE91dHB1dCgpICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1TcGF0aWFsaXplci0+ZGV0YWNoT3V0cHV0KCk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVNwYXRpYWxpemVyT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNvdW50QWN0aXZlQ2xpZW50c09uT3V0cHV0X2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBzcGF0aWFsaXplZE9ubHkpIHsKKyAgICBzaXplX3QgY291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGxheWJhY2tDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8gY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChjbGllbnQtPmlvID09IG91dHB1dCAmJiBjbGllbnQtPmFjdGl2ZQorICAgICAgICAgICAgICAgICYmICghc3BhdGlhbGl6ZWRPbmx5IHx8IGNsaWVudC0+aXNTcGF0aWFsaXplZCkpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc19sKCkgeworICAgIGlmIChtU3BhdGlhbGl6ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT51cGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc0NvbW1hbmQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrcygpCit7CisgICAgc3A8U3BhdGlhbGl6ZXI+IHNwYXRpYWxpemVyOworICAgIHNpemVfdCBhY3RpdmVDbGllbnRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TcGF0aWFsaXplciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3BhdGlhbGl6ZXIgPSBtU3BhdGlhbGl6ZXI7CisgICAgICAgIGFjdGl2ZUNsaWVudHMgPSBjb3VudEFjdGl2ZUNsaWVudHNPbk91dHB1dF9sKG1TcGF0aWFsaXplci0+Z2V0T3V0cHV0KCkpOworICAgIH0KKyAgICBpZiAoc3BhdGlhbGl6ZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzcGF0aWFsaXplci0+dXBkYXRlQWN0aXZlVHJhY2tzKGFjdGl2ZUNsaWVudHMpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCkBAIC00MDksNyArNjUyLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQpIHsKQEAgLTQ0MiwyMiArNjg1LDI0IEBACiAgICAgICAgICAgICBpbnQzMl90IGV2ZW50QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGV2ZW50KSk7CiAgICAgICAgICAgICBtZWRpYTo6UmVjb3JkQ2xpZW50SW5mbyBjbGllbnRJbmZvQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3JlY29yZF9jbGllbnRfaW5mb190X1JlY29yZENsaWVudEluZm8oKmNsaWVudEluZm8pKTsKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UgY2xpZW50Q29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKCpjbGllbnRDb25maWcpKTsKKyAgICAgICAgICAgIEF1ZGlvQ29uZmlnQmFzZSBjbGllbnRDb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNsaWVudENvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+IGNsaWVudEVmZmVjdHNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGRldmljZUNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqZGV2aWNlQ29uZmlnKSk7CisgICAgICAgICAgICBBdWRpb0NvbmZpZ0Jhc2UgZGV2aWNlQ29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2VDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3RzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+PigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcikpOwogICAgICAgICAgICAgaW50MzJfdCBwYXRjaEhhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KHBhdGNoSGFuZGxlKSk7Ci0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2Ugc291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKHNvdXJjZSkpOwogICAgICAgICAgICAgcmV0dXJuIGFpZGxfdXRpbHM6OnN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SW5mb0FpZGwsCkBAIC00ODksNiArNzM0LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewogICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CkBAIC01MTAsMjAgKzc2MiwyNyBAQAogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyOiAlcFxuIiwgbUF1ZGlvUG9saWN5TWFuYWdlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU3VwcG9ydGVkIFN5c3RlbSBVc2FnZXM6XG4gICIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlN1cHBvcnRlZCBTeXN0ZW0gVXNhZ2VzOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD46Oml0ZXJhdG9yIGl0ID0gbVN1cHBvcnRlZFN5c3RlbVVzYWdlcy5iZWdpbigpOwotICAgICAgICBpdCAhPSBtU3VwcG9ydGVkU3lzdGVtVXNhZ2VzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JWRcbiIsICppdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBtc2c7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byB1c2FnZSA6IG1TdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMpIHsKKyAgICAgICAgaWYgKGkrKyAhPSAwKSBtc2cgPDwgIiwgIjsKKyAgICAgICAgaWYgKGNvbnN0IGNoYXIqIHN0clVzYWdlID0gYXVkaW9fdXNhZ2VfdG9fc3RyaW5nKHVzYWdlKTsgc3RyVXNhZ2UpIHsKKyAgICAgICAgICAgIG1zZyA8PCBzdHJVc2FnZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZyA8PCB1c2FnZSA8PCAiICh1bmtub3duKSI7CisgICAgICAgIH0KICAgICB9CisgICAgaWYgKGkgPT0gMCkgeworICAgICAgICBtc2cgPDwgIk5vbmUiOworICAgIH0KKyAgICBtc2cgPDwgc3RkOjplbmRsOworICAgIHJlc3VsdC5hcHBlbmQobXNnLnN0cigpLmNfc3RyKCkpOwogCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBtVWlkUG9saWN5LT5kdW1wSW50ZXJuYWxzKGZkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTUzNywxMyArNzk2LDIwIEBACiB7CiAvLyAgICBHbyBvdmVyIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgYWxsb3cgY2FwdHVyZSAoZG9lcyBub3QgZm9yY2Ugc2lsZW5jZSkgaW4gdGhlCiAvLyAgICBmb2xsb3dpbmcgY2FzZXM6Ci0vLyAgICBUaGUgY2xpZW50IGlzIHRoZSBhc3Npc3RhbnQKKy8vICAgIFRoZSBjbGllbnQgaXMgaW4gdGhlIGFjdGl2ZSBhc3Npc3RhbnQgbGlzdAorLy8gICAgICAgICBBTkQgaXMgVE9QCisvLyAgICAgICAgICAgICAgIEFORCBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgVE9QCisvLyAgICAgICAgICAgICAgICAgIEFORCBzb3VyY2UgaXMgZWl0aGVyIFZPSUNFX1JFQ09HTklUSU9OIE9SIEhPVFdPUkQKKy8vICAgICAgICAgICAgICAgT1IgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisvLyAgICAgICAgICAgICAgICAgIEFORCBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gT1IgSE9UV09SRAorLy8gICAgVGhlIGNsaWVudCBpcyBhbiBhc3Npc3RhbnQgQU5EIGFjdGl2ZSBhc3Npc3RhbnQgaXMgbm90IGJlaW5nIHVzZWQKIC8vICAgICAgICBBTkQgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUCBvciBhIFJUVCBjYWxsIGlzIGFjdGl2ZQogLy8gICAgICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAotLy8gICAgICAgICAgICBPUiB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIEFORCBpcyBvbiBUT1AKLS8vICAgICAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAotLy8gICAgICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorLy8gICAgICAgIE9SIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKIC8vICAgICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisvLyAgICAgICAgICAgIEFORCBpcyBUT1AgbW9zdCByZWNlbnQgYXNzaXN0YW50IGFuZCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgICAgICAgICAgICAgIE9SIHRoZXJlIGlzIG5vIHRvcCByZWNlbnQgYXNzaXN0YW50IGFuZCBzb3VyY2UgaXMgSE9UV09SRAogLy8gICAgT1IgVGhlIGNsaWVudCBpcyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKIC8vICAgICAgICBBTkQgSXMgb24gVE9QCiAvLyAgICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECkBAIC01NzEsMTMgKzgzNywxNiBAQAogICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IHRvcFNlbnNpdGl2ZUFjdGl2ZTsKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlT3JDb21tOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmVBc3Npc3RhbnQ7CiAKICAgICBuc2Vjc190IHRvcFN0YXJ0TnMgPSAwOwogICAgIG5zZWNzX3QgbGF0ZXN0U3RhcnROcyA9IDA7CiAgICAgbnNlY3NfdCB0b3BTZW5zaXRpdmVTdGFydE5zID0gMDsKICAgICBuc2Vjc190IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0QXNzaXN0YW50U3RhcnROcyA9IDA7CiAgICAgYm9vbCBpc0ExMXlPblRvcCA9IG1VaWRQb2xpY3ktPmlzQTExeU9uVG9wKCk7CiAgICAgYm9vbCBpc0Fzc2lzdGFudE9uVG9wID0gZmFsc2U7CisgICAgYm9vbCB1c2VBY3RpdmVBc3Npc3RhbnRMaXN0ID0gZmFsc2U7CiAgICAgYm9vbCBpc1NlbnNpdGl2ZUFjdGl2ZSA9IGZhbHNlOwogICAgIGJvb2wgaXNJbkNhbGwgPSBtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEw7CiAgICAgYm9vbCBpc0luQ29tbXVuaWNhdGlvbiA9IG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjsKQEAgLTYxMiw2ICs4ODEsNyBAQAogICAgICAgICAvLyBmb3IgdG9wIG9yIGxhdGVzdCBhY3RpdmUgdG8gYXZvaWQgbWFza2luZyByZWd1bGFyIGNsaWVudHMgc3RhcnRlZCBiZWZvcmUKICAgICAgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHkgJiYgIWlzVmlydHVhbFNvdXJjZShjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkpIHsKICAgICAgICAgICAgIGJvb2wgaXNBc3Npc3RhbnQgPSBtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50VWlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNBY3RpdmVBc3Npc3RhbnQgPSBtVWlkUG9saWN5LT5pc0FjdGl2ZUFzc2lzdGFudFVpZChjdXJyZW50VWlkKTsKICAgICAgICAgICAgIGJvb2wgaXNQcml2YWN5U2Vuc2l0aXZlID0KICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtPmF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSkgIT0gMDsKIApAQCAtNjI5LDYgKzg5OSwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaXNBc3Npc3RhbnQpIHsKICAgICAgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZUFzc2lzdGFudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlQWN0aXZlQXNzaXN0YW50TGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXVzZUFjdGl2ZUFzc2lzdGFudExpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IGxhdGVzdEFzc2lzdGFudFN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RBY3RpdmVBc3Npc3RhbnQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEFzc2lzdGFudFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENsaWVudHMgY2FwdHVyaW5nIGZvciBIT1RXT1JEIGFyZSBub3QgY29uc2lkZXJlZApAQCAtNjYwLDcgKzkzOCw4IEBACiAgICAgICAgIGlmIChjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewogICAgICAgICAgICAgb25seUhvdHdvcmRBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFVpZCA9PSBtUGhvbmVTdGF0ZU93bmVyVWlkKSB7CisgICAgICAgIGlmIChjdXJyZW50VWlkID09IG1QaG9uZVN0YXRlT3duZXJVaWQgJiYKKyAgICAgICAgICAgICAgICAhaXNWaXJ0dWFsU291cmNlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgewogICAgICAgICAgICAgaXNQaG9uZVN0YXRlT3duZXJBY3RpdmUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtNzA3LDYgKzk4Niw4IEBACiAgICAgICAgICAgICBjdXJyZW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQgPT0gdG9wQWN0aXZlLT5hdHRyaWJ1dGlvblNvdXJjZS51aWQ7CiAgICAgICAgIGJvb2wgaXNUb3BPckxhdGVzdFNlbnNpdGl2ZSA9IHRvcFNlbnNpdGl2ZUFjdGl2ZSA9PSBudWxscHRyID8gZmFsc2UgOgogICAgICAgICAgICAgY3VycmVudC0+YXR0cmlidXRpb25Tb3VyY2UudWlkID09IHRvcFNlbnNpdGl2ZUFjdGl2ZS0+YXR0cmlidXRpb25Tb3VyY2UudWlkOworICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RBc3Npc3RhbnQgPSBsYXRlc3RBY3RpdmVBc3Npc3RhbnQgPT0gbnVsbHB0ciA/IGZhbHNlIDoKKyAgICAgICAgICAgIGN1cnJlbnQtPmF0dHJpYnV0aW9uU291cmNlLnVpZCA9PSBsYXRlc3RBY3RpdmVBc3Npc3RhbnQtPmF0dHJpYnV0aW9uU291cmNlLnVpZDsKIAogICAgICAgICBhdXRvIGNhbkNhcHR1cmVJZkluQ2FsbE9yQ29tbXVuaWNhdGlvbiA9IFsmXShjb25zdCBhdXRvICZyZWNvcmRDbGllbnQpIFJFUVVJUkVTKG1Mb2NrKSB7CiAgICAgICAgICAgICB1aWRfdCByZWNvcmRVaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KApAQCAtNzM2LDIzICsxMDE3LDQ1IEBACiAgICAgICAgIH0gZWxzZSBpZiAoaXNWaXJ0dWFsU291cmNlKHNvdXJjZSkpIHsKICAgICAgICAgICAgIC8vIEFsbG93IGNhcHR1cmUgZm9yIHZpcnR1YWwgKHJlbW90ZSBzdWJtaXgsIGNhbGwgYXVkaW8gVFggb3IgUlguLi4pIHNvdXJjZXMKICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudFVpZCkpIHsKKyAgICAgICAgfSBlbHNlIGlmICghdXNlQWN0aXZlQXNzaXN0YW50TGlzdCAmJiBtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50VWlkKSkgewogICAgICAgICAgICAgLy8gRm9yIGFzc2lzdGFudCBhbGxvdyBjYXB0dXJlIGlmOgotICAgICAgICAgICAgLy8gICAgIEFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1Agb3IgYSBSVFQgY2FsbCBpcyBhY3RpdmUKKyAgICAgICAgICAgIC8vICAgICBBY3RpdmUgYXNzaXN0YW50IGxpc3QgaXMgbm90IGJlaW5nIHVzZWQKKyAgICAgICAgICAgIC8vICAgICBBTkQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUCBvciBhIFJUVCBjYWxsIGlzIGFjdGl2ZQogICAgICAgICAgICAgLy8gICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECi0gICAgICAgICAgICAvLyAgICAgT1IgaXMgb24gVE9QIEFORCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAotICAgICAgICAgICAgLy8gICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAotICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIC8vICAgICBPUiB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCisgICAgICAgICAgICAvLyAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorICAgICAgICAgICAgLy8gICAgICAgICAgICBBTkQgaXMgbGF0ZXN0IFRPUCBhc3Npc3RhbnQgQU5ECisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gT1IgdXNlcyBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgICAgICAgIE9SIHRoZXJlIGlzIG5vIFRPUCBhc3Npc3RhbnQgYW5kIHVzZXMgSE9UV09SRAogICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wIHx8IHJ0dENhbGxBY3RpdmUpIHsKICAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoKGlzQXNzaXN0YW50T25Ub3AgJiYgc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEoaXNTZW5zaXRpdmVBY3RpdmUgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpCisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoaXNTZW5zaXRpdmVBY3RpdmUgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICYmIGNhbkNhcHR1cmVJZkluQ2FsbE9yQ29tbXVuaWNhdGlvbihjdXJyZW50KSkgeworICAgICAgICAgICAgICAgIGlmIChpc1RvcE9yTGF0ZXN0QXNzaXN0YW50CisgICAgICAgICAgICAgICAgICAgICYmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQXNzaXN0YW50T25Ub3AgJiYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodXNlQWN0aXZlQXNzaXN0YW50TGlzdCAmJiBtVWlkUG9saWN5LT5pc0FjdGl2ZUFzc2lzdGFudFVpZChjdXJyZW50VWlkKSkgeworICAgICAgICAgICAgLy8gRm9yIGFzc2lzdGFudCBvbiBhY3RpdmUgbGlzdCBhbmQgb24gdG9wIGFsbG93IGNhcHR1cmUgaWY6CisgICAgICAgICAgICAvLyAgICAgQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUAorICAgICAgICAgICAgLy8gICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgT1IgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIC8vICAgICAgICAgQU5EIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gT1IgdXNlcyBIT1RXT1JECisgICAgICAgICAgICBpZiAoaXNBMTF5T25Ub3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoaXNTZW5zaXRpdmVBY3RpdmUgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjYW5DYXB0dXJlSWZJbkNhbGxPckNvbW11bmljYXRpb24oY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8IChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKQorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC04MzksNiArMTE0Miw3IEBACiAgICAgc3dpdGNoIChzb3VyY2UpIHsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC04ODcsMTcgKzExOTEsMzUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGR1bXBJbnRlcm5hbHMoZmQpOworCisgICAgICAgIFN0cmluZzggYWN0UHRyID0gU3RyaW5nODo6Zm9ybWF0KCJBdWRpb0NvbW1hbmRUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKKyAgICAgICAgd3JpdGUoZmQsIGFjdFB0ci5zdHJpbmcoKSwgYWN0UHRyLnNpemUoKSk7CiAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9CiAKKyAgICAgICAgU3RyaW5nOCBvY3RQdHIgPSBTdHJpbmc4Ojpmb3JtYXQoIk91dHB1dENvbW1hbmRUaHJlYWQ6ICVwXG4iLCBtT3V0cHV0Q29tbWFuZFRocmVhZC5nZXQoKSk7CisgICAgICAgIHdyaXRlKGZkLCBvY3RQdHIuc3RyaW5nKCksIG9jdFB0ci5zaXplKCkpOworICAgICAgICBpZiAobU91dHB1dENvbW1hbmRUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nOCBhcG1QdHIgPSBTdHJpbmc4Ojpmb3JtYXQoIkF1ZGlvUG9saWN5TWFuYWdlcjogJXBcbiIsIG1BdWRpb1BvbGljeU1hbmFnZXIpOworICAgICAgICAgICAgd3JpdGUoZmQsIGFwbVB0ci5zdHJpbmcoKSwgYXBtUHRyLnNpemUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBtUGFja2FnZU1hbmFnZXIuZHVtcChmZCk7CiAKICAgICAgICAgZHVtcFJlbGVhc2VMb2NrKG1Mb2NrLCBsb2NrZWQpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRpbWVDaGVja1N0YXRzID0gZ2V0SUF1ZGlvUG9saWN5U2VydmljZVN0YXRpc3RpY3MoKS5kdW1wKCk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG5JQXVkaW9Qb2xpY3lTZXJ2aWNlIGJpbmRlciBjYWxsIHByb2ZpbGVcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHRpbWVDaGVja1N0YXRzLmNfc3RyKCksIHRpbWVDaGVja1N0YXRzLnNpemUoKSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtOTU4LDE5ICsxMjgwLDE5IEBACiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNTdHJlYW1BY3RpdmU6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNTdHJlYW1BY3RpdmVSZW1vdGVseToKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9pc1NvdXJjZUFjdGl2ZToKLSAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXREZXZpY2VzRm9yU3RyZWFtOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlZ2lzdGVyUG9saWN5TWl4ZXM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0TWFzdGVyTW9ubzoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRTdXJyb3VuZEZvcm1hdHM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkOgotICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldEFzc2lzdGFudFVpZDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldEExMXlTZXJ2aWNlc1VpZHM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0VWlkRGV2aWNlQWZmaW5pdGllczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFVzZXJJZERldmljZUFmZmluaXRpZXM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllczoKLSAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYToKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9saXN0QXVkaW9Wb2x1bWVHcm91cHM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2FjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uOgpAQCAtOTkwLDcgKzEzMTIsOCBAQAogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2FkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldDoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQ6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQ6Ci0gICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0OiB7CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldFNwYXRpYWxpemVyOiB7CiAgICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLApAQCAtMTAwMiw4ICsxMzI1LDIwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOwotICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IGdldElBdWRpb1BvbGljeVNlcnZpY2VTdGF0aXN0aWNzKCkuZ2V0TWV0aG9kRm9yQ29kZShjb2RlKTsKKyAgICBtZWRpYXV0aWxzOjpUaW1lQ2hlY2sgY2hlY2soCisgICAgICAgICAgICBzdGQ6OnN0cmluZygiSUF1ZGlvUG9saWN5U2VydmljZTo6IikuYXBwZW5kKG1ldGhvZE5hbWUpLAorICAgICAgICAgICAgW2NvZGUsIG1ldGhvZE5hbWVdKGJvb2wgdGltZW91dCwgZmxvYXQgZWxhcHNlZE1zKSB7IC8vIGRvbid0IG1vdmUgbWV0aG9kTmFtZS4KKyAgICAgICAgaWYgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShBTUVESUFNRVRSSUNTX0tFWV9BVURJT19QT0xJQ1kpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9USU1FT1VUKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01FVEhPRENPREUsIGludDY0X3QoY29kZSkpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9ETkFNRSwgbWV0aG9kTmFtZS5jX3N0cigpKQorICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldElBdWRpb1BvbGljeVNlcnZpY2VTdGF0aXN0aWNzKCkuZXZlbnQoY29kZSwgZWxhcHNlZE1zKTsKKyAgICAgICAgfQorICAgIH0pOwogCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0hFTExfQ09NTUFORF9UUkFOU0FDVElPTjogewpAQCAtMTMyNSw2ICsxNjYwLDkgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkUHJvY0FkakNoYW5nZWQodWlkX3QgdWlkIF9fdW51c2VkKSB7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7CiAgICAgdXBkYXRlVWlkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGluc2VydCk7CiB9CkBAIC0xNDAxLDYgKzE3MzksNjYgQEAKICAgICByZXR1cm4gaXQgIT0gbUExMXlVaWRzLmVuZCgpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpzZXRBc3Npc3RhbnRVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeworICAgIG1Bc3Npc3RhbnRVaWRzLmNsZWFyKCk7CisgICAgbUFzc2lzdGFudFVpZHMgPSB1aWRzOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0Fzc2lzdGFudFVpZCh1aWRfdCB1aWQpCit7CisgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+OjppdGVyYXRvciBpdCA9IGZpbmQobUFzc2lzdGFudFVpZHMuYmVnaW4oKSwgbUFzc2lzdGFudFVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1Bc3Npc3RhbnRVaWRzLmVuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpzZXRBY3RpdmVBc3Npc3RhbnRVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgYWN0aXZlVWlkcykgeworICAgIG1BY3RpdmVBc3Npc3RhbnRVaWRzID0gYWN0aXZlVWlkczsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBY3RpdmVBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BY3RpdmVBc3Npc3RhbnRVaWRzLmJlZ2luKCksCisgICAgICAgICAgICBtQWN0aXZlQXNzaXN0YW50VWlkcy5lbmQoKSwgdWlkKTsKKyAgICByZXR1cm4gaXQgIT0gbUFjdGl2ZUFzc2lzdGFudFVpZHMuZW5kKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmR1bXBJbnRlcm5hbHMoaW50IGZkKSB7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgYXV0byBhcHBlbmRVaWRzVG9SZXN1bHQgPSBbJl0oY29uc3QgY2hhciogdGl0bGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiAmdWlkcykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCVzOiBcbiIsIHRpdGxlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIGlmICh1aWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRObyBVSURzIHByZXNlbnQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnVpZCA6IHVpZHMpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRVSURbJWRdPSVkXG4iLCBjb3VudGVyKyssIHVpZCk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVUlEIFBvbGljeTpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdG1PYnNlcnZlclJlZ2lzdGVyZWQ9JXNcbiIsKG1PYnNlcnZlclJlZ2lzdGVyZWQgPyAiVHJ1ZSI6IkZhbHNlIikpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIGFwcGVuZFVpZHNUb1Jlc3VsdCgiQXNzaXN0YW50cyBVSURzIiwgbUFzc2lzdGFudFVpZHMpOworICAgIGFwcGVuZFVpZHNUb1Jlc3VsdCgiQWN0aXZlIEFzc2lzdGFudHMgVUlEcyIsIG1BY3RpdmVBc3Npc3RhbnRVaWRzKTsKKworICAgIGFwcGVuZFVpZHNUb1Jlc3VsdCgiQWNjZXNzaWJpbGl0eSBVSURzIiwgbUExMXlVaWRzKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0SW5wdXQgTWV0aG9kIFNlcnZpY2UgVUlEPSVkXG4iLCBtQ3VycmVudEltZVVpZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRJcyBSVFQgRW5hYmxlZDogJXNcbiIsIChtUnR0RW5hYmxlZCA/ICJUcnVlIjoiRmFsc2UiKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lTZXJ2aWNlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CiAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOwpAQCAtMTQwOCwxNCArMTgwNiw2IEBACiAgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZkZvck1pY3JvcGhvbmVPbmx5KGludCB1c2VySWQpIHsKLSAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07Ci0gICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzSW5kaXZpZHVhbFNlbnNvclByaXZhY3lFbmFibGVkKHVzZXJJZCwKLSAgICAgICAgICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyOjpJTkRJVklEVUFMX1NFTlNPUl9NSUNST1BIT05FKTsKLSAgICBzcG0uYWRkSW5kaXZpZHVhbFNlbnNvclByaXZhY3lMaXN0ZW5lcih1c2VySWQsCi0gICAgICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfTUlDUk9QSE9ORSwgdGhpcyk7Ci19Ci0KIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKICAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CiAgICAgc3BtLnJlbW92ZVNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKQEAgLTE0MjUsNyArMTgxNSw4IEBACiAgICAgcmV0dXJuIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKIH0KIAotYmluZGVyOjpTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgeworYmluZGVyOjpTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpvblNlbnNvclByaXZhY3lDaGFuZ2VkKAorICAgIGludCB0b2dnbGVUeXBlIF9fdW51c2VkLCBpbnQgc2Vuc29yIF9fdW51c2VkLCBib29sIGVuYWJsZWQpIHsKICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOwogICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CkBAIC0xNTY3LDEyICsxOTU4LDE2IEBACiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKICAgICAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzdmM7CisgICAgICAgIGludCBudW1UaW1lc0JlY2FtZUVtcHR5ID0gMDsKICAgICAgICAgd2hpbGUgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgICAgIG5zZWNzX3QgY3VyVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBleGVjdXRlIHRoZW0gZnJvbSBpbmRleCAwIGFuZCB1cAogICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSA8PSBjdXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbUF1ZGlvQ29tbWFuZHNbMF07CiAgICAgICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZHMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgKytudW1UaW1lc0JlY2FtZUVtcHR5OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewpAQCAtMTc2NCw2ICsyMTU5LDM5IEBACiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKIAorICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tfU1BBVElBTElaRVJfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIGNoZWNrIHNwYXRpYWxpemVyIik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQ2hlY2tTcGF0aWFsaXplcigpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BQ1RJVkVfU1BBVElBTElaRVJfVFJBQ0tTOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBzcGF0aWFsaXplciB0cmFja3MiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrcygpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZPTF9SQU5HRV9JTklUX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgdm9sdW1lIHJhbmdlIGluaXQgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNzg3LDggKzIyMTUsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jayBpZiB0aGUgcXVldWUgaXMgZW1wdHkKLSAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGFzIG1hbnkgdGltZXMgYXMgd2UgbWFkZSB0aGUgIHF1ZXVlIGlzCisgICAgICAgIC8vIGVtcHR5IGR1cmluZyBwb3BwaW5nLgorICAgICAgICB3aGlsZSAobnVtVGltZXNCZWNhbWVFbXB0eS0tKSB7CiAgICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CiAgICAgICAgIH0KIApAQCAtMTgxNywxMCArMjI0Niw2IEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0NvbW1hbmRUaHJlYWQgJXAgRHVtcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCiAgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKICAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKQEAgLTIwNzUsNiArMjUwMCwzMCBAQAogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpjaGVja1NwYXRpYWxpemVyQ29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBDSEVDS19TUEFUSUFMSVpFUl9PVVRQVVQ7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBjaGVjayBzcGF0aWFsaXplciIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp1cGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc0NvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gVVBEQVRFX0FDVElWRV9TUEFUSUFMSVpFUl9UUkFDS1M7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB1cGRhdGUgYWN0aXZlIHNwYXRpYWxpemVyIHRyYWNrcyIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2xSYW5nZUluaXRSZXFDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFZPTF9SQU5HRV9JTklUX1JFUVVFU1Q7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB2b2x1bWUgcmFuZ2UgaW5pdCByZXF1ZXN0Iik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKIHsKICAgICB7CkBAIC0yMjQyLDYgKzI2OTEsMTAgQEAKIAogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgVk9MX1JBTkdFX0lOSVRfUkVRVUVTVDogeworICAgICAgICAgICAgLy8gY29tbWFuZCBtYXkgY29tZSBmcm9tIGRpZmZlcmVudCByZXF1ZXN0cywgZG8gbm90IGZpbHRlcgorICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggN2VkODI5Yy4uM2EwOGNmOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5BdWRpb1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0dldFNwYXRpYWxpemVyUmVzcG9uc2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CkBAIC0zOCw2ICszOSw3IEBACiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCiAjaW5jbHVkZSAiQ2FwdHVyZVN0YXRlTm90aWZpZXIuaCIKKyNpbmNsdWRlICJTcGF0aWFsaXplci5oIgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CkBAIC00NywxMyArNDksMjUgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CiAgICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPiwKICAgICBwdWJsaWMgbWVkaWE6OkJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAotICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKKyAgICBwdWJsaWMgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjawogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT47CiAKQEAgLTY4LDI1ICs4MiwyNCBAQAogICAgIC8vCiAgICAgYmluZGVyOjpTdGF0dXMgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZSwKICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlIHN0YXRlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZU5hbWUsCi0gICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGVuY29kZWRGb3JtYXQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBBdWRpb0RldmljZSYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBkZXZpY2UsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlTmFtZSwKLSAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0KSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBzZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUgc3RhdGUsIGludDMyX3QgdWlkKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGVuY29kZWRGb3JtYXQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFBob25lU3RhdGUoQXVkaW9Nb2RlIHN0YXRlLCBpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnIGNvbmZpZykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldE91dHB1dChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXQoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwgaW50MzJfdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnJiBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLCBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6R2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0T3V0cHV0KGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKQEAgLTk1LDMyICsxMDgsMzUgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRJbnB1dEZvckF0dHIoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLCBpbnQzMl90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJpaWQsIGludDMyX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZywgaW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWdCYXNlJiBjb25maWcsIGludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkdldElucHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0SW5wdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0b3BJbnB1dChpbnQzMl90IHBvcnRJZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVsZWFzZUlucHV0KGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBpbml0U3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluZGV4TWluLAorICAgIGJpbmRlcjo6U3RhdHVzIGluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXhNYXgpIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVZvbHVtZUluZGV4KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGRldmljZSwKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBkZXZpY2UsCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZSwgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2UsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZXNGb3JTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3ImIGRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVnaXN0ZXJFZmZlY3QoY29uc3QgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3ImIGRlc2MsIGludDMyX3QgaW8sIGludDMyX3Qgc3RyYXRlZ3ksCkBAIC0xMjgsNDIgKzE0NCw0MiBAQAogICAgIGJpbmRlcjo6U3RhdHVzIHVucmVnaXN0ZXJFZmZlY3QoaW50MzJfdCBpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RWZmZWN0RW5hYmxlZChpbnQzMl90IGlkLCBib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIG1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaWRzLCBpbnQzMl90IGlvKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBpc1N0cmVhbUFjdGl2ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpblBhc3RNcywKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1N0cmVhbUFjdGl2ZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluUGFzdE1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpblBhc3RNcywKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5QYXN0TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGlzU291cmNlQWN0aXZlKG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGlzU291cmNlQWN0aXZlKEF1ZGlvU291cmNlIHNvdXJjZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKAotICAgICAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb24sIG1lZGlhOjpJbnQqIGNvdW50LAorICAgICAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb24sIEludCogY291bnQsCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlLAorICAgIGJpbmRlcjo6U3RhdHVzIGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgQXVkaW9VdWlkJiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB1dWlkLCBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1V1aWQmIHV1aWQsIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZSBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZSwKKyAgICBiaW5kZXI6OlN0YXR1cyBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IEF1ZGlvVXVpZCYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdXVpZCwgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1VzYWdlIHVzYWdlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9VdWlkJiB1dWlkLCBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vc2FnZSB1c2FnZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGludDMyX3QgaWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaW50MzJfdCBpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVXNhZ2U+JiBzeXN0ZW1Vc2FnZXMpIG92ZXJyaWRlOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9Vc2FnZT4mIHN5c3RlbVVzYWdlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koaW50MzJfdCB1aWQsIGludDMyX3QgY2FwdHVyZVBvbGljeSkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGluZm8sCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT2ZmbG9hZEluZm8mIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnLAorICAgIGJpbmRlcjo6U3RhdHVzIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGxpc3RBdWRpb1BvcnRzKG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkludCogY291bnQsIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BvcnQ+KiBwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qb3J0PiogcG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRBdWRpb1BvcnQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcG9ydCwKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRBdWRpb1BvcnQoaW50IHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IG1lZGlhOjpBdWRpb1BhdGNoJiBwYXRjaCwgaW50MzJfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbGVhc2VBdWRpb1BhdGNoKGludDMyX3QgaGFuZGxlKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBsaXN0QXVkaW9QYXRjaGVzKG1lZGlhOjpJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4qIHBhdGNoZXMsCisgICAgYmluZGVyOjpTdGF0dXMgbGlzdEF1ZGlvUGF0Y2hlcyhJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4qIHBhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBjb25maWcpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZTsKQEAgLTE3MSwxNSArMTg3LDE1IEBACiAgICAgYmluZGVyOjpTdGF0dXMgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihtZWRpYTo6U291bmRUcmlnZ2VyU2Vzc2lvbiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihpbnQzMl90IHNlc3Npb24pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldFBob25lU3RhdGUobWVkaWE6OkF1ZGlvTW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRQaG9uZVN0YXRlKEF1ZGlvTW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb01peD4mIG1peGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWdpc3RyYXRpb24pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldFVpZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyhpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcygKICAgICAgICAgICAgIGludDMyX3QgdXNlcklkLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1c2VySWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyaWJ1dGVzLApAQCAtMTg3LDIyICsyMDMsMjUgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBzdG9wQXVkaW9Tb3VyY2UoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRNYXN0ZXJNb25vKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyZWFtVm9sdW1lREIobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5kZXgsIGludDMyX3QgZGV2aWNlLAorICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmVhbVZvbHVtZURCKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldFN1cnJvdW5kRm9ybWF0cyhtZWRpYTo6SW50KiBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cywKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdXJyb3VuZEZvcm1hdHMoSW50KiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4qIGZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+KiBmb3JtYXRzRW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoCi0gICAgICAgICAgICBtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cykgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgIEludCogY291bnQsIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KiBmb3JtYXRzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoY29uc3QgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgc2V0QXNzaXN0YW50VWlkKGludDMyX3QgdWlkKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZChpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0QXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRBY3RpdmVBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFjdGl2ZVVpZHMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHVpZHMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEN1cnJlbnRJbWVVaWQoaW50MzJfdCB1aWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1VsdHJhc291bmRTdXBwb3J0ZWQoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcygKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXgmIGFhLApAQCAtMjE3LDM3ICsyMzYsNDggQEAKICAgICBiaW5kZXI6OlN0YXR1cyBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneSgKICAgICAgICAgICAgIGludDMyX3Qgc3RyYXRlZ3ksIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShpbnQzMl90IHN0cmF0ZWd5LCBtZWRpYTo6RGV2aWNlUm9sZSByb2xlKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KAogICAgICAgICAgICAgaW50MzJfdCBzdHJhdGVneSwgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklDYXB0dXJlU3RhdGVMaXN0ZW5lcj4mIGxpc3RlbmVyLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3BhdGlhbGl6ZXIoY29uc3Qgc3A8bWVkaWE6OklOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICBtZWRpYTo6R2V0U3BhdGlhbGl6ZXJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjYW5CZVNwYXRpYWxpemVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw+JiBhdHRyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxBdWRpb0NvbmZpZz4mIGNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcywKKyAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSBvdmVycmlkZTsKIAogICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKQEAgLTMxMyw2ICszNDMsMjMgQEAKICAgICB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKTsKICAgICB2b2lkIGRvT25Sb3V0aW5nVXBkYXRlZCgpOwogCisgICAgdm9pZCBvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKKyAgICB2b2lkIGRvT25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBTcGF0aWFsaXplciBTcGF0aWFsaXplclBvbGljeUNhbGxiYWNrIGltcGxlbWVudGF0aW9uLgorICAgICAqIG9uQ2hlY2tTcGF0aWFsaXplcigpIHNlbmRzIGFuIGV2ZW50IG9uIG1PdXRwdXRDb21tYW5kVGhyZWFkIHdoaWNoIGV4ZWN1dGVzCisgICAgICogZG9PbkNoZWNrU3BhdGlhbGl6ZXIoKSB0byBjaGVjayBpZiBhIFNwYXRpYWxpemVyIG91dHB1dCBtdXN0IGJlIG9wZW5lZCBvciBjbG9zZWQKKyAgICAgKiBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciBhbmQgYXR0YWNoL2RldGFjaCB0aGUgc3BhdGlhbGl6ZXIgZWZmZWN0IGFjY29yZGluZ2x5LgorICAgICAqLworICAgIHZvaWQgb25DaGVja1NwYXRpYWxpemVyKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICB2b2lkIGRvT25DaGVja1NwYXRpYWxpemVyKCk7CisKKyAgICB2b2lkIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICB2b2lkIGRvT25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrcygpOworCisKICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCk7CkBAIC0zNTAsOCArMzk3LDkgQEAKICAgICBhcHBfc3RhdGVfdCBhcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpOwogCiAgICAgYm9vbCBpc1N1cHBvcnRlZFN5c3RlbVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgc3RhdHVzX3QgdmFsaWRhdGVVc2FnZShhdWRpb191c2FnZV90IHVzYWdlLCBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgc3RhdHVzX3QgdmFsaWRhdGVVc2FnZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIpOworICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogCiAgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXMoKTsKICAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlc19sKCkgUkVRVUlSRVMobUxvY2spOwpAQCAtMzc3LDcgKzQyNSw3IEBACiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBVaWRQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQogICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpLAotICAgICAgICAgICAgICAgICAgbUFzc2lzdGFudFVpZCgwKSwgbUhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKDApLCBtQ3VycmVudEltZVVpZCgwKSwKKyAgICAgICAgICAgICAgICAgIG1DdXJyZW50SW1lVWlkKDApLAogICAgICAgICAgICAgICAgICAgbVJ0dEVuYWJsZWQoZmFsc2UpIHt9CiAKICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKQEAgLTM4OCwxMyArNDM2LDEwIEBACiAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQpOwogICAgICAgICBpbnQgZ2V0VWlkU3RhdGUodWlkX3QgdWlkKTsKLSAgICAgICAgdm9pZCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IG1Bc3Npc3RhbnRVaWQgPSB1aWQ7IH07Ci0gICAgICAgIHZvaWQgc2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkX3QgdWlkKSB7IG1Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCA9IHVpZDsgfQotICAgICAgICBib29sIGlzQXNzaXN0YW50VWlkKHVpZF90IHVpZCkgY29uc3QgewotICAgICAgICAgICAgLy8gVGhlIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlIGlzIHBhcnQgb2YgdGhlIEFzc2lzdGFudCBwYWNrYWdlIGJ1dCBydW5zIHdpdGggYSBzZXBhcmF0ZQotICAgICAgICAgICAgLy8gKGlzb2xhdGVkKSB1aWQsIHNvIHdlIGNoZWNrIGZvciBlaXRoZXIgdWlkIGhlcmUuCi0gICAgICAgICAgICByZXR1cm4gdWlkID09IG1Bc3Npc3RhbnRVaWQgfHwgdWlkID09IG1Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZDsKLSAgICAgICAgfQorICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKyAgICAgICAgYm9vbCBpc0Fzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHNldEFjdGl2ZUFzc2lzdGFudFVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiBhY3RpdmVVaWRzKTsKKyAgICAgICAgYm9vbCBpc0FjdGl2ZUFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIHNldEExMXlVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeyBtQTExeVVpZHMuY2xlYXIoKTsgbUExMXlVaWRzID0gdWlkczsgfQogICAgICAgICBib29sIGlzQTExeVVpZCh1aWRfdCB1aWQpOwogICAgICAgICBib29sIGlzQTExeU9uVG9wKCk7CkBAIC00MDgsNyArNDUzLDggQEAKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFiaWxpdHkpOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWJpbGl0eSkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25VaWRQcm9jQWRqQ2hhbmdlZCh1aWRfdCB1aWQpIG92ZXJyaWRlOwogCiAgICAgICAgIHZvaWQgYWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGFjdGl2ZSwgdHJ1ZSk7IH0KICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBmYWxzZSwgZmFsc2UpOyB9CkBAIC00MTYsNiArNDYyLDggQEAKICAgICAgICAgdm9pZCB1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOwogCisgICAgICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQpOworCiAgICAgIHByaXZhdGU6CiAgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSgpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKQEAgLTQyOSw4ICs0NzcsOCBAQAogICAgICAgICBib29sIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gbU92ZXJyaWRlVWlkczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gbUNhY2hlZFVpZHM7Ci0gICAgICAgIHVpZF90IG1Bc3Npc3RhbnRVaWQgPSAtMTsKLSAgICAgICAgdWlkX3QgbUhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkID0gLTE7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBtQXNzaXN0YW50VWlkczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BY3RpdmVBc3Npc3RhbnRVaWRzOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUExMXlVaWRzOwogICAgICAgICB1aWRfdCBtQ3VycmVudEltZVVpZCA9IC0xOwogICAgICAgICBib29sIG1SdHRFbmFibGVkID0gZmFsc2U7CkBAIC00NDYsMTIgKzQ5NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpIHt9CiAKICAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7Ci0gICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZkZvck1pY3JvcGhvbmVPbmx5KGludCB1c2VySWQpOwogICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwogCiAgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKIAotICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChpbnQgdG9nZ2xlVHlwZSwgaW50IHNlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKTsKIAogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKQEAgLTQ4Myw3ICs1MzEsMTAgQEAKICAgICAgICAgICAgIFNFVF9FRkZFQ1RfU1VTUEVOREVELAogICAgICAgICAgICAgQVVESU9fTU9EVUxFU19VUERBVEUsCiAgICAgICAgICAgICBST1VUSU5HX1VQREFURUQsCi0gICAgICAgICAgICBVUERBVEVfVUlEX1NUQVRFUworICAgICAgICAgICAgVVBEQVRFX1VJRF9TVEFURVMsCisgICAgICAgICAgICBDSEVDS19TUEFUSUFMSVpFUl9PVVRQVVQsIC8vIHZlcmlmeSBpZiBzcGF0aWFsaXplciBlZmZlY3Qgc2hvdWxkIGJlIGNyZWF0ZWQgb3IgbW92ZWQKKyAgICAgICAgICAgIFVQREFURV9BQ1RJVkVfU1BBVElBTElaRVJfVFJBQ0tTLCAvLyBVcGRhdGUgYWN0aXZlIHRyYWNrIGNvdW50cyBvbiBzcGFsaWFsaXplciBvdXRwdXQKKyAgICAgICAgICAgIFZPTF9SQU5HRV9JTklUX1JFUVVFU1QsIC8vIHJlcXVlc3QgdG8gcmVzZXQgdGhlIHZvbHVtZSByYW5nZSBpbmRpY2VzCiAgICAgICAgIH07CiAKICAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOwpAQCAtNTMyLDYgKzU4MywxMCBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhdWRpb01vZHVsZXNVcGRhdGVDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJvdXRpbmdDaGFuZ2VkQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVVaWRTdGF0ZXNDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGNoZWNrU3BhdGlhbGl6ZXJDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUFjdGl2ZVNwYXRpYWxpemVyVHJhY2tzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB2b2xSYW5nZUluaXRSZXFDb21tYW5kKCk7CisKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwpAQCAtNjY3LDcgKzcyMiw4IEBACiAgICAgICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwpAQCAtNzUyLDYgKzgwOCw4IEBACiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKTsKIAorICAgICAgICB2aXJ0dWFsIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpOwogCiAgICAgICAgIHZvaWQgc2V0U291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKSBvdmVycmlkZTsKQEAgLTc2MSw2ICs4MTksOSBAQAogICAgICAgICBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKIAorICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOworCiAgICAgIHByaXZhdGU6CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSAqbUF1ZGlvUG9saWN5U2VydmljZTsKICAgICB9OwpAQCAtNzg4LDYgKzg0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25Sb3V0aW5nVXBkYXRlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIApAQCAtOTE3LDEyICs5NzksMTQgQEAKICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZCkgOgogICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgYXR0cmlidXRpb25Tb3VyY2UsIHNlc3Npb24sIHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSkge30KKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSksIGlzU3BhdGlhbGl6ZWQoaXNTcGF0aWFsaXplZCkgIHt9CiAgICAgICAgICAgICAgICAgfkF1ZGlvUGxheWJhY2tDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CisgICAgICAgIGNvbnN0IGJvb2wgaXNTcGF0aWFsaXplZDsKICAgICB9OwogCiAgICAgdm9pZCBnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCkBAIC05NTIsNiArMTAxNiwxNyBAQAogICAgIHZvaWQgbG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpOwogICAgIHZvaWQgdW5sb2FkQXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIGF1ZGlvIHRyYWNrcyBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dCBtaXhlci4KKyAgICAgKiBUaGUgcXVlcnkgY2FuIGJlIHNwZWNpZmllZCB0byBvbmx5IGluY2x1ZGUgc3BhdGlhbGl6ZWQgYXVkaW8gdHJhY2tzIG9yIGNvbnNpZGVyCisgICAgICogYWxsIHRyYWNrcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBJL08gaGFuZGxlIG9mIHRoZSBvdXRwdXQgbWl4ZXIgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW0gc3BhdGlhbGl6ZWRPbmx5IHRydWUgaWYgb25seSBzcGF0aWFsaXplZCB0cmFja3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYWN0aXZlIHRyYWNrcy4KKyAgICAgKi8KKyAgICBzaXplX3QgY291bnRBY3RpdmVDbGllbnRzT25PdXRwdXRfbCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBib29sIHNwYXRpYWxpemVkT25seSA9IHRydWUpIFJFUVVJUkVTKG1Mb2NrKTsKKwogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKICAgICAvLyBOb3RlOiBsb2NrIGFjcXVpc2l0aW9uIG9yZGVyIGlzIGFsd2F5cyBtTG9jayA+IG1FZmZlY3RzTG9jazoKQEAgLTk4NSw2ICsxMDYwLDggQEAKIAogICAgIENhcHR1cmVTdGF0ZU5vdGlmaWVyIG1DYXB0dXJlU3RhdGVOb3RpZmllcjsKIAorICAgIHNwPFNwYXRpYWxpemVyPiBtU3BhdGlhbGl6ZXI7CisKICAgICB2b2lkICptTGlicmFyeUhhbmRsZSA9IG51bGxwdHI7CiAgICAgQ3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgbUNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcjsKICAgICBEZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgbURlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTlhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyLmNwcApAQCAtMCwwICsxLDg2NCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisjZGVmaW5lIExPR19UQUcgIlNwYXRpYWxpemVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpeGVkZmZ0Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisKKyNpbmNsdWRlICJTcGF0aWFsaXplci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGFpZGxfdXRpbHM6OnN0YXR1c1RGcm9tQmluZGVyU3RhdHVzOwordXNpbmcgYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1Q7Cit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwordXNpbmcgYmluZGVyOjpTdGF0dXM7Cit1c2luZyBtZWRpYTo6SGVhZFRyYWNraW5nTW9kZTsKK3VzaW5nIG1lZGlhOjpQb3NlM2Y7Cit1c2luZyBtZWRpYTo6U3BhdGlhbGl6YXRpb25MZXZlbDsKK3VzaW5nIG1lZGlhOjpTcGF0aWFsaXphdGlvbk1vZGU7Cit1c2luZyBtZWRpYTo6U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOwordXNpbmcgbWVkaWE6OlNlbnNvclBvc2VQcm92aWRlcjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKHgpIFwKKyAgICAoeyBhdXRvIF90bXAgPSAoeCk7IFwKKyAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKF90bXAuZXJyb3IoKSk7IFwKKyAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgfSkKKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0TWF4Q2hhbm5lbE1hc2soc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1hc2tzKSB7CisgICAgdWludDMyX3QgbWF4Q291bnQgPSAwOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1heE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgZm9yIChhdXRvIG1hc2sgOiBtYXNrcykgeworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CisgICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSB7CisgICAgICAgICAgICBtYXhNYXNrID0gbWFzazsKKyAgICAgICAgICAgIG1heENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heE1hc2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTcGF0aWFsaXplcjo6RW5naW5lQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBFbmdpbmVDYWxsYmFja0hhbmRsZXIod3A8U3BhdGlhbGl6ZXI+IHNwYXRpYWxpemVyKQorICAgICAgICAgICAgOiBtU3BhdGlhbGl6ZXIoc3BhdGlhbGl6ZXIpIHsKKyAgICB9CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gRGV2aWNlIHN0YXRlIGNhbGxiYWNrcworICAgICAgICBrV2hhdE9uRnJhbWVzUHJvY2Vzc2VkLCAgICAvLyBBdWRpb0VmZmVjdDo6RVZFTlRfRlJBTUVTX1BST0NFU1NFRAorICAgICAgICBrV2hhdE9uSGVhZFRvU3RhZ2VQb3NlLCAgICAvLyBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpMaXN0ZW5lcjo6b25IZWFkVG9TdGFnZVBvc2UKKyAgICAgICAga1doYXRPbkFjdHVhbE1vZGVDaGFuZ2UsICAgLy8gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6TGlzdGVuZXI6Om9uQWN0dWFsTW9kZUNoYW5nZQorICAgIH07CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprTnVtRnJhbWVzS2V5ID0gIm51bUZyYW1lcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprTW9kZUtleSA9ICJtb2RlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmtUcmFuc2xhdGlvbjBLZXkgPSAidHJhbnNsYXRpb24wIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmtUcmFuc2xhdGlvbjFLZXkgPSAidHJhbnNsYXRpb24xIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmtUcmFuc2xhdGlvbjJLZXkgPSAidHJhbnNsYXRpb24yIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmtSb3RhdGlvbjBLZXkgPSAicm90YXRpb24wIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmtSb3RhdGlvbjFLZXkgPSAicm90YXRpb24xIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmtSb3RhdGlvbjJLZXkgPSAicm90YXRpb24yIjsKKworICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlIHsKKyAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgY2FzZSBrV2hhdE9uRnJhbWVzUHJvY2Vzc2VkOiB7CisgICAgICAgICAgICAgICAgc3A8U3BhdGlhbGl6ZXI+IHNwYXRpYWxpemVyID0gbVNwYXRpYWxpemVyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3BhdGlhbGl6ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IENhbm5vdCBwcm9tb3RlIHNwYXRpYWxpemVyIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihrTnVtRnJhbWVzS2V5LCAmbnVtRnJhbWVzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG51bSBmcmFtZXMhIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChudW1GcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxpemVyLT5jYWxjdWxhdGVIZWFkUG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrV2hhdE9uSGVhZFRvU3RhZ2VQb3NlOiB7CisgICAgICAgICAgICAgICAgc3A8U3BhdGlhbGl6ZXI+IHNwYXRpYWxpemVyID0gbVNwYXRpYWxpemVyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3BhdGlhbGl6ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IENhbm5vdCBwcm9tb3RlIHNwYXRpYWxpemVyIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBoZWFkVG9TdGFnZShzSGVhZFBvc2VLZXlzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgc0hlYWRQb3NlS2V5cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KHNIZWFkUG9zZUtleXNbaV0sICZoZWFkVG9TdGFnZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQga1RyYW5zbGF0aW9uMEtleSEiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3BhdGlhbGl6ZXItPm9uSGVhZFRvU3RhZ2VQb3NlTXNnKGhlYWRUb1N0YWdlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrV2hhdE9uQWN0dWFsTW9kZUNoYW5nZTogeworICAgICAgICAgICAgICAgIHNwPFNwYXRpYWxpemVyPiBzcGF0aWFsaXplciA9IG1TcGF0aWFsaXplci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHNwYXRpYWxpemVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBDYW5ub3QgcHJvbW90ZSBzcGF0aWFsaXplciIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a01vZGVLZXksICZtb2RlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGFjdHVhbE1vZGUhIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwYXRpYWxpemVyLT5vbkFjdHVhbE1vZGVDaGFuZ2VNc2coc3RhdGljX2Nhc3Q8SGVhZFRyYWNraW5nTW9kZT4obW9kZSkpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgY2FsbGJhY2sgbWVzc2FnZSAlZCIsIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KK3ByaXZhdGU6CisgICAgd3A8U3BhdGlhbGl6ZXI+IG1TcGF0aWFsaXplcjsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gU3BhdGlhbGl6ZXI6OnNIZWFkUG9zZUtleXMgPSB7CisgICAgU3BhdGlhbGl6ZXI6OkVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1RyYW5zbGF0aW9uMEtleSwKKyAgICBTcGF0aWFsaXplcjo6RW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprVHJhbnNsYXRpb24xS2V5LAorICAgIFNwYXRpYWxpemVyOjpFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtUcmFuc2xhdGlvbjJLZXksCisgICAgU3BhdGlhbGl6ZXI6OkVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1JvdGF0aW9uMEtleSwKKyAgICBTcGF0aWFsaXplcjo6RW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprUm90YXRpb24xS2V5LAorICAgIFNwYXRpYWxpemVyOjpFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtSb3RhdGlvbjJLZXksCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NwPFNwYXRpYWxpemVyPiBTcGF0aWFsaXplcjo6Y3JlYXRlKFNwYXRpYWxpemVyUG9saWN5Q2FsbGJhY2sgKmNhbGxiYWNrKSB7CisgICAgc3A8U3BhdGlhbGl6ZXI+IHNwYXRpYWxpemVyOworCisgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGVmZmVjdHNGYWN0b3J5SGFsID0gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpOworICAgIGlmIChlZmZlY3RzRmFjdG9yeUhhbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBmYWlsZWQgdG8gY3JlYXRlIGVmZmVjdCBmYWN0b3J5IGludGVyZmFjZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHNwYXRpYWxpemVyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGRlc2NyaXB0b3JzOworICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBlZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcnMoRlhfSUlEX1NQQVRJQUxJWkVSLCAmZGVzY3JpcHRvcnMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzIGZhaWxlZCB0byBnZXQgc3BhdGlhbGl6ZXIgZGVzY3JpcHRvciwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHNwYXRpYWxpemVyOworICAgIH0KKyAgICBBTE9HX0FTU0VSVCghZGVzY3JpcHRvcnMuZW1wdHkoKSwKKyAgICAgICAgICAgICIlcyBnZXREZXNjcmlwdG9ycygpIHJldHVybmVkIG5vIGVycm9yIGJ1dCBlbXB0eSBsaXN0IiwgX19mdW5jX18pOworCisgICAgLy9UT0RPOiBnZXQgc3VwcG9ydGVkIHNwYXRpYWxpemF0aW9uIG1vZGVzIGZyb20gRlggZW5naW5lIG9yIGRlc2NyaXB0b3IKKworICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0OworICAgIHN0YXR1cyA9IGVmZmVjdHNGYWN0b3J5SGFsLT5jcmVhdGVFZmZlY3QoJmRlc2NyaXB0b3JzWzBdLnV1aWQsIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFLAorICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsIEFVRElPX1BPUlRfSEFORExFX05PTkUsICZlZmZlY3QpOworICAgIEFMT0dJKCIlcyBGWCBjcmVhdGUgc3RhdHVzICVkIGVmZmVjdCAlcCIsIF9fZnVuY19fLCBzdGF0dXMsIGVmZmVjdC5nZXQoKSk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIGVmZmVjdCAhPSBudWxscHRyKSB7CisgICAgICAgIHNwYXRpYWxpemVyID0gbmV3IFNwYXRpYWxpemVyKGRlc2NyaXB0b3JzWzBdLCBjYWxsYmFjayk7CisgICAgICAgIGlmIChzcGF0aWFsaXplci0+bG9hZEVuZ2luZUNvbmZpZ3VyYXRpb24oZWZmZWN0KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3BhdGlhbGl6ZXIuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzcGF0aWFsaXplcjsKK30KKworU3BhdGlhbGl6ZXI6OlNwYXRpYWxpemVyKGVmZmVjdF9kZXNjcmlwdG9yX3QgZW5naW5lRGVzY3JpcHRvciwgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayogY2FsbGJhY2spCisgICAgOiBtRW5naW5lRGVzY3JpcHRvcihlbmdpbmVEZXNjcmlwdG9yKSwKKyAgICAgIG1Qb2xpY3lDYWxsYmFjayhjYWxsYmFjaykgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKK30KKwordm9pZCBTcGF0aWFsaXplcjo6b25GaXJzdFJlZigpIHsKKyAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUxvb3Blci0+c2V0TmFtZSgiU3BhdGlhbGl6ZXItbG9vcGVyIik7CisgICAgbUxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAvKnJ1bk9uQ2FsbGluZ1RocmVhZCovZmFsc2UsCisgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgZmFsc2UsCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisKKyAgICBtSGFuZGxlciA9IG5ldyBFbmdpbmVDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKK30KKworU3BhdGlhbGl6ZXI6On5TcGF0aWFsaXplcigpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG1Mb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICB9CisgICAgbUxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFNwYXRpYWxpemVyOjpsb2FkRW5naW5lQ29uZmlndXJhdGlvbihzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKworICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHN1cHBvcnRzSGVhZFRyYWNraW5nOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEhhbFBhcmFtZXRlcjxmYWxzZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9IRUFEVFJBQ0tJTkdfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VwcG9ydHNIZWFkVHJhY2tpbmcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgZ2V0IFNQQVRJQUxJWkVSX1BBUkFNX0hFQURUUkFDS0lOR19TVVBQT1JURUQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIG1TdXBwb3J0c0hlYWRUcmFja2luZyA9IHN1cHBvcnRzSGVhZFRyYWNraW5nWzBdOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw+IHNwYXRpYWxpemF0aW9uTGV2ZWxzOworICAgIHN0YXR1cyA9IGdldEhhbFBhcmFtZXRlcjx0cnVlPihlZmZlY3QsIFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9MRVZFTFMsCisgICAgICAgICAgICAmc3BhdGlhbGl6YXRpb25MZXZlbHMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgZ2V0IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9MRVZFTFMiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGJvb2wgbm9uZUxldmVsRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGFjdGl2ZUxldmVsRm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gc3BhdGlhbGl6YXRpb25MZXZlbCA6IHNwYXRpYWxpemF0aW9uTGV2ZWxzKSB7CisgICAgICAgIGlmICghYWlkbF91dGlsczo6aXNWYWxpZEVudW0oc3BhdGlhbGl6YXRpb25MZXZlbCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogaWdub3Jpbmcgc3BhdGlhbGl6YXRpb25MZXZlbDolZCIsIF9fZnVuY19fLCAoaW50KXNwYXRpYWxpemF0aW9uTGV2ZWwpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNwYXRpYWxpemF0aW9uTGV2ZWwgPT0gbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUpIHsKKyAgICAgICAgICAgIG5vbmVMZXZlbEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjdGl2ZUxldmVsRm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIHdlIGRvbid0IGRldGVjdCBkdXBsaWNhdGVzLgorICAgICAgICBtTGV2ZWxzLmVtcGxhY2VfYmFjayhzcGF0aWFsaXphdGlvbkxldmVsKTsKKyAgICB9CisgICAgaWYgKCFub25lTGV2ZWxGb3VuZCB8fCAhYWN0aXZlTGV2ZWxGb3VuZCkgeworICAgICAgICBBTE9HVygiJXM6IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9MRVZFTFMgbXVzdCBpbmNsdWRlIE5PTkUiCisgICAgICAgICAgICAgICAgIiBhbmQgYW5vdGhlciB2YWxpZCBsZXZlbCIsICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTW9kZT4gc3BhdGlhbGl6YXRpb25Nb2RlczsKKyAgICBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8dHJ1ZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfU1BBVElBTElaQVRJT05fTU9ERVMsCisgICAgICAgICAgICAmc3BhdGlhbGl6YXRpb25Nb2Rlcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBnZXQgU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX1NQQVRJQUxJWkFUSU9OX01PREVTIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gc3BhdGlhbGl6YXRpb25Nb2RlIDogc3BhdGlhbGl6YXRpb25Nb2RlcykgeworICAgICAgICBpZiAoIWFpZGxfdXRpbHM6OmlzVmFsaWRFbnVtKHNwYXRpYWxpemF0aW9uTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogaWdub3Jpbmcgc3BhdGlhbGl6YXRpb25Nb2RlOiVkIiwgX19mdW5jX18sIChpbnQpc3BhdGlhbGl6YXRpb25Nb2RlKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHdlIGRvbid0IGRldGVjdCBkdXBsaWNhdGVzLgorICAgICAgICBtU3BhdGlhbGl6YXRpb25Nb2Rlcy5lbXBsYWNlX2JhY2soc3BhdGlhbGl6YXRpb25Nb2RlKTsKKyAgICB9CisgICAgaWYgKG1TcGF0aWFsaXphdGlvbk1vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfU1BBVElBTElaQVRJT05fTU9ERVMgcmVwb3J0cyBlbXB0eSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gY2hhbm5lbE1hc2tzOworICAgIHN0YXR1cyA9IGdldEhhbFBhcmFtZXRlcjx0cnVlPihlZmZlY3QsIFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9DSEFOTkVMX01BU0tTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXNrcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBnZXQgU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX0NIQU5ORUxfTUFTS1MiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byBjaGFubmVsTWFzayA6IGNoYW5uZWxNYXNrcykgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2NoYW5uZWxfbWFza19zcGF0aWFsaXplZChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogaWdub3JpbmcgY2hhbm5lbE1hc2s6JSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHdlIGRvbid0IGRldGVjdCBkdXBsaWNhdGVzLgorICAgICAgICBtQ2hhbm5lbE1hc2tzLmVtcGxhY2VfYmFjayhjaGFubmVsTWFzayk7CisgICAgfQorICAgIGlmIChtQ2hhbm5lbE1hc2tzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfQ0hBTk5FTF9NQVNLUyByZXBvcnRzIGVtcHR5IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEN1cnJlbnRseSB3ZSBleHBvc2Ugb25seSBSRUxBVElWRV9XT1JMRC4KKyAgICAvLyBUaGlzIGlzIGEgbGltaXRhdGlvbiBvZiB0aGUgaGVhZCB0cmFja2luZyBsaWJyYXJ5IGJhc2VkIG9uIGEgVVggY2hvaWNlLgorICAgIG1IZWFkVHJhY2tpbmdNb2Rlcy5wdXNoX2JhY2soU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpESVNBQkxFRCk7CisgICAgaWYgKG1TdXBwb3J0c0hlYWRUcmFja2luZykgeworICAgICAgICBtSGVhZFRyYWNraW5nTW9kZXMucHVzaF9iYWNrKFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6UkVMQVRJVkVfV09STEQpOworICAgIH0KKyAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0NIQU5ORUxNQVNLLCAoaW50MzJfdClnZXRNYXhDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2tzKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTEVWRUxTLCBhaWRsX3V0aWxzOjplbnVtc1RvU3RyaW5nKG1MZXZlbHMpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFUywgYWlkbF91dGlsczo6ZW51bXNUb1N0cmluZyhtU3BhdGlhbGl6YXRpb25Nb2RlcykpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0hFQURUUkFDS0lOR01PREVTLCBhaWRsX3V0aWxzOjplbnVtc1RvU3RyaW5nKG1IZWFkVHJhY2tpbmdNb2RlcykpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVUywgKGludDMyX3Qpc3RhdHVzKQorICAgICAgICAucmVjb3JkKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKiogR2V0cyB0aGUgY2hhbm5lbCBtYXNrLCBzYW1wbGluZyByYXRlIGFuZCBmb3JtYXQgc2V0IGZvciB0aGUgc3BhdGlhbGl6ZXIgaW5wdXQuICovCithdWRpb19jb25maWdfYmFzZV90IFNwYXRpYWxpemVyOjpnZXRBdWRpb0luQ29uZmlnKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIC8vIEZvciBub3cgdXNlIGhpZ2hlc3Qgc3VwcG9ydGVkIGNoYW5uZWwgY291bnQKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZ2V0TWF4Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrcyk7CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKworc3RhdHVzX3QgU3BhdGlhbGl6ZXI6OnJlZ2lzdGVyQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2FsbGJhY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IGJpbmRlci0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtU3BhdGlhbGl6ZXJDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICBBTE9HVigiJXMgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3ZvaWQgU3BhdGlhbGl6ZXI6OmJpbmRlckRpZWQoX191bnVzZWQgY29uc3Qgd3A8SUJpbmRlcj4gJndobykgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICAgICBtTGV2ZWwgPSBTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FOworICAgICAgICBtU3BhdGlhbGl6ZXJDYWxsYmFjay5jbGVhcigpOworICAgIH0KKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgbVBvbGljeUNhbGxiYWNrLT5vbkNoZWNrU3BhdGlhbGl6ZXIoKTsKK30KKworLy8gSVNwYXRpYWxpemVyCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmdldFN1cHBvcnRlZExldmVscyhzdGQ6OnZlY3RvcjxTcGF0aWFsaXphdGlvbkxldmVsPiAqbGV2ZWxzKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGlmIChsZXZlbHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgLy8gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORSBpcyBhbHJlYWR5IHJlcXVpcmVkIGZyb20gdGhlIGVmZmVjdCBvciB3ZSBkb24ndCBsb2FkIGl0LgorICAgIGxldmVscy0+aW5zZXJ0KGxldmVscy0+ZW5kKCksIG1MZXZlbHMuYmVnaW4oKSwgbUxldmVscy5lbmQoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpzZXRMZXZlbChTcGF0aWFsaXphdGlvbkxldmVsIGxldmVsKSB7CisgICAgQUxPR1YoIiVzIGxldmVsICVkIiwgX19mdW5jX18sIChpbnQpbGV2ZWwpOworICAgIGlmIChsZXZlbCAhPSBTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FCisgICAgICAgICAgICAmJiBzdGQ6OmZpbmQobUxldmVscy5iZWdpbigpLCBtTGV2ZWxzLmVuZCgpLCBsZXZlbCkgPT0gbUxldmVscy5lbmQoKSkgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgc3A8bWVkaWE6OklOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrPiBjYWxsYmFjazsKKyAgICBib29sIGxldmVsQ2hhbmdlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICAgICBsZXZlbENoYW5nZWQgPSBtTGV2ZWwgIT0gbGV2ZWw7CisgICAgICAgIG1MZXZlbCA9IGxldmVsOworICAgICAgICBjYWxsYmFjayA9IG1TcGF0aWFsaXplckNhbGxiYWNrOworCisgICAgICAgIGlmIChsZXZlbENoYW5nZWQgJiYgbUVuZ2luZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjaGVja0VuZ2luZVN0YXRlX2woKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja1NlbnNvcnNTdGF0ZV9sKCk7CisgICAgfQorCisgICAgaWYgKGxldmVsQ2hhbmdlZCkgeworICAgICAgICBtUG9saWN5Q2FsbGJhY2stPm9uQ2hlY2tTcGF0aWFsaXplcigpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uTGV2ZWxDaGFuZ2VkKGxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmdldExldmVsKFNwYXRpYWxpemF0aW9uTGV2ZWwgKmxldmVsKSB7CisgICAgaWYgKGxldmVsID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAqbGV2ZWwgPSBtTGV2ZWw7CisgICAgQUxPR1YoIiVzIGxldmVsICVkIiwgX19mdW5jX18sIChpbnQpKmxldmVsKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmlzSGVhZFRyYWNraW5nU3VwcG9ydGVkKGJvb2wgKnN1cHBvcnRzKSB7CisgICAgQUxPR1YoIiVzIG1TdXBwb3J0c0hlYWRUcmFja2luZyAlZCIsIF9fZnVuY19fLCBtU3VwcG9ydHNIZWFkVHJhY2tpbmcpOworICAgIGlmIChzdXBwb3J0cyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgKnN1cHBvcnRzID0gbVN1cHBvcnRzSGVhZFRyYWNraW5nOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6Z2V0U3VwcG9ydGVkSGVhZFRyYWNraW5nTW9kZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZT4qIG1vZGVzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAobW9kZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgbW9kZXMtPmluc2VydChtb2Rlcy0+ZW5kKCksIG1IZWFkVHJhY2tpbmdNb2Rlcy5iZWdpbigpLCBtSGVhZFRyYWNraW5nTW9kZXMuZW5kKCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6c2V0RGVzaXJlZEhlYWRUcmFja2luZ01vZGUoU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigiJXMgbW9kZSAlZCIsIF9fZnVuY19fLCAoaW50KW1vZGUpOworCisgICAgaWYgKCFtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6T1RIRVI6CisgICAgICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgY2FzZSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6OkRJU0FCTEVEOgorICAgICAgICAgICAgbURlc2lyZWRIZWFkVHJhY2tpbmdNb2RlID0gSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpSRUxBVElWRV9XT1JMRDoKKyAgICAgICAgICAgIG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSA9IEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpSRUxBVElWRV9TQ1JFRU46CisgICAgICAgICAgICBtRGVzaXJlZEhlYWRUcmFja2luZ01vZGUgPSBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjaGVja1Bvc2VDb250cm9sbGVyX2woKTsKKyAgICBjaGVja1NlbnNvcnNTdGF0ZV9sKCk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmdldEFjdHVhbEhlYWRUcmFja2luZ01vZGUoU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlICptb2RlKSB7CisgICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICptb2RlID0gbUFjdHVhbEhlYWRUcmFja2luZ01vZGU7CisgICAgQUxPR1YoIiVzIG1vZGUgJWQiLCBfX2Z1bmNfXywgKGludCkqbW9kZSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpyZWNlbnRlckhlYWRUcmFja2VyKCkgeworICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLT5yZWNlbnRlcigpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldEdsb2JhbFRyYW5zZm9ybShjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIHNjcmVlblRvU3RhZ2UpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKCFtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisgICAgc3RkOjpvcHRpb25hbDxQb3NlM2Y+IG1heWJlUG9zZSA9IFBvc2UzZjo6ZnJvbVZlY3RvcihzY3JlZW5Ub1N0YWdlKTsKKyAgICBpZiAoIW1heWJlUG9zZS5oYXNfdmFsdWUoKSkgeworICAgICAgICBBTE9HVygiSW52YWxpZCBzY3JlZW5Ub1N0YWdlIHZlY3Rvci4iKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRTY3JlZW5Ub1N0YWdlUG9zZShtYXliZVBvc2UudmFsdWUoKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6cmVsZWFzZSgpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgYm9vbCBsZXZlbENoYW5nZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TcGF0aWFsaXplckNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtU3BhdGlhbGl6ZXJDYWxsYmFjayk7CisgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgbVNwYXRpYWxpemVyQ2FsbGJhY2suY2xlYXIoKTsKKworICAgICAgICBsZXZlbENoYW5nZWQgPSBtTGV2ZWwgIT0gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORTsKKyAgICAgICAgbUxldmVsID0gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORTsKKyAgICB9CisKKyAgICBpZiAobGV2ZWxDaGFuZ2VkKSB7CisgICAgICAgIG1Qb2xpY3lDYWxsYmFjay0+b25DaGVja1NwYXRpYWxpemVyKCk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6c2V0SGVhZFNlbnNvcihpbnQgc2Vuc29ySGFuZGxlKSB7CisgICAgQUxPR1YoIiVzIHNlbnNvckhhbmRsZSAlZCIsIF9fZnVuY19fLCBzZW5zb3JIYW5kbGUpOworICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhlYWRTZW5zb3IgIT0gc2Vuc29ySGFuZGxlKSB7CisgICAgICAgIG1IZWFkU2Vuc29yID0gc2Vuc29ySGFuZGxlOworICAgICAgICBjaGVja1Bvc2VDb250cm9sbGVyX2woKTsKKyAgICAgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldFNjcmVlblNlbnNvcihpbnQgc2Vuc29ySGFuZGxlKSB7CisgICAgQUxPR1YoIiVzIHNlbnNvckhhbmRsZSAlZCIsIF9fZnVuY19fLCBzZW5zb3JIYW5kbGUpOworICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVNjcmVlblNlbnNvciAhPSBzZW5zb3JIYW5kbGUpIHsKKyAgICAgICAgbVNjcmVlblNlbnNvciA9IHNlbnNvckhhbmRsZTsKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgYSBuZXcgbWV0aG9kIHNldEhlYWRBbmRTY3JlZW5TZW5zb3IoKQorICAgICAgICAvLyBiZWNhdXNlIHdlIGdlbmVyYWxseSBzZXQgYm90aCBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICAvLyBUaGlzIHdpbGwgYXZvaWQgZHVwbGljYXRlZCB3b3JrIGFuZCByZWNlbnRlcmluZy4KKyAgICAgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldERpc3BsYXlPcmllbnRhdGlvbihmbG9hdCBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlKSB7CisgICAgQUxPR1YoIiVzIHBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUgJWYiLCBfX2Z1bmNfXywgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSk7CisgICAgaWYgKCFtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIG1EaXNwbGF5T3JpZW50YXRpb24gPSBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlOworICAgIGlmIChtUG9zZUNvbnRyb2xsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldERpc3BsYXlPcmllbnRhdGlvbihtRGlzcGxheU9yaWVudGF0aW9uKTsKKyAgICB9CisgICAgaWYgKG1FbmdpbmUgIT0gbnVsbHB0cikgeworICAgICAgICBzZXRFZmZlY3RQYXJhbWV0ZXJfbCgKKyAgICAgICAgICAgIFNQQVRJQUxJWkVSX1BBUkFNX0RJU1BMQVlfT1JJRU5UQVRJT04sIHN0ZDo6dmVjdG9yPGZsb2F0PntwaHlzaWNhbFRvTG9naWNhbEFuZ2xlfSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6c2V0SGluZ2VBbmdsZShmbG9hdCBoaW5nZUFuZ2xlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBoaW5nZUFuZ2xlICVmIiwgX19mdW5jX18sIGhpbmdlQW5nbGUpOworICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fSElOR0VfQU5HTEUsIHN0ZDo6dmVjdG9yPGZsb2F0PntoaW5nZUFuZ2xlfSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6Z2V0U3VwcG9ydGVkTW9kZXMoc3RkOjp2ZWN0b3I8U3BhdGlhbGl6YXRpb25Nb2RlPiAqbW9kZXMpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG1vZGVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgICptb2RlcyA9IG1TcGF0aWFsaXphdGlvbk1vZGVzOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6cmVnaXN0ZXJIZWFkVHJhY2tpbmdDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBBTE9HVigiJXMgY2FsbGJhY2sgJXAiLCBfX2Z1bmNfXywgY2FsbGJhY2suZ2V0KCkpOworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1TdXBwb3J0c0hlYWRUcmFja2luZykgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKyAgICBtSGVhZFRyYWNraW5nQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgdmFsdWUpIHsKKyAgICBBTE9HVigiJXMga2V5ICVkIiwgX19mdW5jX18sIGtleSk7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RhdHVzID0gc2V0RWZmZWN0UGFyYW1ldGVyX2woa2V5LCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiAqdmFsdWUpIHsKKyAgICBBTE9HVigiJXMga2V5ICVkIHZhbHVlIHNpemUgJWQiLCBfX2Z1bmNfXywga2V5LAorICAgICAgICAgICh2YWx1ZSAhPSBudWxscHRyID8gKGludCl2YWx1ZS0+c2l6ZSgpIDogLTEpKTsKKyAgICBpZiAodmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGtleSAlZCBtRW5naW5lICVwIiwgX19mdW5jX18sIGtleSwgbUVuZ2luZS5nZXQoKSk7CisgICAgICAgIHN0YXR1cyA9IGdldEVmZmVjdFBhcmFtZXRlcl9sKGtleSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpnZXRPdXRwdXQoaW50ICpvdXRwdXQpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAqb3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChtT3V0cHV0KSk7CisgICAgQUxPR1YoIiVzIGdvdCBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgKm91dHB1dCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworLy8gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6TGlzdGVuZXIKK3ZvaWQgU3BhdGlhbGl6ZXI6Om9uSGVhZFRvU3RhZ2VQb3NlKGNvbnN0IFBvc2UzZiYgaGVhZFRvU3RhZ2UpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbVN1cHBvcnRzSGVhZFRyYWNraW5nLAorICAgICAgICAgICAgIm9uSGVhZFRvU3RhZ2VQb3NlKCkgY2FsbGVkIHdpdGggbm8gaGVhZCB0cmFja2luZyBzdXBwb3J0ISIpOworCisgICAgYXV0byB2ZWMgPSBoZWFkVG9TdGFnZS50b1ZlY3RvcigpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodmVjLnNpemUoKSAhPSBzSGVhZFBvc2VLZXlzLnNpemUoKSwKKyAgICAgICAgICAgICIlcyBpbnZhbGlkIGhlYWQgdG8gc3RhZ2UgdmVjdG9yIHNpemUgJXp1IiwgX19mdW5jX18sIHZlYy5zaXplKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPQorICAgICAgICAgICAgbmV3IEFNZXNzYWdlKEVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1doYXRPbkhlYWRUb1N0YWdlUG9zZSwgbUhhbmRsZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IHNIZWFkUG9zZUtleXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXNnLT5zZXRGbG9hdChzSGVhZFBvc2VLZXlzW2ldLCB2ZWNbaV0pOworICAgIH0KKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBTcGF0aWFsaXplcjo6b25IZWFkVG9TdGFnZVBvc2VNc2coY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBoZWFkVG9TdGFnZSkgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBzcDxtZWRpYTo6SVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICAgICBjYWxsYmFjayA9IG1IZWFkVHJhY2tpbmdDYWxsYmFjazsKKyAgICAgICAgaWYgKG1FbmdpbmUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fSEVBRF9UT19TVEFHRSwgaGVhZFRvU3RhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uSGVhZFRvU291bmRTdGFnZVBvc2VVcGRhdGVkKGhlYWRUb1N0YWdlKTsKKyAgICB9Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6Om9uQWN0dWFsTW9kZUNoYW5nZShIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIChpbnQpbW9kZSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9CisgICAgICAgICAgICBuZXcgQU1lc3NhZ2UoRW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprV2hhdE9uQWN0dWFsTW9kZUNoYW5nZSwgbUhhbmRsZXIpOworICAgIG1zZy0+c2V0SW50MzIoRW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprTW9kZUtleSwgc3RhdGljX2Nhc3Q8aW50Pihtb2RlKSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6Om9uQWN0dWFsTW9kZUNoYW5nZU1zZyhIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIChpbnQpIG1vZGUpOworICAgIHNwPG1lZGlhOjpJU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIHNwYXRpYWxpemVyTW9kZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgICAgIHNwYXRpYWxpemVyTW9kZSA9IFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6RElTQUJMRUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgc3BhdGlhbGl6ZXJNb2RlID0gU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpESVNBQkxFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRToKKyAgICAgICAgICAgICAgICAgICAgc3BhdGlhbGl6ZXJNb2RlID0gU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpSRUxBVElWRV9XT1JMRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkU6CisgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxpemVyTW9kZSA9IFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6UkVMQVRJVkVfU0NSRUVOOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIG1vZGU6ICVkIiwgbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUFjdHVhbEhlYWRUcmFja2luZ01vZGUgPSBzcGF0aWFsaXplck1vZGU7CisgICAgICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0hFQURUUkFDS0lOR19NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlPntzcGF0aWFsaXplck1vZGV9KTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayA9IG1IZWFkVHJhY2tpbmdDYWxsYmFjazsKKyAgICB9CisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uSGVhZFRyYWNraW5nTW9kZUNoYW5nZWQoc3BhdGlhbGl6ZXJNb2RlKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFNwYXRpYWxpemVyOjphdHRhY2hPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzaXplX3QgbnVtQWN0aXZlVHJhY2tzKSB7CisgICAgYm9vbCBvdXRwdXRDaGFuZ2VkID0gZmFsc2U7CisgICAgc3A8bWVkaWE6OklOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrPiBjYWxsYmFjazsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICAgICBBTE9HVigiJXMgb3V0cHV0ICVkIG1PdXRwdXQgJWQiLCBfX2Z1bmNfXywgKGludClvdXRwdXQsIChpbnQpbU91dHB1dCk7CisgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1FbmdpbmUgPT0gbnVsbHB0ciwgIiVzIG91dHB1dCBzZXQgd2l0aG91dCBGWCBlbmdpbmUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAvLyByZW1vdmUgRlggaW5zdGFuY2UKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgbUVuZ2luZS5jbGVhcigpOworICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIEZYIGluc3RhbmNlIG9uIG91dHB1dAorICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOworICAgICAgICBtRW5naW5lID0gbmV3IEF1ZGlvRWZmZWN0KGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgbUVuZ2luZS0+c2V0KG51bGxwdHIsICZtRW5naW5lRGVzY3JpcHRvci51dWlkLCAwLCBTcGF0aWFsaXplcjo6ZW5naW5lQ2FsbGJhY2sgLyogY2JmICovLAorICAgICAgICAgICAgICAgICAgICAgdGhpcyAvKiB1c2VyICovLCBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSwgb3V0cHV0LCB7fSAvKiBkZXZpY2UgKi8sCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBwcm9iZSAqLywgdHJ1ZSAvKiBub3RpZnlGcmFtZXNQcm9jZXNzZWQgKi8pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5pbml0Q2hlY2soKTsKKyAgICAgICAgQUxPR1YoIiVzIG1FbmdpbmUgY3JlYXRlIHN0YXR1cyAlZCIsIF9fZnVuY19fLCAoaW50KXN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRDaGFuZ2VkID0gbU91dHB1dCAhPSBvdXRwdXQ7CisgICAgICAgIG1PdXRwdXQgPSBvdXRwdXQ7CisgICAgICAgIG1OdW1BY3RpdmVUcmFja3MgPSBudW1BY3RpdmVUcmFja3M7CisKKyAgICAgICAgY2hlY2tFbmdpbmVTdGF0ZV9sKCk7CisgICAgICAgIGlmIChtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgICAgIGNoZWNrUG9zZUNvbnRyb2xsZXJfbCgpOworICAgICAgICAgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOworICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrID0gbVNwYXRpYWxpemVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgaWYgKG91dHB1dENoYW5nZWQgJiYgY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBjYWxsYmFjay0+b25PdXRwdXRDaGFuZ2VkKG91dHB1dCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19pb19oYW5kbGVfdCBTcGF0aWFsaXplcjo6ZGV0YWNoT3V0cHV0KCkgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4gY2FsbGJhY2s7CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgQUxPR1YoIiVzIG1PdXRwdXQgJWQiLCBfX2Z1bmNfXywgKGludCltT3V0cHV0KTsKKyAgICAgICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVtb3ZlIEZYIGluc3RhbmNlCisgICAgICAgIG1FbmdpbmUtPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtRW5naW5lLmNsZWFyKCk7CisgICAgICAgIG91dHB1dCA9IG1PdXRwdXQ7CisgICAgICAgIG1PdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLnJlc2V0KCk7CisgICAgICAgIGNhbGxiYWNrID0gbVNwYXRpYWxpemVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uT3V0cHV0Q2hhbmdlZChBVURJT19JT19IQU5ETEVfTk9ORSk7CisgICAgfQorICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6OnVwZGF0ZUFjdGl2ZVRyYWNrcyhzaXplX3QgbnVtQWN0aXZlVHJhY2tzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgIGlmIChtTnVtQWN0aXZlVHJhY2tzICE9IG51bUFjdGl2ZVRyYWNrcykgeworICAgICAgICBtTnVtQWN0aXZlVHJhY2tzID0gbnVtQWN0aXZlVHJhY2tzOworICAgICAgICBjaGVja0VuZ2luZVN0YXRlX2woKTsKKyAgICAgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOworICAgIH0KK30KKwordm9pZCBTcGF0aWFsaXplcjo6Y2hlY2tTZW5zb3JzU3RhdGVfbCgpIHsKKyAgICBpZiAobVN1cHBvcnRzSGVhZFRyYWNraW5nICYmIG1Qb3NlQ29udHJvbGxlciAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtTnVtQWN0aXZlVHJhY2tzID4gMCAmJiBtTGV2ZWwgIT0gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORQorICAgICAgICAgICAgJiYgbURlc2lyZWRIZWFkVHJhY2tpbmdNb2RlICE9IEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQworICAgICAgICAgICAgJiYgbUhlYWRTZW5zb3IgIT0gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1IpIHsKKyAgICAgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0SGVhZFNlbnNvcihtSGVhZFNlbnNvcik7CisgICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldFNjcmVlblNlbnNvcihtU2NyZWVuU2Vuc29yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0SGVhZFNlbnNvcihTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUik7CisgICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldFNjcmVlblNlbnNvcihTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6OmNoZWNrRW5naW5lU3RhdGVfbCgpIHsKKyAgICBpZiAobUVuZ2luZSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtTGV2ZWwgIT0gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORSAmJiBtTnVtQWN0aXZlVHJhY2tzID4gMCkgeworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGF0aWFsaXphdGlvbkxldmVsPnttTGV2ZWx9KTsKKyAgICAgICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0hFQURUUkFDS0lOR19NT0RFLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU+e21BY3R1YWxIZWFkVHJhY2tpbmdNb2RlfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRFZmZlY3RQYXJhbWV0ZXJfbChTUEFUSUFMSVpFUl9QQVJBTV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BhdGlhbGl6YXRpb25MZXZlbD57U3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORX0pOworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6OmNoZWNrUG9zZUNvbnRyb2xsZXJfbCgpIHsKKyAgICBib29sIGlzQ29udHJvbGxlck5lZWRlZCA9IG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSAhPSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMKKyAgICAgICAgICAgICYmIG1IZWFkU2Vuc29yICE9IFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OklOVkFMSURfU0VOU09SOworCisgICAgaWYgKGlzQ29udHJvbGxlck5lZWRlZCAmJiBtUG9zZUNvbnRyb2xsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtUG9zZUNvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI+KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6Okxpc3RlbmVyKj4odGhpcyksCisgICAgICAgICAgICAgICAgMTBtcywgc3RkOjpudWxsb3B0KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUG9zZUNvbnRyb2xsZXIgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgY291bGQgbm90IGFsbG9jYXRlIHBvc2UgY29udHJvbGxlciIsIF9fZnVuY19fKTsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXREaXNwbGF5T3JpZW50YXRpb24obURpc3BsYXlPcmllbnRhdGlvbik7CisgICAgfSBlbHNlIGlmICghaXNDb250cm9sbGVyTmVlZGVkICYmIG1Qb3NlQ29udHJvbGxlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci5yZXNldCgpOworICAgIH0KKyAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXREZXNpcmVkTW9kZShtRGVzaXJlZEhlYWRUcmFja2luZ01vZGUpOworICAgIH0KK30KKwordm9pZCBTcGF0aWFsaXplcjo6Y2FsY3VsYXRlSGVhZFBvc2UoKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLT5jYWxjdWxhdGVBc3luYygpOworICAgIH0KK30KKwordm9pZCBTcGF0aWFsaXplcjo6ZW5naW5lQ2FsbGJhY2soaW50MzJfdCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgeworICAgIGlmICh1c2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTcGF0aWFsaXplciogY29uc3QgbWUgPSByZWludGVycHJldF9jYXN0PFNwYXRpYWxpemVyICo+KHVzZXIpOworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBBdWRpb0VmZmVjdDo6RVZFTlRfRlJBTUVTX1BST0NFU1NFRDogeworICAgICAgICAgICAgaW50IGZyYW1lcyA9IGluZm8gPT0gbnVsbHB0ciA/IDAgOiAqKGludCopaW5mbzsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBmcmFtZXMgcHJvY2Vzc2VkICVkIGZvciBtZSAlcCIsIF9fZnVuY19fLCBmcmFtZXMsIG1lKTsKKyAgICAgICAgICAgIG1lLT5wb3N0RnJhbWVzUHJvY2Vzc2VkTXNnKGZyYW1lcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVigiJXMgZXZlbnQgJWQiLCBfX2Z1bmNfXywgZXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFNwYXRpYWxpemVyOjpwb3N0RnJhbWVzUHJvY2Vzc2VkTXNnKGludCBmcmFtZXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0KKyAgICAgICAgICAgIG5ldyBBTWVzc2FnZShFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtXaGF0T25GcmFtZXNQcm9jZXNzZWQsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldEludDMyKEVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a051bUZyYW1lc0tleSwgZnJhbWVzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjRiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyLmgKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfU1BBVElBTElaRVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1NQQVRJQUxJWkVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5FZmZlY3QuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuU3BhdGlhbGl6ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTGV2ZWwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTW9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3Rfc3BhdGlhbGl6ZXIuaD4KKworI2luY2x1ZGUgIlNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmcm9tIHRoZSBTcGF0aWFsaXplciBvYmplY3Qgb3IgaXRzIHBhcmVudCBBdWRpb1BvbGljeVNlcnZpY2UuCisgKiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSBob3N0aW5nIHRoZSBTcGF0aWFsaXplciB0byBwZXJmb3JtCisgKiBhY3Rpb25zIG5lZWRlZCB3aGVuIGEgc3RhdGUgY2hhbmdlIGluc2lkZSB0aGUgU3BhdGlhbGl6ZXIgcmVxdWlyZXMgc29tZSBhdWRpbyBzeXN0ZW0KKyAqIGNoYW5nZXMgdGhhdCBjYW5ub3QgYmUgcGVyZm9ybWVkIGJ5IHRoZSBTcGF0aWFsaXplci4gRm9yIGluc3RhbmNlIG9wZW5pbmcgb3IgY2xvc2luZyBhCisgKiBzcGF0aWFsaXplciBvdXRwdXQgc3RyZWFtIHdoZW4gdGhlIHNwYXRpYWxpemVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqLworY2xhc3MgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayB7CitwdWJsaWM6CisgICAgLyoqIENhbGxlZCB3aGVuIGEgc3RhZ2UgY2hhbmdlIG9jY3VycyB0aGF0IHJlcXVpcmVzIHRoZSBwYXJlbnQgYXVkaW8gcG9saWN5IHNlcnZpY2UgdG8gdGFrZQorICAgICAqIHNvbWUgYWN0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvbkNoZWNrU3BhdGlhbGl6ZXIoKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5TcGF0aWFsaXplclBvbGljeUNhbGxiYWNrKCkgPSBkZWZhdWx0OworfTsKKy8qKgorICogVGhlIFNwYXRpYWxpemVyIGNsYXNzIGltcGxlbWVudHMgYWxsIGZ1bmN0aW9uYWwgY29udHJvbGxpbmcgdGhlIG11bHRpY2hhbm5lbCBzcGF0aWFsaXplcgorICogd2l0aCBoZWFkIHRyYWNraW5nIGltcGxlbWVudGF0aW9uIGluIHRoZSBuYXRpdmUgYXVkaW8gc2VydmljZTogYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyLgorICogSXQgcHJlc2VudHMgYW4gQUlETCBpbnRlcmZhY2UgYXZhaWxhYmxlIHRvIHRoZSBqYXZhIGF1ZGlvIHNlcnZpY2UgdG8gZGlzY292ZXIgdGhlIGF2YWlsYWJpbGl0eQorICogb2YgdGhlIGZlYXR1cmUgYW5kIG9wdGlvbnMsIGNvbnRyb2wgaXRzIHN0YXRlIGFuZCByZWdpc3RlciBhbiBhY3RpdmUgaGVhZCB0cmFja2luZyBzZW5zb3IuCisgKiBJdCBtYWludGFpbnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBsYXRmb3JtIHNwYXRpYWxpemVyIGFuZCBhcHBsaWVzIHRoZSBzdG9yZWQgcGFyYW1ldGVycworICogd2hlbiB0aGUgc3BhdGlhbGl6ZXIgZW5naW5lIGlzIGNyZWF0ZWQgYW5kIGVuYWJsZWQuCisgKiBCYXNlZCBvbiB0aGUgcmVxdWVzdGVkIHNwYXRpYWxpemVyIGxldmVsLCBpdCB3aWxsIHJlcXVlc3QgdGhlIGNyZWF0aW9uIG9mIGEgc3BlY2lhbGl6ZWQgb3V0cHV0CisgKiBtaXhlciB0byB0aGUgYXVkaW8gcG9saWN5IHNlcnZpY2Ugd2hpY2ggd2lsbCBpbiB0dXJuIG5vdGlmeSB0aGUgU3BhdGlhbGl6ZXIgb2YgdGhlIG91dHB1dAorICogc3RyZWFtIG9uIHdoaWNoIGEgc3BhdGlhbGl6ZXIgZW5naW5lIHNob3VsZCBiZSBjcmVhdGVkLCBjb25maWd1cmVkIGFuZCBlbmFibGVkLgorICogVGhlIHNwYXRpYWxpemVyIGFsc28gaG9zdHMgdGhlIGhlYWQgdHJhY2tpbmcgbWFuYWdlbWVudCBsb2dpYy4gVGhpcyBsb2dpYyByZWNlaXZlcyB0aGUKKyAqIGRlc2lyZWQgaGVhZCB0cmFja2luZyBtb2RlIGFuZCBzZWxlY3RlZCBoZWFkIHRyYWNraW5nIHNlbnNvciwgcmVnaXN0ZXJzIGEgc2Vuc29yIGV2ZW50IGxpc3RlbmVyCisgKiBhbmQgZGVyaXZlcyB0aGUgY29tcG91bmRlZCBoZWFkIHBvc2UgaW5mb3JtYXRpb24gdG8gdGhlIHNwYXRpYWxpemVyIGVuZ2luZS4KKyAqCisgKiBXb3JrZmxvdzoKKyAqIC0gSW5pdGlhbGl6YXRpb246IHdoZW4gdGhlIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIHN0YXJ0cywgaXQgY2hlY2tzIGlmIGEgc3BhdGlhbGl6ZXIgZWZmZWN0CisgKiBlbmdpbmUgZXhpc3RzIGFuZCBpZiB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgcmVwb3J0cyBhIGRlZGljYXRlZCBzcGF0aWFsaXplciBvdXRwdXQgcHJvZmlsZS4KKyAqIElmIGJvdGggY29uZGl0aW9ucyBhcmUgbWV0LCBhIFNwYXRpYWxpemVyIG9iamVjdCBpcyBjcmVhdGVkCisgKiAtIENhcGFiaWxpdGllcyBkaXNjb3Zlcnk6IEF1ZGlvU2VydmljZSB3aWxsIGNhbGwgQXVkaW9TeXN0ZW06OmNhbkJlU3BhdGlhbGl6ZWQoKSBhbmQgaWYgdHJ1ZSwKKyAqIGFjcXVpcmUgYW4gSVNwYXRpYWxpemVyIGludGVyZmFjZSB3aXRoIEF1ZGlvU3lzdGVtOjpnZXRTcGF0aWFsaXplcigpLiBUaGlzIGludGVyZmFjZQorICogd2lsbCBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBjYXBhYmlsaXRpZXMgYW5kIGNvbmZpZ3VyZSB0aGUgc3BhdGlhbGl6ZXIuCisgKiAtIEVuYWJsaW5nOiB3aGVuIElTcGF0aWFsaXplcjo6c2V0TGV2ZWwoKSBzZXRzIGEgbGV2ZWwgZGlmZmVyZW50IGZyb20gTk9ORSB0aGUgc3BhdGlhbGl6ZXIKKyAqIGlzIGNvbnNpZGVyZWQgZW5hYmxlZC4gVGhlIGF1ZGlvIHBvbGljeSBjYWxsYmFjayBvbkNoZWNrU3BhdGlhbGl6ZXIoKSBpcyBjYWxsZWQuIFRoaXMKKyAqIHRyaWdnZXJzIGEgcmVxdWVzdCB0byBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBvcGVuIGEgc3BhdGlhbGl6YXRpb24gb3V0cHV0IHN0cmVhbSBhbmQgYQorICogc3BhdGlhbGl6ZXIgbWl4ZXIgaXMgY3JlYXRlZCBpbiBhdWRpbyBmbGluZ2VyLiBXaGVuIGFuIG91dHB1dCBpcyByZXR1cm5lZCBieSBhdWRpbyBwb2xpY3kKKyAqIG1hbmFnZXIsIFNwYXRpYWxpemVyOjphdHRhY2hPdXRwdXQoKSBpcyBjYWxsZWQgd2hpY2ggY3JlYXRlcyBhbmQgZW5hYmxlcyB0aGUgc3BhdGlhbGl6ZXIKKyAqIHN0YWdlIGVuZ2luZSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dC4KKyAqIC0gRGlzYWJsaW5nOiB3aGVuIHRoZSBzcGF0aWFsaXphdGlvbiBsZXZlbCBpcyBzZXQgdG8gTk9ORSwgdGhlIHNwYXRpYWxpemVyIGlzIGNvbnNpZGVyZWQKKyAqIGRpc2FibGVkLiBUaGUgYXVkaW8gcG9saWN5IGNhbGxiYWNrIG9uQ2hlY2tTcGF0aWFsaXplcigpIGlzIGNhbGxlZC4gVGhpcyB0cmlnZ2VycyBhIGNhbGwKKyAqIHRvIFNwYXRpYWxpemVyOjpkZXRhY2hPdXRwdXQoKSBhbmQgdGhlIHNwYXRpYWxpemVyIGVuZ2luZSBpcyByZWxlYXNlZC4gVGhlbiBhIHJlcXVlc3QgaXMKKyAqIG1hZGUgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gcmVsZWFzZSBhbmQgY2xvc2UgdGhlIHNwYXRpYWxpemVyIG91dHB1dCBzdHJlYW0gYW5kIHRoZQorICogc3BhdGlhbGl6ZXIgbWl4ZXIgdGhyZWFkIGlzIGRlc3Ryb3llZC4KKyAqLworY2xhc3MgU3BhdGlhbGl6ZXIgOiBwdWJsaWMgbWVkaWE6OkJuU3BhdGlhbGl6ZXIsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpMaXN0ZW5lciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3A8U3BhdGlhbGl6ZXI+IGNyZWF0ZShTcGF0aWFsaXplclBvbGljeUNhbGxiYWNrICpjYWxsYmFjayk7CisKKyAgICAgICAgICAgflNwYXRpYWxpemVyKCkgb3ZlcnJpZGU7CisKKyAgICAvKiogUmVmQmFzZSAqLworICAgIHZvaWQgb25GaXJzdFJlZigpOworCisgICAgLyoqIElTcGF0aWFsaXplciwgc2VlIElTcGF0aWFsaXplci5haWRsICovCisgICAgYmluZGVyOjpTdGF0dXMgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldFN1cHBvcnRlZExldmVscyhzdGQ6OnZlY3RvcjxtZWRpYTo6U3BhdGlhbGl6YXRpb25MZXZlbD4qIGxldmVscykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0TGV2ZWwobWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWwgbGV2ZWwpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldExldmVsKG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsICpsZXZlbCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgaXNIZWFkVHJhY2tpbmdTdXBwb3J0ZWQoYm9vbCAqc3VwcG9ydHMpOworICAgIGJpbmRlcjo6U3RhdHVzIGdldFN1cHBvcnRlZEhlYWRUcmFja2luZ01vZGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZT4qIG1vZGVzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXREZXNpcmVkSGVhZFRyYWNraW5nTW9kZSgKKyAgICAgICAgICAgIG1lZGlhOjpTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0QWN0dWFsSGVhZFRyYWNraW5nTW9kZSgKKyAgICAgICAgICAgIG1lZGlhOjpTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUqIG1vZGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlY2VudGVySGVhZFRyYWNrZXIoKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRHbG9iYWxUcmFuc2Zvcm0oY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBzY3JlZW5Ub1N0YWdlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRIZWFkU2Vuc29yKGludCBzZW5zb3JIYW5kbGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFNjcmVlblNlbnNvcihpbnQgc2Vuc29ySGFuZGxlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0SGluZ2VBbmdsZShmbG9hdCBoaW5nZUFuZ2xlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdXBwb3J0ZWRNb2RlcyhzdGQ6OnZlY3RvcjxtZWRpYTo6U3BhdGlhbGl6YXRpb25Nb2RlPiogbW9kZXMpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVySGVhZFRyYWNraW5nQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjaz4mIGNhbGxiYWNrKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIHZhbHVlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRQYXJhbWV0ZXIoaW50IGtleSwgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gKnZhbHVlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXQoaW50ICpvdXRwdXQpOworCisgICAgLyoqIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LiBMaXN0ZW4gdG8gdGhlIGRlYXRoIG9mIHRoZSBJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjay4gKi8KKyAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgIC8qKiBSZWdpc3RlcnMgYSBJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjayB3aGVuIGEgY2xpZW50IGlzIGF0dGFjaGVkIHRvIHRoaXMgU3BhdGlhbGl6ZXIKKyAgICAgKiBieSBhdWRpbyBwb2xpY3kgc2VydmljZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZWdpc3RlckNhbGxiYWNrKGNvbnN0IHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKworICAgIHN0YXR1c190IGxvYWRFbmdpbmVDb25maWd1cmF0aW9uKHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8qKiBMZXZlbCBnZXR0ZXIgZm9yIHVzZSBieSBsb2NhbCBjbGFzc2VzLiAqLworICAgIG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsIGdldExldmVsKCkgY29uc3QgeyBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7IHJldHVybiBtTGV2ZWw7IH0KKworICAgIC8qKiBDYWxsZWQgYnkgYXVkaW8gcG9saWN5IHNlcnZpY2Ugd2hlbiB0aGUgc3BlY2lhbCBvdXRwdXQgbWl4ZXIgZGVkaWNhdGVkIHRvIHNwYXRpYWxpemF0aW9uCisgICAgICogaXMgb3BlbmVkIGFuZCB0aGUgc3BhdGlhbGl6ZXIgZW5naW5lIG11c3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhdHRhY2hPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzaXplX3QgbnVtQWN0aXZlVHJhY2tzKTsKKyAgICAvKiogQ2FsbGVkIGJ5IGF1ZGlvIHBvbGljeSBzZXJ2aWNlIHdoZW4gdGhlIHNwZWNpYWwgb3V0cHV0IG1peGVyIGRlZGljYXRlZCB0byBzcGF0aWFsaXphdGlvbgorICAgICAqIGlzIGNsb3NlZCBhbmQgdGhlIHNwYXRpYWxpemVyIGVuZ2luZSBtdXN0IGJlIHJlbGVhc2UuCisgICAgICovCisgICAgYXVkaW9faW9faGFuZGxlX3QgZGV0YWNoT3V0cHV0KCk7CisgICAgLyoqIFJldHVybnMgdGhlIG91dHB1dCBzdHJlYW0gdGhlIHNwYXRpYWxpemVyIGlzIGF0dGFjaGVkIHRvLiAqLworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dCgpIGNvbnN0IHsgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOyByZXR1cm4gbU91dHB1dDsgfQorCisgICAgdm9pZCB1cGRhdGVBY3RpdmVUcmFja3Moc2l6ZV90IG51bUFjdGl2ZVRyYWNrcyk7CisKKyAgICAvKiogR2V0cyB0aGUgY2hhbm5lbCBtYXNrLCBzYW1wbGluZyByYXRlIGFuZCBmb3JtYXQgc2V0IGZvciB0aGUgc3BhdGlhbGl6ZXIgaW5wdXQuICovCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRBdWRpb0luQ29uZmlnKCkgY29uc3Q7CisKKyAgICB2b2lkIGNhbGN1bGF0ZUhlYWRQb3NlKCk7CisKK3ByaXZhdGU6CisgICAgU3BhdGlhbGl6ZXIoZWZmZWN0X2Rlc2NyaXB0b3JfdCBlbmdpbmVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayAqY2FsbGJhY2spOworCisgICAgc3RhdGljIHZvaWQgZW5naW5lQ2FsbGJhY2soaW50MzJfdCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CisKKyAgICAvLyBGcm9tIFZpcnR1YWxpemVyU3RhZ2VDb250cm9sbGVyOjpMaXN0ZW5lcgorICAgIHZvaWQgb25IZWFkVG9TdGFnZVBvc2UoY29uc3QgbWVkaWE6OlBvc2UzZiYgaGVhZFRvU3RhZ2UpIG92ZXJyaWRlOworICAgIHZvaWQgb25BY3R1YWxNb2RlQ2hhbmdlKG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIG92ZXJyaWRlOworCisgICAgdm9pZCBvbkhlYWRUb1N0YWdlUG9zZU1zZyhjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIGhlYWRUb1N0YWdlKTsKKyAgICB2b2lkIG9uQWN0dWFsTW9kZUNoYW5nZU1zZyhtZWRpYTo6SGVhZFRyYWNraW5nTW9kZSBtb2RlKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhFZmZlY3RQYXJhbVZhbHVlcyA9IDEwOworICAgIC8qKgorICAgICAqIEdldCBhIHBhcmFtZXRlciBmcm9tIHNwYXRpYWxpemVyIGVuZ2luZSBieSBjYWxsaW5nIHRoZSBlZmZlY3QgSEFMIGNvbW1hbmQgbWV0aG9kIGRpcmVjdGx5LgorICAgICAqIFRvIGJlIHVzZWQgd2hlbiB0aGUgZW5naW5lIGluc3RhbmNlIG1FbmdpbmUgaXMgbm90IHlldCBjcmVhdGVkIGluIHRoZSBlZmZlY3QgZnJhbWV3b3JrLgorICAgICAqIFdoZW4gTVVMVElfVkFMVUVTIGlzIGZhbHNlLCB0aGUgZXhwZWN0ZWQgcmVwbHkgaXMgb25seSBvbmUgdmFsdWUgb2YgdHlwZSBULgorICAgICAqIFdoZW4gTVVMVElfVkFMVUVTIGlzIHRydWUsIHRoZSBleHBlY3RlZCByZXBseSBpcyBtYWRlIG9mIGEgbnVtYmVyIChvZiB0eXBlIFQpIGluZGljYXRpbmcKKyAgICAgKiBob3cgbWFueSB2YWx1ZXMgYXJlIHJldHVybmVkLCBmb2xsb3dlZCBieSB0aGlzIG51bWJlciBmb3IgdmFsdWVzIG9mIHR5cGUgVC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTxib29sIE1VTFRJX1ZBTFVFUywgdHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBnZXRIYWxQYXJhbWV0ZXIoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QsIHVpbnQzMl90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiAqdmFsdWVzKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpIDw9IHNpemVvZih1aW50MzJfdCksICJUaGUgc2l6ZSBvZiBUIG11c3QgbGVzcyB0aGFuIDMyIGJpdHMiKTsKKworICAgICAgICB1aW50MzJfdCBjbWRbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAxXTsKKyAgICAgICAgdWludDMyX3QgcmVwbHlbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAyICsga01heEVmZmVjdFBhcmFtVmFsdWVzXTsKKworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWNtZDsKKyAgICAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICBpZiAoTVVMVElfVkFMVUVTKSB7CisgICAgICAgICAgICBwLT52c2l6ZSA9IChrTWF4RWZmZWN0UGFyYW1WYWx1ZXMgKyAxKSAqIHNpemVvZihUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKFQpOworICAgICAgICB9CisgICAgICAgICoodWludDMyX3QgKilwLT5kYXRhID0gdHlwZTsKKyAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplICsgcC0+dnNpemU7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfR0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCksIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsIHJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+c3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcC0+c3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChyZXBseVNpemUgPAorICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpICsgKE1VTFRJX1ZBTFVFUyA/IDIgOiAxKSAqIHNpemVvZihUKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFQgKnBhcmFtcyA9IChUICopKCh1aW50OF90ICopcmVwbHkgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGludCBudW1QYXJhbXMgPSAxOworICAgICAgICBpZiAoTVVMVElfVkFMVUVTKSB7CisgICAgICAgICAgICBudW1QYXJhbXMgPSAoaW50KSpwYXJhbXMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtUGFyYW1zID4ga01heEVmZmVjdFBhcmFtVmFsdWVzKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICgqdmFsdWVzKS5jbGVhcigpOworICAgICAgICBzdGQ6OmNvcHkoJnBhcmFtc1swXSwgJnBhcmFtc1tudW1QYXJhbXNdLCBiYWNrX2luc2VydGVyKCp2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHBhcmFtZXRlciB0byBzcGF0aWFsaXplciBlbmdpbmUgYnkgY2FsbGluZyBzZXRQYXJhbWV0ZXIgb24gbUVuZ2luZSBBdWRpb0VmZmVjdCBvYmplY3QuCisgICAgICogSXQgaXMgcG9zc2libGUgdG8gcGFzcyBtb3JlIHRoYW4gb25lIHZhbHVlIG9mIHR5cGUgVCBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlciB0eXBlCisgICAgICogIGFjY29yZGluZyB0byB2YWx1ZXMgdmVjdG9yIHNpemUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBzZXRFZmZlY3RQYXJhbWV0ZXJfbCh1aW50MzJfdCB0eXBlLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdmFsdWVzKSBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA8PSBzaXplb2YodWludDMyX3QpLCAiVGhlIHNpemUgb2YgVCBtdXN0IGxlc3MgdGhhbiAzMiBiaXRzIik7CisKKyAgICAgICAgdWludDMyX3QgY21kW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMSArIHZhbHVlcy5zaXplKCldOworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWNtZDsKKyAgICAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICBwLT52c2l6ZSA9IHNpemVvZihUKSAqIHZhbHVlcy5zaXplKCk7CisgICAgICAgICoodWludDMyX3QgKilwLT5kYXRhID0gdHlwZTsKKyAgICAgICAgbWVtY3B5KCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxLCB2YWx1ZXMuZGF0YSgpLCBzaXplb2YoVCkgKiB2YWx1ZXMuc2l6ZSgpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5zZXRQYXJhbWV0ZXIocCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPnN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHAtPnN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgcGFyYW1ldGVyIGZyb20gc3BhdGlhbGl6ZXIgZW5naW5lIGJ5IGNhbGxpbmcgZ2V0UGFyYW1ldGVyIG9uIEF1ZGlvRWZmZWN0IG9iamVjdC4KKyAgICAgKiBJdCBpcyBwb3NzaWJsZSB0byByZWFkIG1vcmUgdGhhbiBvbmUgdmFsdWUgb2YgdHlwZSBUIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVyIHR5cGUKKyAgICAgKiBieSBzcGVjaWZ5aW5nIHZhbHVlcyB2ZWN0b3Igc2l6ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IGdldEVmZmVjdFBhcmFtZXRlcl9sKHVpbnQzMl90IHR5cGUsIHN0ZDo6dmVjdG9yPFQ+ICp2YWx1ZXMpIFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpIDw9IHNpemVvZih1aW50MzJfdCksICJUaGUgc2l6ZSBvZiBUIG11c3QgbGVzcyB0aGFuIDMyIGJpdHMiKTsKKworICAgICAgICB1aW50MzJfdCBjbWRbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAxICsgdmFsdWVzLT5zaXplKCldOworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWNtZDsKKyAgICAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICBwLT52c2l6ZSA9IHNpemVvZihUKSAqIHZhbHVlcy0+c2l6ZSgpOworICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSA9IHR5cGU7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+Z2V0UGFyYW1ldGVyKHApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPnN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHAtPnN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1WYWx1ZXMgPSBzdGQ6Om1pbihwLT52c2l6ZSAvIHNpemVvZihUKSwgdmFsdWVzLT5zaXplKCkpOworICAgICAgICAoKnZhbHVlcykuY2xlYXIoKTsKKyAgICAgICAgVCAqcmV0VmFsdWVzID0gKFQgKikoKHVpbnQ4X3QgKilwLT5kYXRhICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIHN0ZDo6Y29weSgmcmV0VmFsdWVzWzBdLCAmcmV0VmFsdWVzW251bVZhbHVlc10sIGJhY2tfaW5zZXJ0ZXIoKnZhbHVlcykpOworCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2b2lkIHBvc3RGcmFtZXNQcm9jZXNzZWRNc2coaW50IGZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgaGVhZCBhbmQgc2NyZWVuIHNlbnNvcnMgbXVzdCBiZSBhY3RpdmVseSBtb25pdG9yZWQgYmFzZWQgb24KKyAgICAgKiBzcGF0aWFsaXplciBzdGF0ZSBhbmQgcGxheWJhY2sgYWN0aXZpdHkgYW5kIGNvbmZpZ3VyZXMgdGhlIHBvc2UgY29udHJvbGxlcgorICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqLworICAgIHZvaWQgY2hlY2tTZW5zb3JzU3RhdGVfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgaGVhZCBwb3NlIGNvbnRyb2xsZXIgc2hvdWxkIGJlIGNyZWF0ZWQgb3IgZGVzdHJveWVkIGFjY29yZGluZworICAgICAqIHRvIGRlc2lyZWQgaGVhZCB0cmFja2luZyBtb2RlLgorICAgICAqLworICAgIHZvaWQgY2hlY2tQb3NlQ29udHJvbGxlcl9sKCkgUkVRVUlSRVMobUxvY2spOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBzcGF0aWFsaXplciBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQgYmFzZWQgb24KKyAgICAgKiBwbGF5YmFjayBhY3Rpdml0eSBhbmQgcmVxdWVzdGVkIGxldmVsLgorICAgICAqLworICAgIHZvaWQgY2hlY2tFbmdpbmVTdGF0ZV9sKCkgUkVRVUlSRVMobUxvY2spOworCisgICAgLyoqIEVmZmVjdCBlbmdpbmUgZGVzY3JpcHRvciAqLworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgbUVuZ2luZURlc2NyaXB0b3I7CisgICAgLyoqIENhbGxiYWNrIGludGVyZmFjZSB0byBwYXJlbnQgYXVkaW8gcG9saWN5IHNlcnZpY2UgKi8KKyAgICBTcGF0aWFsaXplclBvbGljeUNhbGxiYWNrKiBjb25zdCBtUG9saWN5Q2FsbGJhY2s7CisKKyAgICAvKiogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgb25lIHZlcnNpb24gb2YgdGhlIHNwYXRpYWxpemVyIHJ1bm5pbmcgKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTWV0cmljc0lkID0gQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NQQVRJQUxJWkVSICIwIjsKKworICAgIC8qKiBNdXRleCBwcm90ZWN0aW5nIGludGVybmFsIHN0YXRlICovCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworCisgICAgLyoqIENsaWVudCBBdWRpb0VmZmVjdCBmb3IgdGhlIGVuZ2luZSAqLworICAgIHNwPEF1ZGlvRWZmZWN0PiBtRW5naW5lIEdVQVJERURfQlkobUxvY2spOworICAgIC8qKiBPdXRwdXQgc3RyZWFtIHRoZSBzcGF0aWFsaXplciBtaXhlciB0aHJlYWQgaXMgYXR0YWNoZWQgdG8gKi8KKyAgICBhdWRpb19pb19oYW5kbGVfdCBtT3V0cHV0IEdVQVJERURfQlkobUxvY2spID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICAvKiogQ2FsbGJhY2sgaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgKEF1ZGlvU2VydmljZSkgY29udHJvbGxpbmcgdGhpc2BTcGF0aWFsaXplciAqLworICAgIHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4gbVNwYXRpYWxpemVyQ2FsbGJhY2sgR1VBUkRFRF9CWShtTG9jayk7CisKKyAgICAvKiogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBoZWFkIHRyYWNraW5nICovCisgICAgc3A8bWVkaWE6OklTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrPiBtSGVhZFRyYWNraW5nQ2FsbGJhY2sgR1VBUkRFRF9CWShtTG9jayk7CisKKyAgICAvKiogUmVxdWVzdGVkIHNwYXRpYWxpemF0aW9uIGxldmVsICovCisgICAgbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWwgbUxldmVsIEdVQVJERURfQlkobUxvY2spID0gbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkU7CisKKyAgICAvKiogQ29udHJvbCBsb2dpYyBmb3IgaGVhZC10cmFja2luZywgZXRjLiAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGF0aWFsaXplclBvc2VDb250cm9sbGVyPiBtUG9zZUNvbnRyb2xsZXIgR1VBUkRFRF9CWShtTG9jayk7CisKKyAgICAvKiogTGFzdCByZXF1ZXN0ZWQgaGVhZCB0cmFja2luZyBtb2RlICovCisgICAgbWVkaWE6OkhlYWRUcmFja2luZ01vZGUgbURlc2lyZWRIZWFkVHJhY2tpbmdNb2RlIEdVQVJERURfQlkobUxvY2spCisgICAgICAgICAgICA9IG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUM7CisKKyAgICAvKiogTGFzdC1yZXBvcnRlZCBhY3R1YWwgaGVhZC10cmFja2luZyBtb2RlLiAqLworICAgIG1lZGlhOjpTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUgbUFjdHVhbEhlYWRUcmFja2luZ01vZGUgR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgICAgID0gbWVkaWE6OlNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6RElTQUJMRUQ7CisKKyAgICAvKiogU2VsZWN0ZWQgSGVhZCBwb3NlIHNlbnNvciAqLworICAgIGludDMyX3QgbUhlYWRTZW5zb3IgR1VBUkRFRF9CWShtTG9jaykgPSBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUjsKKworICAgIC8qKiBTZWxlY3RlZCBTY3JlZW4gcG9zZSBzZW5zb3IgKi8KKyAgICBpbnQzMl90IG1TY3JlZW5TZW5zb3IgR1VBUkRFRF9CWShtTG9jaykgPSBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUjsKKworICAgIC8qKiBMYXN0IGRpc3BsYXkgb3JpZW50YXRpb24gcmVjZWl2ZWQgKi8KKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtEaXNwbGF5T3JpZW50YXRpb25JbnZhbGlkID0gMTAwMDsKKyAgICBmbG9hdCBtRGlzcGxheU9yaWVudGF0aW9uIEdVQVJERURfQlkobUxvY2spID0ga0Rpc3BsYXlPcmllbnRhdGlvbkludmFsaWQ7CisKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6U3BhdGlhbGl6YXRpb25MZXZlbD4gbUxldmVsczsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlPiBtSGVhZFRyYWNraW5nTW9kZXM7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTW9kZT4gbVNwYXRpYWxpemF0aW9uTW9kZXM7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1DaGFubmVsTWFza3M7CisgICAgYm9vbCBtU3VwcG9ydHNIZWFkVHJhY2tpbmc7CisKKyAgICAvLyBMb29wZXIgdGhyZWFkIGZvciBtRW5naW5lIGNhbGxiYWNrcworICAgIGNsYXNzIEVuZ2luZUNhbGxiYWNrSGFuZGxlcjsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8RW5naW5lQ2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIHNpemVfdCBtTnVtQWN0aXZlVHJhY2tzIEdVQVJERURfQlkobUxvY2spID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IHNIZWFkUG9zZUtleXM7Cit9OworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1NQQVRJQUxJWkVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIlNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuaCIKKworI2RlZmluZSBMT0dfVEFHICJTcGF0aWFsaXplclBvc2VDb250cm9sbGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHNlbnNvci9TZW5zb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBtZWRpYTo6Y3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yOwordXNpbmcgbWVkaWE6OkhlYWRUcmFja2luZ01vZGU7Cit1c2luZyBtZWRpYTo6SGVhZFRyYWNraW5nUHJvY2Vzc29yOwordXNpbmcgbWVkaWE6OlBvc2UzZjsKK3VzaW5nIG1lZGlhOjpTZW5zb3JQb3NlUHJvdmlkZXI7Cit1c2luZyBtZWRpYTo6VHdpc3QzZjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgeworCisvLyBUaGlzIGlzIGhvdyBmYXN0LCBpbiBtL3MsIHdlIGFsbG93IHBvc2l0aW9uIHRvIHNoaWZ0IGR1cmluZyByYXRlLWxpbWl0aW5nLgorY29uc3RleHByIGZsb2F0IGtNYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSAyOworCisvLyBUaGlzIGlzIGhvdyBmYXN0LCBpbiByYWQvcywgd2UgYWxsb3cgcm90YXRpb24gYW5nbGUgdG8gc2hpZnQgZHVyaW5nIHJhdGUtbGltaXRpbmcuCitjb25zdGV4cHIgZmxvYXQga01heFJvdGF0aW9uYWxWZWxvY2l0eSA9IDg7CisKKy8vIFRoaXMgaXMgaG93IGZhciBpbnRvIHRoZSBmdXR1cmUgd2UgcHJlZGljdCB0aGUgaGVhZCBwb3NlLCB1c2luZyBsaW5lYXIgZXh0cmFwb2xhdGlvbiBiYXNlZCBvbgorLy8gdHdpc3QgKHZlbG9jaXR5KS4gSXQgc2hvdWxkIGJlIHNldCB0byBhIHZhbHVlIHRoYXQgbWF0Y2hlcyB0aGUgY2hhcmFjdGVyaXN0aWMgZHVyYXRpb25zIG9mIG1vdmluZworLy8gb25lJ3MgaGVhZC4gVGhlIGhpZ2hlciB3ZSBzZXQgdGhpcywgdGhlIG1vcmUgbGF0ZW5jeSB3ZSBhcmUgYWJsZSB0byByZWR1Y2UsIGJ1dCBzZXR0aW5nIHRoaXMgdG9vCisvLyBoaWdoIHdpbGwgcmVzdWx0IGluIGhpZ2ggcHJlZGljdGlvbiBlcnJvcnMgd2hlbmV2ZXIgdGhlIGhlYWQgYWNjZWxlcmF0ZXMgKGNoYW5nZXMgdmVsb2NpdHkpLgorY29uc3RleHByIGF1dG8ga1ByZWRpY3Rpb25EdXJhdGlvbiA9IDUwbXM7CisKKy8vIEFmdGVyIG5vdCBnZXR0aW5nIGEgcG9zZSBzYW1wbGUgZm9yIHRoaXMgbG9uZywgd2Ugd291bGQgdHJlYXQgdGhlIG1lYXN1cmVtZW50IGFzIHN0YWxlLgorY29uc3RleHByIGF1dG8ga0ZyZXNobmVzc1RpbWVvdXQgPSA1MG1zOworCisvLyBBdXRvLXJlY2VudGVyIGtpY2tzIGluIGFmdGVyIHRoZSBoZWFkIGhhcyBiZWVuIHN0aWxsIGZvciB0aGlzIGxvbmcuCitjb25zdGV4cHIgYXV0byBrQXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24gPSA2czsKKworLy8gQXV0by1yZWNlbnRlciBjb25zaWRlcnMgaGVhZCBub3Qgc3RpbGwgaWYgdHJhbnNsYXRlZCBieSB0aGlzIG11Y2ggKGluIG1ldGVycywgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrQXV0b1JlY2VudGVyVHJhbnNsYXRpb25UaHJlc2hvbGQgPSAwLjFmOworCisvLyBBdXRvLXJlY2VudGVyIGNvbnNpZGVycyBoZWFkIG5vdCBzdGlsbCBpZiByb3RhdGVkIGJ5IHRoaXMgbXVjaCAoaW4gcmFkaWFucywgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrQXV0b1JlY2VudGVyUm90YXRpb25UaHJlc2hvbGQgPSAxMC41ZiAvIDE4MCAqIE1fUEk7CisKKy8vIFNjcmVlbiBpcyBjb25zaWRlcmVkIHRvIGJlIHVuc3RhYmxlIChub3Qgc3RpbGwpIGlmIGl0IGhhcyBtb3ZlZCBzaWduaWZpY2FudGx5IHdpdGhpbiB0aGUgbGFzdAorLy8gdGltZSB3aW5kb3cgb2YgdGhpcyBkdXJhdGlvbi4KK2NvbnN0ZXhwciBhdXRvIGtTY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbiA9IDNzOworCisvLyBTY3JlZW4gaXMgY29uc2lkZXJlZCB0byBoYXZlIG1vdmVkIHNpZ25pZmljYW50bHkgaWYgdHJhbnNsYXRlZCBieSB0aGlzIG11Y2ggKGluIG1ldGVyLCBhcHByb3gpLgorY29uc3RleHByIGZsb2F0IGtTY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvblRocmVzaG9sZCA9IDAuMWY7CisKKy8vIFNjcmVlbiBpcyBjb25zaWRlcmVkIHRvIGhhdmUgbW92ZWQgc2lnbmlmaWNhbnRseSBpZiByb3RhdGVkIGJ5IHRoaXMgbXVjaCAoaW4gcmFkaWFucywgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrU2NyZWVuU3RpbGxuZXNzUm90YXRpb25UaHJlc2hvbGQgPSA3LjBmIC8gMTgwICogTV9QSTsKKworLy8gVGltZSB1bml0cyBmb3Igc3lzdGVtIGNsb2NrIHRpY2tzLiBUaGlzIGlzIHdoYXQgdGhlIFNlbnNvciBGcmFtZXdvcmsgdGltZXN0YW1wcyByZXByZXNlbnQgYW5kCisvLyB3aGF0IHdlIHVzZSBmb3IgcG9zZSBmaWx0ZXJpbmcuCit1c2luZyBUaWNrcyA9IHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kczsKKworLy8gSG93IG1hbnkgdGlja3MgaW4gYSBzZWNvbmQuCitjb25zdGV4cHIgYXV0byBrVGlja3NQZXJTZWNvbmQgPSBUaWNrczo6cGVyaW9kOjpkZW47CisKK3N0ZDo6c3RyaW5nIGdldFNlbnNvck1ldHJpY3NJZChpbnQzMl90IHNlbnNvcklkKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19TRU5TT1IpLmFwcGVuZChzdGQ6OnRvX3N0cmluZyhzZW5zb3JJZCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6U3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcihMaXN0ZW5lciogbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBzZW5zb3JQZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPiBtYXhVcGRhdGVQZXJpb2QpCisgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpLAorICAgICAgbVNlbnNvclBlcmlvZChzZW5zb3JQZXJpb2QpLAorICAgICAgbVByb2Nlc3NvcihjcmVhdGVIZWFkVHJhY2tpbmdQcm9jZXNzb3IoSGVhZFRyYWNraW5nUHJvY2Vzc29yOjpPcHRpb25zeworICAgICAgICAgICAgICAubWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0ga01heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSAvIGtUaWNrc1BlclNlY29uZCwKKyAgICAgICAgICAgICAgLm1heFJvdGF0aW9uYWxWZWxvY2l0eSA9IGtNYXhSb3RhdGlvbmFsVmVsb2NpdHkgLyBrVGlja3NQZXJTZWNvbmQsCisgICAgICAgICAgICAgIC5mcmVzaG5lc3NUaW1lb3V0ID0gVGlja3Moa0ZyZXNobmVzc1RpbWVvdXQpLmNvdW50KCksCisgICAgICAgICAgICAgIC5wcmVkaWN0aW9uRHVyYXRpb24gPSBUaWNrcyhrUHJlZGljdGlvbkR1cmF0aW9uKS5jb3VudCgpLAorICAgICAgICAgICAgICAuYXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24gPSBUaWNrcyhrQXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24pLmNvdW50KCksCisgICAgICAgICAgICAgIC5hdXRvUmVjZW50ZXJUcmFuc2xhdGlvbmFsVGhyZXNob2xkID0ga0F1dG9SZWNlbnRlclRyYW5zbGF0aW9uVGhyZXNob2xkLAorICAgICAgICAgICAgICAuYXV0b1JlY2VudGVyUm90YXRpb25hbFRocmVzaG9sZCA9IGtBdXRvUmVjZW50ZXJSb3RhdGlvblRocmVzaG9sZCwKKyAgICAgICAgICAgICAgLnNjcmVlblN0aWxsbmVzc1dpbmRvd0R1cmF0aW9uID0gVGlja3Moa1NjcmVlblN0aWxsbmVzc1dpbmRvd0R1cmF0aW9uKS5jb3VudCgpLAorICAgICAgICAgICAgICAuc2NyZWVuU3RpbGxuZXNzVHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IGtTY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvblRocmVzaG9sZCwKKyAgICAgICAgICAgICAgLnNjcmVlblN0aWxsbmVzc1JvdGF0aW9uYWxUaHJlc2hvbGQgPSBrU2NyZWVuU3RpbGxuZXNzUm90YXRpb25UaHJlc2hvbGQsCisgICAgICB9KSksCisgICAgICBtUG9zZVByb3ZpZGVyKFNlbnNvclBvc2VQcm92aWRlcjo6Y3JlYXRlKCJoZWFkdHJhY2tlciIsIHRoaXMpKSwKKyAgICAgIG1UaHJlYWQoW3RoaXMsIG1heFVwZGF0ZVBlcmlvZF0geworICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIFBvc2UzZiBoZWFkVG9TdGFnZTsKKyAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxIZWFkVHJhY2tpbmdNb2RlPiBtb2RlSWZDaGFuZ2VkOworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgICAgICAgIGlmIChtYXhVcGRhdGVQZXJpb2QuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBtQ29uZFZhci53YWl0X2Zvcihsb2NrLCBtYXhVcGRhdGVQZXJpb2QudmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyByZXR1cm4gbVNob3VsZEV4aXQgfHwgbVNob3VsZENhbGN1bGF0ZTsgfSk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIG1Db25kVmFyLndhaXQobG9jaywgW3RoaXNdIHsgcmV0dXJuIG1TaG91bGRFeGl0IHx8IG1TaG91bGRDYWxjdWxhdGU7IH0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKG1TaG91bGRFeGl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkV4aXRpbmcgdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUuCisgICAgICAgICAgICAgICAgICBzdGQ6OnRpZShoZWFkVG9TdGFnZSwgbW9kZUlmQ2hhbmdlZCkgPSBjYWxjdWxhdGVfbCgpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFja3Mgb3V0c2lkZSB0aGUgbG9jay4KKyAgICAgICAgICAgICAgbUxpc3RlbmVyLT5vbkhlYWRUb1N0YWdlUG9zZShoZWFkVG9TdGFnZSk7CisgICAgICAgICAgICAgIGlmIChtb2RlSWZDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm9uQWN0dWFsTW9kZUNoYW5nZShtb2RlSWZDaGFuZ2VkLnZhbHVlKCkpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgICAgICAgIGlmICghbUNhbGN1bGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBtQ2FsY3VsYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgbUNvbmRWYXIubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgbVNob3VsZENhbGN1bGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfSkge30KKworU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6flNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIoKSB7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgbVNob3VsZEV4aXQgPSB0cnVlOworICAgICAgICBtQ29uZFZhci5ub3RpZnlfYWxsKCk7CisgICAgfQorICAgIG1UaHJlYWQuam9pbigpOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OnNldEhlYWRTZW5zb3IoaW50MzJfdCBzZW5zb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOworICAgIGlmIChzZW5zb3IgPT0gbUhlYWRTZW5zb3IpIHJldHVybjsKKyAgICBBTE9HVigiJXM6IG5ldyBzZW5zb3I6JWQgIG1IZWFkU2Vuc29yOiVkICBtU2NyZWVuU2Vuc29yOiVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzZW5zb3IsIG1IZWFkU2Vuc29yLCBtU2NyZWVuU2Vuc29yKTsKKworICAgIC8vIFN0b3AgY3VycmVudCBzZW5zb3IsIGlmIHZhbGlkIGFuZCBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgc2Vuc29yLgorICAgIGlmIChtSGVhZFNlbnNvciAhPSBJTlZBTElEX1NFTlNPUiAmJiBtSGVhZFNlbnNvciAhPSBtU2NyZWVuU2Vuc29yKSB7CisgICAgICAgIG1Qb3NlUHJvdmlkZXItPnN0b3BTZW5zb3IobUhlYWRTZW5zb3IpOworICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oZ2V0U2Vuc29yTWV0cmljc0lkKG1IZWFkU2Vuc29yKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RPUCkKKyAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICB9CisKKyAgICBpZiAoc2Vuc29yICE9IElOVkFMSURfU0VOU09SKSB7CisgICAgICAgIGlmIChzZW5zb3IgIT0gbVNjcmVlblNlbnNvcikgeworICAgICAgICAgICAgLy8gU3RhcnQgbmV3IHNlbnNvci4KKyAgICAgICAgICAgIG1IZWFkU2Vuc29yID0KKyAgICAgICAgICAgICAgICAgICAgbVBvc2VQcm92aWRlci0+c3RhcnRTZW5zb3Ioc2Vuc29yLCBtU2Vuc29yUGVyaW9kKSA/IHNlbnNvciA6IElOVkFMSURfU0VOU09SOworICAgICAgICAgICAgaWYgKG1IZWFkU2Vuc29yICE9IElOVkFMSURfU0VOU09SKSB7CisgICAgICAgICAgICAgICAgYXV0byBzZW5zb3IgPSBtUG9zZVByb3ZpZGVyLT5nZXRTZW5zb3JCeUhhbmRsZShtSGVhZFNlbnNvcik7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5nVHlwZSA9IHNlbnNvciA/IHNlbnNvci0+Z2V0U3RyaW5nVHlwZSgpLmNfc3RyKCkgOiAiIjsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oZ2V0U2Vuc29yTWV0cmljc0lkKG1IZWFkU2Vuc29yKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVEFSVCkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTU9ERSwgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfSEVBRCkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfVFlQRSwgc3RyaW5nVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgLnJlY29yZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2Vuc29yIGlzIGFscmVhZHkgZW5hYmxlZC4KKyAgICAgICAgICAgIG1IZWFkU2Vuc29yID0gbVNjcmVlblNlbnNvcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1IZWFkU2Vuc29yID0gSU5WQUxJRF9TRU5TT1I7CisgICAgfQorCisgICAgbVByb2Nlc3Nvci0+cmVjZW50ZXIodHJ1ZSAvKiByZWNlbnRlckhlYWQgKi8sIGZhbHNlIC8qIHJlY2VudGVyU2NyZWVuICovKTsKK30KKwordm9pZCBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpzZXRTY3JlZW5TZW5zb3IoaW50MzJfdCBzZW5zb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOworICAgIGlmIChzZW5zb3IgPT0gbVNjcmVlblNlbnNvcikgcmV0dXJuOworICAgIEFMT0dWKCIlczogbmV3IHNlbnNvcjolZCAgbUhlYWRTZW5zb3I6JWQgIG1TY3JlZW5TZW5zb3I6JWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHNlbnNvciwgbUhlYWRTZW5zb3IsIG1TY3JlZW5TZW5zb3IpOworCisgICAgLy8gU3RvcCBjdXJyZW50IHNlbnNvciwgaWYgdmFsaWQgYW5kIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBzZW5zb3IuCisgICAgaWYgKG1TY3JlZW5TZW5zb3IgIT0gSU5WQUxJRF9TRU5TT1IgJiYgbVNjcmVlblNlbnNvciAhPSBtSGVhZFNlbnNvcikgeworICAgICAgICBtUG9zZVByb3ZpZGVyLT5zdG9wU2Vuc29yKG1TY3JlZW5TZW5zb3IpOworICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oZ2V0U2Vuc29yTWV0cmljc0lkKG1TY3JlZW5TZW5zb3IpKQorICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVE9QKQorICAgICAgICAgICAgLnJlY29yZCgpOworICAgIH0KKworICAgIGlmIChzZW5zb3IgIT0gSU5WQUxJRF9TRU5TT1IpIHsKKyAgICAgICAgaWYgKHNlbnNvciAhPSBtSGVhZFNlbnNvcikgeworICAgICAgICAgICAgLy8gU3RhcnQgbmV3IHNlbnNvci4KKyAgICAgICAgICAgIG1TY3JlZW5TZW5zb3IgPQorICAgICAgICAgICAgICAgICAgICBtUG9zZVByb3ZpZGVyLT5zdGFydFNlbnNvcihzZW5zb3IsIG1TZW5zb3JQZXJpb2QpID8gc2Vuc29yIDogSU5WQUxJRF9TRU5TT1I7CisgICAgICAgICAgICBhdXRvIHNlbnNvciA9IG1Qb3NlUHJvdmlkZXItPmdldFNlbnNvckJ5SGFuZGxlKG1TY3JlZW5TZW5zb3IpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5nVHlwZSA9IHNlbnNvciA/IHNlbnNvci0+Z2V0U3RyaW5nVHlwZSgpLmNfc3RyKCkgOiAiIjsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShnZXRTZW5zb3JNZXRyaWNzSWQobVNjcmVlblNlbnNvcikpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVEFSVCkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFLCBBTUVESUFNRVRSSUNTX1BST1BfTU9ERV9WQUxVRV9TQ1JFRU4pCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfVFlQRSwgc3RyaW5nVHlwZSkKKyAgICAgICAgICAgICAgICAucmVjb3JkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZW5zb3IgaXMgYWxyZWFkeSBlbmFibGVkLgorICAgICAgICAgICAgbVNjcmVlblNlbnNvciA9IG1IZWFkU2Vuc29yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNjcmVlblNlbnNvciA9IElOVkFMSURfU0VOU09SOworICAgIH0KKworICAgIG1Qcm9jZXNzb3ItPnJlY2VudGVyKGZhbHNlIC8qIHJlY2VudGVySGVhZCAqLywgdHJ1ZSAvKiByZWNlbnRlclNjcmVlbiAqLyk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6c2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZSBtb2RlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBtUHJvY2Vzc29yLT5zZXREZXNpcmVkTW9kZShtb2RlKTsKK30KKwordm9pZCBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpzZXRTY3JlZW5Ub1N0YWdlUG9zZShjb25zdCBQb3NlM2YmIHNjcmVlblRvU3RhZ2UpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOworICAgIG1Qcm9jZXNzb3ItPnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OnNldERpc3BsYXlPcmllbnRhdGlvbihmbG9hdCBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBtUHJvY2Vzc29yLT5zZXREaXNwbGF5T3JpZW50YXRpb24ocGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6Y2FsY3VsYXRlQXN5bmMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBtU2hvdWxkQ2FsY3VsYXRlID0gdHJ1ZTsKKyAgICBtQ29uZFZhci5ub3RpZnlfYWxsKCk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6d2FpdFVudGlsQ2FsY3VsYXRlZCgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBtQ29uZFZhci53YWl0KGxvY2ssIFt0aGlzXSB7IHJldHVybiBtQ2FsY3VsYXRlZDsgfSk7Cit9CisKK3N0ZDo6dHVwbGU8bWVkaWE6OlBvc2UzZiwgc3RkOjpvcHRpb25hbDxtZWRpYTo6SGVhZFRyYWNraW5nTW9kZT4+CitTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpjYWxjdWxhdGVfbCgpIHsKKyAgICBQb3NlM2YgaGVhZFRvU3RhZ2U7CisgICAgSGVhZFRyYWNraW5nTW9kZSBtb2RlOworICAgIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkhlYWRUcmFja2luZ01vZGU+IG1vZGVJZkNoYW5nZWQ7CisKKyAgICBtUHJvY2Vzc29yLT5jYWxjdWxhdGUoZWxhcHNlZFJlYWx0aW1lTmFubygpKTsKKyAgICBoZWFkVG9TdGFnZSA9IG1Qcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpOworICAgIG1vZGUgPSBtUHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCk7CisgICAgaWYgKCFtQWN0dWFsTW9kZS5oYXNfdmFsdWUoKSB8fCBtQWN0dWFsTW9kZS52YWx1ZSgpICE9IG1vZGUpIHsKKyAgICAgICAgbUFjdHVhbE1vZGUgPSBtb2RlOworICAgICAgICBtb2RlSWZDaGFuZ2VkID0gbW9kZTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShoZWFkVG9TdGFnZSwgbW9kZUlmQ2hhbmdlZCk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6cmVjZW50ZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBtUHJvY2Vzc29yLT5yZWNlbnRlcigpOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6Om9uUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwgaW50MzJfdCBzZW5zb3IsIGNvbnN0IFBvc2UzZiYgcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8VHdpc3QzZj4mIHR3aXN0LCBib29sIGlzTmV3UmVmZXJlbmNlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBpZiAoc2Vuc29yID09IG1IZWFkU2Vuc29yKSB7CisgICAgICAgIG1Qcm9jZXNzb3ItPnNldFdvcmxkVG9IZWFkUG9zZSh0aW1lc3RhbXAsIHBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2lzdC52YWx1ZV9vcihUd2lzdDNmKCkpIC8ga1RpY2tzUGVyU2Vjb25kKTsKKyAgICAgICAgaWYgKGlzTmV3UmVmZXJlbmNlKSB7CisgICAgICAgICAgICBtUHJvY2Vzc29yLT5yZWNlbnRlcih0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNlbnNvciA9PSBtU2NyZWVuU2Vuc29yKSB7CisgICAgICAgIG1Qcm9jZXNzb3ItPnNldFdvcmxkVG9TY3JlZW5Qb3NlKHRpbWVzdGFtcCwgcG9zZSk7CisgICAgICAgIGlmIChpc05ld1JlZmVyZW5jZSkgeworICAgICAgICAgICAgbVByb2Nlc3Nvci0+cmVjZW50ZXIoZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZkNzlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8bWVkaWEvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bWVkaWEvU2Vuc29yUG9zZVByb3ZpZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgZm9yIHBvc2UgcHJvY2Vzc2luZywgaW50ZW5kZWQgZm9yIGRyaXZpbmcgYSBzcGF0aWFsaXplciBlZmZlY3QuCisgKiBUaGlzIGluY2x1ZGVzIGludGVncmF0aW9uIHdpdGggdGhlIFNlbnNvciBzdWItc3lzdGVtIGZvciByZXRyaWV2aW5nIHNlbnNvciBkYXRhLCBkb2luZyBhbGwgdGhlCisgKiBuZWNlc3NhcnkgcHJvY2Vzc2luZywgZXRjLgorICoKKyAqIENhbGN1bGF0aW9ucyBoYXBwZW4gb24gYSBkZWRpY2F0ZWQgdGhyZWFkIGFuZCBwdWJsaXNoZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIExpc3RlbmVyIGludGVyZmFjZS4KKyAqIEEgY2FsY3VsYXRpb24gbWF5IGJlIHRyaWdnZXJlZCBpbiBvbmUgb2YgdHdvIHdheXM6CisgKiAtIEJ5IGNhbGxpbmcgY2FsY3VsYXRlQXN5bmMoKSAtIGNhbGN1bGF0aW9uIHdpbGwgYmUga2lja2VkIG9mZiBpbiB0aGUgYmFja2dyb3VuZC4KKyAqIC0gQnkgc2V0dGluZyBhIHRpbWVvdXQgaW4gdGhlIGN0b3IsIGEgY2FsY3VsYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHRpbWVvdXQgZWxhcHNlZAorICogICBmcm9tIHRoZSBsYXN0IGNhbGN1bGF0ZUFzeW5jKCkgY2FsbC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlLgorICovCitjbGFzcyBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyIDogcHJpdmF0ZSBtZWRpYTo6U2Vuc29yUG9zZVByb3ZpZGVyOjpMaXN0ZW5lciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgSU5WQUxJRF9TRU5TT1IgPSBtZWRpYTo6U2Vuc29yUG9zZVByb3ZpZGVyOjpJTlZBTElEX0hBTkRMRTsKKworICAgIC8qKgorICAgICAqIExpc3RlbmVyIGludGVyZmFjZSBmb3IgZ2V0dGluZyBwb3NlIGFuZCBtb2RlIHVwZGF0ZXMuCisgICAgICogTWV0aG9kcyB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGZyb20gYSBkZXNpZ25hdGVkIHRocmVhZC4KKyAgICAgKi8KKyAgICBjbGFzcyBMaXN0ZW5lciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkhlYWRUb1N0YWdlUG9zZShjb25zdCBtZWRpYTo6UG9zZTNmJikgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BY3R1YWxNb2RlQ2hhbmdlKG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlKSA9IDA7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEN0b3IuCisgICAgICogc2Vuc29yUGVyaW9kIGRldGVybWluZXMgaG93IG9mdGVuIHRvIHJlY2VpdmUgdXBkYXRlcyBmcm9tIHRoZSBzZW5zb3JzIChpbnB1dCByYXRlKS4KKyAgICAgKiBtYXhVcGRhdGVQZXJpb2QgZGV0ZXJtaW5lcyBob3cgb2Z0ZW4gdG8gcHJvZHVjZSBhbiBvdXRwdXQgd2hlbiBjYWxjdWxhdGVBc3luYygpIGlzbid0CisgICAgICogaW52b2tlZDsgcGFzc2luZyBudWxsb3B0IG1lYW5zIGFuIG91dHB1dCBpcyBuZXZlciBwcm9kdWNlZC4KKyAgICAgKi8KKyAgICBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyKExpc3RlbmVyKiBsaXN0ZW5lciwgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBzZW5zb3JQZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPiBtYXhVcGRhdGVQZXJpb2QpOworCisgICAgLyoqIER0b3IuICovCisgICAgflNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vuc29yIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgaGVhZC10cmFja2luZy4KKyAgICAgKiBJTlZBTElEX1NFTlNPUiBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGhlYWQtdHJhY2tpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRIZWFkU2Vuc29yKGludDMyX3Qgc2Vuc29yKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vuc29yIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3Igc2NyZWVuLXRyYWNraW5nLgorICAgICAqIElOVkFMSURfU0VOU09SIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgc2NyZWVuLXRyYWNraW5nLgorICAgICAqLworICAgIHZvaWQgc2V0U2NyZWVuU2Vuc29yKGludDMyX3Qgc2Vuc29yKTsKKworICAgIC8qKiBTZXRzIHRoZSBkZXNpcmVkIGhlYWQtdHJhY2tpbmcgbW9kZS4gKi8KKyAgICB2b2lkIHNldERlc2lyZWRNb2RlKG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlIG1vZGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY3JlZW4tdG8tc3RhZ2UgcG9zZSwgdXNlZCBpbiBhbGwgbW9kZXMuCisgICAgICovCisgICAgdm9pZCBzZXRTY3JlZW5Ub1N0YWdlUG9zZShjb25zdCBtZWRpYTo6UG9zZTNmJiBzY3JlZW5Ub1N0YWdlKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24uCisgICAgICogT3JpZW50YXRpb24gaXMgZXhwcmVzc2VkIGluIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBmcm9tIHRoZSBwaHlzaWNhbCAidXAiIHNpZGUgb2YgdGhlIHNjcmVlbgorICAgICAqIHRvIHRoZSBsb2dpY2FsICJ1cCIgc2lkZSBvZiB0aGUgY29udGVudCBkaXNwbGF5ZWQgdGhlIHNjcmVlbi4gQ291bnRlcmNsb2Nrd2lzZSBhbmdsZXMsIGFzCisgICAgICogdmlld2VkIHdoaWxlIGZhY2luZyB0aGUgc2NyZWVuIGFyZSBwb3NpdGl2ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldERpc3BsYXlPcmllbnRhdGlvbihmbG9hdCBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2F1c2VzIHRoZSBjdXJyZW50IHBvc2VzIGZvciBib3RoIHRoZSBoZWFkIGFuZCBzY3JlZW4gdG8gYmUgY29uc2lkZXJlZCAiY2VudGVyIi4KKyAgICAgKi8KKyAgICB2b2lkIHJlY2VudGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGwgdHJpZ2dlcnMgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIG91dHB1dCBhbmQgdGhlIGludm9jYXRpb24gb2YgdGhlIHJlbGV2YW50CisgICAgICogY2FsbGJhY2tzLiBUaGlzIGNhbGwgaXMgYXN5bmMgYW5kIHRoZSBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWQgc2hvcnRseSBhZnRlci4KKyAgICAgKi8KKyAgICB2b2lkIGNhbGN1bGF0ZUFzeW5jKCk7CisKKyAgICAvKioKKyAgICAgKiBCbG9ja3MgdW50aWwgY2FsY3VsYXRpb24gYW5kIGludm9jYXRpb24gb2YgdGhlIHJlc3BlY3RpdmUgY2FsbGJhY2tzIGhhcyBoYXBwZW5lZCBhdCBsZWFzdAorICAgICAqIG9uY2UuIERvIG5vdCBjYWxsIGZyb20gd2l0aGluIGNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICB2b2lkIHdhaXRVbnRpbENhbGN1bGF0ZWQoKTsKKworICBwcml2YXRlOgorICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgTGlzdGVuZXIqIGNvbnN0IG1MaXN0ZW5lcjsKKyAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIG1TZW5zb3JQZXJpb2Q7CisgICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgdGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyB0byBlbnN1cmUgY29ycmVjdCBkZXN0cnVjdGlvbi4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8bWVkaWE6OkhlYWRUcmFja2luZ1Byb2Nlc3Nvcj4gbVByb2Nlc3NvcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8bWVkaWE6OlNlbnNvclBvc2VQcm92aWRlcj4gbVBvc2VQcm92aWRlcjsKKyAgICBpbnQzMl90IG1IZWFkU2Vuc29yID0gbWVkaWE6OlNlbnNvclBvc2VQcm92aWRlcjo6SU5WQUxJRF9IQU5ETEU7CisgICAgaW50MzJfdCBtU2NyZWVuU2Vuc29yID0gbWVkaWE6OlNlbnNvclBvc2VQcm92aWRlcjo6SU5WQUxJRF9IQU5ETEU7CisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6SGVhZFRyYWNraW5nTW9kZT4gbUFjdHVhbE1vZGU7CisgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZFZhcjsKKyAgICBib29sIG1TaG91bGRDYWxjdWxhdGUgPSB0cnVlOworICAgIGJvb2wgbVNob3VsZEV4aXQgPSBmYWxzZTsKKyAgICBib29sIG1DYWxjdWxhdGVkID0gZmFsc2U7CisKKyAgICB2b2lkIG9uUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwgaW50MzJfdCBzZW5zb3IsIGNvbnN0IG1lZGlhOjpQb3NlM2YmIHBvc2UsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxtZWRpYTo6VHdpc3QzZj4mIHR3aXN0LCBib29sIGlzTmV3UmVmZXJlbmNlKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgdGhlIG5ldyBvdXRwdXRzIGFuZCB1cGRhdGVzIGludGVybmFsIHN0YXRlLiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQuCisgICAgICogUmV0dXJucyB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByZXNwZWN0aXZlIGNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICBzdGQ6OnR1cGxlPG1lZGlhOjpQb3NlM2YsIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkhlYWRUcmFja2luZ01vZGU+PiBjYWxjdWxhdGVfbCgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGIyOTZmYjAuLjJlMjIwYmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icApAQCAtMjUsMTMgKzI1LDEzIEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlieG1sMiIsCi0gICAgICAgICJsaWJwZXJtaXNzaW9uIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAotICAgICAgICAibGliZ21vY2siCisgICAgICAgICJsaWJnbW9jayIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCkBAIC02NSw2ICs2NSwxMiBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAorICAgICAgICAibGlic2htZW11dGlsIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIl0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKaW5kZXggZjdiMDU2NS4uMDU3ZmE1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaApAQCAtMzcsNyArMzcsOCBAQAogCiAgICAgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICogLypoYWxDb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKiAvKm1peGVyQ29uZmlnKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIC8qZGV2aWNlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqIC8qbGF0ZW5jeU1zKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsKQEAgLTEwMiw2ICsxMDMsMTEgQEAKICAgICAgICAgKyttQXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50OwogICAgIH0KIAorICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3RlZFN0YXRlKAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQgX191bnVzZWQsIGJvb2wgY29ubmVjdGVkIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKICAgICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgdGVzdHMKICAgICBzaXplX3QgZ2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZVBhdGNoZXMuc2l6ZSgpOyB9CiAKQEAgLTEzMiw3ICsxMzgsMTIgQEAKICAgICB9CiAKICAgICBzaXplX3QgZ2V0Um91dGluZ1VwZGF0ZWRDb3VudGVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJvdXRpbmdVcGRhdGVkVXBkYXRlQ291bnQ7IH0KKyAgICAgICAgcmV0dXJuIG1Sb3V0aW5nVXBkYXRlZFVwZGF0ZUNvdW50OworICAgIH0KKworICAgIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkgb3ZlcnJpZGUgeworCisgICAgfQogCiAgICAgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzIF9fdW51c2VkKSBvdmVycmlkZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaAppbmRleCBhNWFkOWIxLi43MzQzYjliIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmgKQEAgLTI4LDE5ICsyOCwyNiBAQAogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCB7CiBwdWJsaWM6CiAgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qIGlvSGFuZGxlICovLCBjb25zdCBTdHJpbmc4JiAgLyoga2V5cyovICkgb3ZlcnJpZGUgeworICAgICAgICBBdWRpb1BhcmFtZXRlciBtQXVkaW9QYXJhbWV0ZXJzOworICAgICAgICBzdGQ6OnN0cmluZyBmb3JtYXRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBtU3VwcG9ydGVkRm9ybWF0cykgeworICAgICAgICAgICAgaWYgKCFmb3JtYXRzLmVtcHR5KCkpIGZvcm1hdHMgKz0gQVVESU9fUEFSQU1FVEVSX1ZBTFVFX0xJU1RfU0VQQVJBVE9SOworICAgICAgICAgICAgZm9ybWF0cyArPSBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGYpOworICAgICAgICB9CisgICAgICAgIG1BdWRpb1BhcmFtZXRlcnMuYWRkKAorICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLAorICAgICAgICAgICAgICAgIFN0cmluZzgoZm9ybWF0cy5jX3N0cigpKSk7CisgICAgICAgIG1BdWRpb1BhcmFtZXRlcnMuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCA0ODAwMCk7CisgICAgICAgIG1BdWRpb1BhcmFtZXRlcnMuYWRkKFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgU3RyaW5nOCgiIikpOwogICAgICAgICByZXR1cm4gbUF1ZGlvUGFyYW1ldGVycy50b1N0cmluZygpOwogICAgIH0KIAogICAgIHZvaWQgYWRkU3VwcG9ydGVkRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgb3ZlcnJpZGUgewotICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZCgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwKLSAgICAgICAgICAgICAgICBTdHJpbmc4KGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcoZm9ybWF0KSkpOwotICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgNDgwMDApOwotICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIFN0cmluZzgoIiIpKTsKKyAgICAgICAgbVN1cHBvcnRlZEZvcm1hdHMuaW5zZXJ0KGZvcm1hdCk7CiAgICAgfQogCiBwcml2YXRlOgotICAgIEF1ZGlvUGFyYW1ldGVyIG1BdWRpb1BhcmFtZXRlcnM7CisgICAgc3RkOjpzZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXBwb3J0ZWRGb3JtYXRzOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKaW5kZXggMTM4NDg2NC4uOGE4NWZlZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTMwLDcgKzMwLDggQEAKICAgICB9CiAgICAgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgLyptb2R1bGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiAvKm91dHB1dCovLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QqIC8qY29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypoYWxDb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QqIC8qbWl4ZXJDb25maWcqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgLypkZXZpY2UqLywKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKmxhdGVuY3lNcyovLAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CkBAIC04NCw2ICs4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlIF9fdW51c2VkKSBvdmVycmlkZSB7IH0KICAgICB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpIG92ZXJyaWRlIHsgfQogICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkIF9fdW51c2VkKSB7fQpAQCAtOTUsNiArOTcsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzIF9fdW51c2VkKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0IF9fdW51c2VkLCBib29sIGNvbm5lY3RlZCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKaW5kZXggN2Y2Nzk0MC4uNzQ0MWYyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaApAQCAtMzMsNiArMzMsMTAgQEAKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzOwogICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkT3V0cHV0UGF0Y2hlczsKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUGF0Y2hlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERpcmVjdFBsYXliYWNrU3VwcG9ydDsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZTsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZVRvQXVkaW9Qb3J0OwogICAgIHVpbnQzMl90IGdldEF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAKaW5kZXggZGY0Mzg5Yi4uMTBmOGRjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCkBAIC0xMTEsMTYgKzExMSwxNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9ICIxMToyMjozMzo0NDo1NTo2NiI7CisgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFBvcnQ7CisgICAgICAgIEFTU0VSVF9FUShPSywgbWFuYWdlci5kZXZpY2VUb0F1ZGlvUG9ydChkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpLCAiIiAvKm5hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWlkbFBvcnQpKTsKICAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpKSk7CiAgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICBkZXZpY2UtPnR5cGUoKSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAiIiAvKmRldmljZV9uYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIGFpZGxQb3J0LmhhbCwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLT50eXBlKCksIGFkZHJlc3MuY19zdHIoKSkpOwogICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT50eXBlKCksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAiIiAvKmRldmljZV9uYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwgYWlkbFBvcnQuaGFsLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgICAgICBBU1NFUlRfRVEoQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhMTZhYjdkLi41NDI5MTc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTEzNyw2ICsxMzcsOCBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gbnVsbHB0cik7CiAgICAgUGF0Y2hDb3VudENoZWNrIHNuYXBzaG90UGF0Y2hDb3VudCgpIHsgcmV0dXJuIFBhdGNoQ291bnRDaGVjayhtQ2xpZW50LmdldCgpKTsgfQogCisgICAgdm9pZCBnZXRBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19wb3J0X3Y3PiogcG9ydHMpOwogICAgIC8vIFRyaWVzIHRvIGZpbmQgYSBkZXZpY2UgcG9ydC4gSWYgJ2ZvdW5kUG9ydCcgaXNuJ3QgbnVsbHB0ciwKICAgICAvLyB3aWxsIGdlbmVyYXRlIGEgZmFpbHVyZSBpZiB0aGUgcG9ydCBoYXNuJ3QgYmVlbiBmb3VuZC4KICAgICBib29sIGZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLApAQCAtMTUxLDcgKzE1Myw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCkgewogICAgIG1DbGllbnQucmVzZXQoZ2V0Q2xpZW50KCkpOwogICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKLSAgICBTZXRVcE1hbmFnZXJDb25maWcoKTsgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb25maWcuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0VXBNYW5hZ2VyQ29uZmlnKCkpOyAgLy8gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGNvbmZpZy4KICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0aWFsaXplKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRDaGVjaygpKTsKIH0KQEAgLTIxNiwxMyArMjE4LDE0IEBACiAgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6b3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOworICAgIGJvb2wgaXNTcGF0aWFsaXplZDsKICAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnVpZCA9IDA7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOwogICAgIEFTU0VSVF9FUShPSywgbU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoCiAgICAgICAgICAgICAgICAgICAgICZhdHRyLCBvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgYXR0cmlidXRpb25Tb3VyY2UsICZjb25maWcsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSwgJm91dHB1dFR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSwgJm91dHB1dFR5cGUsICZpc1NwYXRpYWxpemVkKSk7CiAgICAgQVNTRVJUX05FKEFVRElPX1BPUlRfSEFORExFX05PTkUsICpwb3J0SWQpOwogICAgIEFTU0VSVF9ORShBVURJT19JT19IQU5ETEVfTk9ORSwgKm91dHB1dCk7CiB9CkBAIC0yNTUsMjEgKzI1OCwyNiBAQAogICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpmaW5kRGV2aWNlUG9ydChhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvcnRfdjcgKmZvdW5kUG9ydCkgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpnZXRBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3BvcnRfdjc+KiBwb3J0cykgewogICAgIHVpbnQzMl90IG51bVBvcnRzID0gMDsKICAgICB1aW50MzJfdCBnZW5lcmF0aW9uMTsKICAgICBzdGF0dXNfdCByZXQ7CiAKLSAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBudWxscHRyLCAmZ2VuZXJhdGlvbjEpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KSA8PCAibU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzIHJldHVybmVkIGVycm9yIjsKLSAgICBpZiAoSGFzRmFpbHVyZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsICZudW1Qb3J0cywgbnVsbHB0ciwgJmdlbmVyYXRpb24xKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCkgPDwgIm1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyByZXR1cm5lZCBlcnJvciI7CiAKICAgICB1aW50MzJfdCBnZW5lcmF0aW9uMjsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyBwb3J0c1tudW1Qb3J0c107Ci0gICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgcG9ydHMsICZnZW5lcmF0aW9uMik7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOwotICAgIEVYUEVDVF9FUShnZW5lcmF0aW9uMSwgZ2VuZXJhdGlvbjIpIDw8ICJHZW5lcmF0aW9ucyBjaGFuZ2VkIGR1cmluZyBwb3J0cyByZXRyaWV2YWwiOworICAgIHBvcnRzLT5yZXNpemUobnVtUG9ydHMpOworICAgIHJldCA9IG1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCAmbnVtUG9ydHMsIHBvcnRzLT5kYXRhKCksICZnZW5lcmF0aW9uMik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOworICAgIEFTU0VSVF9FUShnZW5lcmF0aW9uMSwgZ2VuZXJhdGlvbjIpIDw8ICJHZW5lcmF0aW9ucyBjaGFuZ2VkIGR1cmluZyBwb3J0cyByZXRyaWV2YWwiOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcywgYXVkaW9fcG9ydF92NyAqZm91bmRQb3J0KSB7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcG9ydF92Nz4gcG9ydHM7CisgICAgZ2V0QXVkaW9Qb3J0cyhBVURJT19QT1JUX1RZUEVfREVWSUNFLCByb2xlLCAmcG9ydHMpOwogICAgIGlmIChIYXNGYWlsdXJlKCkpIHJldHVybiBmYWxzZTsKIAogICAgIGZvciAoY29uc3QgYXV0byAmcG9ydCA6IHBvcnRzKSB7CkBAIC0zNzMsNiArMzgxLDcgQEAKICAgcHJvdGVjdGVkOgogICAgIHZvaWQgU2V0VXBNYW5hZ2VyQ29uZmlnKCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyKTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOwpAQCAtNDAxLDcgKzQxMCw3IEBACiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgewogICAgIC8vIFRPRE86IENvbnNpZGVyIHVzaW5nIFNlcmlhbGl6ZXIgdG8gbG9hZCBwYXJ0IG9mIHRoZSBjb25maWcgZnJvbSBhIHN0cmluZy4KLSAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKSk7CiAgICAgQXVkaW9Qb2xpY3lDb25maWcmIGNvbmZpZyA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKTsKICAgICBtTXNkT3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9CVVMpOwogICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCkBAIC01MDIsNiArNTExLDEzIEBACiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6VGVhckRvd24oKTsKIH0KIAorQXVkaW9Qcm9maWxlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIpIHsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlc1ZlY3RvcjsKKyAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCZhdHRyLCBhdWRpb1Byb2ZpbGVzVmVjdG9yKTsKKyAgICByZXR1cm4gYXVkaW9Qcm9maWxlc1ZlY3RvcjsKK30KKwogVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CiAgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CiAgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKQEAgLTY0Miw2ICs2NTgsMjAwIEBACiAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXNXaXRoTXNkKSB7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAorICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn07CisKKyAgICAvLyBjb3VudCBleHBlY3RlZCBkaXJlY3QgcHJvZmlsZXMgZm9yIHRoZSBkZWZhdWx0IGRldmljZQorICAgIGludCBjb3VudERpcmVjdFByb2ZpbGVzUHJpbWFyeSA9IDA7CisgICAgY29uc3QgYXV0byYgcHJpbWFyeSA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRId01vZHVsZXMoKQorICAgICAgICAgICAgLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gb3V0cHV0UHJvZmlsZSA6IHByaW1hcnktPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgaWYgKG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGNvdW50RGlyZWN0UHJvZmlsZXNQcmltYXJ5ICs9IG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb3VudCBleHBlY3RlZCBkaXJlY3QgcHJvZmlsZXMgZm9yIHRoZSBtc2QgZGV2aWNlCisgICAgaW50IGNvdW50RGlyZWN0UHJvZmlsZXNNc2QgPSAwOworICAgIGNvbnN0IGF1dG8mIG1zZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRId01vZHVsZXMoKQorICAgICAgICAgICAgLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGZvciAoY29uc3QgYXV0byBvdXRwdXRQcm9maWxlIDogbXNkLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgIGlmIChvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgICAgICBjb3VudERpcmVjdFByb2ZpbGVzTXNkICs9IG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBiZWZvcmUgc2V0dGluZyB1cCBNU0QgYXVkaW8gcGF0Y2hlcyB3ZSBvbmx5IGhhdmUgdGhlIHByaW1hcnkgaGFsIGRpcmVjdCBwcm9maWxlcworICAgIEFTU0VSVF9FUShjb3VudERpcmVjdFByb2ZpbGVzUHJpbWFyeSwgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGF0dHIpLnNpemUoKSk7CisKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgLy8gUmVtb3ZlIE1TRCBvdXRwdXQgZGV2aWNlIHRvIGF2b2lkIHBhdGNoaW5nIHRvIGl0c2VsZgorICAgIG91dHB1dERldmljZXMucmVtb3ZlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKTsKKworICAgIC8vIGFmdGVyIHNldHRpbmcgdXAgTVNEIGF1ZGlvIHBhdGNoZXMgdGhlIE1TRCBkaXJlY3QgcHJvZmlsZXMgYXJlIGFkZGVkCisgICAgQVNTRVJUX0VRKGNvdW50RGlyZWN0UHJvZmlsZXNQcmltYXJ5ICsgY291bnREaXJlY3RQcm9maWxlc01zZCwKKyAgICAgICAgICAgICAgICBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoYXR0cikuc2l6ZSgpKTsKKworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhvdXRwdXREZXZpY2VzKTsKKyAgICAvLyByZWxlYXNpbmcgdGhlIE1TRCBhdWRpbyBwYXRjaGVzIGdldHMgdXMgYmFjayB0byB0aGUgcHJpbWFyeSBoYWwgZGlyZWN0IHByb2ZpbGVzIG9ubHkKKyAgICBBU1NFUlRfRVEoY291bnREaXJlY3RQcm9maWxlc1ByaW1hcnksIGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhhdHRyKS5zaXplKCkpOworfQorCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgSXNEaXJlY3RQbGF5YmFja1N1cHBvcnRlZFdpdGhNc2QpIHsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsKKyAgICAgICAgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCisgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifTsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgZGlyZWN0Q29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9EVFM7CisgICAgZGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgZGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7CisKKyAgICBhdWRpb19jb25maWdfYmFzZV90IG5vbkRpcmVjdENvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG5vbkRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBub25EaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBub25EaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBub25FeGlzdGVudENvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9FX0FDMzsKKyAgICBub25FeGlzdGVudENvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgbXNkRGlyZWN0Q29uZmlnMSA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG1zZERpcmVjdENvbmZpZzEuZm9ybWF0ID0gQVVESU9fRk9STUFUX0FDMzsKKyAgICBtc2REaXJlY3RDb25maWcxLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgbXNkRGlyZWN0Q29uZmlnMS5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtc2REaXJlY3RDb25maWcyID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5mb3JtYXQgPSBBVURJT19GT1JNQVRfSUVDNjA5NTg7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzIuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtc2ROb25EaXJlY3RDb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gOTYwMDA7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChkaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkRpcmVjdENvbmZpZywgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobm9uRXhpc3RlbnRDb25maWcsIGF0dHIpKTsKKyAgICAvLyBiZWZvcmUgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiBmYWxzZQorICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMSwgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMiwgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkTm9uRGlyZWN0Q29uZmlnLCBhdHRyKSk7CisKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgLy8gUmVtb3ZlIE1TRCBvdXRwdXQgZGV2aWNlIHRvIGF2b2lkIHBhdGNoaW5nIHRvIGl0c2VsZgorICAgIG91dHB1dERldmljZXMucmVtb3ZlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKTsKKworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChkaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkRpcmVjdENvbmZpZywgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobm9uRXhpc3RlbnRDb25maWcsIGF0dHIpKTsKKyAgICAvLyBhZnRlciBzZXR0aW5nIE1TRCBwYXRjaGVzIHRoZSBkaXJlY3QgTVNEIGNvbmZpZ3MgcmV0dXJuIHRydWUKKyAgICBBU1NFUlRfVFJVRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMSwgYXR0cikpOworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2REaXJlY3RDb25maWcyLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2ROb25EaXJlY3RDb25maWcsIGF0dHIpKTsKKworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhvdXRwdXREZXZpY2VzKTsKKworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChkaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkRpcmVjdENvbmZpZywgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobm9uRXhpc3RlbnRDb25maWcsIGF0dHIpKTsKKyAgICAvLyBBRlRFUiByZWxlYXNpbmcgTVNEIHBhdGNoZXMgdGhlIGRpcmVjdCBNU0QgY29uZmlncyByZXR1cm4gZmFsc2UKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzEsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzIsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZE5vbkRpcmVjdENvbmZpZywgYXR0cikpOworfQorCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0V2l0aE1zZCkgeworICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geworICAgICAgICBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OworCisgICAgYXVkaW9fY29uZmlnX3QgZGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfRFRTOworICAgIGRpcmVjdENvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIGRpcmVjdENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOworCisgICAgYXVkaW9fY29uZmlnX3Qgbm9uRGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIG5vbkRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBub25EaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBub25EaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX3Qgbm9uRXhpc3RlbnRDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbm9uRXhpc3RlbnRDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX0VfQUMzOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgbm9uRXhpc3RlbnRDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX3QgbXNkRGlyZWN0Q29uZmlnMSA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBtc2REaXJlY3RDb25maWcxLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQzM7CisgICAgbXNkRGlyZWN0Q29uZmlnMS5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzEuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMTsKKworICAgIGF1ZGlvX2NvbmZpZ190IG1zZERpcmVjdENvbmZpZzIgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5mb3JtYXQgPSBBVURJT19GT1JNQVRfSUVDNjA5NTg7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzIuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX3QgbXNkTm9uRGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIG1zZE5vbkRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA5NjAwMDsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9CSVRTVFJFQU1fU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZkaXJlY3RDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm5vbkRpcmVjdENvbmZpZykpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbm9uRXhpc3RlbnRDb25maWcpKTsKKyAgICAvLyBiZWZvcmUgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRAorICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMSkpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMikpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkTm9uRGlyZWN0Q29uZmlnKSk7CisKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgLy8gUmVtb3ZlIE1TRCBvdXRwdXQgZGV2aWNlIHRvIGF2b2lkIHBhdGNoaW5nIHRvIGl0c2VsZgorICAgIG91dHB1dERldmljZXMucmVtb3ZlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKTsKKworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmZGlyZWN0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZub25EaXJlY3RDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm5vbkV4aXN0ZW50Q29uZmlnKSk7CisgICAgLy8gYWZ0ZXIgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZWlyIGZsYWdzCisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMSkpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMikpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkTm9uRGlyZWN0Q29uZmlnKSk7CisKKyAgICBtTWFuYWdlci0+cmVsZWFzZU1zZE91dHB1dFBhdGNoZXMob3V0cHV0RGV2aWNlcyk7CisKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX0JJVFNUUkVBTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmRpcmVjdENvbmZpZykpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbm9uRGlyZWN0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZub25FeGlzdGVudENvbmZpZykpOworICAgIC8vIGFmdGVyIHJlbGVhc2luZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRAorICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMSkpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMikpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkTm9uRGlyZWN0Q29uZmlnKSk7Cit9CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBTZXRVcE1hbmFnZXJDb25maWcoKSBvdmVycmlkZTsKQEAgLTY2MCw2ICs4NzAsNyBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlOjpTZXRVcE1hbmFnZXJDb25maWcoKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoZ2V0Q29uZmlnRmlsZSgpLmNfc3RyKCksICZtTWFuYWdlci0+Z2V0Q29uZmlnKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0U291cmNlKGdldENvbmZpZ0ZpbGUoKSk7CiB9CiAKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlLCBJbml0U3VjY2VzcykgewpAQCAtNjcwLDYgKzg4MSw0NCBAQAogICAgIGR1bXBUb0xvZygpOwogfQogCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSwgTGlzdEF1ZGlvUG9ydHNIYXNGbGFncykgeworICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBmb3IgVk9JUCBUWCBiZWNhdXNlIGl0J3Mgbm90IG9wZW5lZCBhdXRvbWF0aWNhbGx5IGxpa2Ugb3V0cHV0cyBhcmUuCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1peFBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBzb3VyY2UsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Rm9yQXR0cihhdHRyLCAxLCAmc2VsZWN0ZWREZXZpY2VJZCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYLCAmbWl4UG9ydElkKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19wb3J0X3Y3PiBwb3J0czsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldEF1ZGlvUG9ydHMoQVVESU9fUE9SVF9UWVBFX01JWCwgQVVESU9fUE9SVF9ST0xFX05PTkUsICZwb3J0cykpOworICAgIEVYUEVDVF9ORSgwLCBwb3J0cy5zaXplKCkpOworICAgIGJvb2wgaGFzRmxhZ3MgPSBmYWxzZSwgZm91bmRQcmltYXJ5ID0gZmFsc2UsIGZvdW5kVm9pcFJ4ID0gZmFsc2UsIGZvdW5kVm9pcFR4ID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBwb3J0IDogcG9ydHMpIHsKKyAgICAgICAgaWYgKChwb3J0LmFjdGl2ZV9jb25maWcuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgIT0gMCkgeworICAgICAgICAgICAgaGFzRmxhZ3MgPSB0cnVlOworICAgICAgICAgICAgaWYgKHBvcnQucm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgaWYgKChwb3J0LmFjdGl2ZV9jb25maWcuZmxhZ3Mub3V0cHV0ICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFByaW1hcnkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHBvcnQuYWN0aXZlX2NvbmZpZy5mbGFncy5vdXRwdXQgJiBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kVm9pcFJ4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcnQucm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgICAgIGlmICgocG9ydC5hY3RpdmVfY29uZmlnLmZsYWdzLmlucHV0ICYgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kVm9pcFR4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgRVhQRUNUX1RSVUUoaGFzRmxhZ3MpOworICAgIEVYUEVDVF9UUlVFKGZvdW5kUHJpbWFyeSk7CisgICAgRVhQRUNUX1RSVUUoZm91bmRWb2lwUngpOworICAgIEVYUEVDVF9UUlVFKGZvdW5kVm9pcFR4KTsKK30KKwogdXNpbmcgUG9saWN5TWl4VHVwbGUgPSBzdGQ6OnR1cGxlPGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90LCB1aW50MzJfdD47CiAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5IDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgewpAQCAtODAzLDcgKzEwNTIsOCBAQAogfQogCiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaQotICAgICAgICA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKKyAgICAgICAgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSwKKyAgICAgICAgICBwdWJsaWMgdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGF1ZGlvX2Zvcm1hdF90PiB7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOwogICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzVHZDb25maWc7IH0KQEAgLTgyNCw3ICsxMDc0LDggQEAKICAgICAgICAgInRlc3Rfc2V0dG9wX2JveF9zdXJyb3VuZF9jb25maWd1cmF0aW9uLnhtbCI7CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OlNldFVwKCkgewotICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXAoKSk7CisgICAgbUNsaWVudC0+YWRkU3VwcG9ydGVkRm9ybWF0KEFVRElPX0ZPUk1BVF9BQzMpOwogICAgIG1DbGllbnQtPmFkZFN1cHBvcnRlZEZvcm1hdChBVURJT19GT1JNQVRfRV9BQzMpOwogICAgIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLApAQCAtOTE0LDc2ICsxMTY1LDkwIEBACiAgICAgcmV0dXJuIGZvcm1hdHM7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwgR2V0U3Vycm91bmRGb3JtYXRzUmV0dXJuc1N1cHBvcnRlZEZvcm1hdHMpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwgR2V0U3Vycm91bmRGb3JtYXRzUmV0dXJuc1N1cHBvcnRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7CiAgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKLSAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoR2V0UGFyYW0oKSkpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCiAgICAgICAgIEdldFN1cnJvdW5kRm9ybWF0c1JldHVybnNNYW5pcHVsYXRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CiAKICAgICBzdGF0dXNfdCByZXQgPQotICAgICAgICAgICAgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgZmFsc2UgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0dldFBhcmFtKCldKTsKIAotICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCB0cnVlIC8qZW5hYmxlZCovKTsKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIHRydWUgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKLSAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOwotICAgIEFTU0VSVF9UUlVFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfVFJVRShzdXJyb3VuZEZvcm1hdHNbR2V0UGFyYW0oKV0pOwogCi0gICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKTsKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIGZhbHNlIC8qZW5hYmxlZCovKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAgICAgc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKLSAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0FVRElPX0ZPUk1BVF9FX0FDM10pOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoR2V0UGFyYW0oKSkpOworICAgIEFTU0VSVF9GQUxTRShzdXJyb3VuZEZvcm1hdHNbR2V0UGFyYW0oKV0pOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCiAgICAgICAgIExpc3RBdWRpb1BvcnRzUmV0dXJuTWFuaXB1bGF0ZWRIZG1pRm9ybWF0cykgewogICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZSgKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKTsKIAotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIGZhbHNlIC8qZW5hYmxlZCovKSk7CiAgICAgYXV0byBmb3JtYXRzID0gZ2V0Rm9ybWF0c0Zyb21Qb3J0cygpOwotICAgIEFTU0VSVF9FUSgwLCBmb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgwLCBmb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKIAotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIHRydWUgLyplbmFibGVkKi8pKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgdHJ1ZSAvKmVuYWJsZWQqLykpOwogICAgIGZvcm1hdHMgPSBnZXRGb3JtYXRzRnJvbVBvcnRzKCk7Ci0gICAgQVNTRVJUX0VRKDEsIGZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0VRKDEsIGZvcm1hdHMuY291bnQoR2V0UGFyYW0oKSkpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCiAgICAgICAgIEdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzUmV0dXJuc0hkbWlSZXBvcnRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7CiAgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEdldFBhcmFtKCkpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAogICAgICAgICBHZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c1JldHVybnNOb25NYW5pcHVsYXRlZEhkbWlSZXBvcnRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CiAKLSAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgZmFsc2UgLyplbmFibGVkKi8pOworICAgIHN0YXR1c190IHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgZmFsc2UgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgR2V0UGFyYW0oKSkpOwogCi0gICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIHRydWUgLyplbmFibGVkKi8pOworICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgdHJ1ZSAvKmVuYWJsZWQqLyk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOwogICAgIHN1cnJvdW5kRm9ybWF0cyA9IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgR2V0UGFyYW0oKSkpOwogfQogCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksIEdldFN1cnJvdW5kRm9ybWF0c0lnbm9yZXNTdXBwb3J0ZWRGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUik7CisgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0dldFBhcmFtKCldKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFN1cnJvdW5kRm9ybWF0U3VwcG9ydCwgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhBVURJT19GT1JNQVRfQUMzLCBBVURJT19GT1JNQVRfRV9BQzMpLAorICAgICAgICBbXShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OlBhcmFtVHlwZT4mIGluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGluZm8ucGFyYW0pOworICAgICAgICB9KTsKKwogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTm9SZW1vdGVTdWJtaXhNb2R1bGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3kgewogcHJvdGVjdGVkOgogICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzUHJpbWFyeU9ubHlDb25maWc7IH0KQEAgLTEwMzUsNyArMTMwMCw3IEBACiB9OwogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUFBsYXliYWNrUmVSb3V0aW5nOjpTZXRVcCgpIHsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6U2V0VXAoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6U2V0VXAoKSk7CiAKICAgICBtVHJhY2tlci5yZXNldChuZXcgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCkpOwogCkBAIC0xMjIxLDcgKzE0ODYsNyBAQAogfTsKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb246OlNldFVwKCkgewotICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjpTZXRVcCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjpTZXRVcCgpKTsKIAogICAgIG1UcmFja2VyLnJlc2V0KG5ldyBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKSk7CiAKQEAgLTEzNzUsNyArMTY0MCw4IEBACiAgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7CiAgICAgICAgIC8vIFNldCBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSBmYWlsZWQgZHVlIHRvIG5vIGRldmljZSBkZXNjcmlwdG9yIGZvdW5kCiAgICAgICAgIC8vIEZvciBIRE1JIGNhc2UsIGl0IGlzIGVhc2llciB0byBzaW11bGF0ZSBkZXZpY2UgZGVzY3JpcHRvciBub3QgZm91bmQgZXJyb3IKLSAgICAgICAgLy8gYnkgdXNpbmcgYSB1bmRlY2xhcmVkIGVuY29kZWQgZm9ybWF0LgorICAgICAgICAvLyBieSB1c2luZyBhbiBlbmNvZGVkIGZvcm1hdCB3aGljaCBpc24ndCBsaXN0ZWQgaW4gdGhlICdlbmNvZGVkRm9ybWF0cycKKyAgICAgICAgLy8gYXR0cmlidXRlIGZvciB0aGlzIGRldmljZVBvcnQuCiAgICAgICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgbU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKICAgICAgICAgICAgICAgICB0eXBlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSwgQVVESU9fRk9STUFUX01BVF8yXzEpKTsKQEAgLTE1MTksNyArMTc4NSw3IEBACiB9OwogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckR5bmFtaWNId01vZHVsZXNUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKSB7Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6U2V0VXBNYW5hZ2VyQ29uZmlnKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkpOwogICAgIC8vIE9ubHkgYWxsb3cgc3VjY2Vzc2Z1bCBvcGVuaW5nIG9mICJwcmltYXJ5IiBodyBtb2R1bGUgZHVyaW5nIEFQTSBpbml0aWFsaXphdGlvbi4KICAgICBtQ2xpZW50LT5zd2FwQWxsb3dlZE1vZHVsZU5hbWVzKHsicHJpbWFyeSJ9KTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA4N2YwYWI5Li41ZTE4MjJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+Cis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjcuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgogICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9InRydWUiLz4KIAogICAgIDxtb2R1bGVzPgpAQCAtNDEsOCArNDEsMTggQEAKICAgICAgICAgICAgICAgICA8L21peFBvcnQ+CiAgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0ibWl4cG9ydF9idF9oZnBfaW5wdXQiIHJvbGU9InNpbmsiPgogICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTYwMDAsNDQxMDAsNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTYwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8gQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InZvaXBfdHgiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAzMjAwMCA0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0idm9pcF9yeCIgcm9sZT0ic291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAzMjAwMCA0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgICAgICAgICA8L21peFBvcnQ+CiAgICAgICAgICAgICA8L21peFBvcnRzPgogICAgICAgICAgICAgPGRldmljZVBvcnRzPgpAQCAtNTAsNyArNjAsOCBAQAogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KICAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+Ci0gICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIZG1pIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hETUkiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQzMiPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIZG1pLUluIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0hETUkiIHJvbGU9InNvdXJjZSI+CiAgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgpAQCAtNjMsMTMgKzc0LDE1IEBACiAgICAgICAgICAgICA8L2RldmljZVBvcnRzPgogICAgICAgICAgICAgPHJvdXRlcz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJTcGVha2VyIgotICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCIvPgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCx2b2lwX3J4Ii8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEhkbWktSW4gTWljIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0idm9pcF90eCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljIi8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSGRtaSIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBTQ08iCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9Im1peHBvcnRfYnRfaGZwX291dHB1dCIvPgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQsdm9pcF9yeCIvPgogICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1peHBvcnRfYnRfaGZwX2lucHV0IgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBTQ08gSGVhZHNldCBNaWMiLz4KICAgICAgICAgICAgIDwvcm91dGVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggMjY1NjJlMC4uOTgxYzU2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC00MiwxMyArNDIsMTUgQEAKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkNhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZy5jcHAiLAogICAgICAgICAiQ2FtZXJhRmxhc2hsaWdodC5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCIsCiAgICAgICAgICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAiLAotICAgICAgICAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIiwKICAgICAgICAgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uY3BwIiwKKyAgICAgICAgImNvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uY3BwIiwKICAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAogICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKICAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLApAQCAtNzYsMzIgKzc4LDM3IEBACiAgICAgICAgICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCIsCi0gICAgICAgICJkZXZpY2UzL0Nvb3JkaW5hdGVNYXBwZXIuY3BwIiwKLSAgICAgICAgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAiLAotICAgICAgICAiZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwIiwKLSAgICAgICAgImRldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcy5jcHAiLAogICAgICAgICAiZGV2aWNlMy9VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvUHJldmlld0ZyYW1lU3BhY2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNEZXZpY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAiLAorICAgICAgICAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAiLAorICAgICAgICAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwIiwKICAgICAgICAgImd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIiwKICAgICAgICAgImhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAiLAogICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCIsCi0gICAgICAgICJoaWRsL0NvbnZlcnQuY3BwIiwKICAgICAgICAgImhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIiwKICAgICAgICAgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgImhpZGwvVXRpbHMuY3BwIiwKICAgICAgICAgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuY3BwIiwKICAgICAgICAgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCIsCiAgICAgICAgICJ1dGlscy9DYW1lcmFUcmFjZXMuY3BwIiwKICAgICAgICAgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCIsCi0gICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKICAgICAgICAgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmNwcCIsCiAgICAgICAgICJ1dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcCIsCiAgICAgICAgICJ1dGlscy9UYWdNb25pdG9yLmNwcCIsCiAgICAgICAgICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJkeW5hbWljX2RlcHRoLWludGVybmFsX2hlYWRlcnMiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aC1wdWJsaWNfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKICAgICBdLApAQCAtMTE1LDYgKzEyMiw3IEBACiAgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJhY3Rpdml0eW1hbmFnZXJfYWlkbCIsCiAgICAgICAgICJsaWJwZXJtaXNzaW9uIiwKICAgICAgICAgImxpYmN1dGlscyIsCkBAIC0xNDgsMTkgKzE1NiwyMyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjciLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXItVjEtbmRrIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZS1WMS1uZGsiLAogICAgICAgICAibWVkaWFfcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhaWRsY29tbW9uc3VwcG9ydCIsCiAgICAgICAgICJsaWJwcm9jZXNzaW5mb3NlcnZpY2VfYWlkbCIsCiAgICAgICAgICJsaWJiaW5kZXJ0aHJlYWRzdGF0ZXV0aWxzIiwKICAgICAgICAgIm1lZGlhX3Blcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZV9kZXZpY2VfaW5kZXBlbmRlbnQiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC0xNzUsOSArMTg3LDU1IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAotICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCi0gICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2VfZGV2aWNlX2luZGVwZW5kZW50IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIC8vIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQorCisgICAgc3JjczogWworICAgICAgICAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcCIsCisgICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJkeW5hbWljX2RlcHRoLWludGVybmFsX2hlYWRlcnMiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aC1wdWJsaWNfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKaW5kZXggY2NkZDllNS4uZmZkMzhiZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKQEAgLTMyLDggKzMyLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1czsKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDYW1lcmFGbGFzaGxpZ2h0IGltcGxlbWVudGF0aW9uIGJlZ2lucwogLy8gdXNlZCBieSBjYW1lcmEgc2VydmljZSB0byBjb250cm9sIGZsYXNoZmxpZ2h0LgpAQCAtMTE5LDYgKzExNyw1OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIHsKKyAgICBpZiAoIW1GbGFzaGxpZ2h0TWFwSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmaW5kRmxhc2hVbml0cygpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZC4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBzZXQgdG9yY2ggc3RyZW5ndGggb2YgY2FtZXJhICVzIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLmluZGV4T2YoY2FtZXJhSWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyBpbiB1c2UsIGNhbm5vdCBiZSB0dXJuZWQgT04uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBpZiAobUZsYXNoQ29udHJvbCA9PSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGNyZWF0ZUZsYXNobGlnaHRDb250cm9sKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IG1GbGFzaENvbnRyb2wtPnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY2FtZXJhSWQsIHRvcmNoU3RyZW5ndGgpOworICAgIHJldHVybiByZXM7Cit9CisKKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICghbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbmRGbGFzaFVuaXRzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKG1GbGFzaENvbnRyb2wgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjYW1lcmFJZCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBtRmxhc2hDb250cm9sLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY2FtZXJhSWQsIHRvcmNoU3RyZW5ndGgpOworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OmZpbmRGbGFzaFVuaXRzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0zMDYsNiArMzU3LDIyIEBACiAKICAgICByZXR1cm4gbVByb3ZpZGVyTWFuYWdlci0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLnN0cmluZygpLCBlbmFibGVkKTsKIH0KKworc3RhdHVzX3QgUHJvdmlkZXJGbGFzaENvbnRyb2w6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIHsKKyAgICBBTE9HVigiJXM6IGNoYW5nZSB0b3JjaCBzdHJlbmd0aCBsZXZlbCBvZiBjYW1lcmEgJXMgdG8gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgdG9yY2hTdHJlbmd0aCk7CisKKyAgICByZXR1cm4gbVByb3ZpZGVyTWFuYWdlci0+dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChjYW1lcmFJZC5zdHJpbmcoKSwgdG9yY2hTdHJlbmd0aCk7Cit9CisKK3N0YXR1c190IFByb3ZpZGVyRmxhc2hDb250cm9sOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKSB7CisgICAgQUxPR1YoIiVzOiBnZXQgdG9yY2ggc3RyZW5ndGggbGV2ZWwgb2YgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIG1Qcm92aWRlck1hbmFnZXItPmdldFRvcmNoU3RyZW5ndGhMZXZlbChjYW1lcmFJZC5zdHJpbmcoKSwgdG9yY2hTdHJlbmd0aCk7Cit9CiAvLyBQcm92aWRlckZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBlbmRzCiAKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaAppbmRleCBiOTdmYTVmLi4xNzAzZGRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCkBAIC00NCw2ICs0NCwxNCBAQAogICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSBicmlnaHRuZXNzIGxldmVsIG9mIHRoZSB0b3JjaC4gSWYgdGhlIHRvcmNoIGlzIE9GRiBhbmQKKyAgICAgICAgLy8gdG9yY2hTdHJlbmd0aCA+PSAxLCB0aGVuIHRoZSB0b3JjaCB3aWxsIGFsc28gYmUgdHVybmVkIE9OLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9yY2hTdHJlbmd0aCkgPSAwOworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHRvcmNoIHN0cmVuZ3RoIGxldmVsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgPSAwOwogfTsKIAogLyoqCkBAIC02Nyw2ICs3NSwxMiBAQAogICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgogICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CiAKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSB0b3JjaCBzdHJlbmd0aCBsZXZlbCBvZiB0aGUgZmxhc2ggdW5pdCBpbiB0b3JjaCBtb2RlLgorICAgICAgICBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQzMl90IHRvcmNoU3RyZW5ndGgpOworCisgICAgICAgIC8vIEdldCB0aGUgdG9yY2ggc3RyZW5ndGggbGV2ZWwKKyAgICAgICAgc3RhdHVzX3QgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKTsKKwogICAgICAgICAvLyBOb3RpZnkgQ2FtZXJhRmxhc2hsaWdodCB0aGF0IGNhbWVyYSBzZXJ2aWNlIGlzIGdvaW5nIHRvIG9wZW4gYSBjYW1lcmEKICAgICAgICAgLy8gZGV2aWNlLiBDYW1lcmFGbGFzaGxpZ2h0IHdpbGwgZnJlZSB0aGUgcmVzb3VyY2VzIHRoYXQgbWF5IGNhdXNlIHRoZQogICAgICAgICAvLyBjYW1lcmEgb3BlbiB0byBmYWlsLiBDYW1lcmEgc2VydmljZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUKQEAgLTExNSw2ICsxMjksOCBAQAogICAgICAgICAvLyBGbGFzaENvbnRyb2xCYXNlCiAgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOwogICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHN0YXR1c190IHR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludDMyX3QgdG9yY2hTdHJlbmd0aCk7CisgICAgICAgIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCogdG9yY2hTdHJlbmd0aCk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGQwZDNhOWQuLjgwNDEwYWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cG9sbC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhQ2xpZW50Lmg+CkBAIC04NSwxMyArODYsMTEgQEAKIAogdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci11c2luZyBjYW1lcmEzOjpTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOwordXNpbmcgbmFtZXNwYWNlIGNhbWVyYTM7CiB1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50OwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Ci11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czsKLXVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzOwogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFJbmplY3Rpb25DYWxsYmFjazsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbjsKQEAgLTEzMywxMCArMTMyLDEyIEBACiBzdGF0aWMgY29uc3QgU3RyaW5nMTYKICAgICAgICAgc0NhbWVyYUluamVjdEV4dGVybmFsQ2FtZXJhUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9JTkpFQ1RfRVhURVJOQUxfQ0FNRVJBIik7CiBjb25zdCBjaGFyICpzRmlsZU5hbWUgPSAibGFzdE9wZW5TZXNzaW9uRHVtcEZpbGUiOwotc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWZW5kb3JDbGllbnRTY29yZSA9IHJlc291cmNlX3BvbGljeTo6UEVSQ0VQVElCTEVfQVBQX0FESjsKLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmVuZG9yQ2xpZW50U3RhdGUgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVF9VSTsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrU3lzdGVtTmF0aXZlQ2xpZW50U2NvcmUgPSByZXNvdXJjZV9wb2xpY3k6OlBFUkNFUFRJQkxFX0FQUF9BREo7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1N5c3RlbU5hdGl2ZUNsaWVudFN0YXRlID0KKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUk7CiAKIGNvbnN0IFN0cmluZzggQ2FtZXJhU2VydmljZTo6a09mZmxpbmVEZXZpY2UoIm9mZmxpbmUtIik7Citjb25zdCBTdHJpbmcxNiBDYW1lcmFTZXJ2aWNlOjprV2F0Y2hBbGxDbGllbnRzRmxhZygiYWxsIik7CiAKIC8vIFNldCB0byBrZWVwIHRyYWNrIG9mIGxvZ2dlZCBzZXJ2aWNlIGVycm9yIGV2ZW50cy4KIHN0YXRpYyBzdGQ6OnNldDxTdHJpbmc4PiBzU2VydmljZUVycm9yRXZlbnRTZXQ7CkBAIC0xNTUsNiArMTU2LDEyIEBACiAgICAgfQogfQogCisvLyBUaGUgd29yZCAnU3lzdGVtJyBoZXJlIGRvZXMgbm90IHJlZmVyIHRvIGNsaWVudHMgb25seSBvbiB0aGUgc3lzdGVtCisvLyBwYXJ0aXRpb24uIFRoZXkganVzdCBuZWVkIHRvIGhhdmUgYSBhbmRyb2lkIHN5c3RlbSB1aWQuCitzdGF0aWMgYm9vbCBkb2VzQ2xpZW50SGF2ZVN5c3RlbVVpZCgpIHsKKyAgICByZXR1cm4gKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkgPCBBSURfQVBQX1NUQVJUKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKIHsKIApAQCAtMzYxLDE4ICszNjgsMjAgQEAKIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjphZGRTdGF0ZXMoY29uc3QgU3RyaW5nOCBpZCkgewogICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkKGlkLmNfc3RyKCkpOwotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IGNvc3Q7CisgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IGNvc3Q7CiAgICAgc3RhdHVzX3QgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UmVzb3VyY2VDb3N0KGNhbWVyYUlkLCAmY29zdCk7Ci0gICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kID0gU3lzdGVtQ2FtZXJhS2luZDo6UFVCTElDOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIFN5c3RlbUNhbWVyYUtpbmQgZGV2aWNlS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRTeXN0ZW1DYW1lcmFLaW5kKGNhbWVyYUlkLCAmZGV2aWNlS2luZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGRldmljZSBraW5kOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShjYW1lcmFJZCwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKICAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbmZsaWN0aW5nLmVtcGxhY2UoU3RyaW5nOChjb3N0LmNvbmZsaWN0aW5nRGV2aWNlc1tpXS5jX3N0cigpKSk7CkBAIC0zODEsNyArMzkwLDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKICAgICAgICAgbUNhbWVyYVN0YXRlcy5lbXBsYWNlKGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZCwgY29zdC5yZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcsIGRldmljZUtpbmQpKTsKKyAgICAgICAgICAgICAgICBjb25mbGljdGluZywgZGV2aWNlS2luZCwgcGh5c2ljYWxDYW1lcmFJZHMpKTsKICAgICB9CiAKICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKQEAgLTU2MCw2ICs1NjksMjIgQEAKICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzLCBzeXN0ZW1DYW1lcmFLaW5kKTsKIH0KIAorCit2b2lkIENhbWVyYVNlcnZpY2U6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLCBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOworICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYUlkLCBuZXdTdGF0dXMsIHN5c3RlbUNhbWVyYUtpbmQpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmJyb2FkY2FzdFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50MzJfdCBuZXdTdHJlbmd0aExldmVsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CisgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICBpLT5nZXRMaXN0ZW5lcigpLT5vblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoU3RyaW5nMTZ7Y2FtZXJhSWR9LAorICAgICAgICAgICAgICAgIG5ld1N0cmVuZ3RoTGV2ZWwpOworICAgIH0KK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSB7CiAgICAgQUxPR0koIiVzOiBUb3JjaCBzdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsCkBAIC02MTMsOCArNjM4LDEwIEBACiAgICAgYnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNhbWVyYUlkLCBuZXdTdGF0dXMsIHN5c3RlbUNhbWVyYUtpbmQpOwogfQogCi1zdGF0aWMgYm9vbCBoYXNQZXJtaXNzaW9uc0ZvclN5c3RlbUNhbWVyYShpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpIHsKLSAgICByZXR1cm4gY2hlY2tQZXJtaXNzaW9uKHNTeXN0ZW1DYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSAmJgorc3RhdGljIGJvb2wgaGFzUGVybWlzc2lvbnNGb3JTeXN0ZW1DYW1lcmEoaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkLAorICAgICAgICBib29sIGxvZ1Blcm1pc3Npb25GYWlsdXJlID0gZmFsc2UpIHsKKyAgICByZXR1cm4gY2hlY2tQZXJtaXNzaW9uKHNTeXN0ZW1DYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgbG9nUGVybWlzc2lvbkZhaWx1cmUpICYmCiAgICAgICAgICAgICBjaGVja1Blcm1pc3Npb24oc0NhbWVyYVBlcm1pc3Npb24sIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOwogfQogCkBAIC02OTMsOCArNzIwLDggQEAKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKmRldmljZUlkcyA9ICZtTm9ybWFsRGV2aWNlSWRzV2l0aG91dFN5c3RlbUNhbWVyYTsKICAgICBhdXRvIGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGF1dG8gY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKGNoZWNrUGVybWlzc2lvbihzU3lzdGVtQ2FtZXJhUGVybWlzc2lvbiwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkgfHwKLSAgICAgICAgICAgIGdldHBpZCgpID09IGNhbGxpbmdQaWQpIHsKKyAgICBpZiAoY2hlY2tQZXJtaXNzaW9uKHNTeXN0ZW1DYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgLypsb2dQZXJtaXNzaW9uRmFpbHVyZSovZmFsc2UpIHx8IGdldHBpZCgpID09IGNhbGxpbmdQaWQpIHsKICAgICAgICAgZGV2aWNlSWRzID0gJm1Ob3JtYWxEZXZpY2VJZHM7CiAgICAgfQogICAgIGlmIChjYW1lcmFJZEludCA8IDAgfHwgY2FtZXJhSWRJbnQgPj0gc3RhdGljX2Nhc3Q8aW50PihkZXZpY2VJZHMtPnNpemUoKSkpIHsKQEAgLTc5Myw2ICs4MjAsMzEgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBIQUwgY291bGRuJ3QgYmUgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgSEFMIGNvdWxkbid0IGJlIGluaXRpYWxpemVkLiIpOworICAgIH0KKworICAgIGlmKHRvcmNoU3RyZW5ndGggPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVuZ3RoIGxldmVsIG11c3Qgbm90IGJlIG51bGwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3RyZW5ndGggbGV2ZWwgc2hvdWxkIG5vdCBiZSBudWxsLiIpOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFRvcmNoU3RyZW5ndGhMZXZlbChTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgdG9yY2hTdHJlbmd0aCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIlVuYWJsZSB0byByZXRyaWV2ZSB0b3JjaCAiCisgICAgICAgICAgICAic3RyZW5ndGggbGV2ZWwgZm9yIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAorICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIEFMT0dJKCIlczogVG9yY2ggc3RyZW5ndGggbGV2ZWwgaXM6ICVkIiwgX19GVU5DVElPTl9fLCAqdG9yY2hTdHJlbmd0aCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpIHsKICAgICB0aW1lX3Qgbm93ID0gdGltZShudWxscHRyKTsKICAgICBjaGFyIGZvcm1hdHRlZFRpbWVbNjRdOwpAQCAtODM1LDI5ICs4ODcsMzcgQEAKICAgICBCYXNpY0NsaWVudDo6QmFzaWNDbGllbnQ6OnNDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKIH0KIAotaW50IENhbWVyYVNlcnZpY2U6OmdldERldmljZVZlcnNpb24oY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCogZmFjaW5nLCBpbnQqIG9yaWVudGF0aW9uKSB7CitzdGQ6OnBhaXI8aW50LCBJUENUcmFuc3BvcnQ+IENhbWVyYVNlcnZpY2U6OmdldERldmljZVZlcnNpb24oY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCogZmFjaW5nLAorICAgICAgICBpbnQqIG9yaWVudGF0aW9uKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGludCBkZXZpY2VWZXJzaW9uID0gMDsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKKyAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gSVBDVHJhbnNwb3J0OjpJTlZBTElEOwogICAgIHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNhbWVyYUlkLnN0cmluZygpLAotICAgICAgICAgICAgJm1heFZlcnNpb24pOwotICAgIGlmIChyZXMgIT0gT0spIHJldHVybiAtMTsKKyAgICAgICAgICAgICZtYXhWZXJzaW9uLCAmdHJhbnNwb3J0KTsKKyAgICBpZiAocmVzICE9IE9LIHx8IHRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OklOVkFMSUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGhpZ2hlc3Qgc3VwcG9ydGVkIHZlcnNpb24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigtMSwgSVBDVHJhbnNwb3J0OjpJTlZBTElEKSA7CisgICAgfQogICAgIGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04obWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7CiAKICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBpbmZvOwogICAgIGlmIChmYWNpbmcpIHsKICAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFJZC5zdHJpbmcoKSwgJmluZm8pOwotICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigtMSwgSVBDVHJhbnNwb3J0OjpJTlZBTElEKTsKKyAgICAgICAgfQogICAgICAgICAqZmFjaW5nID0gaW5mby5mYWNpbmc7CiAgICAgICAgIGlmIChvcmllbnRhdGlvbikgewogICAgICAgICAgICAgKm9yaWVudGF0aW9uID0gaW5mby5vcmllbnRhdGlvbjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBkZXZpY2VWZXJzaW9uOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihkZXZpY2VWZXJzaW9uLCB0cmFuc3BvcnQpOwogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKQEAgLTg3OCw0OCArOTM4LDUwIEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwKKyAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgZmVhdHVyZUlkLCAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBzZW5zb3JPcmllbnRhdGlvbiwgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAotICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKLQotICAgIC8vIENyZWF0ZSBDYW1lcmFDbGllbnQgYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ERVBSRUNBVEVEX0hBTCwKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2UgXCIlc1wiIEhBTCB2ZXJzaW9uICVkIG5vIGxvbmdlciBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNzoKLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQotICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCi0gICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKLSAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYURldmljZUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBmZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFNob3VsZCBub3QgYmUgcmVhY2hhYmxlCi0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiBoYXMgdW5rbm93biBIQUwgdmVyc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgaW50IHNlcnZpY2VQaWQsIHN0ZDo6cGFpcjxpbnQsIElQQ1RyYW5zcG9ydD4gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCkgeworICAgIC8vIEZvciBISURMIGRldmljZXMKKyAgICBpZiAoZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5zZWNvbmQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSB7CisgICAgICAgIC8vIENyZWF0ZSBDYW1lcmFDbGllbnQgYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0LmZpcnN0OworICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ERVBSRUNBVEVEX0hBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiBIQUwgdmVyc2lvbiAlZCBubyBsb25nZXIgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgaGFzIHVua25vd24gSEFMIHZlcnNpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQorICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOworICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgZmVhdHVyZUlkLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwgY2xpZW50VWlkLAorICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKKyAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1OYXRpdmVDbGllbnQsIGZlYXR1cmVJZCwgY2FtZXJhSWQsIGZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKICAgICB9CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KQEAgLTEwMDcsNyArMTA2OSw3IEBACiAgICAgc3A8Q2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgIGlmICghKHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKKyAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIC8qc3lzdGVtTmF0aXZlQ2xpZW50Ki8gZmFsc2UsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKICAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvb21TY29yZU9mZnNldCovIDAsCiAgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qLyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CkBAIC0xMjQyLDkgKzEzMDQsOSBAQAogCiAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCk7CiAKLSAgICAvLyBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQgZGV2aWNlIHVzZXIsIHVubGVzcyBjYWxsaW5nCi0gICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MgT1IgdGhlIGNhbGxlciBpcyB1c2luZyB0aGUgY2FtZXJhc2VydmVyJ3MgSElETCBpbnRlcmZhY2UuCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpICE9IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUiAmJiBjYWxsaW5nUGlkICE9IGdldHBpZCgpICYmCisgICAgLy8gRm9yIG5vbi1zeXN0ZW0gY2xpZW50cyA6IE9ubHkgYWxsb3cgY2xpZW50cyB3aG8gYXJlIGJlaW5nIHVzZWQgYnkgdGhlIGN1cnJlbnQgZm9yZWdyb3VuZAorICAgIC8vIGRldmljZSB1c2VyLCB1bmxlc3MgY2FsbGluZyBmcm9tIG91ciBvd24gcHJvY2Vzcy4KKyAgICBpZiAoIWRvZXNDbGllbnRIYXZlU3lzdGVtVWlkKCkgJiYgY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSAmJgogICAgICAgICAgICAgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbm5vdCBjb25uZWN0IGZyb20gIgogICAgICAgICAgICAgICAgICJkZXZpY2UgdXNlciAlZCwgY3VycmVudGx5IGFsbG93ZWQgZGV2aWNlIHVzZXJzOiAlcykiLCBjYWxsaW5nUGlkLCBjbGllbnRVc2VySWQsCkBAIC0xMjgxLDEyICsxMzQzLDEyIEBACiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6ZmluaXNoQ29ubmVjdExvY2tlZChjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgZGVzYywgaW50IG9vbVNjb3JlT2Zmc2V0KSB7CisgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIGRlc2MsIGludCBvb21TY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQpIHsKIAogICAgIC8vIE1ha2UgYSBkZXNjcmlwdG9yIGZvciB0aGUgaW5jb21pbmcgY2xpZW50CiAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0KICAgICAgICAgICAgIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKGNsaWVudCwgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBvb21TY29yZU9mZnNldCwgc3lzdGVtTmF0aXZlQ2xpZW50KTsKICAgICBhdXRvIGV2aWN0ZWQgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5hZGRBbmRFdmljdChjbGllbnREZXNjcmlwdG9yKTsKIAogICAgIGxvZ0Nvbm5lY3RlZChkZXNjLT5nZXRLZXkoKSwgc3RhdGljX2Nhc3Q8aW50PihkZXNjLT5nZXRPd25lcklkKCkpLApAQCAtMTMxNiw3ICsxMzc4LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLCBjb25zdCBTdHJpbmc4JiBwYWNrYWdlTmFtZSwKLSAgICAgICAgaW50IG9vbVNjb3JlT2Zmc2V0LAorICAgICAgICBpbnQgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKSB7CkBAIC0xMzM0LDcgKzEzOTYsNyBAQAogICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50U3AgPSBjdXJyZW50LT5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSAhPSBudWxscHRyKSB7IC8vIHNob3VsZCBuZXZlciBiZSBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGllbnRTcC0+Y2FuQ2FzdFRvQXBpQ2xpZW50KGVmZmVjdGl2ZUFwaUxldmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2UgY29ubmVjdCBjYWxsZWQgZnJvbSBzYW1lIGNsaWVudCwgYnV0IHdpdGggYSBkaWZmZXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBjb25uZWN0IGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFQSSBsZXZlbCwgZXZpY3RpbmcgcHJpb3IgY2xpZW50Li4uIik7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50U3AtPmdldFJlbW90ZSgpID09IHJlbW90ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIChzZWNvbmQgY2FsbCBmcm9tIHNhbWUiCkBAIC0xMzkxLDcgKzE0NTMsNyBAQAogICAgICAgICBjbGllbnREZXNjcmlwdG9yID0gQ2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+e251bGxwdHJ9LCBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0ZS0+Z2V0Q29zdCgpKSwKICAgICAgICAgICAgICAgICBzdGF0ZS0+Z2V0Q29uZmxpY3RpbmcoKSwgYWN0dWFsU2NvcmUsIGNsaWVudFBpZCwgYWN0dWFsU3RhdGUsCi0gICAgICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0LCBzeXN0ZW1OYXRpdmVDbGllbnQpOwogCiAgICAgICAgIHJlc291cmNlX3BvbGljeTo6Q2xpZW50UHJpb3JpdHkgY2xpZW50UHJpb3JpdHkgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRQcmlvcml0eSgpOwogCkBAIC0xNTM0LDcgKzE1OTYsNyBAQAogICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCB7fSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsLypzeXN0ZW1OYXRpdmVDbGllbnQqLyBmYWxzZSwge30sIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKICAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvb21TY29yZU9mZnNldCovIDAsIHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKQEAgLTE1NjYsMTQgKzE2MjgsMTQgQEAKICAgICAvLyAxKSBJZiBjYW1lcmFzZXJ2ZXIgdHJpZXMgdG8gYWNjZXNzIHRoaXMgY2FtZXJhIGRldmljZSwgYWNjZXB0IHRoZQogICAgIC8vICAgIGNvbm5lY3Rpb24uCiAgICAgLy8gMikgVGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBwdWJsaWNseSBoaWRkZW4gc2VjdXJlIGNhbWVyYSBkZXZpY2UgQU5EIHNvbWUKLSAgICAvLyAgICBjb21wb25lbnQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBpdCBvbiBhIG5vbi1od2JpbmRlciB0aHJlYWQgKGdlbmVyYWxseSBhIG5vbiBIQUwgY2xpZW50KSwKLSAgICAvLyAgICByZWplY3QgaXQuCisgICAgLy8gICAgbm9uIHN5c3RlbSBjb21wb25lbnQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBpdC4KICAgICAvLyAzKSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBhZHZlcnRpc2VkIGJ5IHRoZSBjYW1lcmEgSEFMIGFzIFNZU1RFTV9PTkxZCiAgICAgLy8gICAgYW5kIHRoZSBzZXJ2aW5nIHRocmVhZCBpcyBhIG5vbiBod2JpbmRlciB0aHJlYWQsIHRoZSBjbGllbnQgbXVzdCBoYXZlCiAgICAgLy8gICAgYW5kcm9pZC5wZXJtaXNzaW9uLlNZU1RFTV9DQU1FUkEgcGVybWlzc2lvbnMgdG8gY29ubmVjdC4KIAogICAgIGludCBjUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpbnQgY1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgYm9vbCBzeXN0ZW1DbGllbnQgPSBkb2VzQ2xpZW50SGF2ZVN5c3RlbVVpZCgpOwogICAgIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBpZiAoZ2V0U3lzdGVtQ2FtZXJhS2luZChjYW1lcmFJZCwgJnN5c3RlbUNhbWVyYUtpbmQpICE9IE9LKSB7CiAgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBrbm93biBjYW1lcmEgSUQsIHNvIGl0J3Mgbm90IGEgc3lzdGVtIGNhbWVyYQpAQCAtMTU4Niw4ICsxNjQ4LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyAoMikKLSAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgIT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSICYmCi0gICAgICAgICAgICBzeXN0ZW1DYW1lcmFLaW5kID09IFN5c3RlbUNhbWVyYUtpbmQ6OkhJRERFTl9TRUNVUkVfQ0FNRVJBKSB7CisgICAgaWYgKCFzeXN0ZW1DbGllbnQgJiYgc3lzdGVtQ2FtZXJhS2luZCA9PSBTeXN0ZW1DYW1lcmFLaW5kOjpISURERU5fU0VDVVJFX0NBTUVSQSkgewogICAgICAgICBBTE9HVygiUmVqZWN0aW5nIGFjY2VzcyB0byBzZWN1cmUgaGlkZGVuIGNhbWVyYSAlcyIsIGNhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xNTk1LDkgKzE2NTYsOCBAQAogICAgIC8vICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoKSBhbGxvd3MgZm9yIGNhbGxzIHRvIHN1Y2NlZWQgKGFsYmVpdCBhZnRlciBoaWRpbmcgc29tZQogICAgIC8vICAgICBjaGFyYWN0ZXJpc3RpY3MpIGV2ZW4gaWYgY2xpZW50cyBkb24ndCBoYXZlIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEuIFdlIGRvIG5vdCB3YW50IHRoZQogICAgIC8vICAgICBzYW1lIGJlaGF2aW9yIGZvciBzeXN0ZW0gY2FtZXJhIGRldmljZXMuCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpICE9IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUiAmJgotICAgICAgICAgICAgc3lzdGVtQ2FtZXJhS2luZCA9PSBTeXN0ZW1DYW1lcmFLaW5kOjpTWVNURU1fT05MWV9DQU1FUkEgJiYKLSAgICAgICAgICAgICFoYXNQZXJtaXNzaW9uc0ZvclN5c3RlbUNhbWVyYShjUGlkLCBjVWlkKSkgeworICAgIGlmICghc3lzdGVtQ2xpZW50ICYmIHN5c3RlbUNhbWVyYUtpbmQgPT0gU3lzdGVtQ2FtZXJhS2luZDo6U1lTVEVNX09OTFlfQ0FNRVJBICYmCisgICAgICAgICAgICAhaGFzUGVybWlzc2lvbnNGb3JTeXN0ZW1DYW1lcmEoY1BpZCwgY1VpZCwgLypsb2dQZXJtaXNzaW9uRmFpbHVyZSovdHJ1ZSkpIHsKICAgICAgICAgQUxPR1coIlJlamVjdGluZyBhY2Nlc3MgdG8gc3lzdGVtIG9ubHkgY2FtZXJhICVzLCBpbmFkZXF1ZXRlIHBlcm1pc3Npb25zIiwKICAgICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNjIxLDExICsxNjgxLDEyIEBACiAgICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIFN0cmluZzE2IGNsaWVudFBhY2thZ2VOYW1lQWRqID0gY2xpZW50UGFja2FnZU5hbWU7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpID09IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUikgewotICAgICAgICBzdGQ6OnN0cmluZyB2ZW5kb3JDbGllbnQgPQotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigidmVuZG9yLmNsaWVudC5waWQ8JWQ+IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgIGNsaWVudFBhY2thZ2VOYW1lQWRqID0gU3RyaW5nMTYodmVuZG9yQ2xpZW50LmNfc3RyKCkpOworICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50ID0gZmFsc2U7CisgICAgaWYgKGRvZXNDbGllbnRIYXZlU3lzdGVtVWlkKCkgJiYgKGNsaWVudFBhY2thZ2VOYW1lQWRqLnNpemUoKSA9PSAwKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzeXN0ZW1DbGllbnQgPQorICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiY2xpZW50LnBpZDwlZD4iLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgY2xpZW50UGFja2FnZU5hbWVBZGogPSBTdHJpbmcxNihzeXN0ZW1DbGllbnQuY19zdHIoKSk7CisgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKG9vbVNjb3JlT2Zmc2V0IDwgMCkgewpAQCAtMTYzNyw2ICsxNjk4LDEzIEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICB9CiAKKyAgICBpZiAoQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6aXNDYW1lcmFEaXNhYmxlZCgpKSB7CisgICAgICAgIFN0cmluZzggbXNnID0KKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSBkaXNhYmxlZCBieSBkZXZpY2UgcG9saWN5Iik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfRElTQUJMRUQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCiAgICAgLy8gZW5mb3JjZSBzeXN0ZW0gY2FtZXJhIHBlcm1pc3Npb25zCiAgICAgaWYgKG9vbVNjb3JlT2Zmc2V0ID4gMCAmJgogICAgICAgICAgICAgIWhhc1Blcm1pc3Npb25zRm9yU3lzdGVtQ2FtZXJhKGNhbGxpbmdQaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkpKSB7CkBAIC0xNjQ5LDcgKzE3MTcsNyBAQAogICAgIH0KIAogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCi0gICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsIGNsaWVudFBhY2thZ2VOYW1lQWRqLCBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsIGNsaWVudFBhY2thZ2VOYW1lQWRqLCBzeXN0ZW1OYXRpdmVDbGllbnQsY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIG9vbVNjb3JlT2Zmc2V0LAogICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgLypvdXQqL2NsaWVudCk7CiAKQEAgLTE2ODAsNyArMTc0OCw3IEBACiAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwgaW50IG9vbVNjb3JlT2Zmc2V0LCBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewpAQCAtMTY5OSw3ICsxNzY3LDcgQEAKICAgICBzcDxDTElFTlQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgaW50IGZhY2luZyA9IC0xOwogICAgIGludCBvcmllbnRhdGlvbiA9IDA7Ci0gICAgYm9vbCBpc05kayA9IChjbGllbnRQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCk7CisgICAgYm9vbCBpc05vblN5c3RlbU5kayA9IChjbGllbnRQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCk7CiAgICAgewogICAgICAgICAvLyBBY3F1aXJlIG1TZXJ2aWNlTG9jayBhbmQgcHJldmVudCBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IGxvY2sgPQpAQCAtMTczMyw4ICsxODAxLDggQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcCA9IG51bGxwdHI7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4gcGFydGlhbDsKICAgICAgICAgaWYgKChlcnIgPSBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY2FtZXJhSWQsIG9yaWdpbmFsQ2xpZW50UGlkLCBlZmZlY3RpdmVBcGlMZXZlbCwKLSAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksIGNsaWVudE5hbWU4LCBvb21TY29yZU9mZnNldCwgLypvdXQqLyZjbGllbnRUbXAsCi0gICAgICAgICAgICAgICAgLypvdXQqLyZwYXJ0aWFsKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksIGNsaWVudE5hbWU4LCBvb21TY29yZU9mZnNldCwgc3lzdGVtTmF0aXZlQ2xpZW50LAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mY2xpZW50VG1wLCAvKm91dCovJnBhcnRpYWwpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICBjYXNlIC1FTk9ERVY6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0NPTk5FQ1RFRCwKQEAgLTE3NjQsNyArMTgzMiw4IEBACiAgICAgICAgIC8vIGdpdmUgZmxhc2hsaWdodCBhIGNoYW5jZSB0byBjbG9zZSBkZXZpY2VzIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgbUZsYXNobGlnaHQtPnByZXBhcmVEZXZpY2VPcGVuKGNhbWVyYUlkKTsKIAotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsIC8qb3V0Ki8mZmFjaW5nLCAvKm91dCovJm9yaWVudGF0aW9uKTsKKyAgICAgICAgYXV0byBkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0ID0KKyAgICAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAvKm91dCovJmZhY2luZywgLypvdXQqLyZvcmllbnRhdGlvbik7CiAgICAgICAgIGlmIChmYWNpbmcgPT0gLTEpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgZGV2aWNlIFwiJXNcIiAgZmFjaW5nIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTE3NzQsMTAgKzE4NDMsMTAgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAogICAgICAgICAgICAgICAgIG1QZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjYW1lcmFJZC5zdHJpbmcoKSwgdGFyZ2V0U2RrVmVyc2lvbik7Ci0gICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIG9yaWVudGF0aW9uLAorICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLCBzeXN0ZW1OYXRpdmVDbGllbnQsCisgICAgICAgICAgICAgICAgY2xpZW50RmVhdHVyZUlkLCBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIG9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCwgZWZmZWN0aXZlQXBpTGV2ZWwsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CkBAIC0xNzg2LDcgKzE4NTUsOCBAQAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLCAiJXM6IENhbWVyYVNlcnZpY2UgaW4gaW52YWxpZCBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBlcnIgPSBjbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbU1vbml0b3JUYWdzKTsKKyAgICAgICAgU3RyaW5nOCBtb25pdG9yVGFncyA9IGlzQ2xpZW50V2F0Y2hlZChjbGllbnQuZ2V0KCkpID8gbU1vbml0b3JUYWdzIDogU3RyaW5nOCgiIik7CisgICAgICAgIGVyciA9IGNsaWVudC0+aW5pdGlhbGl6ZShtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLCBtb25pdG9yVGFncyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGluaXRpYWxpemUgY2xpZW50IGZyb20gSEFMLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAvLyBFcnJvcnMgY291bGQgYmUgZnJvbSB0aGUgSEFMIG1vZHVsZSBvcGVuIGNhbGwgb3IgZnJvbSBBcHBPcHNNYW5hZ2VyCkBAIC0xODM0LDE0ICsxOTA0LDE1IEBACiAgICAgICAgIC8vIFNldCByb3RhdGUtYW5kLWNyb3Agb3ZlcnJpZGUgYmVoYXZpb3IKICAgICAgICAgaWYgKG1PdmVycmlkZVJvdGF0ZUFuZENyb3BNb2RlICE9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9BVVRPKSB7CiAgICAgICAgICAgICBjbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZShtT3ZlcnJpZGVSb3RhdGVBbmRDcm9wTW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6aXNSb3RhdGVBbmRDcm9wT3ZlcnJpZGVOZWVkZWQoY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBmYWNpbmcpKSB7Ci0gICAgICAgICAgICBjbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZShBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfOTApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNsaWVudC0+c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAorICAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpnZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoCisgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgZmFjaW5nLCBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoY2xpZW50VWlkKSkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gU2V0IGNhbWVyYSBtdXRpbmcgYmVoYXZpb3IKICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkID0KLSAgICAgICAgICAgICAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZChtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoY2xpZW50VWlkKSk7CisgICAgICAgICAgICAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKTsKICAgICAgICAgaWYgKGNsaWVudC0+c3VwcG9ydHNDYW1lcmFNdXRlKCkpIHsKICAgICAgICAgICAgIGNsaWVudC0+c2V0Q2FtZXJhTXV0ZSgKICAgICAgICAgICAgICAgICAgICAgbU92ZXJyaWRlQ2FtZXJhTXV0ZU1vZGUgfHwgaXNDYW1lcmFQcml2YWN5RW5hYmxlZCk7CkBAIC0xODc0LDcgKzE5NDUsNyBAQAogICAgICAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYWRkIGNsaWVudCB0byBhY3RpdmUgY2xpZW50cyBsaXN0Ci0gICAgICAgICAgICBmaW5pc2hDb25uZWN0TG9ja2VkKGNsaWVudCwgcGFydGlhbCwgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwsIG9vbVNjb3JlT2Zmc2V0LCBzeXN0ZW1OYXRpdmVDbGllbnQpOwogICAgICAgICB9CiAKICAgICAgICAgY2xpZW50LT5zZXRJbWFnZUR1bXBNYXNrKG1JbWFnZUR1bXBNYXNrKTsKQEAgLTE4ODYsNyArMTk1NywzNCBAQAogCiAgICAgaW50MzJfdCBvcGVuTGF0ZW5jeU1zID0gbnMybXMoc3lzdGVtVGltZSgpIC0gb3BlblRpbWVOcyk7CiAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nT3BlbihjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGVmZmVjdGl2ZUFwaUxldmVsLCBpc05kaywgb3BlbkxhdGVuY3lNcyk7CisgICAgICAgICAgICBlZmZlY3RpdmVBcGlMZXZlbCwgaXNOb25TeXN0ZW1OZGssIG9wZW5MYXRlbmN5TXMpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uUGFyYW1ldGVyc0xvY2spOworICAgICAgICBpZiAoY2FtZXJhSWQgPT0gbUluamVjdGlvbkludGVybmFsQ2FtSWQgJiYgbUluamVjdGlvbkluaXRQZW5kaW5nKSB7CisgICAgICAgICAgICBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgICAgICAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KG1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICAgICAgICAgIGlmIChjbGllbnREZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIHJlcyA9IGNoZWNrSWZJbmplY3Rpb25DYW1lcmFJc1ByZXNlbnQobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIGNsaWVudFNwKTsKKyAgICAgICAgICAgICAgICBpZihyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgXCIlc1wiIGN1cnJlbnRseSBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzID0gY2xpZW50U3AtPmluamVjdENhbWVyYShtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgbUNhbWVyYVByb3ZpZGVyTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnRlcm5hbCBjYW1lcmEgSUQgPSAlcyAncyBjbGllbnQgZG9lcyBub3QgZXhpc3QhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUluamVjdGlvbkludGVybmFsQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5ub3RpZnlJbmplY3Rpb25FcnJvcihtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xOTIyLDcgKzIwMjAsOCBAQAogICAgICAgICAgICAgICAgIGtPZmZsaW5lRGV2aWNlICsgb25saW5lQ2xpZW50RGVzYy0+Z2V0S2V5KCksIG9mZmxpbmVDbGllbnQsIC8qY29zdCovIDAsCiAgICAgICAgICAgICAgICAgLypjb25mbGljdGluZ0tleXMqLyBzdGQ6OnNldDxTdHJpbmc4PigpLCBvbmxpbmVQcmlvcml0eS5nZXRTY29yZSgpLAogICAgICAgICAgICAgICAgIG9ubGluZUNsaWVudERlc2MtPmdldE93bmVySWQoKSwgb25saW5lUHJpb3JpdHkuZ2V0U3RhdGUoKSwKLSAgICAgICAgICAgICAgICAvKm9tbVNjb3JlT2Zmc2V0Ki8gMCk7CisgICAgICAgICAgICAgICAgLy8gbmF0aXZlIGNsaWVudHMgZG9uJ3QgaGF2ZSBvZmZsaW5lIHByb2Nlc3Npbmcgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICAvKm9tbVNjb3JlT2Zmc2V0Ki8gMCwgLypzeXN0ZW1OYXRpdmVDbGllbnQqL2ZhbHNlKTsKIAogICAgICAgICAvLyBBbGxvdyBvbmx5IG9uZSBvZmZsaW5lIGRldmljZSBwZXIgY2FtZXJhCiAgICAgICAgIGF1dG8gaW5jb21wYXRpYmxlQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEluY29tcGF0aWJsZUNsaWVudHMob2ZmbGluZUNsaWVudERlc2MpOwpAQCAtMTkzMSw3ICsyMDMwLDggQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBhdXRvIGVyciA9IG9mZmxpbmVDbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbU1vbml0b3JUYWdzKTsKKyAgICAgICAgU3RyaW5nOCBtb25pdG9yVGFncyA9IGlzQ2xpZW50V2F0Y2hlZChvZmZsaW5lQ2xpZW50LmdldCgpKSA/IG1Nb25pdG9yVGFncyA6IFN0cmluZzgoIiIpOworICAgICAgICBhdXRvIGVyciA9IG9mZmxpbmVDbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbW9uaXRvclRhZ3MpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIG9mZmxpbmUgY2xpZW50LiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTk2Myw2ICsyMDYzLDEzNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IHRvcmNoU3RyZW5ndGgsCisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworCisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoY2xpZW50QmluZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBjbGllbnQgYmluZGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgIlRvcmNoIGNsaWVudCBiaW5kZXIgaW4gbnVsbC4iKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisKKyAgICBpZiAoc2hvdWxkUmVqZWN0U3lzdGVtQ2FtZXJhQ29ubmVjdGlvbihpZCkpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlVuYWJsZSB0byBjaGFuZ2UgdGhlIHN0cmVuZ3RoIGxldmVsIgorICAgICAgICAgICAgICAgICJmb3Igc3lzdGVtIG9ubHkgZGV2aWNlICVzOiAiLCBpZC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gdmVyaWZ5IGlkIGlzIHZhbGlkCisgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKKyAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBpZCBpcyBpbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAiQ2FtZXJhIElEIFwiJXNcIiBpcyBhIG5vdCB2YWxpZCBjYW1lcmEgSUQiLCBpZC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgU3RhdHVzSW50ZXJuYWwgY2FtZXJhU3RhdHVzID0gc3RhdGUtPmdldFN0YXR1cygpOworICAgIGlmIChjYW1lcmFTdGF0dXMgIT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1cyAhPSBTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBpZCBpcyBpbnZhbGlkICVzLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLAorICAgICAgICAgICAgKGludCljYW1lcmFTdGF0dXMpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJDYW1lcmEgSUQgXCIlc1wiIGlzIGEgbm90IHZhbGlkIGNhbWVyYSBJRCIsIGlkLnN0cmluZygpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CisgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBzdGF0dXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IGdldFRvcmNoU3RhdHVzTG9ja2VkKGlkLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgXCIlc1wiIGRvZXMgbm90IGhhdmUgYSBmbGFzaCB1bml0IiwgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGN1cnJlbnQgdG9yY2ggc3RhdHVzIGZhaWxlZCBmb3IgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNoYW5naW5nIHRvcmNoIHN0cmVuZ3RoIGxldmVsIGZvciBjYW1lcmEgXCIlc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRvcmNoIG1vZGUgb2YgY2FtZXJhICVzIGlzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FtZXJhIGlzIGluIHVzZS4iLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9DQU1FUkFfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRvcmNoIGZvciBjYW1lcmEgXCIlc1wiIGlzIG5vdCBhdmFpbGFibGUgZHVlIHRvIGFuIGV4aXN0aW5nIGNhbWVyYSB1c2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfTUFYX0NBTUVSQVNfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRvcmNoIGZvciBjYW1lcmEgXCIlc1wiIGlzIG5vdCBhdmFpbGFibGUgZHVlIHRvIGluc3VmZmljaWVudCByZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOworICAgICAgICB1cGRhdGVUb3JjaFVpZE1hcExvY2tlZChjYW1lcmFJZCwgdWlkKTsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdG9yY2ggc3RyZW5ndGggbGV2ZWwgaXMgc2FtZSBhcyB0aGUgbmV3IG9uZS4KKyAgICBib29sIHNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPnNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlKAorICAgICAgICAgICAgaWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUZsYXNobGlnaHQtPnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoaWQsIHRvcmNoU3RyZW5ndGgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpbnQzMl90IGVycm9yQ29kZTsKKyAgICAgICAgU3RyaW5nOCBtc2c7CisgICAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgICAgICBjYXNlIC1FTk9TWVM6CisgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgXCIlc1wiIGhhcyBubyBmbGFzaGxpZ2h0LiIsCisgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgXCIlc1wiIGlzIGluIHVzZSIsCisgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtRUlOVkFMOgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVG9yY2ggc3RyZW5ndGggbGV2ZWwgJWQgaXMgbm90IHdpdGhpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIHJhbmdlLiIsIHRvcmNoU3RyZW5ndGgpOworICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9IEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2hhbmdpbmcgdG9yY2ggc3RyZW5ndGggbGV2ZWwgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9IEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBsaW5rIHRvIGNsaWVudCdzIGRlYXRoCisgICAgICAgIC8vIFN0b3JlIHRoZSBsYXN0IGNsaWVudCB0aGF0IHR1cm5zIG9uIGVhY2ggY2FtZXJhJ3MgdG9yY2ggbW9kZS4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaENsaWVudE1hcE11dGV4KTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Ub3JjaENsaWVudE1hcC5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAuYWRkKGlkLCBjbGllbnRCaW5kZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnZhbHVlQXQoaW5kZXgpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnJlcGxhY2VWYWx1ZUF0KGluZGV4LCBjbGllbnRCaW5kZXIpOworICAgICAgICB9CisgICAgICAgIGNsaWVudEJpbmRlci0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgfQorCisgICAgaW50IGNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgY2hhciAqaWRfY3N0ciA9IGlkLmNfc3RyKCk7CisgICAgQUxPR0koIiVzOiBUb3JjaCBzdHJlbmd0aCBmb3IgY2FtZXJhIGlkICVzIGNoYW5nZWQgdG8gJWQgZm9yIGNsaWVudCBQSUQgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZF9jc3RyLCB0b3JjaFN0cmVuZ3RoLCBjbGllbnRQaWQpOworICAgIGlmICghc2hvdWxkU2tpcFRvcmNoU3RyZW5ndGhVcGRhdGVzKSB7CisgICAgICAgIGJyb2FkY2FzdFRvcmNoU3RyZW5ndGhMZXZlbChpZCwgdG9yY2hTdHJlbmd0aCk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQsCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwpAQCAtMjAzNCwxMyArMjI2NCw3IEBACiAgICAgICAgIC8vIFVwZGF0ZSBVSUQgbWFwIC0gdGhpcyBpcyB1c2VkIGluIHRoZSB0b3JjaCBzdGF0dXMgY2hhbmdlZCBjYWxsYmFja3MsIHNvIG11c3QgYmUgZG9uZQogICAgICAgICAvLyBiZWZvcmUgc2V0VG9yY2hNb2RlCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hVaWRNYXBNdXRleCk7Ci0gICAgICAgIGlmIChtVG9yY2hVaWRNYXAuZmluZChpZCkgPT0gbVRvcmNoVWlkTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOwotICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5zZWNvbmQgPSB1aWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIHBlbmRpbmcgVUlECi0gICAgICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOwotICAgICAgICB9CisgICAgICAgIHVwZGF0ZVRvcmNoVWlkTWFwTG9ja2VkKGNhbWVyYUlkLCB1aWQpOwogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IG1GbGFzaGxpZ2h0LT5zZXRUb3JjaE1vZGUoaWQsIGVuYWJsZWQpOwpAQCAtMjA1NCw2ICsyMjc4LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgXCIlc1wiIGlzIGluIHVzZSIsCisgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIHRvcmNoIG1vZGUgb2YgY2FtZXJhIFwiJXNcIiB0byAlZCBmYWlsZWQ6ICVzICglZCkiLApAQCAtMjA5MCw2ICsyMzE5LDE3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVUb3JjaFVpZE1hcExvY2tlZChjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGludCB1aWQpIHsKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaWYgKG1Ub3JjaFVpZE1hcC5maW5kKGlkKSA9PSBtVG9yY2hVaWRNYXAuZW5kKCkpIHsKKyAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5zZWNvbmQgPSB1aWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2V0IHRoZSBwZW5kaW5nIFVJRAorICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOworICAgIH0KK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpIHsKICAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKQEAgLTIxMjAsNiArMjM2MCwxMyBAQAogICAgICAgICAgICAgZG9Vc2VyU3dpdGNoKC8qbmV3VXNlcklkcyovIGFyZ3MpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNCX0RFVklDRV9BVFRBQ0hFRDoKKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNCX0RFVklDRV9ERVRBQ0hFRDogeworICAgICAgICAgICAgLy8gTm90aWZ5IENhbWVyYVByb3ZpZGVyTWFuYWdlciBmb3IgbGF6eSBIQUxzCisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlVc2JEZXZpY2VFdmVudChldmVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhhcmdzWzBdKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIElDYW1lcmFTZXJ2aWNlOjpFVkVOVF9OT05FOgogICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIGludmFsaWQgc3lzdGVtIGV2ZW50IGZyb20gc3lzdGVtX3NlcnZlcjogJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0yMTYyLDI0ICsyNDA5LDcgQEAKIAogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU7Ci0gICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRle307Ci0gICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQpIHsKLSAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkJBQ0tfQ09WRVJFRDsKLSAgICB9Ci0gICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GUk9OVF9DT1ZFUkVEKSB7Ci0gICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGUk9OVF9DT1ZFUkVEOwotICAgIH0KLSAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZPTERFRCkgewotICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6Rk9MREVEOwotICAgIH0KLSAgICAvLyBPbmx5IG1hcCB2ZW5kb3IgYml0cyBkaXJlY3RseQotICAgIHVpbnQ2NF90IHZlbmRvckJpdHMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3U3RhdGUpICYgMHhGRkZGRkZGRjAwMDAwMDAwbDsKLSAgICBuZXdEZXZpY2VTdGF0ZSB8PSB2ZW5kb3JCaXRzOwotCi0gICAgQUxPR1YoIiVzOiBOZXcgZGV2aWNlIHN0YXRlIDB4JSIgUFJJeDY0LCBfX0ZVTkNUSU9OX18sIG5ld0RldmljZVN0YXRlKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtU2VydmljZUxvY2spOwotICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG5ld0RldmljZVN0YXRlKTsKKyAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdTdGF0ZSk7CiAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQpAQCAtMjIxMywxMyArMjQ0MywxMSBAQAogICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBjb25zdCBhdXRvIGJhc2ljQ2xpZW50ID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKICAgICAgICAgICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpLCBiYXNpY0NsaWVudC0+Z2V0Q2FtZXJhT3JpZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+Z2V0Q2FtZXJhRmFjaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5zZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzkwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5zZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoCisgICAgICAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpnZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoCisgICAgICAgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPmdldENhbWVyYUZhY2luZygpLAorICAgICAgICAgICAgICAgICAgICAgIG11bHRpdXNlcl9nZXRfdXNlcl9pZChiYXNpY0NsaWVudC0+Z2V0Q2xpZW50VWlkKCkpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMzM2LDcgKzI1NjQsNyBAQAogICAgIGF1dG8gY2xpZW50VWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICBhdXRvIGNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgYm9vbCBvcGVuQ2xvc2VDYWxsYmFja0FsbG93ZWQgPSBjaGVja1Blcm1pc3Npb24oc0NhbWVyYU9wZW5DbG9zZUxpc3RlbmVyUGVybWlzc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKKyAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCAvKmxvZ1Blcm1pc3Npb25GYWlsdXJlKi9mYWxzZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCkBAIC0yMzczLDcgKzI2MDEsOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CiAgICAgICAgIGZvciAoYXV0byYgaSA6IG1DYW1lcmFTdGF0ZXMpIHsKICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzLT5lbXBsYWNlX2JhY2soaS5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgbWFwVG9JbnRlcmZhY2UoaS5zZWNvbmQtPmdldFN0YXR1cygpKSwgaS5zZWNvbmQtPmdldFVuYXZhaWxhYmxlUGh5c2ljYWxJZHMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSksIGkuc2Vjb25kLT5nZXRVbmF2YWlsYWJsZVBoeXNpY2FsSWRzKCksCisgICAgICAgICAgICAgICAgICAgIG9wZW5DbG9zZUNhbGxiYWNrQWxsb3dlZCA/IGkuc2Vjb25kLT5nZXRDbGllbnRQYWNrYWdlKCkgOiBTdHJpbmc4OjplbXB0eSgpKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBSZW1vdmUgdGhlIGNhbWVyYSBzdGF0dXNlcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbSB0aGUgY2xpZW50LCB3ZSBkbwpAQCAtMjQ5MCw0NCArMjcxOSw0OCBAQAogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgIH0KIAotICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCk7Ci0gICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6Ci0gICAgICAgICAgICBpZiAoYXBpVmVyc2lvbiA9PSBBUElfVkVSU0lPTl8yKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwgdmVyc2lvbiAlZCA8My4yLCBkb2Vzbid0IHN1cHBvcnQgYXBpMiB3aXRob3V0IHNoaW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBpZiAoYXBpVmVyc2lvbiA9PSBBUElfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBvbGRlciBIQUwgYmVmb3JlIDMuMiwgYnV0IGFwaTEgaXMgYWx3YXlzIHN1cHBvcnRlZCIsCisgICAgYXV0byBkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0ID0gZ2V0RGV2aWNlVmVyc2lvbihpZCk7CisgICAgaWYgKGRldmljZVZlcnNpb25BbmRUcmFuc3BvcnQuZmlyc3QgPT0gLTEpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIlVua25vd24gY2FtZXJhIElEICVzIiwgaWQuc3RyaW5nKCkpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0LnNlY29uZCA9PSBJUENUcmFuc3BvcnQ6OkhJREwpIHsKKyAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0LmZpcnN0OworICAgICAgICBzd2l0Y2ggKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICAgICAgICBpZiAoYXBpVmVyc2lvbiA9PSBBUElfVkVSU0lPTl8yKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMIHZlcnNpb24gJWQgPDMuMiwgZG9lc24ndCBzdXBwb3J0IGFwaTIgd2l0aG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoaW0iLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIG9sZGVyIEhBTCBiZWZvcmUgMy4yLCBidXQgYXBpMSBpcyBhbHdheXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNjoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzc6CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJVbmtub3duIGRldmljZSB2ZXJzaW9uICV4IGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiwgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM182OgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183OgotICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIC0xOiB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVW5rbm93biBjYW1lcmEgSUQgJXMiLCBpZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJVbmtub3duIGRldmljZSB2ZXJzaW9uICV4IGZvciBkZXZpY2UgJXMiLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VWZXJzaW9uLCBpZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CiAgICAgfQotCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIApAQCAtMjU0OCw3ICsyNzgxLDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGV4dGVybmFsQ2FtSWQsCiAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFJbmplY3Rpb25DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4qIGNhbWVyYUluamVjdGlvblNlc3Npb24pIHsKKyAgICAgICAgc3A8SUNhbWVyYUluamVjdGlvblNlc3Npb24+KiBjYW1lcmFJbmplY3Rpb25TZXNzaW9uKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FtZXJhSW5qZWN0RXh0ZXJuYWxDYW1lcmFQZXJtaXNzaW9uKSkgewpAQCAtMjU2NSwxOCArMjc5OCwzNiBAQAogICAgICAgICBfX0ZVTkNUSU9OX18sIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpLAogICAgICAgICBTdHJpbmc4KGludGVybmFsQ2FtSWQpLnN0cmluZygpLCBTdHJpbmc4KGV4dGVybmFsQ2FtSWQpLnN0cmluZygpKTsKIAotICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBmdW5jdGlvbi4KLSAgICAvLyByZXQgPSBpbnRlcm5hbEluamVjdENhbWVyYSguLi4pOwotICAgIC8vIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgLy8gICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+bm90aWZ5SW5qZWN0aW9uRXJyb3IoLi4uKTsKLSAgICAvLyAgICAgcmV0dXJuIHJldDsKLSAgICAvLyB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uUGFyYW1ldGVyc0xvY2spOworICAgICAgICBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZCA9IFN0cmluZzgoaW50ZXJuYWxDYW1JZCk7CisgICAgICAgIG1JbmplY3Rpb25FeHRlcm5hbENhbUlkID0gU3RyaW5nOChleHRlcm5hbENhbUlkKTsKKyAgICAgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5hZGRMaXN0ZW5lcihjYWxsYmFjayk7CisgICAgICAgICpjYW1lcmFJbmplY3Rpb25TZXNzaW9uID0gbmV3IENhbWVyYUluamVjdGlvblNlc3Npb24odGhpcyk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQobUluamVjdGlvbkludGVybmFsQ2FtSWQpOworICAgICAgICAvLyBJZiB0aGUgY2xpZW50IGFscmVhZHkgZXhpc3RzLCB3ZSBjYW4gZGlyZWN0bHkgY29ubmVjdCB0byB0aGUgY2FtZXJhIGRldmljZSB0aHJvdWdoIHRoZQorICAgICAgICAvLyBjbGllbnQncyBpbmplY3RDYW1lcmEoKSwgb3RoZXJ3aXNlIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgY2xpZW50IGlzIGVzdGFibGlzaGVkCisgICAgICAgIC8vIChleGVjdXRlIGNvbm5lY3RIZWxwZXIoKSkgYmVmb3JlIGluamVjdGluZyB0aGUgY2FtZXJhIHRvIHRoZSBjYW1lcmEgZGV2aWNlLgorICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRTcCA9IGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCk7CisgICAgICAgICAgICByZXMgPSBjaGVja0lmSW5qZWN0aW9uQ2FtZXJhSXNQcmVzZW50KG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLCBjbGllbnRTcCk7CisgICAgICAgICAgICBpZihyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2FtZXJhIGRldmljZSB3aXRoIElEIFwiJXNcIiBjdXJyZW50bHkgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IGNsaWVudFNwLT5pbmplY3RDYW1lcmEobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIG1DYW1lcmFQcm92aWRlck1hbmFnZXIpOworICAgICAgICAgICAgaWYocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5ub3RpZnlJbmplY3Rpb25FcnJvcihtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbmplY3Rpb25Jbml0UGVuZGluZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPmFkZExpc3RlbmVyKGNhbGxiYWNrKTsKLSAgICAqY2FtZXJhSW5qZWN0aW9uU2Vzc2lvbiA9IG5ldyBDYW1lcmFJbmplY3Rpb25TZXNzaW9uKHRoaXMpOwotCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQnlDbGllbnQoY29uc3QgQmFzaWNDbGllbnQqIGNsaWVudCkgewpAQCAtMjU4NCw2ICsyODM1LDcgQEAKICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgewogICAgICAgICBhdXRvIGNsaWVudFNwID0gaS0+Z2V0VmFsdWUoKTsKICAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpID09IGNsaWVudCkgeworICAgICAgICAgICAgY2FjaGVDbGllbnRUYWdEdW1wSWZOZWVkZWQoY2xpZW50LT5tQ2FtZXJhSWRTdHIsIGNsaWVudFNwLmdldCgpKTsKICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnJlbW92ZShpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI2NjAsNyArMjkxMiwxMSBAQAogICAgICAgICByZXR1cm4gc3A8QmFzaWNDbGllbnQ+e251bGxwdHJ9OwogICAgIH0KIAotICAgIHJldHVybiBjbGllbnREZXNjcmlwdG9yUHRyLT5nZXRWYWx1ZSgpOworICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yUHRyLT5nZXRWYWx1ZSgpOworICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBjYWNoZUNsaWVudFRhZ0R1bXBJZk5lZWRlZChjbGllbnREZXNjcmlwdG9yUHRyLT5nZXRLZXkoKSwgY2xpZW50LmdldCgpKTsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudDsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpkb1VzZXJTd2l0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIG5ld1VzZXJJZHMpIHsKQEAgLTI5NDMsNyArMzE5OSw3IEBACiAKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sCkBAIC0yOTUxLDcgKzMyMDcsNyBAQAogICAgICAgICBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNsaWVudCksCi0gICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgc3lzdGVtTmF0aXZlQ2xpZW50LCBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWRTdHIsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgc2VydmljZVBpZCksCkBAIC0yOTgxLDEzICszMjM3LDE0IEBACiAKIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sCi0gICAgICAgIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBib29sIG5hdGl2ZUNsaWVudCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsCisgICAgICAgIGludCBjYW1lcmFGYWNpbmcsIGludCBzZW5zb3JPcmllbnRhdGlvbiwgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQoZmFsc2UpLAogICAgICAgICBtQ2FtZXJhSWRTdHIoY2FtZXJhSWRTdHIpLCBtQ2FtZXJhRmFjaW5nKGNhbWVyYUZhY2luZyksIG1PcmllbnRhdGlvbihzZW5zb3JPcmllbnRhdGlvbiksCi0gICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSksIG1DbGllbnRGZWF0dXJlSWQoY2xpZW50RmVhdHVyZUlkKSwKKyAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwgbVN5c3RlbU5hdGl2ZUNsaWVudChuYXRpdmVDbGllbnQpLAorICAgICAgICBtQ2xpZW50RmVhdHVyZUlkKGNsaWVudEZlYXR1cmVJZCksCiAgICAgICAgIG1DbGllbnRQaWQoY2xpZW50UGlkKSwgbUNsaWVudFVpZChjbGllbnRVaWQpLAogICAgICAgICBtU2VydmljZVBpZChzZXJ2aWNlUGlkKSwKICAgICAgICAgbURpc2Nvbm5lY3RlZChmYWxzZSksIG1VaWRJc1RydXN0ZWQoZmFsc2UpLApAQCAtMzAzMCw3ICszMjg3LDE5IEBACiAgICAgICAgIH0KICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lID0gcGFja2FnZXNbMF07CiAgICAgfQotICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSAhPSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIpIHsKKworICAgIC8vIFRoZXJlIGFyZSAyIHNjZW5hcmlvcyBpbiB3aGljaCBhIGNsaWVudCB3b24ndCBoYXZlIEFwcE9wcyBvcGVyYXRpb25zCisgICAgLy8gKGJvdGggc2NlbmFyaW9zIDogbmF0aXZlIGNsaWVudHMpCisgICAgLy8gICAgMSkgSXQncyBhbiBzeXN0ZW0gbmF0aXZlIGNsaWVudCosIHRoZSBwYWNrYWdlIG5hbWUgd2lsbCBiZSBlbXB0eQorICAgIC8vICAgICAgIGFuZCBpdCB3aWxsIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gaW4gdGhlIHByZXZpb3VzIGlmIGNvbmRpdGlvbgorICAgIC8vICAgICAgIChUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGJlaGF2aW9yKS4KKyAgICAvLyAgICAyKSBJdCBpcyBhIHN5c3RlbSBuYXRpdmUgY2xpZW50LCBidXQgaXRzIHBhY2thZ2UgbmFtZSBoYXMgYmVlbgorICAgIC8vICAgICAgIG1vZGlmaWVkIGZvciBkZWJ1Z2dpbmcsIGhvd2V2ZXIgaXQgc3RpbGwgbXVzdCBub3QgdXNlIEFwcE9wcyBzaW5jZQorICAgIC8vICAgICAgIHRoZSBwYWNrYWdlIG5hbWUgaXMgbm90IGEgcmVhbCBvbmUuCisgICAgLy8KKyAgICAvLyAgICAgICAqIHN5c3RlbSBuYXRpdmUgY2xpZW50IC0gbmF0aXZlIGNsaWVudCB3aXRoIFVJRCA8IEFJRF9BUFBfU1RBUlQuIEl0CisgICAgLy8gICAgICAgICBkb2Vzbid0IGV4Y2x1ZGUgY2xpZW50cyBub3Qgb24gdGhlIHN5c3RlbSBwYXJ0aXRpb24uCisgICAgaWYgKCFtU3lzdGVtTmF0aXZlQ2xpZW50KSB7CiAgICAgICAgIG1BcHBPcHNNYW5hZ2VyID0gc3RkOjptYWtlX3VuaXF1ZTxBcHBPcHNNYW5hZ2VyPigpOwogICAgIH0KIApAQCAtMzA3OSw2ICszMzQ4LDIxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6c3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCYsIGludCkgeworICAgIC8vIENhbid0IHdhdGNoIHRhZ3MgZGlyZWN0bHksIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpzdGFydFdhdGNoaW5nVGFncworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OnN0b3BXYXRjaGluZ1RhZ3MoaW50KSB7CisgICAgLy8gQ2FuJ3Qgd2F0Y2ggdGFncyBkaXJlY3RseSwgbXVzdCBnbyB0aHJvdWdoIENhbWVyYVNlcnZpY2U6OnN0b3BXYXRjaGluZ1RhZ3MKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmKSB7CisgICAgLy8gQ2FuJ3Qgd2F0Y2ggdGFncyBkaXJlY3RseSwgbXVzdCBnbyB0aHJvdWdoIENhbWVyYVNlcnZpY2U6OmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3IKKyAgICByZXR1cm4gT0s7Cit9CisKIFN0cmluZzE2IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpnZXRQYWNrYWdlTmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbUNsaWVudFBhY2thZ2VOYW1lOwogfQpAQCAtMzE0NCw4ICszNDI4LDcgQEAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSA9IHNDYW1lcmFTZXJ2aWNlLT5tVWlkUG9saWN5LT5pc1VpZEFjdGl2ZShtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIGJvb2wgaXNDYW1lcmFQcml2YWN5RW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPm1TZW5zb3JQcml2YWN5UG9saWN5LT5pc0NhbWVyYVByaXZhY3lFbmFibGVkKAotICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQobUNsaWVudFVpZCkpOworICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgpOwogICAgICAgICBpZiAoIWlzVWlkQWN0aXZlIHx8ICFpc0NhbWVyYVByaXZhY3lFbmFibGVkKSB7CiAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkIiwKICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwpAQCAtMzMyNyw4ICszNjEwLDcgQEAKICAgICB9IGVsc2UgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0lHTk9SRUQpIHsKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSA9IHNDYW1lcmFTZXJ2aWNlLT5tVWlkUG9saWN5LT5pc1VpZEFjdGl2ZShtQ2xpZW50VWlkLCBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQgPQotICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpdXNlcl9nZXRfdXNlcl9pZChtQ2xpZW50VWlkKSk7CisgICAgICAgICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPm1TZW5zb3JQcml2YWN5UG9saWN5LT5pc0NhbWVyYVByaXZhY3lFbmFibGVkKCk7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJXM6IEFjY2VzcyBmb3IgXCIlc1wiIGhhcyBiZWVuIHJlc3RyaWN0ZWQsIGlzVWlkVHJ1c3RlZCAlZCwgaXNVaWRBY3RpdmUgJWQiLAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAogICAgICAgICAgICAgICAgIG1VaWRJc1RydXN0ZWQsIGlzVWlkQWN0aXZlKTsKQEAgLTM0MDgsNyArMzY5MCw4IEBACiAgICAgc3RhdHVzX3QgcmVzID0gbUFtLmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIG1BbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKICAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfSURMRQotICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUsCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURQorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DX09PTV9BREosCiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKICAgICAgICAgICAgIFN0cmluZzE2KCJjYW1lcmFzZXJ2ZXIiKSk7CiAgICAgaWYgKHJlcyA9PSBPSykgewpAQCAtMzQ1Nyw5ICszNzQwLDkgQEAKICAgICBib29sIHByb2NTdGF0ZUNoYW5nZSA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKLSAgICAgICAgaWYgKChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpICYmCi0gICAgICAgICAgICAgICAgKG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgIT0gcHJvY1N0YXRlKSkgewotICAgICAgICAgICAgbU1vbml0b3JlZFVpZHNbdWlkXS5maXJzdCA9IHByb2NTdGF0ZTsKKyAgICAgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSAmJgorICAgICAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzW3VpZF0ucHJvY1N0YXRlICE9IHByb2NTdGF0ZSkgeworICAgICAgICAgICAgbU1vbml0b3JlZFVpZHNbdWlkXS5wcm9jU3RhdGUgPSBwcm9jU3RhdGU7CiAgICAgICAgICAgICBwcm9jU3RhdGVDaGFuZ2UgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzQ3MiwxNSArMzc1NSwzMyBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkUHJvY0FkakNoYW5nZWQodWlkX3QgdWlkKSB7CisgICAgYm9vbCBwcm9jQWRqQ2hhbmdlID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgICAgICBpZiAobU1vbml0b3JlZFVpZHMuZmluZCh1aWQpICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBwcm9jQWRqQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9jQWRqQ2hhbmdlKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOwogICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CiAgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kKys7CisgICAgICAgIGl0LT5zZWNvbmQucmVmQ291bnQrKzsKICAgICB9IGVsc2UgewotICAgICAgICBtTW9uaXRvcmVkVWlkcy5lbXBsYWNlKAotICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjx1aWRfdCwgc3RkOjpwYWlyPGludDMyX3QsIHNpemVfdD4+ICh1aWQsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+IChBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQsIDEpKSk7CisgICAgICAgIE1vbml0b3JlZFVpZCBtb25pdG9yZWRVaWQ7CisgICAgICAgIG1vbml0b3JlZFVpZC5wcm9jU3RhdGUgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQ7CisgICAgICAgIG1vbml0b3JlZFVpZC5yZWZDb3VudCA9IDE7CisgICAgICAgIG1Nb25pdG9yZWRVaWRzLmVtcGxhY2Uoc3RkOjpwYWlyPHVpZF90LCBNb25pdG9yZWRVaWQ+KHVpZCwgbW9uaXRvcmVkVWlkKSk7CiAgICAgfQogfQogCkBAIC0zNDg4LDggKzM3ODksOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CiAgICAgYXV0byBpdCA9IG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKTsKICAgICBpZiAoaXQgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpIHsKLSAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQtLTsKLSAgICAgICAgaWYgKGl0LT5zZWNvbmQuc2Vjb25kID09IDApIHsKKyAgICAgICAgaXQtPnNlY29uZC5yZWZDb3VudC0tOworICAgICAgICBpZiAoaXQtPnNlY29uZC5yZWZDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBtTW9uaXRvcmVkVWlkcy5lcmFzZShpdCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMzU2Nyw3ICszODY4LDcgQEAKIGludDMyX3QgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpnZXRQcm9jU3RhdGVMb2NrZWQodWlkX3QgdWlkKSB7CiAgICAgaW50MzJfdCBwcm9jU3RhdGUgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKICAgICBpZiAobU1vbml0b3JlZFVpZHMuZmluZCh1aWQpICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgIHByb2NTdGF0ZSA9IG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3Q7CisgICAgICAgIHByb2NTdGF0ZSA9IG1Nb25pdG9yZWRVaWRzW3VpZF0ucHJvY1N0YXRlOwogICAgIH0KICAgICByZXR1cm4gcHJvY1N0YXRlOwogfQpAQCAtMzY0MCwxOCArMzk0MSwxOCBAQAogICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CiB9CiAKLWJvb2wgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aXNDYW1lcmFQcml2YWN5RW5hYmxlZCh1c2VyaWRfdCB1c2VySWQpIHsKK2Jvb2wgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgpIHsKICAgICBpZiAoIWhhc0NhbWVyYVByaXZhY3lGZWF0dXJlKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gbVNwbS5pc0luZGl2aWR1YWxTZW5zb3JQcml2YWN5RW5hYmxlZCh1c2VySWQsCi0gICAgICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyOjpJTkRJVklEVUFMX1NFTlNPUl9DQU1FUkEpOworICAgIHJldHVybiBtU3BtLmlzVG9nZ2xlU2Vuc29yUHJpdmFjeUVuYWJsZWQoU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9TRU5TT1JfQ0FNRVJBKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKK2JpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoCisgICAgaW50IHRvZ2dsZVR5cGUgX191bnVzZWQsIGludCBzZW5zb3IgX191bnVzZWQsIGJvb2wgZW5hYmxlZCkgewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7Ci0gICAgICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IG1TcG0uaXNUb2dnbGVTZW5zb3JQcml2YWN5RW5hYmxlZChTZW5zb3JQcml2YWN5TWFuYWdlcjo6VE9HR0xFX1NFTlNPUl9DQU1FUkEpOwogICAgIH0KICAgICAvLyBpZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYmxvY2sgYWxsIGNsaWVudHMgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYQogICAgIGlmIChlbmFibGVkKSB7CkBAIC0zNjcwLDcgKzM5NzEsMTEgQEAKIH0KIAogYm9vbCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpoYXNDYW1lcmFQcml2YWN5RmVhdHVyZSgpIHsKLSAgICByZXR1cm4gbVNwbS5zdXBwb3J0c1NlbnNvclRvZ2dsZShTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfQ0FNRVJBKTsKKyAgICBib29sIHN1cHBvcnRzU29mdHdhcmVUb2dnbGUgPSBtU3BtLnN1cHBvcnRzU2Vuc29yVG9nZ2xlKAorICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9UWVBFX1NPRlRXQVJFLCBTZW5zb3JQcml2YWN5TWFuYWdlcjo6VE9HR0xFX1NFTlNPUl9DQU1FUkEpOworICAgIGJvb2wgc3VwcG9ydHNIYXJkd2FyZVRvZ2dsZSA9IG1TcG0uc3VwcG9ydHNTZW5zb3JUb2dnbGUoCisgICAgICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6VE9HR0xFX1RZUEVfSEFSRFdBUkUsIFNlbnNvclByaXZhY3lNYW5hZ2VyOjpUT0dHTEVfU0VOU09SX0NBTUVSQSk7CisgICAgcmV0dXJuIHN1cHBvcnRzU29mdHdhcmVUb2dnbGUgfHwgc3VwcG9ydHNIYXJkd2FyZVRvZ2dsZTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzY3OCw5ICszOTgzLDEwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsCi0gICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSA6IG1JZChpZCksCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBoeXNpY2FsQ2FtZXJhcykgOiBtSWQoaWQpLAogICAgICAgICBtU3RhdHVzKFN0YXR1c0ludGVybmFsOjpOT1RfUFJFU0VOVCksIG1Db3N0KGNvc3QpLCBtQ29uZmxpY3RpbmcoY29uZmxpY3RpbmcpLAotICAgICAgICBtU3lzdGVtQ2FtZXJhS2luZChzeXN0ZW1DYW1lcmFLaW5kKSB7fQorICAgICAgICBtU3lzdGVtQ2FtZXJhS2luZChzeXN0ZW1DYW1lcmFLaW5kKSwgbVBoeXNpY2FsQ2FtZXJhcyhwaHlzaWNhbENhbWVyYXMpIHt9CiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjp+Q2FtZXJhU3RhdGUoKSB7fQogCkBAIC0zNzE5LDYgKzQwMjUsMTEgQEAKICAgICByZXR1cm4gbVN5c3RlbUNhbWVyYUtpbmQ7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmNvbnRhaW5zUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmaW5kKG1QaHlzaWNhbENhbWVyYXMuYmVnaW4oKSwgbVBoeXNpY2FsQ2FtZXJhcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZCkKKyAgICAgICAgICAgICE9IG1QaHlzaWNhbENhbWVyYXMuZW5kKCk7Cit9CisKIGJvb2wgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmFkZFVuYXZhaWxhYmxlUGh5c2ljYWxJZChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbVVuYXZhaWxhYmxlUGh5c2ljYWxJZHMuaW5zZXJ0KHBoeXNpY2FsSWQpOwpAQCAtMzczMSw2ICs0MDQyLDE2IEBACiAgICAgcmV0dXJuIGNvdW50ID4gMDsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6c2V0Q2xpZW50UGFja2FnZShjb25zdCBTdHJpbmc4JiBjbGllbnRQYWNrYWdlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIG1DbGllbnRQYWNrYWdlID0gY2xpZW50UGFja2FnZTsKK30KKworU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Z2V0Q2xpZW50UGFja2FnZSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTG9jayk7CisgICAgcmV0dXJuIG1DbGllbnRQYWNrYWdlOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgICAgICAgICAgICAgIENsaWVudEV2ZW50TGlzdGVuZXIKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4MjEsMjMgKzQxNDIsMjMgQEAKIENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHIgQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwgaW50MzJfdCBjb3N0LAogICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsCi0gICAgICAgIGludDMyX3Qgc3RhdGUsIGludDMyX3Qgb29tU2NvcmVPZmZzZXQpIHsKKyAgICAgICAgaW50MzJfdCBzdGF0ZSwgaW50MzJfdCBvb21TY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQpIHsKIAotICAgIGJvb2wgaXNWZW5kb3JDbGllbnQgPSBnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVI7Ci0gICAgaW50MzJfdCBzY29yZV9hZGogPSBpc1ZlbmRvckNsaWVudCA/IGtWZW5kb3JDbGllbnRTY29yZSA6IHNjb3JlOwotICAgIGludDMyX3Qgc3RhdGVfYWRqID0gaXNWZW5kb3JDbGllbnQgPyBrVmVuZG9yQ2xpZW50U3RhdGU6IHN0YXRlOworICAgIGludDMyX3Qgc2NvcmVfYWRqID0gc3lzdGVtTmF0aXZlQ2xpZW50ID8ga1N5c3RlbU5hdGl2ZUNsaWVudFNjb3JlIDogc2NvcmU7CisgICAgaW50MzJfdCBzdGF0ZV9hZGogPSBzeXN0ZW1OYXRpdmVDbGllbnQgPyBrU3lzdGVtTmF0aXZlQ2xpZW50U3RhdGU6IHN0YXRlOwogCiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KAotICAgICAgICAgICAga2V5LCB2YWx1ZSwgY29zdCwgY29uZmxpY3RpbmdLZXlzLCBzY29yZV9hZGosIG93bmVySWQsIHN0YXRlX2FkaiwgaXNWZW5kb3JDbGllbnQsCi0gICAgICAgICAgICBvb21TY29yZU9mZnNldCk7CisgICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlX2Fkaiwgb3duZXJJZCwgc3RhdGVfYWRqLAorICAgICAgICAgICAgc3lzdGVtTmF0aXZlQ2xpZW50LCBvb21TY29yZU9mZnNldCk7CiB9CiAKIENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHIgQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIHBhcnRpYWwsCi0gICAgICAgIGludDMyX3Qgb29tU2NvcmVPZmZzZXQpIHsKKyAgICAgICAgaW50MzJfdCBvb21TY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQpIHsKICAgICByZXR1cm4gbWFrZUNsaWVudERlc2NyaXB0b3IocGFydGlhbC0+Z2V0S2V5KCksIHZhbHVlLCBwYXJ0aWFsLT5nZXRDb3N0KCksCiAgICAgICAgICAgICBwYXJ0aWFsLT5nZXRDb25mbGljdGluZygpLCBwYXJ0aWFsLT5nZXRQcmlvcml0eSgpLmdldFNjb3JlKCksCi0gICAgICAgICAgICBwYXJ0aWFsLT5nZXRPd25lcklkKCksIHBhcnRpYWwtPmdldFByaW9yaXR5KCkuZ2V0U3RhdGUoKSwgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgcGFydGlhbC0+Z2V0T3duZXJJZCgpLCBwYXJ0aWFsLT5nZXRQcmlvcml0eSgpLmdldFN0YXRlKCksIG9vbVNjb3JlT2Zmc2V0LAorICAgICAgICAgICAgc3lzdGVtTmF0aXZlQ2xpZW50KTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzg2NSwyMiArNDE4Niw2MiBAQAogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OkluamVjdGlvblN0YXR1c0xpc3RlbmVyOjpub3RpZnlJbmplY3Rpb25FcnJvcigKLSAgICAgICAgaW50IGVycm9yQ29kZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1MaXN0ZW5lckxvY2spOworICAgICAgICBTdHJpbmc4IGluamVjdGVkQ2FtSWQsIHN0YXR1c190IGVycikgewogICAgIGlmIChtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HVygiSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXI6IG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjayA9PSBudWxscHRyIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrLT5vbkluamVjdGlvbkVycm9yKGVycm9yQ29kZSk7CisKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIC1FTk9ERVY6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04pOworICAgICAgICAgICAgQUxPR0UoIk5vIGNhbWVyYSBkZXZpY2Ugd2l0aCBJRCBcIiVzXCIgY3VycmVudGx5IGF2YWlsYWJsZSEiLAorICAgICAgICAgICAgICAgICAgICBpbmplY3RlZENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC1FQlVTWToKKyAgICAgICAgICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fU0VTU0lPTik7CisgICAgICAgICAgICBBTE9HRSgiSGlnaGVyLXByaW9yaXR5IGNsaWVudCB1c2luZyBjYW1lcmEsIElEIFwiJXNcIiBjdXJyZW50bHkgdW5hdmFpbGFibGUhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICAgICAgICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fU0VTU0lPTik7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIElEIFwiJXNcIiBvYmplY3QgaXMgZGVhZCEiLAorICAgICAgICAgICAgICAgICAgICBpbmplY3RlZENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrLT5vbkluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9TRVNTSU9OKTsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgSUQgXCIlc1wiIGVuY291bnRlcmVkIGFuIG9wZXJhdGluZyBvciBpbnRlcm5hbCBlcnJvciEiLAorICAgICAgICAgICAgICAgICAgICBpbmplY3RlZENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVOS05PV05fVFJBTlNBQ1RJT046CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1VOU1VQUE9SVEVEKTsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgSUQgXCIlc1wiIG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fSU5WQUxJRF9FUlJPUik7CisgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBlcnJvciAlcyAoJWQpIG9wZW5pbmcgY2FtZXJhIFwiJXNcIiEiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyLCBpbmplY3RlZENhbUlkLnN0cmluZygpKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6SW5qZWN0aW9uU3RhdHVzTGlzdGVuZXI6OmJpbmRlckRpZWQoCiAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxpc3RlbmVyTG9jayk7CiAgICAgQUxPR1YoIkluamVjdGlvblN0YXR1c0xpc3RlbmVyOiBJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2sgaGFzIGRpZWQiKTsKICAgICBhdXRvIHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgewotICAgICAgICBwYXJlbnQtPnN0b3BJbmplY3Rpb25JbXBsKCk7CisgICAgICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IHBhcmVudC0+bUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KHBhcmVudC0+bUluamVjdGlvbkludGVybmFsQ2FtSWQpOworICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBCYXNpY0NsaWVudCogYmFzZUNsaWVudFB0ciA9IGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCkuZ2V0KCk7CisgICAgICAgICAgICBiYXNlQ2xpZW50UHRyLT5zdG9wSW5qZWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50LT5jbGVhckluamVjdGlvblBhcmFtZXRlcnMoKTsKICAgICB9CiB9CiAKQEAgLTM4OTYsNyArNDI1NywyMCBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgIkNhbWVyYSBzZXJ2aWNlIGVuY291bnRlcmVkIGVycm9yIik7CiAgICAgfQotICAgIHBhcmVudC0+c3RvcEluamVjdGlvbkltcGwoKTsKKworICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IHBhcmVudC0+bUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KHBhcmVudC0+bUluamVjdGlvbkludGVybmFsQ2FtSWQpOworICAgIGlmIChjbGllbnREZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgQmFzaWNDbGllbnQqIGJhc2VDbGllbnRQdHIgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpLmdldCgpOworICAgICAgICByZXMgPSBiYXNlQ2xpZW50UHRyLT5zdG9wSW5qZWN0aW9uKCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmFJbmplY3Rpb25TZXNzaW9uOiBGYWlsZWQgdG8gc3RvcCB0aGUgaW5qZWN0aW9uIGNhbWVyYSEiCisgICAgICAgICAgICAgICAgIiByZXQgIT0gTk9fRVJST1I6ICVkIiwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAiQ2FtZXJhIHNlc3Npb24gZW5jb3VudGVyZWQgZXJyb3IiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJlbnQtPmNsZWFySW5qZWN0aW9uUGFyYW1ldGVycygpOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIApAQCAtNDAzNyw3ICs0NDExLDcgQEAKIAogICAgIC8vIER1bXAgY2FtZXJhIHRyYWNlcyBpZiB0aGVyZSB3ZXJlIGFueQogICAgIGRwcmludGYoZmQsICJcbiIpOwotICAgIGNhbWVyYTM6OkNhbWVyYVRyYWNlczo6ZHVtcChmZCwgYXJncyk7CisgICAgY2FtZXJhMzo6Q2FtZXJhVHJhY2VzOjpkdW1wKGZkKTsKIAogICAgIC8vIFByb2Nlc3MgZHVtcCBhcmd1bWVudHMsIGlmIGFueQogICAgIGludCBuID0gYXJncy5zaXplKCk7CkBAIC00MDk2LDggKzQ0NzAsOSBAQAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpkdW1wT3BlblNlc3Npb25DbGllbnRMb2dzKGludCBmZCwKICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOwotICAgIGRwcmludGYoZmQsICIgIERldmljZSAlcyBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcbiIsCi0gICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICBkcHJpbnRmKGZkLCAiICAlcyA6IERldmljZSAlcyBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcbiIsCisgICAgICAgICAgICBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpLnN0cmluZygpLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgIGRwcmludGYoZmQsICIgICAgQ2xpZW50IHByaW9yaXR5IHNjb3JlOiAlZCBzdGF0ZTogJWRcbiIsCiAgICAgICAgIGNsaWVudERlc2NyaXB0b3ItPmdldFByaW9yaXR5KCkuZ2V0U2NvcmUoKSwKICAgICAgICAgY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKS5nZXRTdGF0ZSgpKTsKQEAgLTQxMzEsNiArNDUwNiw0NSBAQAogICAgIGRwcmludGYoZmQsICJcbiIpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmNhY2hlQ2xpZW50VGFnRHVtcElmTmVlZGVkKGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBCYXNpY0NsaWVudCogY2xpZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvZ0xvY2spOworICAgIGlmICghaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNsaWVudCkpIHsgcmV0dXJuOyB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZHVtcFZlY3RvcjsKKyAgICBjbGllbnQtPmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3IoZHVtcFZlY3Rvcik7CisKKyAgICBpZiAoZHVtcFZlY3Rvci5lbXB0eSgpKSB7IHJldHVybjsgfQorCisgICAgc3RkOjpzdHJpbmcgZHVtcFN0cmluZzsKKworICAgIFN0cmluZzggY3VycmVudFRpbWUgPSBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpOworICAgIGR1bXBTdHJpbmcgKz0gIkNhY2hlZCBAICI7CisgICAgZHVtcFN0cmluZyArPSBjdXJyZW50VGltZS5zdHJpbmcoKTsKKyAgICBkdW1wU3RyaW5nICs9ICJcbiI7IC8vIEZpcnN0IGxpbmUgaXMgdGhlIHRpbWVzdGFtcCBvZiB3aGVuIGNsaWVudCBpcyBjYWNoZWQuCisKKworICAgIGNvbnN0IFN0cmluZzE2ICZwYWNrYWdlTmFtZSA9IGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKTsKKworICAgIFN0cmluZzggcGFja2FnZU5hbWU4ID0gU3RyaW5nOChwYWNrYWdlTmFtZSk7CisgICAgY29uc3QgY2hhciAqcHJpbnRhYmxlUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTgubG9ja0J1ZmZlcihwYWNrYWdlTmFtZS5zaXplKCkpOworCisKKyAgICBzaXplX3QgaSA9IGR1bXBWZWN0b3Iuc2l6ZSgpOworCisgICAgLy8gU3RvcmUgdGhlIHN0cmluZyBpbiByZXZlcnNlIG9yZGVyIChsYXRlc3QgbGFzdCkKKyAgICB3aGlsZSAoaSA+IDApIHsKKyAgICAgICAgIGktLTsKKyAgICAgICAgIGR1bXBTdHJpbmcgKz0gY2FtZXJhSWQ7CisgICAgICAgICBkdW1wU3RyaW5nICs9ICI6IjsKKyAgICAgICAgIGR1bXBTdHJpbmcgKz0gcHJpbnRhYmxlUGFja2FnZU5hbWU7CisgICAgICAgICBkdW1wU3RyaW5nICs9ICIgICI7CisgICAgICAgICBkdW1wU3RyaW5nICs9IGR1bXBWZWN0b3JbaV07IC8vIGltcGxpY2l0bHkgZW5kcyB3aXRoICdcbicKKyAgICB9CisKKyAgICBwYWNrYWdlTmFtZTgudW5sb2NrQnVmZmVyKCk7CisgICAgbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlW3BhY2thZ2VOYW1lXSA9IGR1bXBTdHJpbmc7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6aGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoQ2xpZW50TWFwTXV0ZXgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvcmNoQ2xpZW50TWFwLnNpemUoKTsgaSsrKSB7CkBAIC00MjQxLDYgKzQ2NTUsMTggQEAKIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVPcGVuQ2xvc2VTdGF0dXMoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgb3BlbiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lKSB7CisgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKyAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCB1cGRhdGUgdGhlIHN0YXR1cyBmb3IgJXMsIG5vIHN1Y2ggZGV2aWNlIGV4aXN0cyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG9wZW4pIHsKKyAgICAgICAgc3RhdGUtPnNldENsaWVudFBhY2thZ2UoU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRlLT5zZXRDbGllbnRQYWNrYWdlKFN0cmluZzg6OmVtcHR5KCkpOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1MaXN0ZW5lckxpc3QpIHsKQEAgLTQzMzcsMTggKzQ3NjMsOSBAQAogICAgIHN0ZDo6bGlzdDxTdHJpbmcxNj4gcmV0TGlzdDsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBzdGF0ZSA6IG1DYW1lcmFTdGF0ZXMpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgICAgICBpZiAoIW1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShzdGF0ZS5maXJzdC5jX3N0cigpLCAmcGh5c2ljYWxDYW1lcmFJZHMpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzdGF0ZS5zZWNvbmQtPmNvbnRhaW5zUGh5c2ljYWxDYW1lcmEocGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICAgICAgcmV0TGlzdC5lbXBsYWNlX2JhY2soU3RyaW5nMTYoc3RhdGUuZmlyc3QpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpCi0gICAgICAgICAgICAgICAgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIC8vIGNhbWVyYUlkIGlzIG5vdCBhIHBoeXNpY2FsIGNhbWVyYSBvZiB0aGlzIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXRMaXN0LmVtcGxhY2VfYmFjayhTdHJpbmcxNihzdGF0ZS5maXJzdCkpOwogICAgIH0KICAgICByZXR1cm4gcmV0TGlzdDsKIH0KQEAgLTQ0MjMsOSArNDg0MCwxMSBAQAogICAgICAgICByZXR1cm4gaGFuZGxlR2V0SW1hZ2VEdW1wTWFzayhvdXQpOwogICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPj0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJzZXQtY2FtZXJhLW11dGUiKSkgewogICAgICAgICByZXR1cm4gaGFuZGxlU2V0Q2FtZXJhTXV0ZShhcmdzKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigid2F0Y2giKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlV2F0Y2hDb21tYW5kKGFyZ3MsIGluLCBvdXQpOwogICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJoZWxwIikpIHsKICAgICAgICAgcHJpbnRIZWxwKG91dCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICBwcmludEhlbHAoZXJyKTsKICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNDU2OSw2ICs0OTg4LDM0OCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlV2F0Y2hDb21tYW5kKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBpbkZkLCBpbnQgb3V0RmQpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPj0gMyAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJzdGFydCIpKSB7CisgICAgICAgIHJldHVybiBzdGFydFdhdGNoaW5nVGFncyhhcmdzLCBvdXRGZCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMV0gPT0gU3RyaW5nMTYoInN0b3AiKSkgeworICAgICAgICByZXR1cm4gc3RvcFdhdGNoaW5nVGFncyhvdXRGZCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMV0gPT0gU3RyaW5nMTYoImR1bXAiKSkgeworICAgICAgICByZXR1cm4gcHJpbnRXYXRjaGVkVGFncyhvdXRGZCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMV0gPT0gU3RyaW5nMTYoImxpdmUiKSkgeworICAgICAgICByZXR1cm4gcHJpbnRXYXRjaGVkVGFnc1VudGlsSW50ZXJydXB0KGFyZ3MsIGluRmQsIG91dEZkKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1sxXSA9PSBTdHJpbmcxNigiY2xlYXIiKSkgeworICAgICAgICByZXR1cm4gY2xlYXJDYWNoZWRNb25pdG9yZWRUYWdEdW1wcyhvdXRGZCk7CisgICAgfQorICAgIGRwcmludGYob3V0RmQsICJDYW1lcmEgc2VydmljZSB3YXRjaCBjb21tYW5kczpcbiIKKyAgICAgICAgICAgICAgICAgIiAgc3RhcnQgLW0gPGNvbW1hX3NlcGFyYXRlZF90YWdfbGlzdD4gWy1jIDxjb21tYV9zZXBhcmF0ZWRfY2xpZW50X2xpc3Q+XVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBzdGFydHMgd2F0Y2hpbmcgdGhlIHByb3ZpZGVkIHRhZ3MgZm9yIGNsaWVudHMgd2l0aCBwcm92aWRlZCBwYWNrYWdlXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIHJlY29nbml6ZXMgdGFnIHNob3J0aGFuZHMgbGlrZSAnM2EnXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIHdhdGNoZXMgYWxsIGNsaWVudHMgaWYgbm8gY2xpZW50IGlzIHBhc3NlZCwgb3IgaWYgJ2FsbCcgaXMgbGlzdGVkXG4iCisgICAgICAgICAgICAgICAgICIgIGR1bXAgZHVtcHMgdGhlIG1vbml0b3JpbmcgaW5mb3JtYXRpb24gYW5kIGV4aXRzXG4iCisgICAgICAgICAgICAgICAgICIgIHN0b3Agc3RvcHMgd2F0Y2hpbmcgYWxsIHRhZ3NcbiIKKyAgICAgICAgICAgICAgICAgIiAgbGl2ZSBbLW4gPHJlZnJlc2hfaW50ZXJ2YWxfbXM+XVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBwcmludHMgdGhlIG1vbml0b3JlZCBpbmZvcm1hdGlvbiBpbiByZWFsIHRpbWVcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgSGl0IHJldHVybiB0byBleGl0XG4iCisgICAgICAgICAgICAgICAgICIgIGNsZWFyIGNsZWFycyBhbGwgYnVmZmVycyBzdG9yaW5nIGluZm9ybWF0aW9uIGZvciB3YXRjaCBjb21tYW5kIik7CisgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MsIGludCBvdXRGZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2dMb2NrKTsKKyAgICBzaXplX3QgdGFnc0lkeDsgLy8gaW5kZXggb2YgJy1tJworICAgIFN0cmluZzE2IHRhZ3MoIiIpOworICAgIGZvciAodGFnc0lkeCA9IDI7IHRhZ3NJZHggPCBhcmdzLnNpemUoKSAmJiBhcmdzW3RhZ3NJZHhdICE9IFN0cmluZzE2KCItbSIpOyB0YWdzSWR4KyspOworICAgIGlmICh0YWdzSWR4IDwgYXJncy5zaXplKCkgLSAxKSB7CisgICAgICAgIHRhZ3MgPSBhcmdzW3RhZ3NJZHggKyAxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKG91dEZkLCAiTm8gdGFncyBwcm92aWRlZC5cbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBjbGllbnRzSWR4OyAvLyBpbmRleCBvZiAnLWMnCisgICAgU3RyaW5nMTYgY2xpZW50cyA9IGtXYXRjaEFsbENsaWVudHNGbGFnOyAvLyB3YXRjaCBhbGwgY2xpZW50cyBpZiBubyBjbGllbnRzIGFyZSBwcm92aWRlZAorICAgIGZvciAoY2xpZW50c0lkeCA9IDI7IGNsaWVudHNJZHggPCBhcmdzLnNpemUoKSAmJiBhcmdzW2NsaWVudHNJZHhdICE9IFN0cmluZzE2KCItYyIpOworICAgICAgICAgY2xpZW50c0lkeCsrKTsKKyAgICBpZiAoY2xpZW50c0lkeCA8IGFyZ3Muc2l6ZSgpIC0gMSkgeworICAgICAgICBjbGllbnRzID0gYXJnc1tjbGllbnRzSWR4ICsgMV07CisgICAgfQorICAgIHBhcnNlQ2xpZW50c1RvV2F0Y2hMb2NrZWQoU3RyaW5nOChjbGllbnRzKSk7CisKKyAgICAvLyB0cmFjayB0YWdzIHRvIGluaXRpYWxpemUgZnV0dXJlIGNsaWVudHMgd2l0aCB0aGUgbW9uaXRvcmluZyBpbmZvcm1hdGlvbgorICAgIG1Nb25pdG9yVGFncyA9IFN0cmluZzgodGFncyk7CisKKyAgICBib29sIHNlcnZpY2VMb2NrID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgIGludCBudW1XYXRjaGVkQ2xpZW50cyA9IDA7CisgICAgYXV0byBjYW1lcmFDbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnREZXNjcmlwdG9yOiBjYW1lcmFDbGllbnRzKSB7CisgICAgICAgIGlmIChjbGllbnREZXNjcmlwdG9yID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCk7CisgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorCisgICAgICAgIGlmIChpc0NsaWVudFdhdGNoZWRMb2NrZWQoY2xpZW50LmdldCgpKSkgeworICAgICAgICAgICAgY2xpZW50LT5zdGFydFdhdGNoaW5nVGFncyhtTW9uaXRvclRhZ3MsIG91dEZkKTsKKyAgICAgICAgICAgIG51bVdhdGNoZWRDbGllbnRzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZHByaW50ZihvdXRGZCwgIlN0YXJ0ZWQgd2F0Y2hpbmcgJWQgYWN0aXZlIGNsaWVudHNcbiIsIG51bVdhdGNoZWRDbGllbnRzKTsKKworICAgIGlmIChzZXJ2aWNlTG9jaykgeyBtU2VydmljZUxvY2sudW5sb2NrKCk7IH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dEZkKSB7CisgICAgLy8gY2xlYXIgbU1vbml0b3JUYWdzIHRvIHByZXZlbnQgbmV3IGNsaWVudHMgZnJvbSBtb25pdG9yaW5nIHRhZ3MgYXQgaW5pdGlhbGl6YXRpb24KKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgbU1vbml0b3JUYWdzID0gU3RyaW5nODo6ZW1wdHkoKTsKKworICAgIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuY2xlYXIoKTsKKyAgICBtV2F0Y2hlZENsaWVudHNEdW1wQ2FjaGUuY2xlYXIoKTsKKworICAgIGJvb2wgc2VydmljZUxvY2sgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgYXV0byBjYW1lcmFDbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnREZXNjcmlwdG9yIDogY2FtZXJhQ2xpZW50cykgeworICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKyAgICAgICAgY2xpZW50LT5zdG9wV2F0Y2hpbmdUYWdzKG91dEZkKTsKKyAgICB9CisgICAgZHByaW50ZihvdXRGZCwgIlN0b3BwZWQgd2F0Y2hpbmcgYWxsIGNsaWVudHMuXG4iKTsKKyAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjbGVhckNhY2hlZE1vbml0b3JlZFRhZ0R1bXBzKGludCBvdXRGZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2dMb2NrKTsKKyAgICBzaXplX3QgY2xlYXJlZFNpemUgPSBtV2F0Y2hlZENsaWVudHNEdW1wQ2FjaGUuc2l6ZSgpOworICAgIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZS5jbGVhcigpOworICAgIGRwcmludGYob3V0RmQsICJDbGVhcmVkIHRhZyBpbmZvcm1hdGlvbiBvZiAlenUgY2FjaGVkIGNsaWVudHMuXG4iLCBjbGVhcmVkU2l6ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpwcmludFdhdGNoZWRUYWdzKGludCBvdXRGZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2dMb2NrKG1Mb2dMb2NrKTsKKyAgICBzdGQ6OnNldDxTdHJpbmcxNj4gY29ubmVjdGVkTW9uaXRvcmVkQ2xpZW50czsKKworICAgIGJvb2wgcHJpbnRlZFNvbWV0aGluZyA9IGZhbHNlOyAvLyB0cmFja3MgaWYgYW55IG1vbml0b3JpbmcgaW5mb3JtYXRpb24gd2FzIHByaW50ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZyb20gZWl0aGVyIGNhY2hlZCBvciBhY3RpdmUgY2xpZW50cykKKworICAgIGJvb2wgc2VydmljZUxvY2sgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgLy8gZ2V0IGFsbCB3YXRjaGVkIGNsaWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGNvbm5lY3RlZAorICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50RGVzY3JpcHRvcjogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorCisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKyAgICAgICAgaWYgKCFpc0NsaWVudFdhdGNoZWRMb2NrZWQoY2xpZW50LmdldCgpKSkgeyBjb250aW51ZTsgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkdW1wVmVjdG9yOworICAgICAgICBjbGllbnQtPmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3IoZHVtcFZlY3Rvcik7CisKKyAgICAgICAgc2l6ZV90IHByaW50SWR4ID0gZHVtcFZlY3Rvci5zaXplKCk7CisgICAgICAgIGlmIChwcmludElkeCA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByaW50IHRhZyBkdW1wcyBmb3IgYWN0aXZlIGNsaWVudAorICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCA9IGNsaWVudERlc2NyaXB0b3ItPmdldEtleSgpOworICAgICAgICBTdHJpbmc4IHBhY2thZ2VOYW1lOCA9IFN0cmluZzgoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgY29uc3QgY2hhciAqcHJpbnRhYmxlUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTgubG9ja0J1ZmZlcihwYWNrYWdlTmFtZTguc2l6ZSgpKTsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIkNsaWVudDogJXMgKGFjdGl2ZSlcbiIsIHByaW50YWJsZVBhY2thZ2VOYW1lKTsKKyAgICAgICAgd2hpbGUocHJpbnRJZHggPiAwKSB7CisgICAgICAgICAgICBwcmludElkeC0tOworICAgICAgICAgICAgZHByaW50ZihvdXRGZCwgIiVzOiVzICAlcyIsIGNhbWVyYUlkLnN0cmluZygpLCBwcmludGFibGVQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZHVtcFZlY3RvcltwcmludElkeF0uY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZHByaW50ZihvdXRGZCwgIlxuIik7CisgICAgICAgIHBhY2thZ2VOYW1lOC51bmxvY2tCdWZmZXIoKTsKKyAgICAgICAgcHJpbnRlZFNvbWV0aGluZyA9IHRydWU7CisKKyAgICAgICAgY29ubmVjdGVkTW9uaXRvcmVkQ2xpZW50cy5lbXBsYWNlKGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorICAgIGlmIChzZXJ2aWNlTG9jaykgeyBtU2VydmljZUxvY2sudW5sb2NrKCk7IH0KKworICAgIC8vIFByaW50IGVudHJpZXMgaW4gbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlIGZvciBjbGllbnRzIHRoYXQgYXJlIG5vdCBjb25uZWN0ZWQKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmt2OiBtV2F0Y2hlZENsaWVudHNEdW1wQ2FjaGUpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nMTYgJnBhY2thZ2UgPSBrdi5maXJzdDsKKyAgICAgICAgaWYgKGNvbm5lY3RlZE1vbml0b3JlZENsaWVudHMuZmluZChwYWNrYWdlKSAhPSBjb25uZWN0ZWRNb25pdG9yZWRDbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGRwcmludGYob3V0RmQsICJDbGllbnQ6ICVzIChjYWNoZWQpXG4iLCBTdHJpbmc4KHBhY2thZ2UpLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIiVzXG4iLCBrdi5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgIHByaW50ZWRTb21ldGhpbmcgPSB0cnVlOworICAgIH0KKworICAgIGlmICghcHJpbnRlZFNvbWV0aGluZykgeworICAgICAgICBkcHJpbnRmKG91dEZkLCAiTm8gbW9uaXRvcmluZyBpbmZvcm1hdGlvbiB0byBwcmludC5cbiIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8gUHJpbnQgYWxsIGV2ZW50cyBpbiB2ZWN0b3IgYGV2ZW50cycgdGhhdCBjYW1lIGFmdGVyIGxhc3RQcmludGVkRXZlbnQKK3ZvaWQgcHJpbnROZXdXYXRjaGVkRXZlbnRzKGludCBvdXRGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgJnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbGFzdFByaW50ZWRFdmVudCkgeworICAgIGlmIChldmVudHMuZW1wdHkoKSkgeyByZXR1cm47IH0KKworICAgIC8vIGluZGV4IG9mIGxhc3RQcmludGVkRXZlbnQgaW4gZXZlbnRzLgorICAgIC8vIGxhc3RQcmludGVkSWR4ID0gZXZlbnRzLnNpemUoKSBpZiBsYXN0UHJpbnRlZEV2ZW50IGlzIG5vdCBpbiBldmVudHMKKyAgICBzaXplX3QgbGFzdFByaW50ZWRJZHg7CisgICAgZm9yIChsYXN0UHJpbnRlZElkeCA9IDA7CisgICAgICAgICBsYXN0UHJpbnRlZElkeCA8IGV2ZW50cy5zaXplKCkgJiYgbGFzdFByaW50ZWRFdmVudCAhPSBldmVudHNbbGFzdFByaW50ZWRJZHhdOworICAgICAgICAgbGFzdFByaW50ZWRJZHgrKyk7CisKKyAgICBpZiAobGFzdFByaW50ZWRJZHggPT0gMCkgeyByZXR1cm47IH0gLy8gZWFybHkgZXhpdCBpZiBubyBuZXcgZXZlbnQgaW4gYGV2ZW50c2AKKworICAgIFN0cmluZzggcGFja2FnZU5hbWU4KHBhY2thZ2VOYW1lKTsKKyAgICBjb25zdCBjaGFyICpwcmludGFibGVQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOC5sb2NrQnVmZmVyKHBhY2thZ2VOYW1lOC5zaXplKCkpOworCisgICAgLy8gcHJpbnQgZXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKGxhdGVzdCBldmVudCBsYXN0KQorICAgIHNpemVfdCBpZHhUb1ByaW50ID0gbGFzdFByaW50ZWRJZHg7CisgICAgZG8geworICAgICAgICBpZHhUb1ByaW50LS07CisgICAgICAgIGRwcmludGYob3V0RmQsICIlczolcyAgJXMiLCBjYW1lcmFJZCwgcHJpbnRhYmxlUGFja2FnZU5hbWUsIGV2ZW50c1tpZHhUb1ByaW50XS5jX3N0cigpKTsKKyAgICB9IHdoaWxlIChpZHhUb1ByaW50ICE9IDApOworCisgICAgcGFja2FnZU5hbWU4LnVubG9ja0J1ZmZlcigpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgYWRiIHNoZWxsIGNtZCB3YXRjaCBzaG91bGQgYmUgaW50ZXJydXB0ZWQgYmFzZWQgb24gZGF0YSBpbiBpbkZkLiBUaGUgd2F0Y2gKKy8vIGNvbW1hbmQgc2hvdWxkIGJlIGludGVycnVwdGVkIGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIHJldHVybiBrZXksIG9yIGlmIHVzZXIgbG9zZXMgYW55IHdheSB0bworLy8gc2lnbmFsIGludGVycnVwdC4KKy8vIElmIHRpbWVvdXRNcyA9PSAwLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZQorYm9vbCBzaG91bGRJbnRlcnJ1cHRXYXRjaENvbW1hbmQoaW50IGluRmQsIGludCBvdXRGZCwgbG9uZyB0aW1lb3V0TXMpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydFRpbWU7CisgICAgaW50IHN0YXJ0VGltZUVycm9yID0gZ2V0dGltZW9mZGF5KCZzdGFydFRpbWUsIG51bGxwdHIpOworICAgIGlmIChzdGFydFRpbWVFcnJvcikgeworICAgICAgICBkcHJpbnRmKG91dEZkLCAiRmFpbGVkIHdhaXRpbmcgZm9yIGludGVycnVwdCwgYWJvcnRpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgbmZkc190IG51bUZkcyA9IDE7CisgICAgc3RydWN0IHBvbGxmZCBwb2xsRmQgPSB7IC5mZCA9IGluRmQsIC5ldmVudHMgPSBQT0xMSU4sIC5yZXZlbnRzID0gMCB9OworCisgICAgc3RydWN0IHRpbWV2YWwgY3VyclRpbWU7CisgICAgY2hhciBidWZmZXJbMl07CisgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICBpbnQgY3VyclRpbWVFcnJvciA9IGdldHRpbWVvZmRheSgmY3VyclRpbWUsIG51bGxwdHIpOworICAgICAgICBpZiAoY3VyclRpbWVFcnJvcikgeworICAgICAgICAgICAgZHByaW50ZihvdXRGZCwgIkZhaWxlZCB3YWl0aW5nIGZvciBpbnRlcnJ1cHQsIGFib3J0aW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgZWxhcHNlZFRpbWVNcyA9ICgoY3VyclRpbWUudHZfc2VjIC0gc3RhcnRUaW1lLnR2X3NlYykgKiAxMDAwTCkKKyAgICAgICAgICAgICAgICArICgoY3VyclRpbWUudHZfdXNlYyAtIHN0YXJ0VGltZS50dl91c2VjKSAvIDEwMDBMKTsKKyAgICAgICAgaW50IHJlbWFpbmluZ1RpbWVNcyA9IChpbnQpICh0aW1lb3V0TXMgLSBlbGFwc2VkVGltZU1zKTsKKworICAgICAgICBpZiAocmVtYWluaW5nVGltZU1zIDw9IDApIHsKKyAgICAgICAgICAgIC8vIE5vIHVzZXIgaW50ZXJydXB0IHdpdGhpbiB0aW1lb3V0TXMsIGRvbid0IGludGVycnVwdCB3YXRjaCBjb21tYW5kCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtRmRzVXBkYXRlZCA9IHBvbGwoJnBvbGxGZCwgbnVtRmRzLCByZW1haW5pbmdUaW1lTXMpOworICAgICAgICBpZiAobnVtRmRzVXBkYXRlZCA8IDApIHsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICJGYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBpbnB1dC4gRXhpdGluZy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtRmRzVXBkYXRlZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBObyB1c2VyIGlucHV0IHdpdGhpbiB0aW1lb3V0TXMsIGRvbid0IGludGVycnVwdCB3YXRjaCBjb21tYW5kCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShwb2xsRmQucmV2ZW50cyAmIFBPTExJTikpIHsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICJGYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBpbnB1dC4gRXhpdGluZy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IHNpemVSZWFkID0gcmVhZChpbkZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSk7CisgICAgICAgIGlmIChzaXplUmVhZCA8IDApIHsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICJFcnJvciByZWFkaW5nIHVzZXIgaW5wdXQuIEV4aXRpbmcuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNpemVSZWFkID09IDApIHsKKyAgICAgICAgICAgIC8vIFJlYWNoZWQgZW5kIG9mIGlucHV0IGZkIChjYW4gaGFwcGVuIGlmIGlucHV0IGlzIHBpcGVkKQorICAgICAgICAgICAgLy8gVXNlciBoYXMgbm8gd2F5IHRvIHNpZ25hbCBhbiBpbnRlcnJ1cHQsIHNvIGludGVycnVwdCBoZXJlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZmZXJbMF0gPT0gJ1xuJykgeworICAgICAgICAgICAgLy8gVXNlciBwcmVzc2VkIHJldHVybiwgaW50ZXJydXB0IHdhdGNoIGNvbW1hbmQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRXYXRjaGVkVGFnc1VudGlsSW50ZXJydXB0KGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluRmQsIGludCBvdXRGZCkgeworICAgIC8vIEZpZ3VyZSBvdXQgcmVmcmVzaCBpbnRlcnZhbCwgaWYgcHJlc2VudCBpbiBhcmdzCisgICAgbG9uZyByZWZyZXNoVGltZW91dE1zID0gMTAwMEw7IC8vIHJlZnJlc2ggZXZlcnkgMXMgYnkgZGVmYXVsdAorICAgIGlmIChhcmdzLnNpemUoKSA+IDIpIHsKKyAgICAgICAgc2l6ZV90IGludGVydmFsSWR4OyAvLyBpbmRleCBvZiAnLW4nCisgICAgICAgIGZvciAoaW50ZXJ2YWxJZHggPSAyOyBpbnRlcnZhbElkeCA8IGFyZ3Muc2l6ZSgpICYmIFN0cmluZzE2KCItbiIpICE9IGFyZ3NbaW50ZXJ2YWxJZHhdOworICAgICAgICAgICAgIGludGVydmFsSWR4KyspOworCisgICAgICAgIHNpemVfdCBpbnRlcnZhbFZhbElkeCA9IGludGVydmFsSWR4ICsgMTsKKyAgICAgICAgaWYgKGludGVydmFsVmFsSWR4IDwgYXJncy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJlZnJlc2hUaW1lb3V0TXMgPSBzdHJ0b2woU3RyaW5nOChhcmdzW2ludGVydmFsVmFsSWR4XS5zdHJpbmcoKSksIG51bGxwdHIsIDEwKTsKKyAgICAgICAgICAgIGlmIChlcnJubykgeyByZXR1cm4gQkFEX1ZBTFVFOyB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgbWluIHRpbWVvdXQgb2YgMTBtcy4gVGhpcyBwcmV2ZW50cyBlZGdlIGNhc2VzIGluIHBvbGxpbmcgd2hlbiB0aW1lb3V0IG9mIDAgaXMgcGFzc2VkLgorICAgIHJlZnJlc2hUaW1lb3V0TXMgPSByZWZyZXNoVGltZW91dE1zIDwgMTAgPyAxMCA6IHJlZnJlc2hUaW1lb3V0TXM7CisKKyAgICBkcHJpbnRmKG91dEZkLCAiUHJlc3MgcmV0dXJuIHRvIGV4aXQuLi5cblxuIik7CisgICAgc3RkOjptYXA8U3RyaW5nMTYsIHN0ZDo6c3RyaW5nPiBwYWNrYWdlTmFtZVRvTGFzdEV2ZW50OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgYm9vbCBzZXJ2aWNlTG9jayA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgYXV0byBjYW1lcmFDbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgICAgIGlmIChzZXJ2aWNlTG9jaykgeyBtU2VydmljZUxvY2sudW5sb2NrKCk7IH0KKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudERlc2NyaXB0b3IgOiBjYW1lcmFDbGllbnRzKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisKKyAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgICAgICBpZiAoIWlzQ2xpZW50V2F0Y2hlZExvY2tlZChjbGllbnQuZ2V0KCkpKSB7IGNvbnRpbnVlOyB9CisKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZwYWNrYWdlTmFtZSA9IGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgIC8vIFRoaXMgYWxzbyBpbml0aWFsaXplcyB0aGUgbWFwIGVudHJpZXMgd2l0aCBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYXN0UHJpbnRlZEV2ZW50ID0gcGFja2FnZU5hbWVUb0xhc3RFdmVudFtwYWNrYWdlTmFtZV07CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsYXRlc3RFdmVudHM7CisgICAgICAgICAgICBjbGllbnQtPmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3IobGF0ZXN0RXZlbnRzKTsKKworICAgICAgICAgICAgaWYgKCFsYXRlc3RFdmVudHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZzggY2FtZXJhSWQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmludGFibGVDYW1lcmFJZCA9IGNhbWVyYUlkLmxvY2tCdWZmZXIoY2FtZXJhSWQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBwcmludE5ld1dhdGNoZWRFdmVudHMob3V0RmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50YWJsZUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0RXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJpbnRlZEV2ZW50KTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZVRvTGFzdEV2ZW50W3BhY2thZ2VOYW1lXSA9IGxhdGVzdEV2ZW50c1swXTsKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC51bmxvY2tCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkSW50ZXJydXB0V2F0Y2hDb21tYW5kKGluRmQsIG91dEZkLCByZWZyZXNoVGltZW91dE1zKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OnBhcnNlQ2xpZW50c1RvV2F0Y2hMb2NrZWQoU3RyaW5nOCBjbGllbnRzKSB7CisgICAgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5jbGVhcigpOworCisgICAgY29uc3QgY2hhciAqYWxsU2VudGluZWwgPSBTdHJpbmc4KGtXYXRjaEFsbENsaWVudHNGbGFnKS5zdHJpbmcoKTsKKworICAgIGNoYXIgKnRva2VuaXplZCA9IGNsaWVudHMubG9ja0J1ZmZlcihjbGllbnRzLnNpemUoKSk7CisgICAgY2hhciAqc2F2ZVB0cjsKKyAgICBjaGFyICpuZXh0Q2xpZW50ID0gc3RydG9rX3IodG9rZW5pemVkLCAiLCIsICZzYXZlUHRyKTsKKworICAgIHdoaWxlIChuZXh0Q2xpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0cmNtcChuZXh0Q2xpZW50LCBhbGxTZW50aW5lbCkgPT0gMCkgeworICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byB0cmFjayBhbnkgb3RoZXIgcGFja2FnZSBpZiAnYWxsJyBpcyBwcmVzZW50CisgICAgICAgICAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmNsZWFyKCk7CisgICAgICAgICAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmVtcGxhY2Uoa1dhdGNoQWxsQ2xpZW50c0ZsYWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmFjayBwYWNrYWdlIG5hbWVzCisgICAgICAgIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuZW1wbGFjZShuZXh0Q2xpZW50KTsKKyAgICAgICAgbmV4dENsaWVudCA9IHN0cnRva19yKG51bGxwdHIsICIsIiwgJnNhdmVQdHIpOworICAgIH0KKyAgICBjbGllbnRzLnVubG9ja0J1ZmZlcigpOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpwcmludEhlbHAoaW50IG91dCkgewogICAgIHJldHVybiBkcHJpbnRmKG91dCwgIkNhbWVyYSBzZXJ2aWNlIGNvbW1hbmRzOlxuIgogICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBbLS11c2VyIFVTRVJfSURdIGdldHMgdGhlIHVpZCBzdGF0ZVxuIgpAQCAtNDU4MSw5ICs1MzQyLDIwIEBACiAgICAgICAgICIgICAgICBWYWxpZCB2YWx1ZXMgMD1PRkYsIDE9T04gZm9yIEpQRUdcbiIKICAgICAgICAgIiAgZ2V0LWltYWdlLWR1bXAtbWFzayByZXR1cm5zIHRoZSBjdXJyZW50IGltYWdlLWR1bXAtbWFzayB2YWx1ZVxuIgogICAgICAgICAiICBzZXQtY2FtZXJhLW11dGUgPDAvMT4gZW5hYmxlIG9yIGRpc2FibGUgY2FtZXJhIG11dGluZ1xuIgorICAgICAgICAiICB3YXRjaCA8c3RhcnR8c3RvcHxkdW1wfHByaW50fGNsZWFyPiBtYW5hZ2VzIHRhZyBtb25pdG9yaW5nIGluIGNvbm5lY3RlZCBjbGllbnRzXG4iCiAgICAgICAgICIgIGhlbHAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKIH0KIAorYm9vbCBDYW1lcmFTZXJ2aWNlOjppc0NsaWVudFdhdGNoZWQoY29uc3QgQmFzaWNDbGllbnQgKmNsaWVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2dMb2NrKTsKKyAgICByZXR1cm4gaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNsaWVudCk7Cit9CisKK2Jvb2wgQ2FtZXJhU2VydmljZTo6aXNDbGllbnRXYXRjaGVkTG9ja2VkKGNvbnN0IEJhc2ljQ2xpZW50ICpjbGllbnQpIHsKKyAgICByZXR1cm4gbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5maW5kKGtXYXRjaEFsbENsaWVudHNGbGFnKSAhPSBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmVuZCgpIHx8CisgICAgICAgICAgIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuZmluZChjbGllbnQtPmdldFBhY2thZ2VOYW1lKCkpICE9IG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuZW5kKCk7Cit9CisKIGludDMyX3QgQ2FtZXJhU2VydmljZTo6dXBkYXRlQXVkaW9SZXN0cmljdGlvbigpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgIHJldHVybiB1cGRhdGVBdWRpb1Jlc3RyaWN0aW9uTG9ja2VkKCk7CkBAIC00NjA1LDEwICs1Mzc3LDQzIEBACiAgICAgcmV0dXJuIG1vZGU7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6c3RvcEluamVjdGlvbkltcGwoKSB7Ci0gICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5yZW1vdmVMaXN0ZW5lcigpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2hlY2tJZkluamVjdGlvbkNhbWVyYUlzUHJlc2VudChjb25zdCBTdHJpbmc4JiBleHRlcm5hbENhbUlkLAorICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3ApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IGxvY2sgPQorICAgICAgICAgICAgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKG1TZXJ2aWNlTG9ja1dyYXBwZXIpOworICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgIGlmICgocmVzID0gY2hlY2tJZkRldmljZUlzVXNhYmxlKGV4dGVybmFsQ2FtSWQpKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiRGV2aWNlICVzIGlzIG5vdCB1c2FibGUhIiwgZXh0ZXJuYWxDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+bm90aWZ5SW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgZXh0ZXJuYWxDYW1JZCwgVU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgICAgIGNsaWVudFNwLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkpOwogCi0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoZSBzdG9wIGluamVjdGlvbiBmdW5jdGlvbi4KKyAgICAgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0IHJldGFpbiB0aGUgY29uZGl0aW9uIGJsb2NraW5nCisgICAgICAgIC8vIG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nIGluIG1TZXJ2aWNlTG9ja1dyYXBwZXIgaWYgaGVsZAorICAgICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBjbGllbnRTcC0+ZGlzY29ubmVjdCgpOworICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICAgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jaworICAgICAgICBtU2VydmljZUxvY2subG9jaygpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Y2xlYXJJbmplY3Rpb25QYXJhbWV0ZXJzKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvblBhcmFtZXRlcnNMb2NrKTsKKyAgICAgICAgbUluamVjdGlvbkluaXRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgIG1JbmplY3Rpb25JbnRlcm5hbENhbUlkID0gIiI7CisgICAgfQorICAgIG1JbmplY3Rpb25FeHRlcm5hbENhbUlkID0gIiI7CisgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5yZW1vdmVMaXN0ZW5lcigpOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IGJjMmUzNDcuLmQ5NmVhMDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJtZWRpYS9SaW5nQnVmZmVyLmgiCiAjaW5jbHVkZSAidXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suaCIKICNpbmNsdWRlICJ1dGlscy9DbGllbnRNYW5hZ2VyLmgiCisjaW5jbHVkZSAidXRpbHMvSVBDVHJhbnNwb3J0LmgiCiAKICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMTA2LDEyICsxMDcsMjAgQEAKICAgICAvLyBIQUwgQ2FsbGJhY2tzIC0gaW1wbGVtZW50cyBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyCiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgb3ZlcnJpZGU7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3SGFsU3RhdHVzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdIYWxTdGF0dXMpIG92ZXJyaWRlOworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgb3ZlcnJpZGU7CisgICAgLy8gVGhpcyBtZXRob2QgbWF5IGhvbGQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptSW50ZXJmYWNlTXV0ZXggYXMgYSBwYXJ0CisgICAgLy8gb2YgY2FsbGluZyBnZXRTeXN0ZW1DYW1lcmFLaW5kKCkgaW50ZXJuYWxseS4gQ2FyZSBzaG91bGQgYmUgdGFrZW4gbm90IHRvCisgICAgLy8gZGlyZWN0bHkgLyBpbmRpcmVjdGx5IGNhbGwgdGhpcyBmcm9tIGNhbGxlcnMgd2hvIGFsc28gaG9sZAorICAgIC8vIG1JbnRlcmZhY2VNdXRleC4KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOworICAgIC8vIERvZXMgbm90IGhvbGQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptSW50ZXJmYWNlTXV0ZXguCisgICAgdmlydHVhbCB2b2lkICAgICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsCisgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGtpbmQpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSBvdmVycmlkZTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTY0LDYgKzE3MywxMiBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkLAogICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGNsaWVudEJpbmRlcik7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoLCBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpOworCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncyk7CiAKQEAgLTIyOCw3ICsyNDMsNyBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2FtZXJhRGV2aWNlRmFjdG9yeSBmdW5jdGlvbmFsaXR5Ci0gICAgaW50ICAgICAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQqIGZhY2luZyA9IG51bGxwdHIsCisgICAgc3RkOjpwYWlyPGludCwgSVBDVHJhbnNwb3J0PiAgICBnZXREZXZpY2VWZXJzaW9uKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQqIGZhY2luZyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQqIG9yaWVudGF0aW9uID0gbnVsbHB0cik7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI3Miw2ICsyODcsMTAgQEAKICAgICAgICAgLy8gSW50ZXJuYWwgZHVtcCBtZXRob2QgdG8gYmUgY2FsbGVkIGJ5IENhbWVyYVNlcnZpY2UKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncywgaW50IG91dEZkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXRGZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCk7CisKICAgICAgICAgLy8gUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoaXMgY2xpZW50CiAgICAgICAgIHZpcnR1YWwgU3RyaW5nMTYgZ2V0UGFja2FnZU5hbWUoKSBjb25zdDsKIApAQCAtMzIwLDEwICszMzksMTkgQEAKICAgICAgICAgLy8gU2V0L3Jlc2V0IGNhbWVyYSBtdXRlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FtZXJhTXV0ZShib29sIGVuYWJsZWQpID0gMDsKIAorICAgICAgICAvLyBUaGUgaW5qZWN0aW9uIGNhbWVyYSBzZXNzaW9uIHRvIHJlcGxhY2UgdGhlIGludGVybmFsIGNhbWVyYQorICAgICAgICAvLyBzZXNzaW9uLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgPSAwOworCisgICAgICAgIC8vIFN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIHJlc3RvcmUgdG8gaW50ZXJuYWwgY2FtZXJhIHNlc3Npb24uCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEluamVjdGlvbigpID0gMDsKKwogICAgIHByb3RlY3RlZDoKICAgICAgICAgQmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBib29sIG5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC0zNDYsNiArMzc0LDcgQEAKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhRmFjaW5nOwogICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsKICAgICAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWU7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbU5hdGl2ZUNsaWVudDsKICAgICAgICAgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gICAgICAgICBtQ2xpZW50RmVhdHVyZUlkOwogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKQEAgLTQzMyw2ICs0NjIsNyBAQAogICAgICAgICBDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsCiAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKQEAgLTUxNiwxNCArNTQ2LDE1IEBACiAgICAgICAgICAqLwogICAgICAgICBzdGF0aWMgRGVzY3JpcHRvclB0ciBtYWtlQ2xpZW50RGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3N0LCBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLAotICAgICAgICAgICAgICAgIGludDMyX3Qgb3duZXJJZCwgaW50MzJfdCBzdGF0ZSwgaW50IG9vbVNjb3JlT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsIGludCBvb21TY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNYWtlIGEgQ2xpZW50RGVzY3JpcHRvciBvYmplY3Qgd3JhcHBpbmcgdGhlIGdpdmVuIEJhc2ljQ2xpZW50IHN0cm9uZyBwb2ludGVyIHdpdGgKICAgICAgICAgICogdmFsdWVzIGludGlhbGl6ZWQgZnJvbSBhIHByaW9yIENsaWVudERlc2NyaXB0b3IuCiAgICAgICAgICAqLwogICAgICAgICBzdGF0aWMgRGVzY3JpcHRvclB0ciBtYWtlQ2xpZW50RGVzY3JpcHRvcihjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLAotICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIHBhcnRpYWwsIGludCBvb21TY29yZU9mZnNldCk7CisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCwgaW50IG9vbVNjb3JlT2Zmc2V0LAorICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KTsKIAogICAgIH07IC8vIGNsYXNzIENhbWVyYUNsaWVudE1hbmFnZXIKIApAQCAtNTMyLDggKzU2Myw2IEBACiAKIHByaXZhdGU6CiAKLSAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIENhbWVyYURldmljZVN0YXR1czsKLQogICAgIC8qKgogICAgICAqIFR5cGVzYWZlIHZlcnNpb24gb2YgZGV2aWNlIHN0YXR1cywgY29udGFpbmluZyBib3RoIHRoZSBIQUwtbGF5ZXIgYW5kIHRoZSBzZXJ2aWNlIGludGVyZmFjZS0KICAgICAgKiBsYXllciB2YWx1ZXMuCkBAIC01NjMsNyArNTkyLDcgQEAKICAgICAgICAgICogcmV0dXJuZWQgaW4gdGhlIEhBTCdzIGNhbWVyYV9pbmZvIHN0cnVjdCBmb3IgZWFjaCBkZXZpY2UuCiAgICAgICAgICAqLwogICAgICAgICBDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZywKLSAgICAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQpOworICAgICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgZGV2aWNlS2luZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwaHlzaWNhbENhbWVyYXMpOwogICAgICAgICB2aXJ0dWFsIH5DYW1lcmFTdGF0ZSgpOwogCiAgICAgICAgIC8qKgpAQCAtNjIxLDEyICs2NTAsMjQgQEAKICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBnZXRTeXN0ZW1DYW1lcmFLaW5kKCkgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgY2FtZXJhIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgYW5kIGhhcyBhCisgICAgICAgICAqIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgY29udGFpbnNQaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCkgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZC9SZW1vdmUgdGhlIHVuYXZhaWxhYmxlIHBoeXNpY2FsIGNhbWVyYSBJRC4KICAgICAgICAgICovCiAgICAgICAgIGJvb2wgYWRkVW5hdmFpbGFibGVQaHlzaWNhbElkKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpOwogICAgICAgICBib29sIHJlbW92ZVVuYXZhaWxhYmxlUGh5c2ljYWxJZChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGFuZCBnZXQgY2xpZW50IHBhY2thZ2UgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0Q2xpZW50UGFja2FnZShjb25zdCBTdHJpbmc4JiBjbGllbnRQYWNrYWdlKTsKKyAgICAgICAgU3RyaW5nOCBnZXRDbGllbnRQYWNrYWdlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybiB0aGUgdW5hdmFpbGFibGUgcGh5c2ljYWwgaWRzIGZvciB0aGlzIGRldmljZS4KICAgICAgICAgICoKICAgICAgICAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgbVN0YXR1c0xvY2suCkBAIC02MzgsOSArNjc5LDExIEBACiAgICAgICAgIGNvbnN0IGludCBtQ29zdDsKICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gbUNvbmZsaWN0aW5nOwogICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBtVW5hdmFpbGFibGVQaHlzaWNhbElkczsKKyAgICAgICAgU3RyaW5nOCBtQ2xpZW50UGFja2FnZTsKICAgICAgICAgbXV0YWJsZSBNdXRleCBtU3RhdHVzTG9jazsKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtU2hpbVBhcmFtczsKICAgICAgICAgY29uc3QgU3lzdGVtQ2FtZXJhS2luZCBtU3lzdGVtQ2FtZXJhS2luZDsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbENhbWVyYXM7IC8vIEVtcHR5IGlmIG5vdCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhCiAgICAgfTsgLy8gY2xhc3MgQ2FtZXJhU3RhdGUKIAogICAgIC8vIE9ic2VydmVyIGZvciBVSUQgbGlmZWN5Y2xlIGVuZm9yY2luZyB0aGF0IFVJRHMgaW4gaWRsZQpAQCAtNjU2LDExICs2OTksMTMgQEAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKICAgICAgICAgaW50MzJfdCBnZXRQcm9jU3RhdGUodWlkX3QgdWlkKTsKIAotICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOwotICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCk7Ci0gICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CisgICAgICAgIC8vIElVaWRPYnNlcnZlcgorICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSwgaW50NjRfdCBwcm9jU3RhdGVTZXEsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhYmlsaXR5KTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFiaWxpdHkpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkUHJvY0FkakNoYW5nZWQodWlkX3QgdWlkKSBvdmVycmlkZTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlKTsKICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKQEAgLTY3NSwxMyArNzIwLDE4IEBACiAgICAgICAgIGludDMyX3QgZ2V0UHJvY1N0YXRlTG9ja2VkKHVpZF90IHVpZCk7CiAgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKIAorICAgICAgICBzdHJ1Y3QgTW9uaXRvcmVkVWlkIHsKKyAgICAgICAgICAgIGludDMyX3QgcHJvY1N0YXRlOworICAgICAgICAgICAgc2l6ZV90IHJlZkNvdW50OworICAgICAgICB9OworCiAgICAgICAgIE11dGV4IG1VaWRMb2NrOwogICAgICAgICBib29sIG1SZWdpc3RlcmVkOwogICAgICAgICBBY3Rpdml0eU1hbmFnZXIgbUFtOwogICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBtQWN0aXZlVWlkczsKLSAgICAgICAgLy8gTW9uaXRvcmVkIHVpZCBtYXAgdG8gY2FjaGVkIHByb2NTdGF0ZSBhbmQgcmVmQ291bnQgcGFpcgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiBtTW9uaXRvcmVkVWlkczsKKyAgICAgICAgLy8gTW9uaXRvcmVkIHVpZCBtYXAKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBNb25pdG9yZWRVaWQ+IG1Nb25pdG9yZWRVaWRzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7CiAgICAgfTsgLy8gY2xhc3MgVWlkUG9saWN5CiAKQEAgLTY5Nyw5ICs3NDcsMTAgQEAKICAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKIAogICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7Ci0gICAgICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQodXNlcmlkX3QgdXNlcklkKTsKKyAgICAgICAgICAgIGJvb2wgaXNDYW1lcmFQcml2YWN5RW5hYmxlZCgpOwogCi0gICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGludCB0b2dnbGVUeXBlLCBpbnQgc2Vuc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpOwogCiAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CkBAIC03NDUsNyArNzk2LDcgQEAKICAgICAvLyBPbmx5IGNhbGwgd2l0aCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkLgogICAgIHN0YXR1c190IGhhbmRsZUV2aWN0aW9uc0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywgY29uc3QgU3RyaW5nOCYgcGFja2FnZU5hbWUsCi0gICAgICAgIGludCBzY29yZU9mZnNldCwKKyAgICAgICAgaW50IHNjb3JlT2Zmc2V0LCBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxCYXNpY0NsaWVudD4qIGNsaWVudCwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiogcGFydGlhbCk7CkBAIC03NzcsNyArODI4LDcgQEAKICAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJldHdlZW4gdGhlIHZhcmlvdXMgY29ubmVjdCBjYWxscwogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIGludCBzY29yZU9mZnNldCwgaW50IHRhcmdldFNka1ZlcnNpb24sCiAgICAgICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKQEAgLTgxMCw2ICs4NjEsMTQgQEAKICAgICBSaW5nQnVmZmVyPFN0cmluZzg+IG1FdmVudExvZzsKICAgICBNdXRleCBtTG9nTG9jazsKIAorICAgIC8vIHNldCBvZiBjbGllbnQgcGFja2FnZSBuYW1lcyB0byB3YXRjaC4gaWYgdGhpcyBzZXQgY29udGFpbnMgJ2FsbCcsIHRoZW4gYWxsIGNsaWVudHMgd2lsbAorICAgIC8vIGJlIHdhdGNoZWQuIEFjY2VzcyBzaG91bGQgYmUgZ3VhcmRlZCBieSBtTG9nTG9jaworICAgIHN0ZDo6c2V0PFN0cmluZzE2PiBtV2F0Y2hlZENsaWVudFBhY2thZ2VzOworICAgIC8vIGNhY2hlIG9mIGxhc3QgbW9uaXRvcmVkIHRhZ3MgZHVtcCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gSWYgYSBjbGllbnQKKyAgICAvLyByZS1jb25uZWN0cywgaXRzIGVudHJ5IGlzIG5vdCB1cGRhdGVkIHVudGlsIGl0IGRpc2Nvbm5lY3RzIGFnYWluLiBBY2Nlc3Mgc2hvdWxkIGJlIGd1YXJkZWQKKyAgICAvLyBieSBtTG9nTG9jaworICAgIHN0ZDo6bWFwPFN0cmluZzE2LCBzdGQ6OnN0cmluZz4gbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlOworCiAgICAgLy8gVGhlIGxhc3QgbW9uaXRvcmVkIHRhZ3Mgc2V0IGJ5IGNsaWVudAogICAgIFN0cmluZzggbU1vbml0b3JUYWdzOwogCkBAIC04NDYsNyArOTA1LDcgQEAKICAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkLgogICAgICAqLwogICAgIHZvaWQgZmluaXNoQ29ubmVjdExvY2tlZChjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwgY29uc3QgRGVzY3JpcHRvclB0ciYgZGVzYywKLSAgICAgICAgICAgIGludCBvb21TY29yZU9mZnNldCk7CisgICAgICAgICAgICBpbnQgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgY2FtZXJhIElkIHN0cmluZyBtYXBwZWQgdG8gYSBjYW1lcmEgaWQgaW50CkBAIC05NDIsNiArMTAwMSw4IEBACiAgICAgICovCiAgICAgdm9pZCBkdW1wRXZlbnRMb2coaW50IGZkKTsKIAorICAgIHZvaWQgY2FjaGVDbGllbnRUYWdEdW1wSWZOZWVkZWQoY29uc3QgY2hhciAqY2FtZXJhSWQsIEJhc2ljQ2xpZW50ICpjbGllbnQpOworCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBhY3F1aXJlIG1TZXJ2aWNlTG9jawogICAgICAqLwpAQCAtMTA1Miw3ICsxMTEzLDcgQEAKICAgICAvLyBndWFyZCBtVG9yY2hVaWRNYXAKICAgICBNdXRleCAgICAgICAgICAgICAgICBtVG9yY2hVaWRNYXBNdXRleDsKICAgICAvLyBjYW1lcmEgaWQgLT4gdG9yY2ggc3RhdHVzCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXM+CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgVG9yY2hNb2RlU3RhdHVzPgogICAgICAgICAgICAgbVRvcmNoU3RhdHVzTWFwOwogICAgIC8vIGNhbWVyYSBpZCAtPiB0b3JjaCBjbGllbnQgYmluZGVyCiAgICAgLy8gb25seSBzdG9yZSB0aGUgbGFzdCBjbGllbnQgdGhhdCB0dXJucyBvbiBlYWNoIGNhbWVyYSdzIHRvcmNoIG1vZGUKQEAgLTEwNjYsMTYgKzExMjcsMTYgQEAKICAgICAvLyBoYW5kbGUgdG9yY2ggbW9kZSBzdGF0dXMgY2hhbmdlIGFuZCBpbnZva2UgY2FsbGJhY2tzLiBtVG9yY2hTdGF0dXNNdXRleAogICAgIC8vIHNob3VsZCBiZSBsb2NrZWQuCiAgICAgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsCiAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpOwogCiAgICAgLy8gZ2V0IGEgY2FtZXJhJ3MgdG9yY2ggc3RhdHVzLiBtVG9yY2hTdGF0dXNNdXRleCBzaG91bGQgYmUgbG9ja2VkLgogICAgIHN0YXR1c190IGdldFRvcmNoU3RhdHVzTG9ja2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAotICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzICpzdGF0dXMpIGNvbnN0OworICAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyAqc3RhdHVzKSBjb25zdDsKIAogICAgIC8vIHNldCBhIGNhbWVyYSdzIHRvcmNoIHN0YXR1cy4gbVRvcmNoU3RhdHVzTXV0ZXggc2hvdWxkIGJlIGxvY2tlZC4KICAgICBzdGF0dXNfdCBzZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgc3RhdHVzKTsKIAogICAgIC8vIG5vdGlmeSBwaHlzaWNhbCBjYW1lcmEgc3RhdHVzIHdoZW4gdGhlIHBoeXNpY2FsIGNhbWVyYSBpcyBwdWJsaWMuCiAgICAgLy8gRXhwZWN0cyBtU3RhdHVzTGlzdGVuZXJMb2NrIHRvIGJlIGxvY2tlZC4KQEAgLTExMzQsOSArMTE5NSw0MyBAQAogICAgIC8vIFNldCB0aGUgY2FtZXJhIG11dGUgc3RhdGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRDYW1lcmFNdXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgLy8gSGFuZGxlICd3YXRjaCcgY29tbWFuZCBhcyBwYXNzZWQgdGhyb3VnaCAnY21kJworICAgIHN0YXR1c190IGhhbmRsZVdhdGNoQ29tbWFuZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLCBpbnQgaW5GZCwgaW50IG91dEZkKTsKKworICAgIC8vIEVuYWJsZSB0YWcgbW9uaXRvcmluZyBvZiB0aGUgZ2l2ZW4gdGFncyBpbiBwcm92aWRlZCBjbGllbnRzCisgICAgc3RhdHVzX3Qgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncywgaW50IG91dEZkKTsKKworICAgIC8vIERpc2FibGUgdGFnIG1vbml0b3JpbmcKKyAgICBzdGF0dXNfdCBzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXRGZCk7CisKKyAgICAvLyBDbGVhcnMgbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlCisgICAgc3RhdHVzX3QgY2xlYXJDYWNoZWRNb25pdG9yZWRUYWdEdW1wcyhpbnQgb3V0RmQpOworCisgICAgLy8gUHJpbnQgZXZlbnRzIG9mIG1vbml0b3JlZCB0YWdzIGluIGFsbCBjYWNoZWQgYW5kIGF0dGFjaGVkIGNsaWVudHMKKyAgICBzdGF0dXNfdCBwcmludFdhdGNoZWRUYWdzKGludCBvdXRGZCk7CisKKyAgICAvLyBQcmludCBldmVudHMgb2YgbW9uaXRvcmVkIHRhZ3MgaW4gYWxsIGF0dGFjaGVkIGNsaWVudHMgYXMgdGhleSBhcmUgY2FwdHVyZWQuIE5ldyBldmVudHMgYXJlCisgICAgLy8gZmV0Y2hlZCBldmVyeSBgcmVmcmVzaE1pbGxpc2AgbXMKKyAgICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB1bnRpbCB1c2VyIHBhc3NlcyAnXG4nIHRvIGluRmQuCisgICAgc3RhdHVzX3QgcHJpbnRXYXRjaGVkVGFnc1VudGlsSW50ZXJydXB0KGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MsIGludCBpbkZkLCBpbnQgb3V0RmQpOworCisgICAgLy8gUGFyc2VzIGNvbW1hIHNlcGFyYXRlZCBjbGllbnRzIGxpc3QgYW5kIGFkZHMgdGhlbSB0byBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLgorICAgIC8vIERvZXMgbm90IGFjcXVpcmUgbUxvZ0xvY2sgYmVmb3JlIG1vZGlmeWluZyBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLiBJdCBpcyB0aGUgY2FsbGVyJ3MKKyAgICAvLyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIG1Mb2dMb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgdm9pZCBwYXJzZUNsaWVudHNUb1dhdGNoTG9ja2VkKFN0cmluZzggY2xpZW50cyk7CisKICAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAogICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKIAorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjbGllbnQgc2hvdWxkIG1vbml0b3IgdGFncyBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4KKyAgICAvLyBBY3F1aXJlcyBtTG9nTG9jayBiZWZvcmUgcXVlcnlpbmcgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4KKyAgICBib29sIGlzQ2xpZW50V2F0Y2hlZChjb25zdCBCYXNpY0NsaWVudCAqY2xpZW50KTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjbGllbnQgc2hvdWxkIG1vbml0b3IgdGFncyBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4KKyAgICAvLyBEb2VzIG5vdCBhY3F1aXJlIG1Mb2dMb2NrIGJlZm9yZSBxdWVyeWluZyBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLiBJdCBpcyB0aGUgY2FsbGVyJ3MKKyAgICAvLyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIG1Mb2dMb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb25zLgorICAgIGJvb2wgaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNvbnN0IEJhc2ljQ2xpZW50ICpjbGllbnQpOworCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGFzIGEgZm9ybWF0dGVkIHN0cmluZy4KICAgICAgKi8KQEAgLTExNDQsMjIgKzEyMzksMjQgQEAKIAogICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBtYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgZmVhdHVyZUlkLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBmYWNpbmcsIGludCBzZW5zb3JPcmllbnRhdGlvbiwgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKLSAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CisgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sCisgICAgICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgc3RkOjpwYWlyPGludCwgSVBDVHJhbnNwb3J0PiBkZXZpY2VWZXJzaW9uQW5kSVBDVHJhbnNwb3J0LCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0NhbWVyYUFjY2Vzcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CiAKICAgICBzdGF0aWMgU3RyaW5nOCB0b1N0cmluZyhzdGQ6OnNldDx1c2VyaWRfdD4gaW50U2V0KTsKLSAgICBzdGF0aWMgaW50MzJfdCBtYXBUb0ludGVyZmFjZShoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpOwotICAgIHN0YXRpYyBTdGF0dXNJbnRlcm5hbCBtYXBUb0ludGVybmFsKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGludDMyX3QgbWFwVG9JbnRlcmZhY2UoVG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIFN0YXR1c0ludGVybmFsIG1hcFRvSW50ZXJuYWwoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CiAgICAgc3RhdGljIGludDMyX3QgbWFwVG9JbnRlcmZhY2UoU3RhdHVzSW50ZXJuYWwgc3RhdHVzKTsKIAogCiAgICAgdm9pZCBicm9hZGNhc3RUb3JjaE1vZGVTdGF0dXMoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpOworICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIHN0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKTsKKworICAgIHZvaWQgYnJvYWRjYXN0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQzMl90IG5ld1RvcmNoU3RyZW5ndGhMZXZlbCk7CiAKICAgICB2b2lkIGRpc2Nvbm5lY3RDbGllbnQoY29uc3QgU3RyaW5nOCYgaWQsIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUb0Rpc2Nvbm5lY3QpOwogCkBAIC0xMTY3LDYgKzEyNjQsMTAgQEAKICAgICAvLyBVc2Ugc2VwYXJhdGUga2V5cyBmb3Igb2ZmbGluZSBkZXZpY2VzLgogICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IGtPZmZsaW5lRGV2aWNlOwogCisgICAgLy8gU2VudGluZWwgdmFsdWUgdG8gYmUgc3RvcmVkIGluIGBtV2F0Y2hlZENsaWVudHNQYWNrYWdlc2AgdG8gaW5kaWNhdGUgdGhhdCBhbGwgY2xpZW50cyBzaG91bGQKKyAgICAvLyBiZSB3YXRjaGVkLgorICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBrV2F0Y2hBbGxDbGllbnRzRmxhZzsKKwogICAgIC8vIFRPRE86IHJpZ2h0IG5vdyBlYWNoIEJhc2ljQ2xpZW50IGhvbGRzIG9uZSBBcHBPcHNNYW5hZ2VyIGluc3RhbmNlLgogICAgIC8vIFdlIGNhbiByZWZhY3RvciB0aGUgY29kZSBzbyBhbGwgb2YgY2xpZW50cyBzaGFyZSB0aGlzIGluc3RhbmNlCiAgICAgQXBwT3BzTWFuYWdlciBtQXBwT3BzOwpAQCAtMTE5NCw3ICsxMjk1LDcgQEAKIAogICAgICAgICAgICAgdm9pZCBhZGRMaXN0ZW5lcihjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYUluamVjdGlvbkNhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgICAgICAgICAgdm9pZCByZW1vdmVMaXN0ZW5lcigpOwotICAgICAgICAgICAgdm9pZCBub3RpZnlJbmplY3Rpb25FcnJvcihpbnQgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIHZvaWQgbm90aWZ5SW5qZWN0aW9uRXJyb3IoU3RyaW5nOCBpbmplY3RlZENhbUlkLCBzdGF0dXNfdCBlcnIpOwogCiAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC0xMjIxLDcgKzEzMjIsMjIgQEAKICAgICAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1QYXJlbnQ7CiAgICAgfTsKIAotICAgIHZvaWQgc3RvcEluamVjdGlvbkltcGwoKTsKKyAgICAvLyBXaGVuIGluamVjdGluZyB0aGUgY2FtZXJhLCBpdCB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGluamVjdGluZyBjYW1lcmEgc3RhdHVzIGlzIHVuYXZhaWxhYmxlLgorICAgIC8vIElmIGl0IGlzLCB0aGUgZGlzY29ubmVjdCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byB0byBwcmV2ZW50IGNhbWVyYSBhY2Nlc3Mgb24gdGhlIGRldmljZS4KKyAgICBzdGF0dXNfdCBjaGVja0lmSW5qZWN0aW9uQ2FtZXJhSXNQcmVzZW50KGNvbnN0IFN0cmluZzgmIGV4dGVybmFsQ2FtSWQsCisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3ApOworCisgICAgdm9pZCBjbGVhckluamVjdGlvblBhcmFtZXRlcnMoKTsKKworICAgIC8vIFRoaXMgaXMgdGhlIGV4aXN0aW5nIGNhbWVyYSBpZCBiZWluZyByZXBsYWNlZC4KKyAgICBTdHJpbmc4IG1JbmplY3Rpb25JbnRlcm5hbENhbUlkOworICAgIC8vIFRoaXMgaXMgdGhlIGV4dGVybmFsIGNhbWVyYSBJZCByZXBsYWNpbmcgdGhlIGludGVybmFsSWQuCisgICAgU3RyaW5nOCBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZDsKKyAgICBib29sIG1JbmplY3Rpb25Jbml0UGVuZGluZyA9IGZhbHNlOworICAgIC8vIEd1YXJkIG1JbmplY3Rpb25JbnRlcm5hbENhbUlkIGFuZCBtSW5qZWN0aW9uSW5pdFBlbmRpbmcuCisgICAgTXV0ZXggbUluamVjdGlvblBhcmFtZXRlcnNMb2NrOworCisgICAgdm9pZCB1cGRhdGVUb3JjaFVpZE1hcExvY2tlZChjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGludCB1aWQpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZVdhdGNoZG9nLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkNmViZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmljZVdhdGNoZG9nIgorCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZVdhdGNoZG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2c6OnRocmVhZExvb3AoKQoreworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1XYXRjaGRvZ0xvY2spOworCisgICAgICAgIHdoaWxlIChtUGF1c2UpIHsKKyAgICAgICAgICAgIG1XYXRjaGRvZ0NvbmRpdGlvbi53YWl0KG1XYXRjaGRvZ0xvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMobUN5Y2xlTGVuZ3RoTXMpKTsKKworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1XYXRjaGRvZ0xvY2spOworCisgICAgICAgIGZvciAoYXV0byBpdCA9IHRpZFRvQ3ljbGVDb3VudGVyTWFwLmJlZ2luKCk7IGl0ICE9IHRpZFRvQ3ljbGVDb3VudGVyTWFwLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50VGhyZWFkSWQgPSBpdC0+Zmlyc3Q7CisKKyAgICAgICAgICAgIHRpZFRvQ3ljbGVDb3VudGVyTWFwW2N1cnJlbnRUaHJlYWRJZF0rKzsKKworICAgICAgICAgICAgaWYgKHRpZFRvQ3ljbGVDb3VudGVyTWFwW2N1cnJlbnRUaHJlYWRJZF0gPj0gbU1heEN5Y2xlcykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlV2F0Y2hkb2cgdHJpZ2dlcmluZyBraWxsIGZvciBwaWQ6ICVkIiwgZ2V0cGlkKCkpOworICAgICAgICAgICAgICAgIGtpbGwoZ2V0cGlkKCksIFNJR0tJTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVdhdGNoZG9nOjpyZXF1ZXN0RXhpdCgpCit7CisgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdCgpOworCisgICAgQXV0b011dGV4IF9sKG1XYXRjaGRvZ0xvY2spOworCisgICAgdGlkVG9DeWNsZUNvdW50ZXJNYXAuY2xlYXIoKTsKKworICAgIGlmIChtUGF1c2UpIHsKKyAgICAgICAgbVBhdXNlID0gZmFsc2U7CisgICAgICAgIG1XYXRjaGRvZ0NvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVdhdGNoZG9nOjpzdG9wKHVpbnQzMl90IHRpZCkKK3sKKyAgICBBdXRvTXV0ZXggX2wobVdhdGNoZG9nTG9jayk7CisKKyAgICB0aWRUb0N5Y2xlQ291bnRlck1hcC5lcmFzZSh0aWQpOworCisgICAgaWYgKHRpZFRvQ3ljbGVDb3VudGVyTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgbVBhdXNlID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVdhdGNoZG9nOjpzdGFydCh1aW50MzJfdCB0aWQpCit7CisgICAgQXV0b011dGV4IF9sKG1XYXRjaGRvZ0xvY2spOworCisgICAgdGlkVG9DeWNsZUNvdW50ZXJNYXBbdGlkXSA9IDA7CisKKyAgICBpZiAobVBhdXNlKSB7CisgICAgICAgIG1QYXVzZSA9IGZhbHNlOworICAgICAgICBtV2F0Y2hkb2dDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZVdhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5NTVlMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaGUgQ2FtZXJhU2VydmljZSB3YXRjaGRvZyBpcyB1c2VkIHRvIGhlbHAgZGV0ZWN0IGJhZCBzdGF0ZXMgaW4gdGhlCisgKiBDYW1lcmEgSEFMLiBUaGUgdGhyZWFkbG9vcCB1c2VzIGN5Y2xlIGNvdW50ZXJzLCBhc3NpZ25lZCB0byBlYWNoIGNhbGxpbmcKKyAqIHRocmVhZCwgdG8gbW9uaXRvciB0aGUgZWxhcHNpbmcgdGltZSBhbmQga2lsbHMgdGhlIHByb2Nlc3Mgd2hlbiB0aGUKKyAqIGV4cGVjdGVkIGR1cmF0aW9uIGhhcyBleGNlZWRlZC4KKyAqIE5vdGVzIG9uIG11bHRpLXRocmVhZGVkIGJlaGF2aW9yczoKKyAqICAgIC0gVGhlIHRocmVhZGxvb3AgaXMgYmxvY2tlZC9wYXVzZWQgd2hlbiB0aGVyZSBhcmUgbm8gY2FsbHMgYmVpbmcKKyAqICAgbW9uaXRvcmVkLgorICogICAtIFRoZSBzdGFydCBhbmQgc3RvcCBmdW5jdGlvbnMgaGFuZGxlIHNpbXVsdGFuZW91cyBjYWxsIG1vbml0b3JpbmcKKyAqICAgYW5kIHNpbmdsZSBjYWxsIG1vbml0b3JpbmcgZGlmZmVyZW50bHkuIFNlZSBmdW5jdGlvbiBkb2N1bWVudGF0aW9uIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKy8vIFVzZWQgdG8gd3JhcCB0aGUgY2FsbCBvZiBpbnRlcmVzdCBpbiBzdGFydCBhbmQgc3RvcCBjYWxscworI2RlZmluZSBXQVRDSCh0b01vbml0b3IpIHdhdGNoVGhyZWFkKFsmXSgpIHsgcmV0dXJuIHRvTW9uaXRvcjt9LCBnZXR0aWQoKSkKKyNkZWZpbmUgV0FUQ0hfQ1VTVE9NX1RJTUVSKHRvTW9uaXRvciwgY3ljbGVzLCBjeWNsZUxlbmd0aCkgXAorICAgICAgICB3YXRjaFRocmVhZChbJl0oKSB7IHJldHVybiB0b01vbml0b3I7fSwgZ2V0dGlkKCksIGN5Y2xlcywgY3ljbGVMZW5ndGgpOworCisvLyBEZWZhdWx0IGN5Y2xlcyBhbmQgY3ljbGUgbGVuZ3RoIHZhbHVlcyB1c2VkIHRvIGNhbGN1bGF0ZSBwZXJtaXR0ZWQgZWxhcHNlZCB0aW1lCitjb25zdCBzdGF0aWMgc2l6ZV90ICAga01heEN5Y2xlcyAgICAgPSAxMDA7Citjb25zdCBzdGF0aWMgdWludDMyX3Qga0N5Y2xlTGVuZ3RoTXMgPSAxMDA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhU2VydmljZVdhdGNoZG9nIDogcHVibGljIFRocmVhZCB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2coKSA6IG1QYXVzZSh0cnVlKSwgbU1heEN5Y2xlcyhrTWF4Q3ljbGVzKSwKKyAgICAgICAgICAgIG1DeWNsZUxlbmd0aE1zKGtDeWNsZUxlbmd0aE1zKSB7fTsKKworICAgIGV4cGxpY2l0IENhbWVyYVNlcnZpY2VXYXRjaGRvZyAoc2l6ZV90IG1heEN5Y2xlcywgdWludDMyX3QgY3ljbGVMZW5ndGhNcykgOgorICAgICAgICAgICAgbVBhdXNlKHRydWUpLCBtTWF4Q3ljbGVzKG1heEN5Y2xlcyksIG1DeWNsZUxlbmd0aE1zKGN5Y2xlTGVuZ3RoTXMpIHt9OworCisgICAgdmlydHVhbCB+Q2FtZXJhU2VydmljZVdhdGNoZG9nKCkge307CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVxdWVzdEV4aXQoKTsKKworICAgIC8qKiBVc2VkIHRvIHdyYXAgbW9uaXRvcmVkIGNhbGxzIGluIHN0YXJ0IGFuZCBzdG9wIGZ1bmN0aW9ucyB1c2luZyBjdXN0b20gdGltZXIgdmFsdWVzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBhdXRvIHdhdGNoVGhyZWFkKFQgZnVuYywgdWludDMyX3QgdGlkLCB1aW50MzJfdCBjeWNsZXMsIHVpbnQzMl90IGN5Y2xlTGVuZ3RoKSB7CisgICAgICAgIGF1dG8gcmVzID0gTlVMTDsKKworICAgICAgICBpZiAoY3ljbGVzICE9IG1NYXhDeWNsZXMgfHwgY3ljbGVMZW5ndGggIT0gbUN5Y2xlTGVuZ3RoTXMpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3YXRjaGRvZyB0byBwcmV2ZW50IGRpc3J1cHRpb24KKyAgICAgICAgICAgIC8vIG9mIHRpbWVyIGZvciBjdXJyZW50IG1vbml0b3JlZCBjYWxscworICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZVdhdGNoZG9nPiB0ZW1wV2F0Y2hkb2cgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhU2VydmljZVdhdGNoZG9nKGN5Y2xlcywgY3ljbGVMZW5ndGgpOworICAgICAgICAgICAgdGVtcFdhdGNoZG9nLT5ydW4oIkNhbWVyYVNlcnZpY2VXYXRjaGRvZyIpOworICAgICAgICAgICAgcmVzID0gdGVtcFdhdGNoZG9nLT53YXRjaFRocmVhZChmdW5jLCB0aWQpOworICAgICAgICAgICAgdGVtcFdhdGNoZG9nLT5yZXF1ZXN0RXhpdCgpOworICAgICAgICAgICAgdGVtcFdhdGNoZG9nLmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiBjdXN0b20gdGltZXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50IHRvIHNldCBjbGFzcyB0aW1lciB2YWx1ZXMsIHVzZQorICAgICAgICAgICAgLy8gY3VycmVudCB0aHJlYWQKKyAgICAgICAgICAgIHJlcyA9IHdhdGNoVGhyZWFkKGZ1bmMsIHRpZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKiBVc2VkIHRvIHdyYXAgbW9uaXRvcmVkIGNhbGxzIGluIHN0YXJ0IGFuZCBzdG9wIGZ1bmN0aW9ucyB1c2luZyBjbGFzcyB0aW1lciB2YWx1ZXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGF1dG8gd2F0Y2hUaHJlYWQoVCBmdW5jLCB1aW50MzJfdCB0aWQpIHsKKyAgICAgICAgYXV0byByZXMgPSBOVUxMOworCisgICAgICAgIHN0YXJ0KHRpZCk7CisgICAgICAgIHJlcyA9IGZ1bmMoKTsKKyAgICAgICAgc3RvcCh0aWQpOworCisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLyoqCisgICAgICogU3RhcnQgYWRkcyBhIGN5Y2xlIGNvdW50ZXIgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4gV2hlbiB0aHJlYWRsb29wIGlzIGJsb2NrZWQvcGF1c2VkLAorICAgICAqIHN0YXJ0KCkgdW5ibG9ja3MgYW5kIHN0YXJ0cyB0aGUgd2F0Y2hkb2cKKyAgICAgKi8KKyAgICB2b2lkIHN0YXJ0KHVpbnQzMl90IHRpZCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGVyZSBhcmUgbm8gY2FsbHMgbGVmdCB0byBiZSBtb25pdG9yZWQsIHN0b3AgYmxvY2tzL3BhdXNlcyB0aHJlYWRsb29wCisgICAgICogb3RoZXJ3aXNlIHN0b3AoKSBlcmFzZXMgdGhlIGN5Y2xlIGNvdW50ZXIgdG8gZW5kIHdhdGNoZG9nIGZvciB0aGUgY2FsbGluZyB0aHJlYWQKKyAgICAgKi8KKyAgICB2b2lkIHN0b3AodWludDMyX3QgdGlkKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICB0aHJlYWRMb29wKCk7CisKKyAgICBNdXRleCAgICAgICAgICAgbVdhdGNoZG9nTG9jazsgICAgICAgIC8vIExvY2sgZm9yIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgIENvbmRpdGlvbiAgICAgICBtV2F0Y2hkb2dDb25kaXRpb247ICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIGZvciBzdG9wL3N0YXJ0CisgICAgYm9vbCAgICAgICAgICAgIG1QYXVzZTsgICAgICAgICAgICAgICAvLyBUcnVlIGlmIHRocmVhZCBpcyBjdXJyZW50bHkgcGF1c2VkCisgICAgdWludDMyX3QgICAgICAgIG1NYXhDeWNsZXM7ICAgICAgICAgICAvLyBNYXggY3ljbGVzCisgICAgdWludDMyX3QgICAgICAgIG1DeWNsZUxlbmd0aE1zOyAgICAgICAvLyBMZW5ndGggb2YgdGltZSBlbGFwc2VkIHBlciBjeWNsZQorCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCB1aW50MzJfdD4gdGlkVG9DeWNsZUNvdW50ZXJNYXA7IC8vIFRocmVhZCBJZCB0byBjeWNsZSBjb3VudGVyIG1hcAorfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCA5NDRiOGFiLi42OGRjN2Y4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CkBAIC0zMyw2ICszNCw3IEBACiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgiCiAKQEAgLTYwLDEzICs2MiwxOCBAQAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkLAogICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKToKLSAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSwKKyAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBmYWxzZS8qc3lzdGVtTmF0aXZlQ2xpZW50IC0gc2luY2Ugbm8gbmRrIGZvciBhcGkxKi8sIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgLypsZWdhY3lDbGllbnQqLyB0cnVlKSwKICAgICAgICAgbVBhcmFtZXRlcnMoYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAorICAgIG1Sb3RhdGVBbmRDcm9wTW9kZSA9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FOworICAgIG1Sb3RhdGVBbmRDcm9wSXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBtUm90YXRlQW5kQ3JvcFByZXZpZXdUcmFuc2Zvcm0gPSAwOworCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID0gUGFyYW1ldGVyczo6RElTQ09OTkVDVEVEOwogfQpAQCAtMTA1LDcgKzExMiw3IEBACiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogCi0gICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZShtRGV2aWNlLmdldCgpLCBtRGV2aWNlVmVyc2lvbik7CisgICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZShtRGV2aWNlLmdldCgpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBidWlsZCBkZWZhdWx0czogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExNSw2ICsxMjIsMTQgQEAKICAgICAgICAgbC5tUGFyYW1ldGVycy5pc0RldmljZVpzbFN1cHBvcnRlZCA9IGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogICAgIH0KIAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOworICAgIG1Sb3RhdGVBbmRDcm9wSXNTdXBwb3J0ZWQgPSBjYW1lcmEzOjpSb3RhdGVBbmRDcm9wTWFwcGVyOjppc05lZWRlZCgmc3RhdGljSW5mbyk7CisgICAgLy8gVGhlICdtUm90YXRlQW5kQ3JvcE1vZGUnIHZhbHVlIG9ubHkgYWNjb3VudHMgZm9yIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudAorICAgIC8vIHdoZW4gdGhlIGRpc3BsYXkgcm90YXRlcy4gVGhlIHNlbnNvciBvcmllbnRhdGlvbiBzdGlsbCBuZWVkcyB0byBiZSBjYWxjdWxhdGVkCisgICAgLy8gYW5kIGFwcGxpZWQgc2ltaWxhciB0byB0aGUgQ2FtZXJhMiBwYXRoLgorICAgIENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShzdGF0aWNJbmZvLCBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPLAorICAgICAgICAgICAgJm1Sb3RhdGVBbmRDcm9wUHJldmlld1RyYW5zZm9ybSk7CisKICAgICBTdHJpbmc4IHRocmVhZE5hbWU7CiAKICAgICBtU3RyZWFtaW5nUHJvY2Vzc29yID0gbmV3IFN0cmVhbWluZ1Byb2Nlc3Nvcih0aGlzKTsKQEAgLTE2NzQsNiArMTY4OSwxNCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBkZWdyZWVzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1Sb3RhdGVBbmRDcm9wTG9jayk7CisgICAgICAgIGlmIChtUm90YXRlQW5kQ3JvcE1vZGUgIT0gQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dJKCIlczogUm90YXRlIGFuZCBjcm9wIHNldCB0bzogJWQsIHNraXBwaW5nIGRpc3BsYXkgb3JpZW50YXRpb24hIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBtUm90YXRlQW5kQ3JvcE1vZGUpOworICAgICAgICAgICAgdHJhbnNmb3JtID0gbVJvdGF0ZUFuZENyb3BQcmV2aWV3VHJhbnNmb3JtOworICAgICAgICB9CisgICAgfQogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgaWYgKHRyYW5zZm9ybSAhPSBsLm1QYXJhbWV0ZXJzLnByZXZpZXdUcmFuc2Zvcm0gJiYKICAgICAgICAgICAgIGdldFByZXZpZXdTdHJlYW1JZCgpICE9IE5PX1NUUkVBTSkgewpAQCAtMjI5Niw2ICsyMzE5LDE2IEBACiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpzZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUodWludDhfdCByb3RhdGVBbmRDcm9wKSB7CiAgICAgaWYgKHJvdGF0ZUFuZENyb3AgPiBBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfQVVUTykgcmV0dXJuIEJBRF9WQUxVRTsKIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtUm90YXRlQW5kQ3JvcExvY2spOworICAgICAgICBpZiAobVJvdGF0ZUFuZENyb3BJc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgbVJvdGF0ZUFuZENyb3BNb2RlID0gcm90YXRlQW5kQ3JvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Sb3RhdGVBbmRDcm9wTW9kZSA9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIG1EZXZpY2UtPnNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3IoCiAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90Pihyb3RhdGVBbmRDcm9wKSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDY0YWI4ZmYuLmM4ZGZjNDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC0yMzgsNiArMjM4LDE1IEBACiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncyk7CiAKICAgICBib29sIGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOworICAgIC8vIFRoZSBjdXJyZW50IHJvdGF0ZSAmIGNyb3AgbW9kZSBwYXNzZWQgYnkgY2FtZXJhIHNlcnZpY2UKKyAgICB1aW50OF90IG1Sb3RhdGVBbmRDcm9wTW9kZTsKKyAgICAvLyBTeW5jaHJvbml6ZSBhY2Nlc3MgdG8gJ21Sb3RhdGVBbmRDcm9wTW9kZScKKyAgICBtdXRhYmxlIE11dGV4IG1Sb3RhdGVBbmRDcm9wTG9jazsKKyAgICAvLyBDb250YWlucyB0aGUgcHJldmlldyBzdHJlYW0gdHJhbnNmb3JtYXRpb24gdGhhdCB3b3VsZCBub3JtYWxseSBiZSBhcHBsaWVkCisgICAgLy8gd2hlbiB0aGUgZGlzcGxheSByb3RhdGlvbiBpcyAwCisgICAgaW50IG1Sb3RhdGVBbmRDcm9wUHJldmlld1RyYW5zZm9ybTsKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgY2FtZXJhIGRldmljZSBzdXBwb3J0IGZvciB0aGUgcm90YXRlICYgY3JvcCBpbnRlcmZhY2UKKyAgICBib29sIG1Sb3RhdGVBbmRDcm9wSXNTdXBwb3J0ZWQ7CiAKICAgICBtdXRhYmxlIE11dGV4IG1MYXRlc3RSZXF1ZXN0TXV0ZXg7CiAgICAgQ29uZGl0aW9uIG1MYXRlc3RSZXF1ZXN0U2lnbmFsOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGVlZDI2NTQuLjQ2NzEwOGQgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2IuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iSWQuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zNiw2ICszOSw4IEBACiBuYW1lc3BhY2UgY2FtZXJhMiB7CiAKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYklkOwogCiBKcGVnUHJvY2Vzc29yOjpKcGVnUHJvY2Vzc29yKAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwKQEAgLTc4LDcgKzgzLDggQEAKICAgICB9CiAKICAgICAvLyBGaW5kIG91dCBidWZmZXIgc2l6ZSBmb3IgSlBFRwotICAgIHNzaXplX3QgbWF4SnBlZ1NpemUgPSBkZXZpY2UtPmdldEpwZWdCdWZmZXJTaXplKHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0KTsKKyAgICBzc2l6ZV90IG1heEpwZWdTaXplID0gZGV2aWNlLT5nZXRKcGVnQnVmZmVyU2l6ZShkZXZpY2UtPmluZm9QaHlzaWNhbChTdHJpbmc4KCIiKSksCisgICAgICAgICAgICBwYXJhbXMucGljdHVyZVdpZHRoLCBwYXJhbXMucGljdHVyZUhlaWdodCk7CiAgICAgaWYgKG1heEpwZWdTaXplIDw9IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEpwZWcgYnVmZmVyIHNpemUgKCV6dSkgaXMgaW52YWxpZCAiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtYXhKcGVnU2l6ZSk7CkBAIC0zNDksMTEgKzM1NSwxMSBAQAogICAgIHNpemVfdCBzaXplOwogCiAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIEpQRUcgdHJhbnNwb3J0IGhlYWRlciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICB1aW50OF90ICpoZWFkZXIgPSBqcGVnQnVmZmVyICsgKG1heFNpemUgLSBzaXplb2Yoc3RydWN0IGNhbWVyYTJfanBlZ19ibG9iKSk7Ci0gICAgc3RydWN0IGNhbWVyYTJfanBlZ19ibG9iICpibG9iID0gKHN0cnVjdCBjYW1lcmEyX2pwZWdfYmxvYiopKGhlYWRlcik7Ci0gICAgaWYgKGJsb2ItPmpwZWdfYmxvYl9pZCA9PSBDQU1FUkEyX0pQRUdfQkxPQl9JRCkgewotICAgICAgICBzaXplID0gYmxvYi0+anBlZ19zaXplOwotICAgICAgICBpZiAoc2l6ZSA+IDAgJiYgc2l6ZSA8PSBtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmEyX2pwZWdfYmxvYikpIHsKKyAgICB1aW50OF90ICpoZWFkZXIgPSBqcGVnQnVmZmVyICsgKG1heFNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpOworICAgIENhbWVyYUJsb2IgKmJsb2IgPSAoQ2FtZXJhQmxvYiopKGhlYWRlcik7CisgICAgaWYgKGJsb2ItPmJsb2JJZCA9PSBDYW1lcmFCbG9iSWQ6OkpQRUcpIHsKKyAgICAgICAgc2l6ZSA9IGJsb2ItPmJsb2JTaXplQnl0ZXM7CisgICAgICAgIGlmIChzaXplID4gMCAmJiBzaXplIDw9IG1heFNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpIHsKICAgICAgICAgICAgIC8vIFZlcmlmeSBTT0kgYW5kIEVPSSBtYXJrZXJzCiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZSAtIE1BUktFUl9MRU5HVEg7CiAgICAgICAgICAgICB1aW50OF90ICplbmQgPSBqcGVnQnVmZmVyICsgb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDgwNTA4ZTQuLjEyM2NkNzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIFBhcmFtZXRlcnM6On5QYXJhbWV0ZXJzKCkgewogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKENhbWVyYURldmljZUJhc2UgKmRldmljZSwgaW50IGRldmljZVZlcnNpb24pIHsKK3N0YXR1c190IFBhcmFtZXRlcnM6OmluaXRpYWxpemUoQ2FtZXJhRGV2aWNlQmFzZSAqZGV2aWNlKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IGRldmljZSBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CkBAIC02Myw3ICs2Myw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIFBhcmFtZXRlcnM6OmluZm8gPSAmaW5mbzsKLSAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZVZlcnNpb247CiAKICAgICByZXMgPSBidWlsZEZhc3RJbmZvKGRldmljZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTc1LDIzICs3NCw0MyBAQAogICAgIC8vIFRyZWF0IHRoZSBILjI2NCBtYXggc2l6ZSBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2aWRlbyBzaXplLgogICAgIE1lZGlhUHJvZmlsZXMgKnZpZGVvRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKICAgICBWZWN0b3I8dmlkZW9fZW5jb2Rlcj4gZW5jb2RlcnMgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVycygpOworICAgIGludDMyX3QgbWluVmlkZW9XaWR0aCA9IE1BWF9QUkVWSUVXX1dJRFRIOworICAgIGludDMyX3QgbWluVmlkZW9IZWlnaHQgPSBNQVhfUFJFVklFV19IRUlHSFQ7CiAgICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gMDsKICAgICBpbnQzMl90IG1heFZpZGVvSGVpZ2h0ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuY29kZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgaW50IHcwID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1pbiIsIGVuY29kZXJzW2ldKTsKKyAgICAgICAgaW50IGgwID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5taW4iLCBlbmNvZGVyc1tpXSk7CisgICAgICAgIGludCB3MSA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKICAgICAgICAgICAgICAgICAiZW5jLnZpZC53aWR0aC5tYXgiLCBlbmNvZGVyc1tpXSk7Ci0gICAgICAgIGludCBoZWlnaHQgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgIGludCBoMSA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKICAgICAgICAgICAgICAgICAiZW5jLnZpZC5oZWlnaHQubWF4IiwgZW5jb2RlcnNbaV0pOwotICAgICAgICAvLyBUcmVhdCB3aWR0aC9oZWlnaHQgc2VwYXJhdGVseSBoZXJlIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBkaWZmZXJlbnQKLSAgICAgICAgLy8gcHJvZmlsZSBtaWdodCByZXBvcnQgbWF4IHNpemUgb2YgZGlmZmVyZW50IGFzcGVjdCByYXRpbwotICAgICAgICBpZiAod2lkdGggPiBtYXhWaWRlb1dpZHRoKSB7Ci0gICAgICAgICAgICBtYXhWaWRlb1dpZHRoID0gd2lkdGg7CisgICAgICAgIC8vIEFzc3VtZSB0aGUgbWluIHNpemUgaXMgMCBpZiBpdCdzIG5vdCByZXBvcnRlZCBieSBlbmNvZGVyCisgICAgICAgIGlmICh3MCA9PSAtMSkgeworICAgICAgICAgICAgdzAgPSAwOwogICAgICAgICB9Ci0gICAgICAgIGlmIChoZWlnaHQgPiBtYXhWaWRlb0hlaWdodCkgewotICAgICAgICAgICAgbWF4VmlkZW9IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGlmIChoMCA9PSAtMSkgeworICAgICAgICAgICAgaDAgPSAwOworICAgICAgICB9CisgICAgICAgIC8vIFRyZWF0IHdpZHRoL2hlaWdodCBzZXBhcmF0ZWx5IGhlcmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpZmZlcmVudAorICAgICAgICAvLyBwcm9maWxlIG1pZ2h0IHJlcG9ydCBtaW4vbWF4IHNpemUgb2YgZGlmZmVyZW50IGFzcGVjdCByYXRpbworICAgICAgICBpZiAodzAgPCBtaW5WaWRlb1dpZHRoKSB7CisgICAgICAgICAgICBtaW5WaWRlb1dpZHRoID0gdzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGgwIDwgbWluVmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgIG1pblZpZGVvSGVpZ2h0ID0gaDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHcxID4gbWF4VmlkZW9XaWR0aCkgeworICAgICAgICAgICAgbWF4VmlkZW9XaWR0aCA9IHcxOworICAgICAgICB9CisgICAgICAgIGlmIChoMSA+IG1heFZpZGVvSGVpZ2h0KSB7CisgICAgICAgICAgICBtYXhWaWRlb0hlaWdodCA9IGgxOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCisgICAgLy8gVGhlc2UgYXJlIHVwcGVyL2xvd2VyIGJvdW5kcyBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCisgICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX0xPV0VSX0JPVU5EID0ge21pblZpZGVvV2lkdGgsIG1pblZpZGVvSGVpZ2h0fTsKICAgICBTaXplIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCiAgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgewpAQCAtOTksOSArMTE4LDEwIEBACiAgICAgICAgIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSk7CiAgICAgfQogCi0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhTaXplezAsIDB9LCBtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKAorICAgICAgICBWSURFT19TSVpFX0xPV0VSX0JPVU5ELCB2aWRlb1NpemVVcHBlckJvdW5kLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZApAQCAtODY0LDcgKzg4NCw2IEBACiAKICAgICBpZiAoZmFicyhtYXhEaWdpdGFsWm9vbS5kYXRhLmZbMF0gLSAxLmYpID4gMC4wMDAwMWYpIHsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTSwgem9vbSk7Ci0gICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9aT09NLCBOVU1fWk9PTV9TVEVQUyAtIDEpOwogCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0cmluZzggem9vbVJhdGlvczsKQEAgLTg3MiwxOCArODkxLDM0IEBACiAgICAgICAgICAgICBmbG9hdCB6b29tSW5jcmVtZW50ID0gKG1heERpZ2l0YWxab29tLmRhdGEuZlswXSAtIHpvb20pIC8KICAgICAgICAgICAgICAgICAgICAgKE5VTV9aT09NX1NURVBTLTEpOwogICAgICAgICAgICAgYm9vbCBhZGRDb21tYSA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgTlVNX1pPT01fU1RFUFM7IGkrKykgeworICAgICAgICAgICAgaW50IHByZXZpb3VzWm9vbSA9IC0xOworICAgICAgICAgICAgc2l6ZV90IHpvb21TdGVwcyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9aT09NX1NURVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VycmVudFpvb20gPSBzdGF0aWNfY2FzdDxpbnQ+KHpvb20gKiAxMDApOworICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1pvb20gPT0gY3VycmVudFpvb20pIHsKKyAgICAgICAgICAgICAgICAgICAgem9vbSArPSB6b29tSW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGFkZENvbW1hKSB6b29tUmF0aW9zICs9ICIsIjsKICAgICAgICAgICAgICAgICBhZGRDb21tYSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgem9vbVJhdGlvcyArPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgc3RhdGljX2Nhc3Q8aW50Pih6b29tICogMTAwKSk7CisgICAgICAgICAgICAgICAgem9vbVJhdGlvcyArPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY3VycmVudFpvb20pOwogICAgICAgICAgICAgICAgIHpvb20gKz0gem9vbUluY3JlbWVudDsKKyAgICAgICAgICAgICAgICBwcmV2aW91c1pvb20gPSBjdXJyZW50Wm9vbTsKKyAgICAgICAgICAgICAgICB6b29tU3RlcHMrKzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01fUkFUSU9TLCB6b29tUmF0aW9zKTsKKworICAgICAgICAgICAgaWYgKHpvb21TdGVwcyA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1JBVElPUywgem9vbVJhdGlvcyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfWk9PTSwgem9vbVN0ZXBzIC0gMSk7CisgICAgICAgICAgICAgICAgem9vbUF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01fU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkFMU0UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6VFJVRSk7Ci0gICAgICAgIHpvb21BdmFpbGFibGUgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01fU1VQUE9SVEVELAogICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZBTFNFKTsKQEAgLTEwNDAsNyArMTA3NSw4IEBACiAgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgewogICAgICAgICBwcmV2aWV3U2l6ZUJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CiAgICAgfQotICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMocHJldmlld1NpemVCb3VuZCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcygKKyAgICAgICAgU2l6ZXswLCAwfSwgcHJldmlld1NpemVCb3VuZCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGcHNSYW5nZXMuY291bnQ7IGkgKz0gMikgewogICAgICAgICBpZiAoIWlzRnBzU3VwcG9ydGVkKHN1cHBvcnRlZFByZXZpZXdTaXplcywKQEAgLTI5ODMsNyArMzAxOSw4IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjpnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpIHsKK3N0YXR1c190IFBhcmFtZXRlcnM6OmdldEZpbHRlcmVkU2l6ZXMoY29uc3QgU2l6ZSAmbG93ZXIsIGNvbnN0IFNpemUgJnVwcGVyLAorICAgICAgICBWZWN0b3I8U2l6ZT4gKnNpemVzKSB7CiAgICAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0YXRpYyBtZXRhZGF0YSBpcyBub3QgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTI5OTksNyArMzAzNiw4IEBACiAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOwogICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgogICAgICAgICAgICAgICAgIHNjLmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKLSAgICAgICAgICAgICAgICAoKHNjLndpZHRoICogc2MuaGVpZ2h0KSA8PSAobGltaXQud2lkdGggKiBsaW1pdC5oZWlnaHQpKSkgeworICAgICAgICAgICAgICAgICgoc2Mud2lkdGggKiBzYy5oZWlnaHQpID49IChsb3dlci53aWR0aCAqIGxvd2VyLmhlaWdodCkpICYmCisgICAgICAgICAgICAgICAgKChzYy53aWR0aCAqIHNjLmhlaWdodCkgPD0gKHVwcGVyLndpZHRoICogdXBwZXIuaGVpZ2h0KSkpIHsKICAgICAgICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IGdldE1pbkZyYW1lRHVyYXRpb25OcygKICAgICAgICAgICAgICAgICAgICAge3NjLndpZHRoLCBzYy5oZWlnaHR9LCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOwogICAgICAgICAgICAgaWYgKG1pbkZyYW1lRHVyYXRpb24gPiBNQVhfUFJFVklFV19SRUNPUkRfRFVSQVRJT05fTlMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IGUyZjhkMDExLi5jYmU2MmE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0lOSVRJQUxfUFJFVklFV19XSURUSCA9IDE5MjA7CiAgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CiAgICAgLy8gQXNwZWN0IHJhdGlvIHRvbGVyYW5jZQotICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOworICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDE7CiAgICAgLy8gVGhyZXNob2xkIGZvciBzbG93IGpwZWcgbW9kZQogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTbG93SnBlZ01vZGVUaHJlc2hvbGQgPSAzMzQwMDAwMExMOyAvLyAzMy40IG1zCiAgICAgLy8gTWFyZ2luIGZvciBjaGVja2luZyBGUFMKQEAgLTI2OSw3ICsyNjksNyBAQAogICAgIH5QYXJhbWV0ZXJzKCk7CiAKICAgICAvLyBTZXRzIHVwIGRlZmF1bHQgcGFyYW1ldGVycwotICAgIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhRGV2aWNlQmFzZSAqZGV2aWNlLCBpbnQgZGV2aWNlVmVyc2lvbik7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFEZXZpY2VCYXNlICpkZXZpY2UpOwogCiAgICAgLy8gQnVpbGQgZmFzdC1hY2Nlc3MgZGV2aWNlIHN0YXRpYyBpbmZvIGZyb20gc3RhdGljIGluZm8KICAgICBzdGF0dXNfdCBidWlsZEZhc3RJbmZvKENhbWVyYURldmljZUJhc2UgKmRldmljZSk7CkBAIC0zOTYsOSArMzk2LDEwIEBACiAKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVWaWRlb1NpemVzOwotICAgIC8vIEdldCBzaXplIGxpc3QgKHRoYXQgYXJlIG5vIGxhcmdlciB0aGFuIGxpbWl0KSBmcm9tIHN0YXRpYyBtZXRhZGF0YS4KKyAgICAvLyBHZXQgc2l6ZSBsaXN0ICh0aGF0IGZhbGwgd2l0aGluIGxvd2VyL3VwcGVyIGJvdW5kcykgZnJvbSBzdGF0aWMgbWV0YWRhdGEuCiAgICAgLy8gVGhpcyBtZXRob2QgZmlsdGVyZWQgc2l6ZSB3aXRoIG1pbkZyYW1lRHVyYXRpb24gPCBNQVhfUFJFVklFV19SRUNPUkRfRFVSQVRJT05fTlMKLSAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpOworICAgIHN0YXR1c190IGdldEZpbHRlcmVkU2l6ZXMoY29uc3QgU2l6ZSAmbG93ZXIsIGNvbnN0IFNpemUgJnVwcGVyLAorICAgICAgICAgICAgVmVjdG9yPFNpemU+ICpzaXplcyk7CiAgICAgLy8gR2V0IG1heCBzaXplIChmcm9tIHRoZSBzaXplIGFycmF5KSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGFzcGVjdCByYXRpby4KICAgICBTaXplIGdldE1heFNpemVGb3JSYXRpbyhmbG9hdCByYXRpbywgY29uc3QgaW50MzJfdCogc2l6ZUFycmF5LCBzaXplX3QgY291bnQpOwogCkBAIC00NTgsNyArNDU5LDYgQEAKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgdmlkZW8gc2l6ZXMKICAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0OwogCi0gICAgaW50IG1EZXZpY2VWZXJzaW9uOwogICAgIHVpbnQ4X3QgbURlZmF1bHRTY2VuZU1vZGU7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggMWYzZDQ3OC4uNWU5MTUwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtNTEsMTMgKzUxLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwordXNpbmcgbmFtZXNwYWNlIGNhbWVyYTM7CiB1c2luZyBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Q6OkNBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDsKLXVzaW5nIGNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM7CiAKIENhbWVyYURldmljZUNsaWVudEJhc2U6OkNhbWVyYURldmljZUNsaWVudEJhc2UoCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKQEAgLTY5LDYgKzcwLDcgQEAKICAgICBCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmVtb3RlQ2FsbGJhY2spLAogICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgICAgICBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjYW1lcmFJZCwKICAgICAgICAgICAgIGNhbWVyYUZhY2luZywKQEAgLTg2LDYgKzg4LDcgQEAKIENhbWVyYURldmljZUNsaWVudDo6Q2FtZXJhRGV2aWNlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKQEAgLTk0LDggKzk3LDggQEAKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCwKICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcykgOgotICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCAvKkFQSTEgY2FtZXJhIElEKi8gLTEsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sCisgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLCBzeXN0ZW1OYXRpdmVDbGllbnQsCisgICAgICAgICAgICAgICAgY2xpZW50RmVhdHVyZUlkLCBjYW1lcmFJZCwgLypBUEkxIGNhbWVyYSBJRCovIC0xLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcyksCiAgICAgbUlucHV0U3RyZWFtKCksCiAgICAgbVN0cmVhbWluZ1JlcXVlc3RJZChSRVFVRVNUX0lEX05PTkUpLApAQCAtMTQwLDYgKzE0Myw0MCBAQAogICAgICAgICAgICAgICAgIHBoeXNpY2FsS2V5c0VudHJ5LmRhdGEuaTMyICsgcGh5c2ljYWxLZXlzRW50cnkuY291bnQpOwogICAgIH0KIAorICAgIGF1dG8gZW50cnkgPSBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIG1EeW5hbWljUHJvZmlsZU1hcC5lbXBsYWNlKAorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgY29uc3QgYXV0byBpdCA9IHN0ZDo6ZmluZChlbnRyeS5kYXRhLnU4LCBlbnRyeS5kYXRhLnU4ICsgZW50cnkuY291bnQsCisgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfRFlOQU1JQ19SQU5HRV9URU5fQklUKTsKKyAgICAgICAgaWYgKGl0ICE9IGVudHJ5LmRhdGEudTggKyBlbnRyeS5jb3VudCkgeworICAgICAgICAgICAgZW50cnkgPSBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUCk7CisgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwIHx8ICgoZW50cnkuY291bnQgJSAzKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhbmRhcmRCaXRtYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRDsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTY0W2ldICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUR5bmFtaWNQcm9maWxlTWFwLmVtcGxhY2UoZW50cnkuZGF0YS5pNjRbaV0sIGVudHJ5LmRhdGEuaTY0W2krMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRyeS5kYXRhLmk2NFtpKzFdID09IDApIHx8IChlbnRyeS5kYXRhLmk2NFtpKzFdICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZEJpdG1hcCB8PSBlbnRyeS5kYXRhLmk2NFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzIGluY2x1ZGVzIHVuZXhwZWN0ZWQgcHJvZmlsZSBlbnRyeTogMHglIiBQUkl4NjQgIiEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5jX3N0cigpLCBlbnRyeS5kYXRhLmk2NFtpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUR5bmFtaWNQcm9maWxlTWFwW0FORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQml0bWFwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlcyBzdXBwb3J0cyAxMC1iaXQgb3V0cHV0IGJ1dCBkb2Vzbid0IGluY2x1ZGUgYSBkeW5hbWljIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9maWxlIG1hcCEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIG1Qcm92aWRlck1hbmFnZXIgPSBwcm92aWRlclB0cjsKICAgICAvLyBDYWNoZSBwaHlzaWNhbCBjYW1lcmEgaWRzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkZXZpY2UgYW5kIGFsc28gdGhlIGhpZ2gKICAgICAvLyByZXNvbHV0aW9uIHNlbnNvcnMgaW4gdGhpcyBkZXZpY2UgKyBwaHlzaWNhbCBjYW1lcmEgaWRzCkBAIC0xNzIsNiArMjA5LDcgQEAKICAgICBpbnQgY29tcG9zaXRlSWR4OwogICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCiAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgpAQCAtMjk3LDYgKzMzNSw3IEBACiAgICAgICAgIFN1cmZhY2VNYXAgc3VyZmFjZU1hcDsKICAgICAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcXVlc3RlZFBoeXNpY2FsSWRzOworICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlQml0bWFwID0gMDsKICAgICAgICAgaWYgKHJlcXVlc3QubVN1cmZhY2VMaXN0LnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UgOiByZXF1ZXN0Lm1TdXJmYWNlTGlzdCkgewogICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlID09IDApIGNvbnRpbnVlOwpAQCAtMzEzLDYgKzM1Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggcmVxdWVzdGVkUGh5c2ljYWxJZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMudmFsdWVBdChpbmRleCkuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxJZHMucHVzaF9iYWNrKHJlcXVlc3RlZFBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBkeW5hbWljUHJvZmlsZUJpdG1hcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBPdXRwdXQgc3RyZWFtIElkIG5vdCBmb3VuZCBhbW9uZyBjb25maWd1cmVkIG91dHB1dHMhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zNDgsNiArMzg5LDQxIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOCByZXF1ZXN0ZWRQaHlzaWNhbElkKAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxJZHMucHVzaF9iYWNrKHJlcXVlc3RlZFBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGR5bmFtaWNQcm9maWxlQml0bWFwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMudmFsdWVBdChpbmRleCkuZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGR5bmFtaWNQcm9maWxlQml0bWFwICE9CisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgICAgICAgICAgICAgICAgICBpIDwgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9NQVg7IGkgPDw9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGR5bmFtaWNQcm9maWxlQml0bWFwICYgaSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBpdCA9IG1EeW5hbWljUHJvZmlsZU1hcC5maW5kKGkpOworICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtRHluYW1pY1Byb2ZpbGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpdC0+c2Vjb25kID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpdC0+c2Vjb25kICYgZHluYW1pY1Byb2ZpbGVCaXRtYXApID09IGR5bmFtaWNQcm9maWxlQml0bWFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZXMgdGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWZlcmVuY2UgYW4gdW5zdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlIGNvbWJpbmF0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDB4JSIgUFJJeDY0ICIhIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNQcm9maWxlQml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyBhbiB1bnN1cHBvcnRlZCBkeW5hbWljIHJhbmdlIHByb2ZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY29tYmluYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWZlcmVuY2VzIHVuc3VwcG9ydGVkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSAweCV4ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyAxMC1iaXQgU3VyZmFjZSB3aXRoIHVuc3VwcG9ydGVkIGR5bmFtaWMgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9maWxlIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM3OSw2ICs0NTUsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkKGl0LmlkLmNfc3RyKCkpOworICAgICAgICAgICAgYm9vbCBoYXNUZXN0UGF0dGVybk1vZGVQaHlzaWNhbEtleSA9IHN0ZDo6ZmluZChtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5lbmQoKSwgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREUpICE9CisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmVuZCgpOworICAgICAgICAgICAgYm9vbCBoYXNUZXN0UGF0dGVybkRhdGFQaHlzaWNhbEtleSA9IHN0ZDo6ZmluZChtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5lbmQoKSwgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX0RBVEEpICE9CisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmVuZCgpOwogICAgICAgICAgICAgaWYgKHBoeXNpY2FsSWQgIT0gbURldmljZS0+Z2V0SWQoKSkgewogICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBzdGQ6OmZpbmQocmVxdWVzdGVkUGh5c2ljYWxJZHMuYmVnaW4oKSwgcmVxdWVzdGVkUGh5c2ljYWxJZHMuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBpdC5pZCk7CkBAIC00MDQsNyArNDg2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LnB1c2hfYmFjayh7aXQuaWQsIGZpbHRlcmVkUGFyYW1zfSk7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LnB1c2hfYmFjayh7aXQuaWQsIGZpbHRlcmVkUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Rlc3RQYXR0ZXJuTW9kZVBoeXNpY2FsS2V5LCBoYXNUZXN0UGF0dGVybkRhdGFQaHlzaWNhbEtleX0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QucHVzaF9iYWNrKHtpdC5pZCwgaXQuc2V0dGluZ3N9KTsKQEAgLTQzNCw2ICs1MTcsMTcgQEAKIAogICAgICAgICBtZXRhZGF0YVJlcXVlc3RMaXN0LnB1c2hfYmFjayhwaHlzaWNhbFNldHRpbmdzTGlzdCk7CiAgICAgICAgIHN1cmZhY2VNYXBMaXN0LnB1c2hfYmFjayhzdXJmYWNlTWFwKTsKKworICAgICAgICAvLyBTYXZlIGNlcnRhaW4gQ2FwdHVyZVJlcXVlc3Qgc2V0dGluZ3MKKyAgICAgICAgaWYgKCFyZXF1ZXN0Lm1Vc2VyVGFnLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Vc2VyVGFnID0gcmVxdWVzdC5tVXNlclRhZzsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPQorICAgICAgICAgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlID0gZW50cnkuZGF0YS51OFswXTsKKyAgICAgICAgfQogICAgIH0KICAgICBtUmVxdWVzdElkQ291bnRlcisrOwogCkBAIC01NjEsNiArNjU1LDcgQEAKICAgICAgICAgb2ZmbGluZVN0cmVhbUlkcy0+Y2xlYXIoKTsKICAgICAgICAgbURldmljZS0+Z2V0T2ZmbGluZVN0cmVhbUlkcyhvZmZsaW5lU3RyZWFtSWRzKTsKIAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgZXJyID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5jb25maWd1cmVTdHJlYW0oKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTYzMSwyNyArNzI2LDExIEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKLSAgICBib29sIGVhcmx5RXhpdCA9IGZhbHNlOworICAgICpzdGF0dXMgPSBmYWxzZTsKICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9IFt0aGlzXShjb25zdCBTdHJpbmc4ICZpZCwgYm9vbCAvKm92ZXJyaWRlRm9yUGVyZkNsYXNzKi8pIHsKICAgICAgICAgICByZXR1cm4gbURldmljZS0+aW5mb1BoeXNpY2FsKGlkKTt9OwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICBtUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUNhbWVyYUlkU3RyLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwotICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKHNlc3Npb25Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtRGV2aWNlLT5pbmZvKCksIGdldE1ldGFkYXRhLCBwaHlzaWNhbENhbWVyYUlkcywgc3RyZWFtQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIG1PdmVycmlkZUZvclBlcmZDbGFzcywgJmVhcmx5RXhpdCk7Ci0gICAgaWYgKCFyZXMuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgaWYgKGVhcmx5RXhpdCkgewotICAgICAgICAqc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICAqc3RhdHVzID0gZmFsc2U7CiAgICAgcmV0ID0gbVByb3ZpZGVyTWFuYWdlci0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCi0gICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgICAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sIG1PdmVycmlkZUZvclBlcmZDbGFzcywgZ2V0TWV0YWRhdGEsIHN0YXR1cyk7CiAgICAgc3dpdGNoIChyZXQpIHsKICAgICAgICAgY2FzZSBPSzoKICAgICAgICAgICAgIC8vIEV4cGVjdGVkLCBkbyBub3RoaW5nLgpAQCAtNzEzLDYgKzc5Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Z2V0U3RyZWFtSWQoKSkgewogICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUluZGV4ID0gaTsKQEAgLTc1MSw2ICs4MzEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY29tcG9zaXRlSW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmV0OwogICAgICAgICAgICAgICAgIGlmICgocmV0ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGNvbXBvc2l0ZUluZGV4KS0+ZGVsZXRlU3RyZWFtKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAhPSBPSykgewpAQCAtNzk0LDYgKzg3NSwxMCBAQAogICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lck9ubHkgPSBkZWZlcnJlZENvbnN1bWVyICYmIG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwOwogICAgIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzTXVsdGlSZXNvbHV0aW9uKCk7CisgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CisgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdHJlYW1Vc2VDYXNlKCk7CisgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFRpbWVzdGFtcEJhc2UoKTsKKyAgICBpbnQgbWlycm9yTW9kZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0TWlycm9yTW9kZSgpOwogCiAgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y2hlY2tTdXJmYWNlVHlwZShudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsCiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCkpOwpAQCAtODM3LDcgKzkyMiw4IEBACiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CiAgICAgICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sCiAgICAgICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLCBtQ2FtZXJhSWRTdHIsCi0gICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIAogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtODczLDYgKzk1OSw3IEBACiAgICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkLCAmc3VyZmFjZUlkcywKICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLCBpc1NoYXJlZCwgaXNNdWx0aVJlc29sdXRpb24pOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmFkZChJSW50ZXJmYWNlOjphc0JpbmRlcihzdXJmYWNlc1swXS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtKTsKICAgICAgICAgfQpAQCAtODgxLDcgKzk2OCw5IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCiAgICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkLCAmc3VyZmFjZUlkcywKLSAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLCBpc1NoYXJlZCwgaXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLCBpc011bHRpUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAvKmNvbnN1bWVyVXNhZ2UqLzAsIHN0cmVhbUluZm8uZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtSW5mby5zdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8udGltZXN0YW1wQmFzZSwgc3RyZWFtSW5mby5taXJyb3JNb2RlKTsKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC05MDcsNyArOTk2LDcgQEAKICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCk7CiAKICAgICAgICAgLy8gU2V0IHRyYW5zZm9ybSBmbGFncyB0byBlbnN1cmUgcHJldmlldyB0byBiZSByb3RhdGVkIGNvcnJlY3RseS4KLSAgICAgICAgcmVzID0gc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKHN0cmVhbUlkKTsKKyAgICAgICAgcmVzID0gc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKHN0cmVhbUlkLCBzdHJlYW1JbmZvLm1pcnJvck1vZGUpOwogCiAgICAgICAgIC8vIEZpbGwgaW4gbUhpZ2hSZXNvbHV0aW9uQ2FtZXJhSWRUb1N0cmVhbUlkU2V0IG1hcAogICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZFVzZWQgPQpAQCAtOTc1LDcgKzEwNjQsMTAgQEAKICAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgICAgICZzdXJmYWNlSWRzLAogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsCi0gICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmlzTXVsdGlSZXNvbHV0aW9uKCksIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5pc011bHRpUmVzb2x1dGlvbigpLCBjb25zdW1lclVzYWdlLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCksCisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN0cmVhbVVzZUNhc2UoKSwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0TWlycm9yTW9kZSgpKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SX0ZNVChDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTk4OCwxNCArMTA4MCwxOCBAQAogICAgICAgICBtRGVmZXJyZWRTdHJlYW1zLnB1c2hfYmFjayhzdHJlYW1JZCk7CiAgICAgICAgIG1TdHJlYW1JbmZvTWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RyZWFtSWQpLAogICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgY29uc3VtZXJVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN0cmVhbVVzZUNhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0VGltZXN0YW1wQmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRNaXJyb3JNb2RlKCkpKTsKIAogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBuZXcgc3RyZWFtIElEICVkIGZvciBhIGRlZmVycmVkIHN1cmZhY2UiCiAgICAgICAgICAgICAgICAgIiAoJWQgeCAlZCkgc3RyZWFtIHdpdGggZm9ybWF0IDB4JXguIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwogCiAgICAgICAgIC8vIFNldCB0cmFuc2Zvcm0gZmxhZ3MgdG8gZW5zdXJlIHByZXZpZXcgdG8gYmUgcm90YXRlZCBjb3JyZWN0bHkuCi0gICAgICAgIHJlcyA9IHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChzdHJlYW1JZCk7CisgICAgICAgIHJlcyA9IHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRNaXJyb3JNb2RlKCkpOwogCiAgICAgICAgICpuZXdTdHJlYW1JZCA9IHN0cmVhbUlkOwogICAgICAgICAvLyBGaWxsIGluIG1IaWdoUmVzb2x1dGlvbkNhbWVyYUlkVG9TdHJlYW1JZFNldApAQCAtMTAwOSw3ICsxMTA1LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1iaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OnNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChpbnQgc3RyZWFtSWQpIHsKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6c2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKGludCBzdHJlYW1JZCwgaW50IG1pcnJvck1vZGUpIHsKICAgICBpbnQzMl90IHRyYW5zZm9ybSA9IDA7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlczsKQEAgLTEwMTgsNyArMTExNCw3IEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKLSAgICBlcnIgPSBnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZCgmdHJhbnNmb3JtKTsKKyAgICBlcnIgPSBnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZChtaXJyb3JNb2RlLCAmdHJhbnNmb3JtKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIC8vIEVycm9yIGxvZ2dlZCBieSBnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZC4KICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTExNzYsMTMgKzEyNzIsMTggQEAKICAgICB9CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkID0KICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKTsKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN0cmVhbVVzZUNhc2UoKTsKKyAgICBpbnQgdGltZXN0YW1wQmFzZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0VGltZXN0YW1wQmFzZSgpOworICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOworICAgIGludCBtaXJyb3JNb2RlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRNaXJyb3JNb2RlKCk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld091dHB1dHNNYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBvdXRJbmZvOwogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicChvdXRJbmZvLAogICAgICAgICAgICAgICAgIC8qaXNTdHJlYW1JbmZvVmFsaWQqLyBmYWxzZSwgc3VyZmFjZSwgbmV3T3V0cHV0c01hcC52YWx1ZUF0KGkpLCBtQ2FtZXJhSWRTdHIsCi0gICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKIApAQCAtMTUzOSw2ICsxNjQwLDEwIEBACiAgICAgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+IGNvbnN1bWVyU3VyZmFjZXM7CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkID0KICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKTsKKyAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2U9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3RyZWFtVXNlQ2FzZSgpOworICAgIGludCB0aW1lc3RhbXBCYXNlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRUaW1lc3RhbXBCYXNlKCk7CisgICAgaW50IG1pcnJvck1vZGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldE1pcnJvck1vZGUoKTsKICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CiAgICAgICAgIC8vIERvbid0IGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIGZvciB0aGUgc2FtZSB0YXJnZXQgc3VyZmFjZQogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7CkBAIC0xNTUxLDcgKzE2NTYsOCBAQAogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicChtU3RyZWFtSW5mb01hcFtzdHJlYW1JZF0sCiAgICAgICAgICAgICAgICAgdHJ1ZSAvKmlzU3RyZWFtSW5mb1ZhbGlkKi8sIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLCBtQ2FtZXJhSWRTdHIsCi0gICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIAogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtMTY4NiwxMCArMTc5MiwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgICAgICBib29sIGlzQ29tcG9zaXRlU3RyZWFtID0gZmFsc2U7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgZ2JwIDogbUNvbmZpZ3VyZWRPdXRwdXRzW3N0cmVhbUlkXS5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBnYnAgOiBtQ29uZmlndXJlZE91dHB1dHMudmFsdWVBdChpbmRleCkuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpKSB7CiAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzID0gbmV3IFN1cmZhY2UoZ2JwLCBmYWxzZSAvKmNvbnRyb2xsZWRCeUFwcCovKTsKLSAgICAgICAgICAgIGlzQ29tcG9zaXRlU3RyZWFtID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0ocykgfAorICAgICAgICAgICAgaXNDb21wb3NpdGVTdHJlYW0gPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzKSB8fAogICAgICAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzKTsKICAgICAgICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0cmVhbSkgewogICAgICAgICAgICAgICAgIGF1dG8gY29tcG9zaXRlSWR4ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpOwpAQCAtMTczNiw2ICsxODQzLDcgQEAKICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmNsZWFyKCk7CiAgICAgICAgIG1EZWZlcnJlZFN0cmVhbXMuY2xlYXIoKTsKICAgICAgICAgbVN0cmVhbUluZm9NYXAuY2xlYXIoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmNsZWFyKCk7CiAgICAgICAgIG1JbnB1dFN0cmVhbSA9IHtmYWxzZSwgMCwgMCwgMCwgMH07CiAgICAgfSBlbHNlIHsKQEAgLTE3OTcsMTYgKzE5MDUsNTAgQEAKICAgICByZXR1cm4gZHVtcERldmljZShmZCwgYXJncyk7CiB9CiAKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6c3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncywgaW50IG91dCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgZHByaW50ZihvdXQsICIgIERldmljZSBpcyBkZXRhY2hlZC4iKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBkZXZpY2UtPnN0YXJ0V2F0Y2hpbmdUYWdzKHRhZ3MpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIGRwcmludGYob3V0LCAiICBEZXZpY2UgaXMgZGV0YWNoZWQuIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgZGV2aWNlLT5zdG9wV2F0Y2hpbmdUYWdzKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgZGV2aWNlLT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKG91dCk7CisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKLSAgICAvLyBDb21wb3NpdGVzIGNhbiBoYXZlIG11bHRpcGxlIGludGVybmFsIHN0cmVhbXMuIEVycm9yIG5vdGlmaWNhdGlvbnMgY29taW5nIGZyb20gc3VjaCBpbnRlcm5hbAotICAgIC8vIHN0cmVhbXMgbWF5IG5lZWQgdG8gcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KICAgICBib29sIHNraXBDbGllbnROb3RpZmljYXRpb24gPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc2tpcENsaWVudE5vdGlmaWNhdGlvbiB8PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgIHsKKyAgICAgICAgLy8gQWNjZXNzIHRvIHRoZSBjb21wb3NpdGUgc3RyZWFtIG1hcCBtdXN0IGJlIHN5bmNocm9uaXplZAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CisgICAgICAgIC8vIENvbXBvc2l0ZXMgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc3RyZWFtcy4gRXJyb3Igbm90aWZpY2F0aW9ucyBjb21pbmcgZnJvbSBzdWNoCisgICAgICAgIC8vIGludGVybmFsIHN0cmVhbXMgbWF5IG5lZWQgdG8gcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBza2lwQ2xpZW50Tm90aWZpY2F0aW9uIHw9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25FcnJvcihlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoKHJlbW90ZUNiICE9IDApICYmICghc2tpcENsaWVudE5vdGlmaWNhdGlvbikpIHsKQEAgLTE4MzQsNyArMTk3Niw4IEBACiAgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKICAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlSWRsZSgpOwogICAgIH0KLSAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5SWRsZShyZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCBzdHJlYW1TdGF0cyk7CisgICAgQ2FtZXJhMkNsaWVudEJhc2U6Om5vdGlmeUlkbGVXaXRoVXNlclRhZyhyZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLAorICAgICAgICAgICAgc3RyZWFtU3RhdHMsIG1Vc2VyVGFnLCBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSk7CiB9CiAKIHZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKQEAgLTE4NDYsNiArMTk4OSw4IEBACiAgICAgfQogICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKIAorICAgIC8vIEFjY2VzcyB0byB0aGUgY29tcG9zaXRlIHN0cmVhbSBtYXAgbXVzdCBiZSBzeW5jaHJvbml6ZWQKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25TaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICB9CkBAIC0xODczLDEzICsyMDE4LDE1IEBACiAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgQUxPR1YoIkNhbWVyYSAlczogU3RvcHBpbmcgcHJvY2Vzc29ycyIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAKLSAgICBtRnJhbWVQcm9jZXNzb3ItPnJlbW92ZUxpc3RlbmVyKGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZTo6RlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZTo6RlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01BWF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGlzdGVuZXIqL3RoaXMpOwotICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVxdWVzdEV4aXQoKTsKLSAgICBBTE9HVigiQ2FtZXJhICVzOiBXYWl0aW5nIGZvciB0aHJlYWRzIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBBTE9HVigiQ2FtZXJhICVzOiBEaXNjb25uZWN0aW5nIGRldmljZSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgaWYgKG1GcmFtZVByb2Nlc3Nvci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVtb3ZlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgY2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlOjpGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAorICAgICAgICAgICAgICAgIGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZTo6RlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01BWF9JRCwgLypsaXN0ZW5lciovdGhpcyk7CisgICAgICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVxdWVzdEV4aXQoKTsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSAlczogV2FpdGluZyBmb3IgdGhyZWFkcyIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIG1GcmFtZVByb2Nlc3Nvci0+am9pbigpOworICAgICAgICBBTE9HVigiQ2FtZXJhICVzOiBEaXNjb25uZWN0aW5nIGRldmljZSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgfQogCiAgICAgLy8gV09SS0FST1VORDogSEFMIHJlZnVzZXMgdG8gZGlzY29ubmVjdCB3aGlsZSB0aGVyZSdzIHN0cmVhbXMgaW4gZmxpZ2h0CiAgICAgewpAQCAtMTg5NSwxNCArMjA0MiwxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1dG8gcmV0ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5kZWxldGVJbnRlcm5hbFN0cmVhbXMoKTsKLSAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcmVtb3ZpbmcgY29tcG9zaXRlIHN0cmVhbSAgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXV0byByZXQgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmRlbGV0ZUludGVybmFsU3RyZWFtcygpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHJlbW92aW5nIGNvbXBvc2l0ZSBzdHJlYW0gICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmNsZWFyKCk7CiAgICAgfQotICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuY2xlYXIoKTsKIAogICAgIENhbWVyYTJDbGllbnRCYXNlOjpkZXRhY2hEZXZpY2UoKTsKIApAQCAtMTkyMiw2ICsyMDcyLDggQEAKICAgICAgICAgICAgICAgICByZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICB9CiAKKyAgICAvLyBBY2Nlc3MgdG8gdGhlIGNvbXBvc2l0ZSBzdHJlYW0gbWFwIG11c3QgYmUgc3luY2hyb25pemVkCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uUmVzdWx0QXZhaWxhYmxlKHJlc3VsdCk7CiAgICAgfQpAQCAtMTk5MCwxMSArMjE0MiwxMiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKGludDMyX3QqIHRyYW5zZm9ybSkgeworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZChpbnQgbWlycm9yTW9kZSwKKyAgICAgICAgaW50MzJfdCogdHJhbnNmb3JtKSB7CiAgICAgQUxPR1YoIiVzOiBiZWdpbiIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICByZXR1cm4gQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKHN0YXRpY0luZm8sIHRyYW5zZm9ybSk7CisgICAgcmV0dXJuIENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShzdGF0aWNJbmZvLCBtaXJyb3JNb2RlLCB0cmFuc2Zvcm0pOwogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFJlcXVlc3RUZW1wbGF0ZShpbnQgdGVtcGxhdGVJZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IDc2YjNmNTMuLmM1YWFkNmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiAjaW5jbHVkZSAiQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCkBAIC00OSw2ICs1MCw3IEBACiAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZShjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC0xNzcsNiArMTc5LDcgQEAKICAgICBDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgYm9vbCBjbGllbnRQYWNrYWdlT3ZlcnJpZGUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtMTk5LDYgKzIwMiwxMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCk7CisKICAgICAvKioKICAgICAgKiBEZXZpY2UgbGlzdGVuZXIgaW50ZXJmYWNlCiAgICAgICovCkBAIC0yMjIsNyArMjI5LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGV0YWNoRGV2aWNlKCk7CiAKICAgICAvLyBDYWxjdWxhdGUgdGhlIEFOYXRpdmVXaW5kb3cgdHJhbnNmb3JtIGZyb20gYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24KLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgZ2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQoLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSk7CisgICAgc3RhdHVzX3QgICAgICAgICAgICAgIGdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKGludCBtaXJyb3JNb2RlLCAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKIAogICAgIGJvb2wgaXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKTsKIApAQCAtMjgyLDcgKzI4OSw3IEBACiAKICAgICAvLyBTZXQgdGhlIHN0cmVhbSB0cmFuc2Zvcm0gZmxhZ3MgdG8gYXV0b21hdGljYWxseSByb3RhdGUgdGhlIGNhbWVyYSBzdHJlYW0gZm9yIHByZXZpZXcgdXNlCiAgICAgLy8gY2FzZXMuCi0gICAgYmluZGVyOjpTdGF0dXMgc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKGludCBzdHJlYW1JZCk7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKGludCBzdHJlYW1JZCwgaW50IG1pcnJvck1vZGUpOwogCiAgICAgLy8gVXRpbGl0eSBtZXRob2QgdG8gaW5zZXJ0IHRoZSBzdXJmYWNlIGludG8gU3VyZmFjZU1hcAogICAgIGJpbmRlcjo6U3RhdHVzIGluc2VydEdicExvY2tlZChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLApAQCAtMjk5LDYgKzMwNiwxMCBAQAogICAgIC8vIFN0cmVhbSBJRCAtPiBPdXRwdXRDb25maWd1cmF0aW9uLiBVc2VkIGZvciBsb29raW5nIHVwIFN1cmZhY2UgYnkgc3RyZWFtL3N1cmZhY2UgaW5kZXgKICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uPiBtQ29uZmlndXJlZE91dHB1dHM7CiAKKyAgICAvLyBEeW5hbWljIHJhbmdlIHByb2ZpbGUgaWQgLT4gU3VwcG9ydGVkIGR5bmFtaWMgcHJvZmlsZXMgYml0bWFwIHdpdGhpbiBhbiBzaW5nbGUgY2FwdHVyZQorICAgIC8vIHJlcXVlc3QKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgaW50NjRfdD4gbUR5bmFtaWNQcm9maWxlTWFwOworCiAgICAgc3RydWN0IElucHV0U3RyZWFtQ29uZmlndXJhdGlvbiB7CiAgICAgICAgIGJvb2wgY29uZmlndXJlZDsKICAgICAgICAgaW50MzJfdCB3aWR0aDsKQEAgLTMzMCwxMiArMzQxLDE5IEBACiAgICAgLy8gc2V0IG9mIGhpZ2ggcmVzb2x1dGlvbiBjYW1lcmEgaWQgKGxvZ2ljYWwgLyBwaHlzaWNhbCkKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1IaWdoUmVzb2x1dGlvblNlbnNvcnM7CiAKKyAgICAvLyBTeW5jaHJvbml6ZSBhY2Nlc3MgdG8gJ21Db21wb3NpdGVTdHJlYW1NYXAnCisgICAgTXV0ZXggbUNvbXBvc2l0ZUxvY2s7CiAgICAgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIHNwPENvbXBvc2l0ZVN0cmVhbT4+IG1Db21wb3NpdGVTdHJlYW1NYXA7CiAKICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CiAKICAgICAvLyBPdmVycmlkZSB0aGUgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgcGVyZm9ybWFuY2UgY2xhc3MgcHJpbWFyeSBjYW1lcmFzLgogICAgIGJvb2wgbU92ZXJyaWRlRm9yUGVyZkNsYXNzOworCisgICAgLy8gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QgcGFzc2VkIGludG8gQ2FwdHVyZVJlcXVlc3Quc2V0VGFnLgorICAgIHN0ZDo6c3RyaW5nIG1Vc2VyVGFnOworICAgIC8vIFRoZSBsYXN0IHNldCB2aWRlbyBzdGFiaWxpemF0aW9uIG1vZGUKKyAgICBpbnQgbVZpZGVvU3RhYmlsaXphdGlvbk1vZGUgPSAtMTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwCmluZGV4IGVmMTVmMmQuLjkzMDNmZDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwCkBAIC0xMTAsNiArMTEwLDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6c3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncywgaW50IG91dEZkKSB7CisgICAgcmV0dXJuIEJhc2ljQ2xpZW50OjpzdGFydFdhdGNoaW5nVGFncyh0YWdzLCBvdXRGZCk7Cit9CisKK3N0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50OjpzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXRGZCkgeworICAgIHJldHVybiBCYXNpY0NsaWVudDo6c3RvcFdhdGNoaW5nVGFncyhvdXRGZCk7Cit9CisKK3N0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50OjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgcmV0dXJuIEJhc2ljQ2xpZW50OjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKG91dCk7Cit9CisKIGJpbmRlcjo6U3RhdHVzIENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50OjpkaXNjb25uZWN0KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIApAQCAtMjc1LDcgKzI4Nyw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6bm90aWZ5QWN0aXZlKCkgeworc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6Om5vdGlmeUFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzIF9fdW51c2VkKSB7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhU3RyZWFtaW5nT3BzKCk7CiB9CiAKQEAgLTMzMCw1ICszNDIsMTkgQEAKICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkpOwogfQogCitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6aW5qZWN0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKKyAgICBBTE9HVigiJXM6IFRoaXMgY2xpZW50IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgaW5qZWN0aW9uIGNhbWVyYS4gaW5qZWN0ZWRDYW1JZDogJXMgcHJvdmlkZXJQdHI6ICVwIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSwgbWFuYWdlci5nZXQoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50OjpzdG9wSW5qZWN0aW9uKCkgeworICAgIEFMT0dWKCIlczogVGhpcyBjbGllbnQgZG9lc24ndCBzdXBwb3J0IHRoZSBpbmplY3Rpb24gY2FtZXJhLiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKaW5kZXggYjIxOWE0Yy4uZjJjNDJkOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaApAQCAtNTQsNyArNTQsOCBAQAogICAgICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gKHYpbmRrIGRvZXNuJ3QgaGF2ZSBvZmZsaW5lIHNlc3Npb24gc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgLypvdmVycmlkZVBhY2thZ2VOYW1lKi9mYWxzZSwgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZFN0ciwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgICAgICAgICAgbVJlbW90ZUNhbGxiYWNrKHJlbW90ZUNhbGxiYWNrKSwgbU9mZmxpbmVTZXNzaW9uKHNlc3Npb24pLAogICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcChvZmZsaW5lQ29tcG9zaXRlU3RyZWFtTWFwKSB7fQpAQCAtNzEsNiArNzIsMTAgQEAKIAogICAgIHN0YXR1c190IGR1bXBDbGllbnQoaW50IC8qZmQqLywgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIG92ZXJyaWRlOwogCisgICAgc3RhdHVzX3Qgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncywgaW50IG91dEZkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXRGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCkgb3ZlcnJpZGU7CisKICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gLyptYW5hZ2VyKi8sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pIG92ZXJyaWRlOwogCkBAIC04OSw3ICs5NCw3IEBACiAgICAgLy8gTm90aWZpY2F0aW9uTGlzdGVuZXIgQVBJCiAgICAgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMpIG92ZXJyaWRlOwogICAgIHZvaWQgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpIG92ZXJyaWRlOwogICAgIHZvaWQgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIG92ZXJyaWRlOwpAQCAtOTgsNiArMTAzLDkgQEAKICAgICB2b2lkIG5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlSZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOwogICAgIHZvaWQgbm90aWZ5UmVwZWF0aW5nUmVxdWVzdEVycm9yKGxvbmcgbGFzdEZyYW1lTnVtYmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBpbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3RvcEluamVjdGlvbigpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIG11dGFibGUgTXV0ZXggbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcAppbmRleCBhNjZhNTkyLi4wNDhkODVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMTgsNiArMTgsOSBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYklkLmg+CisKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKICNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCkBAIC0zMCw2ICszMyw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYklkOworCiBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6RGVwdGhDb21wb3NpdGVTdHJlYW0oc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAogICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKICAgICAgICAgQ29tcG9zaXRlU3RyZWFtKGRldmljZSwgY2IpLApAQCAtMjk3LDcgKzMwMyw4IEBACiAgICAgfQogCiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2IgPSBHcmFwaGljQnVmZmVyOjpmcm9tKGFuYik7Ci0gICAgcmVzID0gZ2ItPmxvY2tBc3luYyhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmZHN0QnVmZmVyLCBmZW5jZUZkKTsKKyAgICBHcmFwaGljQnVmZmVyTG9ja2VyIGdiTG9ja2VyKGdiKTsKKyAgICByZXMgPSBnYkxvY2tlci5sb2NrQXN5bmMoJmRzdEJ1ZmZlciwgZmVuY2VGZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBsb2NrIG91dHB1dCBidWZmZXIgZmVuY2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0zNjYsNyArMzczLDcgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBzaXplX3QgZmluYWxKcGVnU2l6ZSA9IGFjdHVhbEpwZWdTaXplICsgc2l6ZW9mKHN0cnVjdCBjYW1lcmFfanBlZ19ibG9iKTsKKyAgICBzaXplX3QgZmluYWxKcGVnU2l6ZSA9IGFjdHVhbEpwZWdTaXplICsgc2l6ZW9mKENhbWVyYUJsb2IpOwogICAgIGlmIChmaW5hbEpwZWdTaXplID4gZmluYWxKcGVnQnVmZmVyU2l6ZSkgewogICAgICAgICBBTE9HRSgiJXM6IEZpbmFsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZSBqcGVnIGJsb2IgaGVhZGVyIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKQEAgLTM4MiwxMCArMzg5LDEwIEBACiAKICAgICBBTE9HVigiJXM6IEZpbmFsIGpwZWcgc2l6ZTogJXp1IiwgX19mdW5jX18sIGZpbmFsSnBlZ1NpemUpOwogICAgIHVpbnQ4X3QqIGhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4gKGRzdEJ1ZmZlcikgKwotICAgICAgICAoZ2ItPmdldFdpZHRoKCkgLSBzaXplb2Yoc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IpKTsKLSAgICBzdHJ1Y3QgY2FtZXJhX2pwZWdfYmxvYiAqYmxvYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IqPiAoaGVhZGVyKTsKLSAgICBibG9iLT5qcGVnX2Jsb2JfaWQgPSBDQU1FUkFfSlBFR19CTE9CX0lEOwotICAgIGJsb2ItPmpwZWdfc2l6ZSA9IGFjdHVhbEpwZWdTaXplOworICAgICAgICAoZ2ItPmdldFdpZHRoKCkgLSBzaXplb2YoQ2FtZXJhQmxvYikpOworICAgIENhbWVyYUJsb2IgKmJsb2IgPSByZWludGVycHJldF9jYXN0PENhbWVyYUJsb2IqPiAoaGVhZGVyKTsKKyAgICBibG9iLT5ibG9iSWQgPSBDYW1lcmFCbG9iSWQ6OkpQRUc7CisgICAgYmxvYi0+YmxvYlNpemVCeXRlcyA9IGFjdHVhbEpwZWdTaXplOwogICAgIG91dHB1dEFOVy0+cXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKIAogICAgIHJldHVybiByZXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcAppbmRleCBhNzNmZmI5Li41NGNjMjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTIzLDcgKzIzLDggQEAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvdHlwZXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYklkLmg+CiAjaW5jbHVkZSA8bGlieXV2Lmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTQxLDggKzQyLDggQEAKICNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCiAjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgogCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2I7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2JJZDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYklkOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMyB7CkBAIC00NDEsNiArNDQyLDEwIEBACiAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX0hFSUdIVCwgbUdyaWRIZWlnaHQpOwogICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9ST1dTLCBtR3JpZFJvd3MpOwogICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCBtR3JpZENvbHMpOworICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICBpZiAobmV3Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgbU91dHB1dFdpZHRoIC0gMSwgbU91dHB1dEhlaWdodCAtIDEpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0lTX0RFRkFVTFQsIDEgLyppc1ByaW1hcnkqLyk7CkBAIC0xMTMwLDcgKzExMzUsOCBAQAogICAgIC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gbWVtb3J5LgogICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShpbnB1dEZyYW1lLmFuYik7CiAgICAgdm9pZCogZHN0QnVmZmVyOwotICAgIGF1dG8gcmVzID0gZ2ItPmxvY2tBc3luYyhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmZHN0QnVmZmVyLCBpbnB1dEZyYW1lLmZlbmNlRmQpOworICAgIEdyYXBoaWNCdWZmZXJMb2NrZXIgZ2JMb2NrZXIoZ2IpOworICAgIGF1dG8gcmVzID0gZ2JMb2NrZXIubG9ja0FzeW5jKCZkc3RCdWZmZXIsIGlucHV0RnJhbWUuZmVuY2VGZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBsb2NrIG91dHB1dCBidWZmZXIgZmVuY2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMTU2LDEwICsxMTYyLDEwIEBACiAKICAgICAvLyBGaWxsIGluIEhFSUMgaGVhZGVyCiAgICAgdWludDhfdCAqaGVhZGVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRzdEJ1ZmZlcikgKyBtTWF4SGVpY0J1ZmZlclNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYik7Ci0gICAgc3RydWN0IENhbWVyYUJsb2IgKmJsb2JIZWFkZXIgPSAoc3RydWN0IENhbWVyYUJsb2IgKiloZWFkZXI7CisgICAgQ2FtZXJhQmxvYiAqYmxvYkhlYWRlciA9IChDYW1lcmFCbG9iICopaGVhZGVyOwogICAgIC8vIE11c3QgYmUgaW4gc3luYyB3aXRoIENBTUVSQTNfSEVJQ19CTE9CX0lEIGluIGFuZHJvaWRfbWVkaWFfVXRpbHMuY3BwCiAgICAgYmxvYkhlYWRlci0+YmxvYklkID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQmxvYklkPigweDAwRkUpOwotICAgIGJsb2JIZWFkZXItPmJsb2JTaXplID0gZlNpemU7CisgICAgYmxvYkhlYWRlci0+YmxvYlNpemVCeXRlcyA9IGZTaXplOwogCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobU91dHB1dFN1cmZhY2UuZ2V0KCksIGlucHV0RnJhbWUudGltZXN0YW1wKTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xNDIxLDE1ICsxNDI3LDE1IEBACiAKICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gMDsKICAgICAvLyBGaXJzdCBjaGVjayBmb3IgRVhJRiB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgotICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciA9IGFwcFNlZ21lbnRCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpOwotICAgIGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iICpibG9iID0gKGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iKikoaGVhZGVyKTsKKyAgICBjb25zdCB1aW50OF90ICpoZWFkZXIgPSBhcHBTZWdtZW50QnVmZmVyICsgKG1heFNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpOworICAgIGNvbnN0IENhbWVyYUJsb2IgKmJsb2IgPSAoY29uc3QgQ2FtZXJhQmxvYiopKGhlYWRlcik7CiAgICAgaWYgKGJsb2ItPmJsb2JJZCAhPSBDYW1lcmFCbG9iSWQ6OkpQRUdfQVBQX1NFR01FTlRTKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBFWElGIGJsb2JJZCAlaHUiLCBfX0ZVTkNUSU9OX18sIGJsb2ItPmJsb2JJZCk7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBFWElGIGJsb2JJZCAlZCIsIF9fRlVOQ1RJT05fXywgYmxvYi0+YmxvYklkKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgZXhwZWN0ZWRTaXplID0gYmxvYi0+YmxvYlNpemU7Ci0gICAgaWYgKGV4cGVjdGVkU2l6ZSA9PSAwIHx8IGV4cGVjdGVkU2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKSB7CisgICAgZXhwZWN0ZWRTaXplID0gYmxvYi0+YmxvYlNpemVCeXRlczsKKyAgICBpZiAoZXhwZWN0ZWRTaXplID09IDAgfHwgZXhwZWN0ZWRTaXplID4gbWF4U2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSkgewogICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgYmxvYlNpemUgJXp1LiIsIF9fRlVOQ1RJT05fXywgZXhwZWN0ZWRTaXplKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTYzMiw3ICsxNjM4LDcgQEAKICAgICAgICAgbWF4QXBwc1NlZ21lbnQgPSBlbnRyeS5kYXRhLnU4WzBdIDwgMSA/IDEgOgogICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPiAxNiA/IDE2IDogZW50cnkuZGF0YS51OFswXTsKICAgICB9Ci0gICAgcmV0dXJuIG1heEFwcHNTZWdtZW50ICogKDIgKyAweEZGRkYpICsgc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKTsKKyAgICByZXR1cm4gbWF4QXBwc1NlZ21lbnQgKiAoMiArIDB4RkZGRikgKyBzaXplb2YoQ2FtZXJhQmxvYik7CiB9CiAKIHZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6dXBkYXRlQ29kZWNRdWFsaXR5TG9ja2VkKGludDMyX3QgcXVhbGl0eSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggMTNkMDQ0YS4uZGM1MDAyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgogCkBAIC00Nyw2ICs0OSw3IEBACiAgICAgICAgIGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxUQ2FtQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLApAQCAtNTUsMjAgKzU4LDIwIEBACiAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOgotICAgICAgICBUQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQpOgorICAgICAgICBUQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsIHN5c3RlbU5hdGl2ZUNsaWVudCwKKyAgICAgICAgICAgICAgICBjbGllbnRGZWF0dXJlSWQsIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKSwKLSAgICAgICAgbURldmljZVZlcnNpb24oY2FtZXJhU2VydmljZS0+Z2V0RGV2aWNlVmVyc2lvbihUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKSksCi0gICAgICAgIG1EZXZpY2UobmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSksCiAgICAgICAgIG1EZXZpY2VBY3RpdmUoZmFsc2UpLCBtQXBpMUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKICAgICBBTE9HSSgiQ2FtZXJhICVzOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLnN0cmluZygpLAogICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAogICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSA9PSAwLCAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBOVUxMIGhlcmUuIik7CisgICAgbU92ZXJyaWRlRm9yUGVyZkNsYXNzID0gb3ZlcnJpZGVGb3JQZXJmQ2xhc3M7CisgICAgbUxlZ2FjeUNsaWVudCA9IGxlZ2FjeUNsaWVudDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMTAzLDcgKzEwNiwyOCBAQAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9Ci0KKyAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBJUENUcmFuc3BvcnQ6OklOVkFMSUQ7CisgICAgcmVzID0gcHJvdmlkZXJQdHItPmdldENhbWVyYUlkSVBDVHJhbnNwb3J0KFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAmcHJvdmlkZXJUcmFuc3BvcnQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgc3dpdGNoIChwcm92aWRlclRyYW5zcG9ydCkgeworICAgICAgICBjYXNlIElQQ1RyYW5zcG9ydDo6SElETDoKKyAgICAgICAgICAgIG1EZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSGlkbENhbWVyYTNEZXZpY2UoVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lDbGllbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpBSURMOgorICAgICAgICAgICAgbURldmljZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBaWRsQ2FtZXJhM0RldmljZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeUNsaWVudCk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXMgSW52YWxpZCB0cmFuc3BvcnQgZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogTm8gZGV2aWNlIGNvbm5lY3RlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKQEAgLTE1NSw2ICsxNzksMzggQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0KSB7CisgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgIGlmICghZGV2aWNlKSB7CisgICAgZHByaW50ZihvdXQsICIgIERldmljZSBpcyBkZXRhY2hlZCIpOworICAgIHJldHVybiBPSzsKKyAgfQorCisgIHJldHVybiBkZXZpY2UtPnN0YXJ0V2F0Y2hpbmdUYWdzKHRhZ3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OnN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dCkgeworICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOworICBpZiAoIWRldmljZSkgeworICAgIGRwcmludGYob3V0LCAiICBEZXZpY2UgaXMgZGV0YWNoZWQiKTsKKyAgICByZXR1cm4gT0s7CisgIH0KKworICByZXR1cm4gZGV2aWNlLT5zdG9wV2F0Y2hpbmdUYWdzKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkdW1wIGlmIHRoZSBkZXZpY2UgaXMgZGV0YWNoZWQKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKG91dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIHN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6ZHVtcERldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKQEAgLTE4NiwyMCArMjQyLDIzIEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CiBiaW5kZXI6OlN0YXR1cyBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmRpc2Nvbm5lY3QoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRCgiQ2FtZXJhICVzOiBzdGFydCB0byBkaXNjb25uZWN0IiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCisgICAgQUxPR0QoIkNhbWVyYSAlczogc2VyaWFsaXphdGlvbkxvY2sgYWNxdWlyZWQiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIG1lZGlhIHNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwogICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAmJgogICAgICAgICBjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIAotICAgIEFMT0dWKCJDYW1lcmEgJXM6IFNodXR0aW5nIGRvd24iLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICBBTE9HRCgiQ2FtZXJhICVzOiBTaHV0dGluZyBkb3duIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAKICAgICAvLyBCZWZvcmUgZGV0YWNoaW5nIHRoZSBkZXZpY2UsIGNhY2hlIHRoZSBpbmZvIGZyb20gY3VycmVudCBvcGVuIHNlc3Npb24uCiAgICAgLy8gVGhlIGRpc2Nvbm5lY3RlZCBjaGVjayBhdm9pZHMgZHVwbGljYXRpb24gb2YgaW5mbyBhbmQgYWxzbyBwcmV2ZW50cwogICAgIC8vIGRlYWRsb2NrIHdoaWxlIGFjcXVpcmluZyBzZXJ2aWNlIGxvY2sgaW4gY2FjaGVEdW1wLgogICAgIGlmICghVENsaWVudEJhc2U6Om1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgQUxPR0QoIkNhbWVyYSAlczogc3RhcnQgdG8gY2FjaGVEdW1wIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlOjpnZXRDYW1lcmFTZXJ2aWNlKCktPmNhY2hlRHVtcCgpOwogICAgIH0KIApAQCAtMjU4LDcgKzMxNyw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5QWN0aXZlKCkgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlBY3RpdmUoZmxvYXQgbWF4UHJldmlld0ZwcykgewogICAgIGlmICghbURldmljZUFjdGl2ZSkgewogICAgICAgICBzdGF0dXNfdCByZXMgPSBUQ2xpZW50QmFzZTo6c3RhcnRDYW1lcmFTdHJlYW1pbmdPcHMoKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjY2LDcgKzMyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0FjdGl2ZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKTsKKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIsIG1heFByZXZpZXdGcHMpOwogICAgIH0KICAgICBtRGV2aWNlQWN0aXZlID0gdHJ1ZTsKIApAQCAtMjc1LDkgKzMzNCwxMCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci12b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5SWRsZSgKK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlJZGxlV2l0aFVzZXJUYWcoCiAgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUpIHsKICAgICBpZiAobURldmljZUFjdGl2ZSkgewogICAgICAgICBzdGF0dXNfdCByZXMgPSBUQ2xpZW50QmFzZTo6ZmluaXNoQ2FtZXJhU3RyZWFtaW5nT3BzKCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI4NSw3ICszNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpLCByZXMpOwogICAgICAgICB9CiAgICAgICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0lkbGUoVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCBzdHJlYW1TdGF0cyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgdXNlclRhZywgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1TdGF0cyk7CiAgICAgfQogICAgIG1EZXZpY2VBY3RpdmUgPSBmYWxzZTsKIApAQCAtMzYxLDExICs0MjIsNiBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci1pbnQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlKCkgewogICAgIHJldHVybiBtRGV2aWNlOwogfQpAQCAtNDEzLDYgKzQ2OSwxNyBAQAogICAgIG1SZW1vdGVDYWxsYmFjay5jbGVhcigpOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKKyAgICByZXR1cm4gbURldmljZS0+aW5qZWN0Q2FtZXJhKGluamVjdGVkQ2FtSWQsIG1hbmFnZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OnN0b3BJbmplY3Rpb24oKSB7CisgICAgcmV0dXJuIG1EZXZpY2UtPnN0b3BJbmplY3Rpb24oKTsKK30KKwogdGVtcGxhdGUgY2xhc3MgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhU2VydmljZTo6Q2xpZW50PjsKIHRlbXBsYXRlIGNsYXNzIENhbWVyYTJDbGllbnRCYXNlPENhbWVyYURldmljZUNsaWVudEJhc2U+OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IDYyNDZmN2IuLmIwZDFjM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC00OCw2ICs0OCw3IEBACiAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC01NiwxMSArNTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVnYWN5Q2xpZW50ID0gZmFsc2UpOwogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnRCYXNlKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCk7CiAKICAgICAvKioKICAgICAgKiBOb3RpZmljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgpAQCAtNjgsMTAgKzczLDExIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIG5vdGlmeUFjdGl2ZSgpOyAgLy8gUmV0dXJucyBlcnJvcnMgb24gYXBwIG9wcyBwZXJtaXNzaW9uIGZhaWx1cmVzCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldmljZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKKyAgICAvLyBSZXR1cm5zIGVycm9ycyBvbiBhcHAgb3BzIHBlcm1pc3Npb24gZmFpbHVyZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgbm90aWZ5QWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlJZGxlKGludDY0X3QgLypyZXF1ZXN0Q291bnQqLywgaW50NjRfdCAvKnJlc3VsdEVycm9yQ291bnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZGV2aWNlRXJyb3IqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+Jikge30KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CkBAIC04Miw2ICs4OCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlSZXF1ZXN0UXVldWVFbXB0eSgpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlSZXBlYXRpbmdSZXF1ZXN0RXJyb3IobG9uZyBsYXN0RnJhbWVOdW1iZXIpOwogCisgICAgdm9pZCAgICAgICAgICAgICAgICAgIG5vdGlmeUlkbGVXaXRoVXNlclRhZyhpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJUYWcsIGludCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlKTsKKwogICAgIGludCAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFJZCgpIGNvbnN0OwogICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JgogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFEZXZpY2UoKTsKQEAgLTExNCwxMCArMTI1LDE2IEBACiAgICAgICAgIG11dGFibGUgTXV0ZXggbVJlbW90ZUNhbGxiYWNrTG9jazsKICAgICB9IG1TaGFyZWRDYW1lcmFDYWxsYmFja3M7CiAKKyAgICBzdGF0dXNfdCAgICAgIGluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgICAgICBzdG9wSW5qZWN0aW9uKCkgb3ZlcnJpZGU7CisKIHByb3RlY3RlZDoKIAogICAgIC8vIFRoZSBQSUQgcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGNhbGwKICAgICBwaWRfdCBtSW5pdGlhbENsaWVudFBpZDsKKyAgICBib29sIG1PdmVycmlkZUZvclBlcmZDbGFzcyA9IGZhbHNlOworICAgIGJvb2wgbUxlZ2FjeUNsaWVudCA9IGZhbHNlOwogCiAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSB7CiAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcih0aGlzKTsKQEAgLTEzNSwxMSArMTUyLDEyIEBACiAKICAgICAvKiogQ2FtZXJhRGV2aWNlQmFzZSBpbnN0YW5jZSB3cmFwcGluZyBIQUwzKyBlbnRyeSAqLwogCi0gICAgY29uc3QgaW50IG1EZXZpY2VWZXJzaW9uOwotCi0gICAgLy8gU2V0IHRvIGNvbnN0IHRvIGF2b2lkIG1EZXZpY2UgYmVpbmcgdXBkYXRlZCAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nCi0gICAgLy8gZHVtcERldmljZSAod2hpY2ggaXMgaW1wb3J0YW50IHRvIGJlIGxvY2sgZnJlZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UpCi0gICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CisgICAgLy8gTm90ZTogVGhpcyB3YXMgcHJldmlvdXNseSBzZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkIC0KKyAgICAvLyBiLzExMjYzOTkzOSAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nIGR1bXBEZXZpY2UgKHdoaWNoIGlzIGltcG9ydGFudCB0byBiZSBsb2NrIGZyZWUKKyAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2UpLiBUaGUgY29uc3QgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBDYW1lcmFEZXZpY2VCYXNlCisgICAgLy8gbmVlZHMgdG8gYmUgc2V0IGR1cmluZyBpbml0aWFsaXplSW1wbCgpLiBUaGlzIG11c3Qgbm90IGJlIHNldCAvIGNsZWFyZWQKKyAgICAvLyBhbnl3aGVyZSBlbHNlLgorICAgIHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCA4NWIwY2MyLi43ZTJmOTNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKICNpbmNsdWRlICJiaW5kZXIvU3RhdHVzLmgiCiAjaW5jbHVkZSAiRnJhbWVQcm9kdWNlci5oIgorI2luY2x1ZGUgInV0aWxzL0lQQ1RyYW5zcG9ydC5oIgogCiAjaW5jbHVkZSAiQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgiCiAKQEAgLTU5LDYgKzYwLDkgQEAKICAgICBDQU1FUkFfVkVORE9SX1NUUkVBTV9DT05GSUdVUkFUSU9OX01PREVfU1RBUlQgPSAweDgwMDAKIH0gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdDsKIAorLy8gTWF0Y2hlcyBkZWZpbml0aW9uIG9mIGNhbWVyYTNfanBlZ19ibG9iIGluIGNhbWVyYTMuaCBhbmQgSElETCBkZWZpbml0aW9uCisvLyBkZXZpY2VAMy4yOnR5cGVzLmhhbCwgbmVlZHMgdG8gc3RheSBhcm91bmQgdGlsbCBISURMIHN1cHBvcnQgaXMgcmVtb3ZlZCAoZm9yCisvLyBISURMIC0+IEFJREwgY2FtZXJhQmxvYiB0cmFuc2xhdGlvbikKIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IgewogICAgIHVpbnQxNl90IGpwZWdfYmxvYl9pZDsKICAgICB1aW50MzJfdCBqcGVnX3NpemU7CkBAIC04OCw2ICs5Miw4IEBACiAgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5DYW1lcmFEZXZpY2VCYXNlKCk7CiAKKyAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRUcmFuc3BvcnRUeXBlKCkgY29uc3QgPSAwOworCiAgICAgLyoqCiAgICAgICogVGhlIGRldmljZSB2ZW5kb3IgdGFnIElECiAgICAgICovCkBAIC05NywxNSArMTAzLDI5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncygpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpID0gMDsKIAogICAgIC8qKgotICAgICAqIFRoZSBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIKKyAgICAgKiBUaGUgcGh5c2ljYWwgY2FtZXJhIGRldmljZSdzIHN0YXRpYyBjaGFyYWN0ZXJpc3RpY3MgbWV0YWRhdGEgYnVmZmVyLCBvcgorICAgICAqIHRoZSBsb2dpY2FsIGNhbWVyYSdzIHN0YXRpYyBjaGFyYWN0ZXJpc3RpY3MgaWYgcGh5c2ljYWwgaWQgaXMgZW1wdHkuCiAgICAgICovCiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mb1BoeXNpY2FsKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIGNvbnN0ID0gMDsKIAogICAgIHN0cnVjdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzIHsKICAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworCisgICAgICAgIC8vIFdoZXRoZXIgdGhlIHBoeXNpY2FsIGNhbWVyYSBzdXBwb3J0cyB0ZXN0UGF0dGVybk1vZGUvdGVzdFBhdHRlcm5EYXRhCisgICAgICAgIGJvb2wgbUhhc1Rlc3RQYXR0ZXJuTW9kZVRhZyA9IHRydWU7CisgICAgICAgIGJvb2wgbUhhc1Rlc3RQYXR0ZXJuRGF0YVRhZyA9IHRydWU7CisKKyAgICAgICAgLy8gT3JpZ2luYWwgdmFsdWUgb2YgVEVTVF9QQVRURVJOX01PREUgYW5kIERBVEEgc28gdGhhdCB0aGV5IGNhbiBiZQorICAgICAgICAvLyByZXN0b3JlZCB3aGVuIHNlbnNvciBtdXRpbmcgaXMgdHVybmVkIG9mZgorICAgICAgICBpbnQzMl90IG1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZSA9IDA7CisgICAgICAgIGludDMyX3QgbU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzRdID0ge307CisKICAgICB9OwogICAgIHR5cGVkZWYgTGlzdDxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdDsKIApAQCAtMTY4LDcgKzE4OCwxMSBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gb3V0cHV0IHN0cmVhbSBvZiB0aGUgcmVxdWVzdGVkIHNpemUsIGZvcm1hdCwgcm90YXRpb24gYW5kCkBAIC0xODUsNyArMjA5LDExIEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzID0gbnVsbHB0ciwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAogICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KQEAgLTIwNiwxMCArMjM0LDEyIEBACiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKICAgICAgICAgYm9vbCBkYXRhU3BhY2VPdmVycmlkZGVuOwogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBvcmlnaW5hbERhdGFTcGFjZTsKKyAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlOwogCiAgICAgICAgIFN0cmVhbUluZm8oKSA6IHdpZHRoKDApLCBoZWlnaHQoMCksIGZvcm1hdCgwKSwgZm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksIG9yaWdpbmFsRm9ybWF0KDApLAogICAgICAgICAgICAgICAgIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLCBkYXRhU3BhY2VPdmVycmlkZGVuKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHt9CisgICAgICAgICAgICAgICAgb3JpZ2luYWxEYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKKyAgICAgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpe30KICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGZvcm1hdCBtYXRjaGVzIHRoZSBjdXJyZW50IG9yIHRoZSBvcmlnaW5hbCBvbmUgaW4gY2FzZQogICAgICAgICAgKiBpdCBnb3Qgb3ZlcnJpZGRlbi4KQEAgLTI5NCw3ICszMjQsOCBAQAogICAgICAqIEdldCBKcGVnIGJ1ZmZlciBzaXplIGZvciBhIGdpdmVuIGpwZWcgcmVzb2x1dGlvbi4KICAgICAgKiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9yIGNvZGVzLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICZpbmZvLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCkgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ29ubmVjdCBIQUwgbm90aWZpY2F0aW9ucyB0byBhIGxpc3RlbmVyLiBPdmVyd3JpdGVzIHByZXZpb3VzCkBAIC00MjcsNiArNDU4LDE4IEBACiAgICAgICovCiAgICAgdm9pZCBzZXRJbWFnZUR1bXBNYXNrKGludCBtYXNrKSB7IG1JbWFnZUR1bXBNYXNrID0gbWFzazsgfQogCisgICAgLyoqCisgICAgICogVGhlIGluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiB0byByZXBsYWNlIHRoZSBpbnRlcm5hbCBjYW1lcmEKKyAgICAgKiBzZXNzaW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5qZWN0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIHJlc3RvcmUgdG8gaW50ZXJuYWwgY2FtZXJhIHNlc3Npb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5qZWN0aW9uKCkgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtSW1hZ2VEdW1wTWFzayA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5oCmluZGV4IDU0ZTQyYTYuLmYzOWI5MmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgKQEAgLTQwLDcgKzQwLDggQEAKICAgICAvLyBSZXF1aXJlZCBmb3IgQVBJIDEgYW5kIDIKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKCkgPSAwOyAvLyBNYXkgcmV0dXJuIGFuIGVycm9yIHNpbmNlIGl0IGNoZWNrcyBhcHBvcHMKKyAgICAvLyBNYXkgcmV0dXJuIGFuIGVycm9yIHNpbmNlIGl0IGNoZWNrcyBhcHBvcHMKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3IsIGJvb2wgZGV2aWNlRXJyb3IsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJJbmZvVGVtcGxhdGVkLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJJbmZvVGVtcGxhdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3NjkyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJJTkZPX1RFTVBMQVRFREgKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUklORk9fVEVNUExBVEVESAorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDxjbGFzcyBWZW5kb3JUYWdTZWN0aW9uVmVjdG9yVHlwZSwgY2xhc3MgVmVuZG9yVGFnU2VjdGlvblR5cGU+CitzdGF0dXNfdCBJZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUlkbCgKKyAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvblZlY3RvclR5cGUmIHZ0cywKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpIHsKKworICAgIGludCB0YWdDb3VudCA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgeworICAgICAgICB0YWdDb3VudCArPSB2dHNbc10udGFncy5zaXplKCk7CisgICAgfQorCisgICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciB0YWcgc2VjdGlvbnMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKKyAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworICAgIHNwPElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgSWRsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGRlc2MtPm1UYWdDb3VudCA9IHRhZ0NvdW50OworCisgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IHNlY3Rpb25zOworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBTdHJpbmc4PiB0YWdUb1NlY3Rpb25NYXA7CisKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgeworICAgICAgICBjb25zdCBWZW5kb3JUYWdTZWN0aW9uVHlwZSYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisgICAgICAgIHNlY3Rpb25zLmFkZChzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNlY3Rpb24udGFncy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgdWludDMyX3QgdGFnID0gc2VjdGlvbi50YWdzW2pdLnRhZ0lkOworICAgICAgICAgICAgaWYgKHRhZyA8IENBTUVSQV9NRVRBREFUQV9WRU5ET1JfVEFHX0JPVU5EQVJZKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3IgdGFnICVkIG5vdCBpbiB2ZW5kb3IgdGFnIHNlY3Rpb24uIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhZ0FycmF5LmVkaXRJdGVtQXQoaWR4KyspID0gc2VjdGlvbi50YWdzW2pdLnRhZ0lkOworCisgICAgICAgICAgICBjb25zdCBjaGFyICp0YWdOYW1lID0gc2VjdGlvbi50YWdzW2pdLnRhZ05hbWUuY19zdHIoKTsKKyAgICAgICAgICAgIGlmICh0YWdOYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICAgICAgdGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHNlY3Rpb25TdHJpbmcpOworCisgICAgICAgICAgICBpbnQgdGFnVHlwZSA9IChpbnQpIHNlY3Rpb24udGFnc1tqXS50YWdUeXBlOworICAgICAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0YWcgdHlwZSAlZCBmcm9tIHZlbmRvciBvcHMgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCB0YWdUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5hZGQodGFnLCB0YWdUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlc2MtPm1TZWN0aW9ucyA9IHNlY3Rpb25zOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAorICAgICAgICBzc2l6ZV90IGluZGV4ID0gc2VjdGlvbnMuaW5kZXhPZihzZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJpbmRleCAlemQgbXVzdCBiZSBub24tbmVnYXRpdmUiLCBpbmRleCk7CisgICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisKKyAgICAgICAgLy8gU2V0IHVwIHJldmVyc2UgbWFwcGluZworICAgICAgICBzc2l6ZV90IHJldmVyc2VJbmRleCA9IC0xOworICAgICAgICBpZiAoKHJldmVyc2VJbmRleCA9IGRlc2MtPm1SZXZlcnNlTWFwcGluZy5pbmRleE9mS2V5KHNlY3Rpb25TdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PiogbmFtZU1hcHBlciA9IG5ldyBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIHJldmVyc2VJbmRleCA9IGRlc2MtPm1SZXZlcnNlTWFwcGluZy5hZGQoc2VjdGlvblN0cmluZywgbmFtZU1hcHBlcik7CisgICAgICAgIH0KKyAgICAgICAgZGVzYy0+bVJldmVyc2VNYXBwaW5nW3JldmVyc2VJbmRleF0tPmFkZChkZXNjLT5tVGFnVG9OYW1lTWFwLnZhbHVlRm9yKHRhZyksIHRhZyk7CisgICAgfQorCisgICAgZGVzY3JpcHRvciA9IHN0ZDo6bW92ZShkZXNjKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggNGYyYjg3OC4uYWJhZWE2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTIwLDE0ICsyMCwxNyBAQAogCiAjaW5jbHVkZSAiQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhRGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmgiCisjaW5jbHVkZSAiYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmgiCiAjaW5jbHVkZSA8ZGxmY24uaD4KICNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgpAQCAtMzYsNyArMzksNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSAiYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgiCkBAIC00NSwyNiArNDcsNTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDsKLXVzaW5nIGNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBuYW1lc3BhY2UgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKIHVzaW5nIHN0ZDo6bGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiInM7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb247Ci11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbjsKIAogbmFtZXNwYWNlIHsKIGNvbnN0IGJvb2wga0VuYWJsZUxhenlIYWwocHJvcGVydHlfZ2V0X2Jvb2woInJvLmNhbWVyYS5lbmFibGVMYXp5SGFsIiwgZmFsc2UpKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtFeHRlcm5hbFByb3ZpZGVyTmFtZSA9ICJleHRlcm5hbC8wIjsKIH0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBjb25zdCBmbG9hdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmtEZXB0aEFSVG9sZXJhbmNlID0gLjFmOwogCi1DYW1lcmFQcm92aWRlck1hbmFnZXI6OkhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkKLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHl7fTsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5SW1wbAorQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5e307CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6fkNhbWVyYVByb3ZpZGVyTWFuYWdlcigpIHsKIH0KIAorY29uc3QgY2hhciogRnJhbWV3b3JrVG9yY2hTdGF0dXNUb1N0cmluZyhjb25zdCBUb3JjaE1vZGVTdGF0dXMmIHMpIHsKKyAgICBzd2l0Y2ggKHMpIHsKKyAgICAgICAgY2FzZSBUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gIk5PVF9BVkFJTEFCTEUiOworICAgICAgICBjYXNlIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRjoKKyAgICAgICAgICAgIHJldHVybiAiQVZBSUxBQkxFX09GRiI7CisgICAgICAgIGNhc2UgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT046CisgICAgICAgICAgICByZXR1cm4gIkFWQUlMQUJMRV9PTiI7CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCB0b3JjaCBtb2RlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuICJVTktOT1dOX1NUQVRVUyI7Cit9CisKK2NvbnN0IGNoYXIqIEZyYW1ld29ya0RldmljZVN0YXR1c1RvU3RyaW5nKGNvbnN0IENhbWVyYURldmljZVN0YXR1cyYgcykgeworICAgIHN3aXRjaCAocykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIk5PVF9QUkVTRU5UIjsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIlBSRVNFTlQiOworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc6CisgICAgICAgICAgICByZXR1cm4gIkVOVU1FUkFUSU5HIjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiAiVU5LTk9XTl9TVEFUVVMiOworfQorCiBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5OjpsaXN0U2VydmljZXMoKSB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OkhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eUltcGw6Omxpc3RTZXJ2aWNlcygpIHsKICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiByZXQ7CiAgICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjFfMigpOwogICAgIGlmIChtYW5hZ2VyICE9IG51bGxwdHIpIHsKQEAgLTc2LDIwICsxMDUsMTEgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmluaXRpYWxpemUod3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIsCi0gICAgICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBwcm94eSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0gICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBzZXJ2aWNlIGludGVyYWN0aW9uIHByb3h5IHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgbVNlcnZpY2VQcm94eSA9IHByb3h5OwotICAgIG1EZXZpY2VTdGF0ZSA9IHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4+KAotICAgICAgICBwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU6Ok5PUk1BTCk7Ci0KK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6dHJ5VG9Jbml0QW5kQWRkSGlkbFByb3ZpZGVyc0xvY2tlZCgKKyAgICAgICAgSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5ICpoaWRsUHJveHkpIHsKKyAgICBtSGlkbFNlcnZpY2VQcm94eSA9IGhpZGxQcm94eTsKICAgICAvLyBSZWdpc3RlcmluZyB3aWxsIHRyaWdnZXIgbm90aWZpY2F0aW9ucyBmb3IgYWxsIGFscmVhZHkta25vd24gcHJvdmlkZXJzCi0gICAgYm9vbCBzdWNjZXNzID0gbVNlcnZpY2VQcm94eS0+cmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAorICAgIGJvb2wgc3VjY2VzcyA9IG1IaWRsU2VydmljZVByb3h5LT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCiAgICAgICAgIC8qIGluc3RhbmNlIG5hbWUsIGVtcHR5IG1lYW5zIG5vIGZpbHRlciAqLyAiIiwKICAgICAgICAgdGhpcyk7CiAgICAgaWYgKCFzdWNjZXNzKSB7CkBAIC05OCwxNCArMTE4LDU3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLQotICAgIGZvciAoY29uc3QgYXV0byYgaW5zdGFuY2UgOiBtU2VydmljZVByb3h5LT5saXN0U2VydmljZXMoKSkgewotICAgICAgICB0aGlzLT5hZGRQcm92aWRlckxvY2tlZChpbnN0YW5jZSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IG1IaWRsU2VydmljZVByb3h5LT5saXN0U2VydmljZXMoKSkgeworICAgICAgICB0aGlzLT5hZGRIaWRsUHJvdmlkZXJMb2NrZWQoaW5zdGFuY2UpOwogICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRGdWxsQWlkbFByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyBpbnN0YW5jZSkgeworICAgIHN0ZDo6c3RyaW5nIGFpZGxIYWxTZXJ2aWNlRGVzY3JpcHRvciA9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyhhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyOjpkZXNjcmlwdG9yKTsKKyAgIHJldHVybiBhaWRsSGFsU2VydmljZURlc2NyaXB0b3IgKyAiLyIgKyBpbnN0YW5jZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0cnlUb0FkZEFpZGxQcm92aWRlcnNMb2NrZWQoKSB7CisgICAgY29uc3QgY2hhciAqIGFpZGxIYWxTZXJ2aWNlRGVzY3JpcHRvciA9CisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyOjpkZXNjcmlwdG9yOworICAgIGF1dG8gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBhdXRvIGFpZGxQcm92aWRlcnMgPSBzbS0+Z2V0RGVjbGFyZWRJbnN0YW5jZXMoCisgICAgICAgICAgICBTdHJpbmcxNihhaWRsSGFsU2VydmljZURlc2NyaXB0b3IpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFpZGxJbnN0YW5jZSA6IGFpZGxQcm92aWRlcnMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWlkbFNlcnZpY2VOYW1lID0KKyAgICAgICAgICAgICAgICBnZXRGdWxsQWlkbFByb3ZpZGVyTmFtZShzdGQ6OnN0cmluZyhTdHJpbmc4KGFpZGxJbnN0YW5jZSkuY19zdHIoKSkpOworICAgICAgICBhdXRvIHJlcyA9IHNtLT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoU3RyaW5nMTYoYWlkbFNlcnZpY2VOYW1lLmNfc3RyKCkpLCB0aGlzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzIFVuYWJsZSB0byByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aXRoIEFJREwgc2VydmljZSBtYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgYWRkQWlkbFByb3ZpZGVyTG9ja2VkKGFpZGxTZXJ2aWNlTmFtZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppbml0aWFsaXplKHdwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkqIGhpZGxQcm94eSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisgICAgaWYgKGhpZGxQcm94eSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmFsaWQgc2VydmljZSBpbnRlcmFjdGlvbiBwcm94eSBwcm92aWRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIG1EZXZpY2VTdGF0ZSA9IDA7CisgICAgYXV0byByZXMgPSB0cnlUb0luaXRBbmRBZGRIaWRsUHJvdmlkZXJzTG9ja2VkKGhpZGxQcm94eSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBMb2dnaW5nIGRvbmUgaW4gY2FsbGVkIGZ1bmN0aW9uOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSB0cnlUb0FkZEFpZGxQcm92aWRlcnNMb2NrZWQoKTsKIAogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGQ6OnBhaXI8aW50LCBpbnQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ291bnQoKSBjb25zdCB7CkBAIC0yMTEsMTUgKzI3NCwxMyBAQAogICAgIHJldHVybiBkZXZpY2VJZHM7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1ZhbGlkRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWFqb3JWZXJzaW9uKSBjb25zdCB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICByZXR1cm4gaXNWYWxpZERldmljZUxvY2tlZChpZCwgbWFqb3JWZXJzaW9uKTsKLX0KLQotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzVmFsaWREZXZpY2VMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0IHsKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1ZhbGlkRGV2aWNlTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWFqb3JWZXJzaW9uLAorICAgICAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0KSBjb25zdCB7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgSVBDVHJhbnNwb3J0IHByb3ZpZGVyVHJhbnNwb3J0ID0gcHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOwogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gaWQgJiYgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCkgPT0gbWFqb3JWZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkICYmIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9tYWpvcigpID09IG1ham9yVmVyc2lvbiAmJgorICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPT0gcHJvdmlkZXJUcmFuc3BvcnQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjY3LDE1ICszMjgsMzEgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAotICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3QgeworICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgbWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGRldmljZUluZm8tPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbiwgc3RhdHVzKTsKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGdldE1ldGFkYXRhLCBzdGF0dXMpOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUlkSVBDVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgSVBDVHJhbnNwb3J0ICpwcm92aWRlclRyYW5zcG9ydCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKyAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyID0gZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50UHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgICpwcm92aWRlclRyYW5zcG9ydCA9IHBhcmVudFByb3ZpZGVyLT5nZXRJUENUcmFuc3BvcnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKQEAgLTI4NSwzOSArMzYyLDEwNiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiAqdikgeworICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uICp2LCBJUENUcmFuc3BvcnQgKnRyYW5zcG9ydCkgeworICAgIGlmICh2ID09IG51bGxwdHIgfHwgdHJhbnNwb3J0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIAogICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbnswLDB9OwogICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBJUENUcmFuc3BvcnQ6OklOVkFMSUQ7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1WZXJzaW9uID4gbWF4VmVyc2lvbikgewogICAgICAgICAgICAgICAgICAgICBtYXhWZXJzaW9uID0gZGV2aWNlSW5mby0+bVZlcnNpb247CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyVHJhbnNwb3J0ID0gcHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOwogICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICghZm91bmQpIHsKKyAgICBpZiAoIWZvdW5kIHx8IHByb3ZpZGVyVHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6SU5WQUxJRCkgewogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogICAgICp2ID0gbWF4VmVyc2lvbjsKKyAgICAqdHJhbnNwb3J0ID0gcHJvdmlkZXJUcmFuc3BvcnQ7CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgICAgIGludDMyX3QqIHRvcmNoU3RyZW5ndGggLypvdXQqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgcmV0dXJuIGRldmljZUluZm8tPmdldFRvcmNoU3RyZW5ndGhMZXZlbCh0b3JjaFN0cmVuZ3RoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCh0b3JjaFN0cmVuZ3RoKTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICBpZiAoZGV2aWNlSW5mby0+bVRvcmNoU3RyZW5ndGhMZXZlbCA9PSB0b3JjaFN0cmVuZ3RoKSB7CisgICAgICAgIEFMT0dWKCIlczogU2tpcHBpbmcgdG9yY2ggc3RyZW5ndGggbGV2ZWwgdXBkYXRlcyBwcmV2X2xldmVsOiAlZCwgbmV3X2xldmVsOiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VJbmZvLT5tVG9yY2hTdHJlbmd0aExldmVsLCB0b3JjaFN0cmVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldFRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bVRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWw7Cit9CisKIGJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKLSAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwotICAgICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXItPm1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQ7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3RlbXBsYXRlIDxjbGFzcyBQcm92aWRlckluZm9UeXBlLCBjbGFzcyBIYWxDYW1lcmFQcm92aWRlclR5cGU+CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZVQoc3A8UHJvdmlkZXJJbmZvPiAmcGFyZW50UHJvdmlkZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gKmhhbENhbWVyYVByb3ZpZGVyKSB7CisgICAgaWYgKGhhbENhbWVyYVByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgUHJvdmlkZXJJbmZvVHlwZSAqaWRsUHJvdmlkZXJJbmZvID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvVHlwZSAqPihwYXJlbnRQcm92aWRlci5nZXQoKSk7CisgICAgYXV0byBpZGxJbnRlcmZhY2UgPSBpZGxQcm92aWRlckluZm8tPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaWRsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICAqaGFsQ2FtZXJhUHJvdmlkZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxIYWxDYW1lcmFQcm92aWRlclR5cGU+KGlkbEludGVyZmFjZSwgaWRsSW50ZXJmYWNlLT5kZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgYm9vbCBlbmFibGVkKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMzMwLDExICs0NzQsMjYgQEAKICAgICBpZiAocGFyZW50UHJvdmlkZXIgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+IGhhbENhbWVyYVByb3ZpZGVyID0gbnVsbHB0cjsKKyAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBwYXJlbnRQcm92aWRlci0+Z2V0SVBDVHJhbnNwb3J0KCk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKHByb3ZpZGVyVHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6SElETCkgeworICAgICAgICByZXMgPSBzZXRUb3JjaE1vZGVUPEhpZGxQcm92aWRlckluZm8sIEhpZGxIYWxDYW1lcmFQcm92aWRlcj4ocGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgJmhhbENhbWVyYVByb3ZpZGVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocHJvdmlkZXJUcmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpBSURMKSB7CisgICAgICAgIHJlcyA9IHNldFRvcmNoTW9kZVQ8QWlkbFByb3ZpZGVySW5mbywgQWlkbEhhbENhbWVyYVByb3ZpZGVyPihwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAmaGFsQ2FtZXJhUHJvdmlkZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzIEludmFsaWQgcHJvdmlkZXIgdHJhbnNwb3J0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBzYXZlUmVmKERldmljZU1vZGU6OlRPUkNILCBkZXZpY2VJbmZvLT5tSWQsIGludGVyZmFjZSk7CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgZGV2aWNlSW5mby0+bUlkLCBoYWxDYW1lcmFQcm92aWRlcik7CiAKICAgICByZXR1cm4gZGV2aWNlSW5mby0+c2V0VG9yY2hNb2RlKGVuYWJsZWQpOwogfQpAQCAtMzUxLDE1ICs1MTAsODUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIHsKK3NwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXJ0RXh0ZXJuYWxMYXp5UHJvdmlkZXIoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHByb3ZpZGVyTG9jayhtUHJvdmlkZXJMaWZlY3ljbGVMb2NrKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBwcm92aWRlckluZm8gOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGlmIChwcm92aWRlckluZm8tPmlzRXh0ZXJuYWxMYXp5SEFMKCkpIHsKKyAgICAgICAgICAgIGlmICghcHJvdmlkZXJJbmZvLT5zdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJJbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om5vdGlmeVVzYkRldmljZUV2ZW50KGludDMyX3QgZXZlbnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzYkRldmljZUlkKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQUxPR1YoIm5vdGlmeVN5c3RlbUV2ZW50OiAlZCB1c2JEZXZpY2VJZCA6ICVzIiwgZXZlbnRJZCwgdXNiRGV2aWNlSWQuY19zdHIoKSk7CisKKyAgICBpZiAoZXZlbnRJZCA9PSBhbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTQl9ERVZJQ0VfQVRUQUNIRUQpIHsKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBleHRlcm5hbFByb3ZpZGVyID0gc3RhcnRFeHRlcm5hbExhenlQcm92aWRlcigpOworICAgICAgICBpZiAoZXh0ZXJuYWxQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIHVzYkRldmljZXMgPSBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIuZmlyc3Q7CisgICAgICAgICAgICB1c2JEZXZpY2VzLnB1c2hfYmFjayh1c2JEZXZpY2VJZCk7CisgICAgICAgICAgICBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIgPSB7dXNiRGV2aWNlcywgZXh0ZXJuYWxQcm92aWRlcn07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV2ZW50SWQKKyAgICAgICAgICA9PSBhbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTQl9ERVZJQ0VfREVUQUNIRUQpIHsKKyAgICAgICAgdXNiRGV2aWNlRGV0YWNoZWQodXNiRGV2aWNlSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp1c2JEZXZpY2VEZXRhY2hlZChjb25zdCBzdGQ6OnN0cmluZyAmdXNiRGV2aWNlSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbnRlcmZhY2VMb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIHVzYkRldmljZXMgPSBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIuZmlyc3Q7CisgICAgYXV0byBmb3VuZElkID0gc3RkOjpmaW5kKHVzYkRldmljZXMuYmVnaW4oKSwgdXNiRGV2aWNlcy5lbmQoKSwgdXNiRGV2aWNlSWQpOworICAgIGlmIChmb3VuZElkICE9IHVzYkRldmljZXMuZW5kKCkpIHsKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPSBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIuc2Vjb25kOworICAgICAgICBpZiAocHJvdmlkZXJJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgQUxPR0UoIiVzIE5vIHZhbGlkIGV4dGVybmFsIHByb3ZpZGVyIGZvciBVU0IgZGV2aWNlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlciA9IHtzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSwgbnVsbHB0cn07CisgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnRlcmZhY2VNdXRleC51bmxvY2soKTsKKyAgICAgICAgICAgIHByb3ZpZGVySW5mby0+cmVtb3ZlQWxsRGV2aWNlcygpOworICAgICAgICAgICAgbUludGVyZmFjZU11dGV4LmxvY2soKTsKKyAgICAgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlciA9IHtzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSwgbnVsbHB0cn07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBtRGV2aWNlU3RhdGUgPSBuZXdTdGF0ZTsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBBTE9HVigiJXM6IE5vdGlmeWluZyAlcyBmb3IgbmV3IHN0YXRlIDB4JSIgUFJJeDY0LAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgbmV3U3RhdGUpOworICAgICAgICAvLyBiLzE5OTI0MDcyNiBDYW1lcmEgcHJvdmlkZXJzIGNhbiBmb3IgZXhhbXBsZSB0cnkgdG8gYWRkL3JlbW92ZQorICAgICAgICAvLyBjYW1lcmEgZGV2aWNlcyBhcyBwYXJ0IG9mIHRoZSBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLiBIb2xkaW5nCisgICAgICAgIC8vICdtSW50ZXJmYWNlTXV0ZXgnIHdoaWxlIGNhbGxpbmcgJ25vdGlmeURldmljZVN0YXRlQ2hhbmdlJyBjYW4KKyAgICAgICAgLy8gcmVzdWx0IGluIGEgcmVjdXJzaXZlIGRlYWRsb2NrLgorICAgICAgICBtSW50ZXJmYWNlTXV0ZXgudW5sb2NrKCk7CiAgICAgICAgIHN0YXR1c190IHNpbmdsZVJlcyA9IHByb3ZpZGVyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICBtSW50ZXJmYWNlTXV0ZXgubG9jaygpOwogICAgICAgICBpZiAoc2luZ2xlUmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBub3RpZnkgcHJvdmlkZXIgJXMgYWJvdXQgZGV2aWNlIHN0YXRlIGNoYW5nZSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTM2NywzNiArNTk2LDEyMCBAQAogICAgICAgICAgICAgcmVzID0gc2luZ2xlUmVzOwogICAgICAgICAgICAgLy8gY29udGludWUgdG8gZG8gdGhlIHJlc3Qgb2YgdGhlIHByb3ZpZGVycyBpbnN0ZWFkIG9mIHJldHVybmluZyBub3cKICAgICAgICAgfQorICAgICAgICBwcm92aWRlci0+bm90aWZ5RGV2aWNlSW5mb1N0YXRlQ2hhbmdlTG9ja2VkKG1EZXZpY2VTdGF0ZSk7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuQWlkbFNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gKnNlc3Npb24pIHsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgYXV0byAqYWlkbERldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8QWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CisgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm8gKj4ocGFyZW50UHJvdmlkZXIuZ2V0KCkpLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+IGhhbENhbWVyYVByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QWlkbEhhbENhbWVyYVByb3ZpZGVyPihwcm92aWRlciwgcHJvdmlkZXItPmRlc2NyaXB0b3IpOworICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgaGFsQ2FtZXJhUHJvdmlkZXIpOworCisgICAgYXV0byBpbnRlcmZhY2UgPSBhaWRsRGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBzZXNzaW9uKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXQpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlbkFpZGxJbmplY3Rpb25TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+ICpzZXNzaW9uKSB7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIGF1dG8gKmFpZGxEZXZpY2VJbmZvMyA9IHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMyo+KGRldmljZUluZm8pOworICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPSBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnRQcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byBwcm92aWRlciA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBaWRsUHJvdmlkZXJJbmZvICo+KHBhcmVudFByb3ZpZGVyLmdldCgpKS0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiBoYWxDYW1lcmFQcm92aWRlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFpZGxIYWxDYW1lcmFQcm92aWRlcj4ocHJvdmlkZXIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yKTsKKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIGhhbENhbWVyYVByb3ZpZGVyKTsKKworICAgIGF1dG8gaW50ZXJmYWNlID0gYWlkbERldmljZUluZm8zLT5zdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byByZXQgPSBpbnRlcmZhY2UtPm9wZW5JbmplY3Rpb25TZXNzaW9uKGNhbGxiYWNrLCBzZXNzaW9uKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlbkhpZGxTZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgewogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIAotICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLAotICAgICAgICAgICAgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCi0gICAgYXV0byAqZGV2aWNlSW5mbzMgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CisgICAgYXV0byAqaGlkbERldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CiAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CiAgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9IHBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbyAqPihwYXJlbnRQcm92aWRlci5nZXQoKSktPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgcHJvdmlkZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gaGFsQ2FtZXJhUHJvdmlkZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxIaWRsSGFsQ2FtZXJhUHJvdmlkZXI+KHByb3ZpZGVyLCBwcm92aWRlci0+ZGVzY3JpcHRvcik7CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBoYWxDYW1lcmFQcm92aWRlcik7CiAKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAotICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGF1dG8gaW50ZXJmYWNlID0gaGlkbERldmljZUluZm8zLT5zdGFydERldmljZUludGVyZmFjZSgpOwogICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQpAQCAtNDE0LDE3ICs3MjcsMTggQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICByZXR1cm4gSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKIHZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCi0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpIHsKICAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQUxPR1YoIlNhdmluZyBjYW1lcmEgcHJvdmlkZXIgJXMgZm9yIGNhbWVyYSBkZXZpY2UgJXMiLCBwcm92aWRlci0+ZGVzY3JpcHRvciwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgQUxPR1YoIlNhdmluZyBjYW1lcmEgcHJvdmlkZXIgJXMgZm9yIGNhbWVyYSBkZXZpY2UgJXMiLCBwcm92aWRlci0+bURlc2NyaXB0b3IuY19zdHIoKSwKKyAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jayk7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gKnByaW1hcnlNYXAsICphbHRlcm5hdGVNYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+PiAqcHJpbWFyeU1hcCwgKmFsdGVybmF0ZU1hcDsKICAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CiAgICAgICAgIHByaW1hcnlNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOwogICAgICAgICBhbHRlcm5hdGVNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKQEAgLTQ0Nyw3ICs3NjEsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWKCJSZW1vdmluZyBjYW1lcmEgZGV2aWNlICVzIiwgY2FtZXJhSWQuY19zdHIoKSk7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gKnByb3ZpZGVyTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPj4gKnByb3ZpZGVyTWFwOwogICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKICAgICAgICAgcHJvdmlkZXJNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOwogICAgIH0gZWxzZSB7CkBAIC00NzIsNiArNzg2LDI2IEBACiAgICAgfQogfQogCisvLyBXZSBpZ25vcmUgc3A8SUJpbmRlcj4gcGFyYW0gaGVyZSBzaW5jZSB3ZSBuZWVkIHN0ZDo6c2hhcmVkX3B0cjwuLi4+IHdoaWNoCisvLyB3aWxsIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSBuZGsgYXBpIHRocm91Z2ggYWRkQWlkbFByb3ZpZGVyTG9ja2VkIC0+CisvLyB0cnlUb0luaXRpYWxpemVBaWRsUHJvdmlkZXIuCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25TZXJ2aWNlUmVnaXN0cmF0aW9uKGNvbnN0IFN0cmluZzE2ICZuYW1lLCBjb25zdCBzcDxJQmluZGVyPiYpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgICAgICByZXMgPSBhZGRBaWRsUHJvdmlkZXJMb2NrZWQoU3RyaW5nOChuYW1lKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBnZXRTdGF0dXNMaXN0ZW5lcigpOworICAgIGlmIChudWxscHRyICE9IGxpc3RlbmVyLmdldCgpICYmIHJlcyA9PSBPSykgeworICAgICAgICBsaXN0ZW5lci0+b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKTsKKyAgICB9CisKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Cit9CisKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvblJlZ2lzdHJhdGlvbigKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAvKmZxTmFtZSovLAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIG5hbWUsCkBAIC00ODEsNyArODE1LDcgQEAKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKLSAgICAgICAgcmVzID0gYWRkUHJvdmlkZXJMb2NrZWQobmFtZSwgcHJlZXhpc3RpbmcpOworICAgICAgICByZXMgPSBhZGRIaWRsUHJvdmlkZXJMb2NrZWQobmFtZSwgcHJlZXhpc3RpbmcpOwogICAgIH0KIAogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IGdldFN0YXR1c0xpc3RlbmVyKCk7CkBAIC01MDMsMTAgKzgzNyw3MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZVByb3ZpZGVySW5mb0NvbW1vbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZkZXZpY2VzKSB7CisKKyAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKKworICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwgQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBlbnVtZXJhdGUgY2FtZXJhIGRldmljZSAnJXMnOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJXMgcmVhZHkgd2l0aCAlenUgY2FtZXJhIGRldmljZXMiLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlcy5zaXplKCkpOworCisgICAgLy8gUHJvY2VzcyBjYWNoZWQgc3RhdHVzIGNhbGxiYWNrcworICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cyA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4oKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7CisKKyAgICAgICAgZm9yIChhdXRvJiBzdGF0dXNJbmZvIDogbUNhY2hlZFN0YXR1cykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaWQsIHBoeXNpY2FsSWQ7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgICAgIGlmIChzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsICZwaHlzaWNhbElkLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNJbmZvLmNhbWVyYUlkLCBzdGF0dXNJbmZvLnBoeXNpY2FsQ2FtZXJhSWQsIHN0YXR1c0luZm8uc3RhdHVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgc3RhdHVzSW5mby5jYW1lcmFJZCwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIGNhY2hlZFN0YXR1cy0+ZW1wbGFjZV9iYWNrKHN0YXR1c0luZm8uaXNQaHlzaWNhbENhbWVyYVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYWNoZWRTdGF0dXMuY2xlYXIoKTsKKworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFRoZSBjYWNoZWQgc3RhdHVzIGNoYW5nZSBjYWxsYmFja3MgY2Fubm90IGJlIGZpcmVkIGRpcmVjdGx5IGZyb20gdGhpcworICAgIC8vIGZ1bmN0aW9uLCBkdWUgdG8gc2FtZS10aHJlYWQgZGVhZGxvY2sgdHJ5aW5nIHRvIGFjcXVpcmUgbUludGVyZmFjZU11dGV4CisgICAgLy8gdHdpY2UuCisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLAorICAgICAgICAgICAgICAgICZDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZSwgdGhpcywKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciwgc3RkOjptb3ZlKGNhY2hlZFN0YXR1cykpOworICAgIH0KK30KKwogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8qIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmluZERldmljZUluZm9Mb2NrZWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBjb25zdCB7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgdXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbjsKKyAgICAgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IHByb3ZpZGVyLT5nZXRJUENUcmFuc3BvcnQoKTsKKyAgICAgICAgLy8gQUlETCBtaW4gdmVyc2lvbiBzdGFydHMgYXQgbWFqb3I6IDEgbWlub3I6IDEKKyAgICAgICAgaGlkbF92ZXJzaW9uIG1pblZlcnNpb24gPQorICAgICAgICAgICAgICAgICh0cmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSA/IGhpZGxfdmVyc2lvbnszLCAyfSA6IGhpZGxfdmVyc2lvbnsxLCAxfSA7CisgICAgICAgIGhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0KKyAgICAgICAgICAgICAgICAodHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6SElETCkgPyBoaWRsX3ZlcnNpb257MywgN30gOiBoaWRsX3ZlcnNpb257MTAwMCwgMH07CisKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkICYmCiAgICAgICAgICAgICAgICAgICAgIG1pblZlcnNpb24gPD0gZGV2aWNlSW5mby0+bVZlcnNpb24gJiYgbWF4VmVyc2lvbiA+PSBkZXZpY2VJbmZvLT5tVmVyc2lvbikgewpAQCAtNTE4LDE2ICs5MTIsMTMgQEAKIH0KIAogbWV0YWRhdGFfdmVuZG9yX2lkX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRQcm92aWRlclRhZ0lkTG9ja2VkKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWluVmVyc2lvbiwKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3QgewogICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IHJldCA9IENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRDsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkICYmCi0gICAgICAgICAgICAgICAgICAgIG1pblZlcnNpb24gPD0gZGV2aWNlSW5mby0+bVZlcnNpb24gJiYKLSAgICAgICAgICAgICAgICAgICAgbWF4VmVyc2lvbiA+PSBkZXZpY2VJbmZvLT5tVmVyc2lvbikgeworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBpZCkgewogICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg1MCwxMiArMTI0MSw0NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaXh1cFRvcmNoU3RyZW5ndGhUYWdzKCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgIGF1dG8gZmxhc2hJbmZvU3RyZW5ndGhEZWZhdWx0TGV2ZWxFbnRyeSA9IGMuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCk7CisgICAgaWYgKGZsYXNoSW5mb1N0cmVuZ3RoRGVmYXVsdExldmVsRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBpbnQzMl90IGZsYXNoSW5mb1N0cmVuZ3RoRGVmYXVsdExldmVsID0gMTsKKyAgICAgICAgcmVzID0gYy51cGRhdGUoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwsCisgICAgICAgICAgICAgICAgJmZsYXNoSW5mb1N0cmVuZ3RoRGVmYXVsdExldmVsLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIGZsYXNoSW5mb1N0cmVuZ3RoTWF4aW11bUxldmVsRW50cnkgPSBjLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwpOworICAgIGlmIChmbGFzaEluZm9TdHJlbmd0aE1heGltdW1MZXZlbEVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgaW50MzJfdCBmbGFzaEluZm9TdHJlbmd0aE1heGltdW1MZXZlbCA9IDE7CisgICAgICAgIHJlcyA9IGMudXBkYXRlKEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMLAorICAgICAgICAgICAgICAgICZmbGFzaEluZm9TdHJlbmd0aE1heGltdW1MZXZlbCwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyxzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaXh1cE1vbm9jaHJvbWVUYWdzKCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOwotCisgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IG1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBJUENUcmFuc3BvcnQgaXBjVHJhbnNwb3J0ID0gcGFyZW50UHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOwogICAgIC8vIE92ZXJyaWRlIHN0YXRpYyBtZXRhZGF0YSBmb3IgTU9OT0NIUk9NRSBjYW1lcmEgd2l0aCBvbGRlciBkZXZpY2UgdmVyc2lvbgotICAgIGlmIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkgeworICAgIGlmIChpcGNUcmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMICYmCisgICAgICAgICAgICAobVZlcnNpb24uZ2V0X21ham9yKCkgPT0gMyAmJiBtVmVyc2lvbi5nZXRfbWlub3IoKSA8IDUpKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBjYXAgPSBjLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcC5jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoY2FwLmRhdGEudThbaV0gPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgewpAQCAtMTE4NSwxMCArMTYwOSwxMiBAQAogfQogCiBib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIHJldHVybiBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhSW50ZXJuYWwoY2FtZXJhSWQpLmZpcnN0OwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmZpbHRlclNtYWxsSnBlZ1NpemVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGNhbWVyYUlkKSB7CkBAIC0xMjEzLDYgKzE2MzksNyBAQAogICAgIH0KIAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBwcm92aWRlci0+Z2V0SVBDVHJhbnNwb3J0KCk7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsSWRzOwogICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKQEAgLTEyMjAsNyArMTY0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCkgIT0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OkhJREwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogV3JvbmcgZGV2aWNlVmVyc2lvbiAleCBmb3IgaGlkZGVuUGh5c2ljYWxDYW1lcmFJZCAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbiwgY2FtZXJhSWQuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VSZXQ7CkBAIC0xMjM1LDIzICsxNjYzLDg5IEBACiAgICAgcmV0dXJuIGZhbHNlUmV0OwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0cnlUb0luaXRpYWxpemVBaWRsUHJvdmlkZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsIGNvbnN0IHNwPFByb3ZpZGVySW5mbz4mIHByb3ZpZGVySW5mbykgewotICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTsKLSAgICBpbnRlcmZhY2UgPSBtU2VydmljZVByb3h5LT50cnlHZXRTZXJ2aWNlKHByb3ZpZGVyTmFtZSk7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgSUNhbWVyYVByb3ZpZGVyOjpmcm9tQmluZGVyKG5kazo6U3BBSUJpbmRlcigKKyAgICAgICAgICAgICAgICAgICAgQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UocHJvdmlkZXJOYW1lLmNfc3RyKCkpKSk7CiAKICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgLy8gVGhlIGludGVyZmFjZSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LiBJbiB0aGF0IGNhc2UsIHRoaXMgaXMgbm90IGEKLSAgICAgICAgLy8gZmF0YWwgZXJyb3IuCi0gICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIHByb3ZpZGVyIEhBTCAnJXMnIGlzIG5vdCBhY3R1YWxseSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgIEFMT0dXKCIlczogQUlETCBDYW1lcmEgcHJvdmlkZXIgSEFMICclcycgaXMgbm90IGFjdHVhbGx5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBwcm92aWRlck5hbWUuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgcmV0dXJuIHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZShpbnRlcmZhY2UsIG1EZXZpY2VTdGF0ZSk7CisgICAgQWlkbFByb3ZpZGVySW5mbyAqYWlkbFByb3ZpZGVySW5mbyA9IHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm8gKj4ocHJvdmlkZXJJbmZvLmdldCgpKTsKKyAgICByZXR1cm4gYWlkbFByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZUFpZGxQcm92aWRlcihpbnRlcmZhY2UsIG1EZXZpY2VTdGF0ZSk7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0cnlUb0luaXRpYWxpemVIaWRsUHJvdmlkZXJMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsIGNvbnN0IHNwPFByb3ZpZGVySW5mbz4mIHByb3ZpZGVySW5mbykgeworICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTsKKyAgICBpbnRlcmZhY2UgPSBtSGlkbFNlcnZpY2VQcm94eS0+dHJ5R2V0U2VydmljZShwcm92aWRlck5hbWUpOworCisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRoZSBpbnRlcmZhY2UgbWF5IG5vdCBiZSBzdGFydGVkIHlldC4gSW4gdGhhdCBjYXNlLCB0aGlzIGlzIG5vdCBhCisgICAgICAgIC8vIGZhdGFsIGVycm9yLgorICAgICAgICBBTE9HVygiJXM6IEhJREwgQ2FtZXJhIHByb3ZpZGVyIEhBTCAnJXMnIGlzIG5vdCBhY3R1YWxseSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEhpZGxQcm92aWRlckluZm8gKmhpZGxQcm92aWRlckluZm8gPSBzdGF0aWNfY2FzdDxIaWRsUHJvdmlkZXJJbmZvICo+KHByb3ZpZGVySW5mby5nZXQoKSk7CisgICAgcmV0dXJuIGhpZGxQcm92aWRlckluZm8tPmluaXRpYWxpemVIaWRsUHJvdmlkZXIoaW50ZXJmYWNlLCBtRGV2aWNlU3RhdGUpOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZEFpZGxQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIpIHsKKyAgICAvLyBTZXZlcmFsIGNhbWVyYSBwcm92aWRlciBpbnN0YW5jZXMgY2FuIGJlIHRlbXBvcmFyaWx5IHByZXNlbnQuCisgICAgLy8gRGVmZXIgaW5pdGlhbGl6YXRpb24gb2YgYSBuZXcgaW5zdGFuY2UgdW50aWwgdGhlIG9sZGVyIGluc3RhbmNlIGlzIHByb3Blcmx5IHJlbW92ZWQuCisgICAgYXV0byBwcm92aWRlckluc3RhbmNlID0gbmV3UHJvdmlkZXIgKyAiLSIgKyBzdGQ6OnRvX3N0cmluZyhtUHJvdmlkZXJJbnN0YW5jZUlkKTsKKyAgICBib29sIHByb3ZpZGVyUHJlc2VudCA9IGZhbHNlOworICAgIGJvb2wgcHJlZXhpc3RpbmcgPQorICAgICAgICAgICAgKG1BaWRsUHJvdmlkZXJXaXRoQmluZGVycy5maW5kKG5ld1Byb3ZpZGVyKSAhPSBtQWlkbFByb3ZpZGVyV2l0aEJpbmRlcnMuZW5kKCkpOworCisgICAgLy8gV2UgbmVlZCB0byB1c2UgdGhlIGV4dHJhY3RlZCBwcm92aWRlciBuYW1lIGhlcmUgc2luY2UgJ25ld1Byb3ZpZGVyJyBoYXMKKyAgICAvLyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHNlcnZpY2UgaW4gY2FzZSBvZiBBSURMLiBXZSB3YW50CisgICAgLy8ganVzdCBpbnN0YW5jZSBuYW1lLgorICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI7CisgICAgc3RkOjpzdHJpbmcgZXh0cmFjdGVkUHJvdmlkZXJOYW1lID0KKyAgICAgICAgICAgIG5ld1Byb3ZpZGVyLnN1YnN0cihzdGQ6OnN0cmluZyhJQ2FtZXJhUHJvdmlkZXI6OmRlc2NyaXB0b3IpLnNpemUoKSArIDEpOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvdmlkZXJJbmZvIDogbVByb3ZpZGVycykgeworICAgICAgICBpZiAocHJvdmlkZXJJbmZvLT5tUHJvdmlkZXJOYW1lID09IGV4dHJhY3RlZFByb3ZpZGVyTmFtZSkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMIHdpdGggbmFtZSAnJXMnIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3UHJvdmlkZXIuY19zdHIoKSk7CisgICAgICAgICAgICAvLyBEbyBub3QgYWRkIG5ldyBpbnN0YW5jZXMgZm9yIGxhenkgSEFMIGV4dGVybmFsIHByb3ZpZGVyIG9yIGFpZGwKKyAgICAgICAgICAgIC8vIGJpbmRlcnMgcHJldmlvdXNseSBzZWVuLgorICAgICAgICAgICAgaWYgKHByZWV4aXN0aW5nIHx8IHByb3ZpZGVySW5mby0+aXNFeHRlcm5hbExhenlIQUwoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUaGUgbmV3IHByb3ZpZGVyIGluc3RhbmNlIHdpbGwgZ2V0IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY3VycmVudGx5IHByZXNlbnQgaW5zdGFuY2UgaXMgcmVtb3ZlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHByb3ZpZGVyUHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBaWRsUHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPQorICAgICAgICAgICAgbmV3IEFpZGxQcm92aWRlckluZm8oZXh0cmFjdGVkUHJvdmlkZXJOYW1lLCBwcm92aWRlckluc3RhbmNlLCB0aGlzKTsKKworICAgIGlmICghcHJvdmlkZXJQcmVzZW50KSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHRyeVRvSW5pdGlhbGl6ZUFpZGxQcm92aWRlckxvY2tlZChuZXdQcm92aWRlciwgcHJvdmlkZXJJbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBtQWlkbFByb3ZpZGVyV2l0aEJpbmRlcnMuZW1wbGFjZShuZXdQcm92aWRlcik7CisgICAgfQorCisgICAgbVByb3ZpZGVycy5wdXNoX2JhY2socHJvdmlkZXJJbmZvKTsKKyAgICBtUHJvdmlkZXJJbnN0YW5jZUlkKys7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkSGlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwKICAgICAgICAgYm9vbCBwcmVleGlzdGluZykgewogICAgIC8vIFNldmVyYWwgY2FtZXJhIHByb3ZpZGVyIGluc3RhbmNlcyBjYW4gYmUgdGVtcG9yYXJpbHkgcHJlc2VudC4KICAgICAvLyBEZWZlciBpbml0aWFsaXphdGlvbiBvZiBhIG5ldyBpbnN0YW5jZSB1bnRpbCB0aGUgb2xkZXIgaW5zdGFuY2UgaXMgcHJvcGVybHkgcmVtb3ZlZC4KQEAgLTEyNjEsOSArMTc1NSwxMCBAQAogICAgICAgICBpZiAocHJvdmlkZXJJbmZvLT5tUHJvdmlkZXJOYW1lID09IG5ld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBwcm92aWRlciBIQUwgd2l0aCBuYW1lICclcycgYWxyZWFkeSByZWdpc3RlcmVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdQcm92aWRlci5jX3N0cigpKTsKLSAgICAgICAgICAgIGlmIChwcmVleGlzdGluZykgeworICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBuZXcgaW5zdGFuY2VzIGZvciBsYXp5IEhBTCBleHRlcm5hbCBwcm92aWRlcgorICAgICAgICAgICAgaWYgKHByZWV4aXN0aW5nIHx8IHByb3ZpZGVySW5mby0+aXNFeHRlcm5hbExhenlIQUwoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUaGUgbmV3IHByb3ZpZGVyIGluc3RhbmNlIHdpbGwgZ2V0IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSIKICAgICAgICAgICAgICAgICAgICAgICAgICIgY3VycmVudGx5IHByZXNlbnQgaW5zdGFuY2UgaXMgcmVtb3ZlZCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIHByb3ZpZGVyUHJlc2VudCA9IHRydWU7CkBAIC0xMjcyLDkgKzE3NjcsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPSBuZXcgUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCBwcm92aWRlckluc3RhbmNlLCB0aGlzKTsKKyAgICBzcDxIaWRsUHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPSBuZXcgSGlkbFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZSwgdGhpcyk7CiAgICAgaWYgKCFwcm92aWRlclByZXNlbnQpIHsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gdHJ5VG9Jbml0aWFsaXplUHJvdmlkZXJMb2NrZWQobmV3UHJvdmlkZXIsIHByb3ZpZGVySW5mbyk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHRyeVRvSW5pdGlhbGl6ZUhpZGxQcm92aWRlckxvY2tlZChuZXdQcm92aWRlciwgcHJvdmlkZXJJbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQpAQCAtMTMxMiw3ICsxODA3LDE3IEBACiAgICAgICAgIC8vIGluaXRpYWxpemUuCiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvdmlkZXJJbmZvIDogbVByb3ZpZGVycykgewogICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+bVByb3ZpZGVyTmFtZSA9PSByZW1vdmVkUHJvdmlkZXJOYW1lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKHJlbW92ZWRQcm92aWRlck5hbWUsIHByb3ZpZGVySW5mbyk7CisgICAgICAgICAgICAgICAgSVBDVHJhbnNwb3J0IHByb3ZpZGVyVHJhbnNwb3J0ID0gcHJvdmlkZXJJbmZvLT5nZXRJUENUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZW1vdmVkQWlkbFByb3ZpZGVyTmFtZSA9IGdldEZ1bGxBaWRsUHJvdmlkZXJOYW1lKHJlbW92ZWRQcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIHN3aXRjaChwcm92aWRlclRyYW5zcG9ydCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIElQQ1RyYW5zcG9ydDo6SElETDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb0luaXRpYWxpemVIaWRsUHJvdmlkZXJMb2NrZWQocmVtb3ZlZFByb3ZpZGVyTmFtZSwgcHJvdmlkZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJUENUcmFuc3BvcnQ6OkFJREw6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VG9Jbml0aWFsaXplQWlkbFByb3ZpZGVyTG9ja2VkKHJlbW92ZWRBaWRsUHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlckluZm8pOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIFVuc3VwcG9ydGVkIFRyYW5zcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcHJvdmlkZXJUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMzM0LDcgKzE4MzksNiBAQAogc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcj4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRTdGF0dXNMaXN0ZW5lcigpIGNvbnN0IHsKICAgICByZXR1cm4gbUxpc3RlbmVyLnByb21vdGUoKTsKIH0KLQogLyoqKiogTWV0aG9kcyBmb3IgUHJvdmlkZXJJbmZvICoqKiovCiAKIApAQCAtMTM1MCwyODUgKzE4NTQsNjMgQEAKICAgICAodm9pZCkgbU1hbmFnZXI7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplKAotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAotICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IGN1cnJlbnREZXZpY2VTdGF0ZSkgewotICAgIHN0YXR1c190IHJlcyA9IHBhcnNlUHJvdmlkZXJOYW1lKG1Qcm92aWRlck5hbWUsICZtVHlwZSwgJm1JZCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJvdmlkZXIgbmFtZSwgaWdub3JpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgaW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKLQotICAgIC8vIERldGVybWluZSBtaW5vciB2ZXJzaW9uCi0gICAgbU1pbm9yVmVyc2lvbiA9IDQ7Ci0gICAgYXV0byBjYXN0Ml82ID0gcHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzYgPSBudWxscHRyOwotICAgIGlmIChjYXN0Ml82LmlzT2soKSkgewotICAgICAgICBpbnRlcmZhY2UyXzYgPSBjYXN0Ml82OwotICAgICAgICBpZiAoaW50ZXJmYWNlMl82ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA2OwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gc2luY2UgY2FzdDJfNi5pc09rKCkgc3VjY2VlZHMgZXZlbiBpZiB0aGUgcHJvdmlkZXIKLSAgICAvLyB2ZXJzaW9uIGlzbid0IGFjdHVhbGx5IDIuNi4KLSAgICBpZiAoaW50ZXJmYWNlMl82ID09IG51bGxwdHIpewotICAgICAgICBhdXRvIGNhc3QyXzUgPQotICAgICAgICAgICAgICAgIHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNSA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChjYXN0Ml81LmlzT2soKSkgewotICAgICAgICAgICAgaW50ZXJmYWNlMl81ID0gY2FzdDJfNTsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXV0byBjYXN0Ml83ID0gcHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICAgICAgaWYgKGNhc3QyXzcuaXNPaygpKSB7Ci0gICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzcgPSBjYXN0Ml83OwotICAgICAgICAgICAgaWYgKGludGVyZmFjZTJfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQotICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igc2V0dGluZyB1cCBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyciLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIH0KLQotICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7Ci0gICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgewotICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKLSAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQotICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKLSAgICB9Ci0KLSAgICBBTE9HVigiJXM6IFNldHRpbmcgZGV2aWNlIHN0YXRlIGZvciAlczogMHglIiBQUkl4NjQsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKLSAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShjdXJyZW50RGV2aWNlU3RhdGUpOwotCi0gICAgcmVzID0gc2V0VXBWZW5kb3JUYWdzKCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgdXAgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKAotICAgICAgICAgICAgU3RhdHVzIGlkU3RhdHVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKSB7Ci0gICAgICAgIHN0YXR1cyA9IGlkU3RhdHVzOwotICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbmFtZSA6IGNhbWVyYURldmljZU5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOwotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOwotICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBJRCBsaXN0IGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgZm9yIGNhbWVyYSBkZXZpY2VzIGZyb20gcHJvdmlkZXIgJyVzJyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgLy8gR2V0IGxpc3Qgb2YgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGRldmljZSBjb21iaW5hdGlvbnMKLSAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7Ci0gICAgICAgIHJlcyA9IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UyXzYpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0ID0gaW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKLSAgICAgICAgW3RoaXNdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgbVNldFRvcmNoTW9kZVN1cHBvcnRlZCA9IHN1cHBvcnRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBtSXNSZW1vdGUgPSBpbnRlcmZhY2UtPmlzUmVtb3RlKCk7Ci0KLSAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKLSAgICBmb3IgKGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgaWQ7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IGFkZERldmljZShkZXZpY2UsIGNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBlbnVtZXJhdGUgY2FtZXJhIGRldmljZSAnJXMnOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJXMgcmVhZHkgd2l0aCAlenUgY2FtZXJhIGRldmljZXMiLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlcy5zaXplKCkpOwotCi0gICAgLy8gUHJvY2VzcyBjYWNoZWQgc3RhdHVzIGNhbGxiYWNrcwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4oKTsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7Ci0KLSAgICAgICAgZm9yIChhdXRvJiBzdGF0dXNJbmZvIDogbUNhY2hlZFN0YXR1cykgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgaWQsIHBoeXNpY2FsSWQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICAgICAgICAgIGlmIChzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsICZwaHlzaWNhbElkLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNJbmZvLmNhbWVyYUlkLCBzdGF0dXNJbmZvLnBoeXNpY2FsQ2FtZXJhSWQsIHN0YXR1c0luZm8uc3RhdHVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgc3RhdHVzSW5mby5jYW1lcmFJZCwgc3RhdHVzSW5mby5zdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgICAgIGNhY2hlZFN0YXR1cy0+ZW1wbGFjZV9iYWNrKHN0YXR1c0luZm8uaXNQaHlzaWNhbENhbWVyYVN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RhdHVzSW5mby5zdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1DYWNoZWRTdGF0dXMuY2xlYXIoKTsKLQotICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIFRoZSBjYWNoZWQgc3RhdHVzIGNoYW5nZSBjYWxsYmFja3MgY2Fubm90IGJlIGZpcmVkIGRpcmVjdGx5IGZyb20gdGhpcwotICAgIC8vIGZ1bmN0aW9uLCBkdWUgdG8gc2FtZS10aHJlYWQgZGVhZGxvY2sgdHJ5aW5nIHRvIGFjcXVpcmUgbUludGVyZmFjZU11dGV4Ci0gICAgLy8gdHdpY2UuCi0gICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLAotICAgICAgICAgICAgICAgICZDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZSwgdGhpcywKLSAgICAgICAgICAgICAgICBsaXN0ZW5lciwgc3RkOjptb3ZlKGNhY2hlZFN0YXR1cykpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlJlcXVlc3QgdG8gc3RhcnQgY2FtZXJhIHByb3ZpZGVyOiAlcyIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgaWYgKG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBtU2F2ZWRJbnRlcmZhY2U7Ci0gICAgfQotICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKLSAgICAgICAgQUxPR0UoIkJhZCBwcm92aWRlciBzdGF0ZSEgU2hvdWxkIG5vdCBiZSBoZXJlIG9uIGEgbm9uLWxhenkgSEFMISIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBhdXRvIGludGVyZmFjZSA9IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HSSgiQ2FtZXJhIEhBTCBwcm92aWRlciBuZWVkcyByZXN0YXJ0LCBjYWxsaW5nIGdldFNlcnZpY2UoJXMpIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgaW50ZXJmYWNlID0gbU1hbmFnZXItPm1TZXJ2aWNlUHJveHktPmdldFNlcnZpY2UobVByb3ZpZGVyTmFtZSk7Ci0gICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7Ci0gICAgICAgIGlmICghbGlua2VkLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9IGVsc2UgaWYgKCFsaW5rZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKLSAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgewotICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OwotICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBJbml0aWFsIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4ICUiIFBSSXg2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgKCVzKSBhbHJlYWR5IGluIHVzZS4gUmUtdXNpbmcgaW5zdGFuY2UuIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGludGVyZmFjZTsKLX0KLQogY29uc3Qgc3RkOjpzdHJpbmcmIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXRUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBtVHlwZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmFkZERldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIGluaXRpYWxTdGF0dXMsIC8qb3V0Ki8gc3RkOjpzdHJpbmcqIHBhcnNlZElkKSB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6YWRkRGV2aWNlKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgQ2FtZXJhRGV2aWNlU3RhdHVzIGluaXRpYWxTdGF0dXMsCisgICAgICAgIC8qb3V0Ki8gc3RkOjpzdHJpbmcqIHBhcnNlZElkKSB7CiAKICAgICBBTE9HSSgiRW51bWVyYXRpbmcgbmV3IGNhbWVyYSBkZXZpY2U6ICVzIiwgbmFtZS5jX3N0cigpKTsKIAogICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0SVBDVHJhbnNwb3J0KCk7CiAKICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisKICAgICBpZiAodHlwZSAhPSBtVHlwZSkgewogICAgICAgICBBTE9HRSgiJXM6IERldmljZSB0eXBlICVzIGRvZXMgbm90IG1hdGNoIHByb3ZpZGVyIHR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgdHlwZS5jX3N0cigpLCBtVHlwZS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKG1NYW5hZ2VyLT5pc1ZhbGlkRGV2aWNlTG9ja2VkKGlkLCBtYWpvcikpIHsKKyAgICBpZiAobU1hbmFnZXItPmlzVmFsaWREZXZpY2VMb2NrZWQoaWQsIG1ham9yLCB0cmFuc3BvcnQpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBJRCAlcyBpcyBhbHJlYWR5IGluIHVzZSBmb3IgZGV2aWNlIG1ham9yIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBpZC5jX3N0cigpLCBtYWpvcik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGRldmljZUluZm87Ci0gICAgc3dpdGNoIChtYWpvcikgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5zdXBwb3J0ZWQgSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIG1ham9yKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGRldmljZUluZm8gPSBpbml0aWFsaXplRGV2aWNlSW5mbzxEZXZpY2VJbmZvMz4obmFtZSwgbVByb3ZpZGVyVGFnaWQsCi0gICAgICAgICAgICAgICAgICAgIGlkLCBtaW5vcik7CisgICAgc3dpdGNoICh0cmFuc3BvcnQpIHsKKyAgICAgICAgY2FzZSBJUENUcmFuc3BvcnQ6OkhJREw6CisgICAgICAgICAgICBzd2l0Y2ggKG1ham9yKSB7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5zdXBwb3J0ZWQgSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAgbmFtZS5jX3N0cigpLCBtYWpvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJUENUcmFuc3BvcnQ6OkFJREw6CisgICAgICAgICAgICBpZiAobWFqb3IgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbnN1cHBvcnRlZCBBSURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIG1ham9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5rbm93biBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgbWFqb3IpOworICAgICAgICAgICAgQUxPR0UoIiVzIEludmFsaWQgdHJhbnNwb3J0ICVkIiwgX19GVU5DVElPTl9fLCB0cmFuc3BvcnQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisKKyAgICBkZXZpY2VJbmZvID0gaW5pdGlhbGl6ZURldmljZUluZm8obmFtZSwgbVByb3ZpZGVyVGFnaWQsIGlkLCBtaW5vcik7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBkZXZpY2VJbmZvLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShnZXREZXZpY2VTdGF0ZSgpKTsKICAgICBkZXZpY2VJbmZvLT5tU3RhdHVzID0gaW5pdGlhbFN0YXR1czsKICAgICBib29sIGlzQVBJMUNvbXBhdGlibGUgPSBkZXZpY2VJbmZvLT5pc0FQSTFDb21wYXRpYmxlKCk7CiAKQEAgLTE2NTYsMTUgKzE5MzgsNTAgQEAKICAgICAgICAgICAgIG1VbmlxdWVDYW1lcmFJZHMuZXJhc2UoaWQpOwogICAgICAgICAgICAgaWYgKCgqaXQpLT5pc0FQSTFDb21wYXRpYmxlKCkpIHsKICAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuZXJhc2Uoc3RkOjpyZW1vdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lbmQoKSwgaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lbmQoKSwgaWQpKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIHJlZmVyZW5jZSB0byBjYW1lcmEgcHJvdmlkZXIgdG8gYXZvaWQgcG9pbnRlciBsZWFrIHdoZW4KKyAgICAgICAgICAgIC8vIHVucGx1Z2dpbmcgZXh0ZXJuYWwgY2FtZXJhIHdoaWxlIGluIHVzZSB3aXRoIGxhenkgSEFMcworICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKwogICAgICAgICAgICAgbURldmljZXMuZXJhc2UoaXQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnJlbW92ZUFsbERldmljZXMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgYXV0byBpdERldmljZXMgPSBtRGV2aWNlcy5iZWdpbigpOworICAgIHdoaWxlIChpdERldmljZXMgIT0gbURldmljZXMuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaWQgPSAoKml0RGV2aWNlcyktPm1JZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlTmFtZSA9ICgqaXREZXZpY2VzKS0+bU5hbWU7CisgICAgICAgIHJlbW92ZURldmljZShpZCk7CisgICAgICAgIC8vIGRldmljZSB3YXMgcmVtb3ZlZCwgcmVzZXQgaXRlcmF0b3IKKyAgICAgICAgaXREZXZpY2VzID0gbURldmljZXMuYmVnaW4oKTsKKworICAgICAgICAvL25vdGlmeSBDYW1lcmFTZXJ2aWNlIG9mIHN0YXR1cyBjaGFuZ2UKKyAgICAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbm90aWZ5IGRldmljZSBub3RfcHJlc2VudDogJXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVCk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmlzRXh0ZXJuYWxMYXp5SEFMKCkgY29uc3QgeworICAgIHJldHVybiBrRW5hYmxlTGF6eUhhbCAmJiAobVByb3ZpZGVyTmFtZSA9PSBrRXh0ZXJuYWxQcm92aWRlck5hbWUpOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSBjb25zdCB7CiAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLiVkLCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKICAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlLmNfc3RyKCksCkBAIC0xNzM5LDExNyArMjA1Niw1NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gJmludGVyZmFjZTJfNikgewotICAgIGlmIChpbnRlcmZhY2UyXzYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IG51bGwgaW50ZXJmYWNlIHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPQotICAgICAgICAgICAgaW50ZXJmYWNlMl82LT5nZXRDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzKFsmc3RhdHVzLCB0aGlzXSgKLSAgICAgICAgICAgIFN0YXR1cyBjb25jdXJyZW50SWRTdGF0dXMsIC8vIFRPRE86IE1vdmUgYWxsIGluc3RhbmNlcyBvZiBoaWRsX3N0cmluZyB0byAndXNpbmcnCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4+JgotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNvbmN1cnJlbnRJZFN0YXR1czsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGNvbWJpbmF0aW9uIDogY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byAmY2FtZXJhRGV2aWNlSWQgOiBjb21iaW5hdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWRzLmluc2VydChjYW1lcmFEZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGV2aWNlSWRzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNvbmN1cnJlbnQgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBmb3IgY2FtZXJhIGRldmljZXMgZnJvbSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgewotICAgIGlmIChtTWlub3JWZXJzaW9uIDwgNikgewotICAgICAgLy8gVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLCBub3RoaW5nIHRvIGRvIGhlcmUKLSAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCi0gICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBwcm92aWRlciBpbnRlcmZhY2UgZm9yICVzIGlzIG5vdCB2YWxpZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0KLSAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl82ID0gY2FzdFJlc3VsdDsKLSAgICAgICAgaWYgKGludGVyZmFjZTJfNiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZTJfNik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNpbmNlIG1NaW5vclZlcnNpb24gPj0gNgotICAgICAgICAgICAgQUxPR0UoIiVzOiBtTWlub3JWZXJzaW9uIHdhcyA+PSA2LCBidXQgaW50ZXJmYWNlMl82IHdhcyBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQogc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXRDb25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIHJldHVybiBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLCBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHN0ZDo6c3RyaW5nIGlkOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7Ci0KKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgaW50ZXJuYWxOZXdTdGF0dXMgPSBuZXdTdGF0dXM7CiAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbUNhY2hlZFN0YXR1cy5lbXBsYWNlX2JhY2soZmFsc2UgLyppc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKi8sCi0gICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBzdGQ6OnN0cmluZygpLmNfc3RyKCksIG5ld1N0YXR1cyk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgc3RkOjpzdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIGludGVybmFsTmV3U3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgICAgICBpZiAoT0sgIT0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKICAgICB9CiAKICAgICAvLyBDYWxsIHdpdGhvdXQgbG9jayBoZWxkIHRvIGFsbG93IHJlZW50cmFuY3kgaW50byBwcm92aWRlciBtYW5hZ2VyCiAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLCBuZXdTdGF0dXMpOworICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIGludGVybmFsTmV3U3RhdHVzKTsKICAgICB9Ci0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKLSAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIHN0ZDo6c3RyaW5nKiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIHsKICAgICBib29sIGtub3duID0gZmFsc2U7CiAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CiAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogbURldmljZXMpIHsKICAgICAgICAgaWYgKGRldmljZUluZm8tPm1OYW1lID09IGNhbWVyYURldmljZU5hbWUpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGRldmljZUluZm8tPm1EZXZpY2VBdmFpbGFibGVMb2NrKTsKICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHN0YXR1cyBpcyBub3cgJXMsIHdhcyAlcyIsIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSwgZGV2aWNlU3RhdHVzVG9TdHJpbmcoZGV2aWNlSW5mby0+bVN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtEZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtEZXZpY2VTdGF0dXNUb1N0cmluZyhkZXZpY2VJbmZvLT5tU3RhdHVzKSk7CiAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tU3RhdHVzID0gbmV3U3RhdHVzOwogICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGRldmljZSByZW1vdmFsIChOT1RfUFJFU0VOVCkKICAgICAgICAgICAgIGNhbWVyYUlkID0gZGV2aWNlSW5mby0+bUlkOwogICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgZGV2aWNlSW5mby0+bUlzRGV2aWNlQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICAobmV3U3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCk7CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tRGV2aWNlQXZhaWxhYmxlU2lnbmFsLnNpZ25hbCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODYzLDcgKzIxMjAsMTMgQEAKICAgICAgICAgYWRkRGV2aWNlKGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cywgJmNhbWVyYUlkKTsKICAgICB9IGVsc2UgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7CiAgICAgICAgIHJlbW92ZURldmljZShjYW1lcmFJZCk7CisgICAgfSBlbHNlIGlmIChpc0V4dGVybmFsTGF6eUhBTCgpKSB7CisgICAgICAgIC8vIERvIG5vdCBub3RpZnkgQ2FtZXJhU2VydmljZSBmb3IgUFJFU0VOVC0+UFJFU0VOVCAobGF6eSBIQUwgcmVzdGFydCkKKyAgICAgICAgLy8gYmVjYXVzZSBOT1RfQVZBSUxBQkxFIGlzIHNldCBvbiBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGFuZCBhIFBSRVNFTlQKKyAgICAgICAgLy8gbm90aWYuIHdvdWxkIG92ZXJ3cml0ZSBpdAorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKwogICAgIGlmIChyZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhUHJvdmlkZXIgJXMgY291bGQgbm90IHJlLWNhY2hlIGNvbmN1cnJlbnQgc3RyZWFtaW5nIGNhbWVyYSBpZCBsaXN0ICIsCiAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CkBAIC0xODcyLDE5ICsyMTM1LDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHN0ZDo6c3RyaW5nIGlkOwogICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQ7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluaXRMb2NrKTsKLQogICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgIG1DYWNoZWRTdGF0dXMuZW1wbGFjZV9iYWNrKHRydWUgLyppc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKi8sIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpOwotICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHsKQEAgLTE4OTIsNyArMjE1NCw3IEBACiAKICAgICAgICAgaWYgKE9LICE9IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgJnBoeXNpY2FsSWQsIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CkBAIC0xOTAyLDEzICsyMTY0LDEzIEBACiAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwKICAgICAgICAgICAgICAgICBTdHJpbmc4KHBoeXNpY2FsSWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CiAgICAgfQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIHJldHVybjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAogICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBzdGQ6OnN0cmluZyogcGh5c2ljYWxJZCwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIGJvb2wga25vd24gPSBmYWxzZTsKICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKQEAgLTE5MjgsNyArMjE5MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyBwaHlzaWNhbCBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcyIsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtEZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKICAgICAgICAgICAgIGtub3duID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xOTQ2LDIyICsyMjA4LDI1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjp0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnRvcmNoTW9kZVN0YXR1c0NoYW5nZUludGVybmFsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAgICAgc3RkOjpzdHJpbmcgaWQ7CisgICAgYm9vbCBrbm93biA9IGZhbHNlOwogICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hbmFnZXItPm1TdGF0dXNMaXN0ZW5lck11dGV4KTsKLSAgICAgICAgYm9vbCBrbm93biA9IGZhbHNlOworICAgICAgICAvLyBIb2xkIG1Mb2NrIGZvciBhY2Nlc3NpbmcgbURldmljZXMKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBtRGV2aWNlcykgewogICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1OYW1lID09IGNhbWVyYURldmljZU5hbWUpIHsKICAgICAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyB0b3JjaCBzdGF0dXMgaXMgbm93ICVzIiwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9yY2hTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya1RvcmNoU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgaWQgPSBkZXZpY2VJbmZvLT5tSWQ7CiAgICAgICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgICAgIHN5c3RlbUNhbWVyYUtpbmQgPSBkZXZpY2VJbmZvLT5tU3lzdGVtQ2FtZXJhS2luZDsKICAgICAgICAgICAgICAgICBpZiAoVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT04gIT0gbmV3U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihDYW1lcmFQcm92aWRlck1hbmFnZXI6OkRldmljZU1vZGU6OlRPUkNILCBpZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTk2OSwxNjUgKzIyMzQsMzEgQEAKICAgICAgICAgaWYgKCFrbm93bikgewogICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBwcm92aWRlciAlcyBzYXlzIGFuIHVua25vd24gY2FtZXJhICVzIG5vdyBoYXMgdG9yY2ggc3RhdHVzICVkLiBDdXJpb3VzLiIsCiAgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBuZXdTdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gbm8gbG9jayBuZWVkZWQgc2luY2UgbGlzdGVuZXIgaXMgc2V0IHVwIG9ubHkgb25jZSBkdXJpbmcKKyAgICAgICAgLy8gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyIGluaXRpYWxpemF0aW9uIGFuZCB0aGVuIG5ldmVyIGNoYW5nZWQgdGlsbCBpdCBpcworICAgICAgICAvLyBkZXN0cnVjdGVkLgogICAgICAgICBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwotICAgIH0KKyAgICAgfQogICAgIC8vIENhbGwgd2l0aG91dCBsb2NrIGhlbGQgdG8gYWxsb3cgcmVlbnRyYW5jeSBpbnRvIHByb3ZpZGVyIG1hbmFnZXIKKyAgICAvLyBUaGUgcHJvYmxlbSB3aXRoIGhvbGRpbmcgbUxvY2sgaGVyZSBpcyB0aGF0IHdlCisgICAgLy8gbWlnaHQgYmUgbGltaXRpbmcgcmUtZW50cmFuY3kgOiBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZCBjYWxscworICAgIC8vIGJhY2sgaW50byBDYW1lcmFQcm92aWRlck1hbmFnZXIgd2hpY2ggbWlnaHQgdHJ5IHRvIGhvbGQgbUxvY2sgYWdhaW4gKGVnOgorICAgIC8vIGZpbmREZXZpY2VJbmZvLCB3aGljaCBzaG91bGQgYmUgaG9sZGluZyBtTG9jayB3aGlsZSBpdGVyYXRpbmcgdGhyb3VnaAorICAgIC8vIGVhY2ggcHJvdmlkZXIncyBkZXZpY2VzKS4KICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBsaXN0ZW5lci0+b25Ub3JjaFN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwgbmV3U3RhdHVzKTsKKyAgICAgICAgbGlzdGVuZXItPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIG5ld1N0YXR1cywgc3lzdGVtQ2FtZXJhS2luZCk7CiAgICAgfQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIHJldHVybjsKIH0KIAotdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2VydmljZURpZWQodWludDY0X3QgY29va2llLAotICAgICAgICBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgewotICAgICh2b2lkKSB3aG87Ci0gICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAnJXMnIGhhcyBkaWVkOyByZW1vdmluZyBpdCIsIG1Qcm92aWRlckluc3RhbmNlLmNfc3RyKCkpOwotICAgIGlmIChjb29raWUgIT0gbUlkKSB7Ci0gICAgICAgIEFMT0dXKCIlczogVW5leHBlY3RlZCBzZXJ2aWNlRGllZCBjb29raWUgJSIgUFJJdTY0ICIsIGV4cGVjdGVkICUiIFBSSXUzMiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvb2tpZSwgbUlkKTsKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeURldmljZUluZm9TdGF0ZUNoYW5nZUxvY2tlZCgKKyAgICAgICAgaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtRGV2aWNlcy5iZWdpbigpOyBpdCAhPSBtRGV2aWNlcy5lbmQoKTsgaXQrKykgeworICAgICAgICAoKml0KS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3RGV2aWNlU3RhdGUpOwogICAgIH0KLSAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVySW5zdGFuY2UpOwotfQotCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2V0VXBWZW5kb3JUYWdzKCkgewotICAgIGlmIChtVmVuZG9yVGFnRGVzY3JpcHRvciAhPSBudWxscHRyKQotICAgICAgICByZXR1cm4gT0s7Ci0KLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOwotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKLSAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgewotICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOwotICAgICAgICAgICAgfQotICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovbVZlbmRvclRhZ0Rlc2NyaXB0b3IpKQotICAgICAgICAgICAgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCi0gICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgotICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZSkgewotICAgIG1EZXZpY2VTdGF0ZSA9IG5ld0RldmljZVN0YXRlOwotICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCi0gICAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCi0gICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+ICZoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCi0gICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKSB7Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNikgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KLSAgICAgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOwotICAgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbWlnaHQgYmUgc29tZSBvdGhlciBwcm9ibGVtCi0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBjYXN0UmVzdWx0Ml82ID0gcHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICAgICAgYXV0byBjYXN0UmVzdWx0Ml83ID0gcHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICAgICAgU3RhdHVzIGNhbGxTdGF0dXM7Ci0gICAgICAgIGF1dG8gY2IgPQotICAgICAgICAgICAgICAgIFsmaXNTdXBwb3J0ZWQsICZjYWxsU3RhdHVzXShTdGF0dXMgcywgYm9vbCBzdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7IH07Ci0KLSAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNzsKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNjsKLSAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNyAmJiBjYXN0UmVzdWx0Ml83LmlzT2soKSkgewotICAgICAgICAgICAgaW50ZXJmYWNlXzJfNyA9IGNhc3RSZXN1bHQyXzc7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzJfNy0+aXNDb25jdXJyZW50U3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWRfMl83KAotICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLCBjYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobU1pbm9yVmVyc2lvbiA9PSA2ICYmIGNhc3RSZXN1bHQyXzYuaXNPaygpKSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VfMl82ID0gY2FzdFJlc3VsdDJfNjsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl82ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8cHJvdmlkZXI6OlYyXzY6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82OwotICAgICAgICAgICAgICAgIHNpemVfdCBudW1TdHJlYW1zID0gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLnNpemUoKTsKLSAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82LnJlc2l6ZShudW1TdHJlYW1zKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMzsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBjb25zdCYgY29tYmluYXRpb24gPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzZbaV0uY2FtZXJhSWQgPSBjb21iaW5hdGlvbi5jYW1lcmFJZDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82W2ldLnN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbi5zdHJlYW1Db25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfMl82LT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzYsIGNiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnRlcmZhY2VfMl83ICE9IG51bGxwdHIgfHwgaW50ZXJmYWNlXzJfNiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6T0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIHVuc3VwcG9ydGVkIG9wZXJhdGlvbgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZSgKQEAgLTIxNDQsMjc3ICsyMjc1LDIxIEBACiAgICAgfQogfQogCi10ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KLXN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbz4KLSAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKLSAgICBTdGF0dXMgc3RhdHVzOwotCi0gICAgYXV0byBjYW1lcmFJbnRlcmZhY2UgPQotICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOwotICAgIGlmIChjYW1lcmFJbnRlcmZhY2UgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBDYW1lcmFSZXNvdXJjZUNvc3QgcmVzb3VyY2VDb3N0OwotICAgIGNhbWVyYUludGVyZmFjZS0+Z2V0UmVzb3VyY2VDb3N0KFsmc3RhdHVzLCAmcmVzb3VyY2VDb3N0XSgKLSAgICAgICAgU3RhdHVzIHMsIENhbWVyYVJlc291cmNlQ29zdCBjb3N0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QgPSBjb3N0OwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZSBjb3N0cyBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBjb25mbGljdE5hbWUgOiByZXNvdXJjZUNvc3QuY29uZmxpY3RpbmdEZXZpY2VzKSB7Ci0gICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShjb25mbGljdE5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcGFyc2UgY29uZmxpY3RpbmcgZGV2aWNlICVzIiwgX19GVU5DVElPTl9fLCBjb25mbGljdE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBjb25mbGljdE5hbWUgPSBpZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+KAotICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwgdGhpcywKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMsIGNhbWVyYUludGVyZmFjZSkpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotc3A8SW50ZXJmYWNlVD4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewotICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbmtub3duIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgSW50ZXJmYWNlVDo6dmVyc2lvbi5nZXRfbWFqb3IoKSk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXRlbXBsYXRlPD4KLXNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCi0gICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIG9idGFpbiBpbnRlcmZhY2UgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiBjYW1lcmFJbnRlcmZhY2U7Ci19Ci0KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjp+RGV2aWNlSW5mbygpIHt9Ci0KLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci1zcDxJbnRlcmZhY2VUPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoKSB7Ci0gICAgc3A8SW50ZXJmYWNlVD4gZGV2aWNlOwotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKG1TYXZlZEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPSBtUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAocGFyZW50UHJvdmlkZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZGV2aWNlID0gcGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KG1OYW1lKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IChJbnRlcmZhY2VUICopIG1TYXZlZEludGVyZmFjZS5nZXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLAotICAgICAgICBib29sIGVuYWJsZWQpIHsKLSAgICBTdGF0dXMgcyA9IGludGVyZmFjZS0+c2V0VG9yY2hNb2RlKGVuYWJsZWQgPyBUb3JjaE1vZGU6Ok9OIDogVG9yY2hNb2RlOjpPRkYpOwotICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7Ci19Ci0KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6RGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCiAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAotICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKLSAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MgPSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgotICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsgfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdTdGF0ZSkgeworICAgIGlmICghbURldmljZVN0YXRlT3JpZW50YXRpb25NYXAuZW1wdHkoKSAmJgorICAgICAgICAgICAgKG1EZXZpY2VTdGF0ZU9yaWVudGF0aW9uTWFwLmZpbmQobmV3U3RhdGUpICE9IG1EZXZpY2VTdGF0ZU9yaWVudGF0aW9uTWFwLmVuZCgpKSkgeworICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTiwKKyAgICAgICAgICAgICAgICAmbURldmljZVN0YXRlT3JpZW50YXRpb25NYXBbbmV3U3RhdGVdLCAxKTsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVN5c3RlbUNhbWVyYUtpbmQgPSBnZXRTeXN0ZW1DYW1lcmFLaW5kKCk7Ci0KLSAgICBzdGF0dXNfdCByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBmaXggdXAgbW9ub2Nocm9tZSB0YWdzIGJhc2VkIGZvciBvbGRlciBIQUwgdmVyc2lvbjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvIHN0YXQgPSBhZGREeW5hbWljRGVwdGhUYWdzKCk7Ci0gICAgaWYgKE9LICE9IHN0YXQpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgYXBwZW5kaW5nIGR5bmFtaWMgZGVwdGggdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXQpLAotICAgICAgICAgICAgICAgIHN0YXQpOwotICAgIH0KLSAgICByZXMgPSBkZXJpdmVIZWljVGFncygpOwotICAgIGlmIChPSyAhPSByZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVyaXZlIEhFSUMgdGFncyBiYXNlZCBvbiBjYW1lcmEgYW5kIG1lZGlhIGNhcGFiaWxpdGllczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICB9Ci0KLSAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MpKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoLyptYXhSZXNvbHV0aW9uKi90cnVlKTsKLSAgICAgICAgaWYgKE9LICE9IHN0YXR1cykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgYXBwZW5kaW5nIGR5bmFtaWMgZGVwdGggdGFncyBmb3IgbWF4aW11bSByZXNvbHV0aW9uIG1vZGU6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0dXMpLCBzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gZGVyaXZlSGVpY1RhZ3MoLyptYXhSZXNvbHV0aW9uKi90cnVlKTsKLSAgICAgICAgaWYgKE9LICE9IHN0YXR1cykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVyaXZlIEhFSUMgdGFncyBiYXNlZCBvbiBjYW1lcmEgYW5kIG1lZGlhIGNhcGFiaWxpdGllcyBmb3IiCi0gICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXMgPSBhZGRSb3RhdGVDcm9wVGFncygpOwotICAgIGlmIChPSyAhPSByZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgU0NBTEVSX1JPVEFURV9BTkRfQ1JPUCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgIH0KLSAgICByZXMgPSBhZGRQcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplKCk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAotICAgICAgICAgICAgJm1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MsICZtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgIH0KLQotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9Ci0gICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7Ci0gICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYKLSAgICAgICAgICAgIGZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRV9UUlVFKSB7Ci0gICAgICAgIG1IYXNGbGFzaFVuaXQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IYXNGbGFzaFVuaXQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7Ci0KLSAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCi0gICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgIGlmICghY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBVbmFibGUgdG8gY29udmVydCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIHZlcnNpb24gMy41IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OwotICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb252ZXJ0ZWQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSXNMb2dpY2FsQ2FtZXJhKSB7Ci0gICAgICAgIGZvciAoYXV0byYgaWQgOiBtUGh5c2ljYWxJZHMpIHsKLSAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkgIT0KLSAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgaGlkbElkKGlkKTsKLSAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGhpZGxJZCwKLSAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZpZCwgdGhpc10oU3RhdHVzIHMsIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBpZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbUlkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXMgPSBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI6Om92ZXJyaWRlWm9vbVJhdGlvVGFncygKLSAgICAgICAgICAgICAgICAgICAgJm1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0sICZtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyk7Ci0gICAgICAgICAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3ZlcnJpZGUgem9vbVJhdGlvIHJlbGF0ZWQgdGFnczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgewotICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5Ci0gICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKLSAgICB9Ci19Ci0KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6fkRldmljZUluZm8zKCkge30KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRDYW1lcmFJbmZvKApAQCAtMjQ3MiwyMSArMjM0Nyw2IEBACiAgICAgcmV0dXJuIGlzQmFja3dhcmRDb21wYXRpYmxlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIHsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgaWYgKGNoYXJhY3RlcmlzdGljcyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjUxMiw2MyArMjM3Miw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKLSAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKLQotICAgIGNvbnN0IHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0KLSAgICAgICAgICAgIHRoaXMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4oKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHRfM181OwotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM183ID0gY2FzdFJlc3VsdF8zXzc7Ci0KLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgU3RhdHVzIGNhbGxTdGF0dXM7Ci0gICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICBhdXRvIGhhbENiID0KLSAgICAgICAgICAgIFsmY2FsbFN0YXR1cywgJnN0YXR1c10gKFN0YXR1cyBzLCBib29sIGNvbWJTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqc3RhdHVzID0gY29tYlN0YXR1czsKLSAgICAgICAgICAgIH07Ci0gICAgaWYgKGludGVyZmFjZV8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICByZXQgPSBpbnRlcmZhY2VfM183LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkXzNfNyhjb25maWd1cmF0aW9uLCBoYWxDYik7Ci0gICAgfSBlbHNlIGlmIChpbnRlcmZhY2VfM181ICE9IG51bGxwdHIpIHsKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25fM180OwotICAgICAgICBib29sIHN1Y2Nlc3MgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbl8zXzQsIGNvbmZpZ3VyYXRpb24pOwotICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb25fM180LCBoYWxDYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKLSAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIHJlcyA9IE9LOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZmlsdGVyU21hbGxKcGVnU2l6ZXMoKSB7CiAgICAgaW50MzJfdCB0aHJlc2hvbGRXID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6UEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XOwogICAgIGludDMyX3QgdGhyZXNob2xkSCA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OlBFUkZfQ0xBU1NfSlBFR19USFJFU0hfSDsKQEAgLTI4MjAsOCArMjYyMyw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi0KLQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86On5Qcm92aWRlckluZm8oKSB7CiAgICAgaWYgKG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUudmFsaWQoKSkgewogICAgICAgICBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlLndhaXQoKTsKQEAgLTI4MzAsMTY3ICsyNjMxLDYgQEAKICAgICAvLyBDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgZGllcywgc28gZG8gbm90IHVucmVnaXN0ZXIgY2FsbGJhY2tzLgogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChjb25zdCBTdGF0dXMmIHMpICB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgotICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKLSAgICAgICAgICAgIHJldHVybiAtRVVTRVJTOwotICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9UUkFOU0FDVElPTjsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgY2FzZSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgc3RhdHVzIGNvZGUgJWQiLCBzKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLWNvbnN0IGNoYXIqIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoY29uc3QgU3RhdHVzJiBzKSB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgotICAgICAgICAgICAgcmV0dXJuICJPSyI7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgotICAgICAgICAgICAgcmV0dXJuICJJTExFR0FMX0FSR1VNRU5UIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6Ci0gICAgICAgICAgICByZXR1cm4gIkNBTUVSQV9JTl9VU0UiOwotICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgotICAgICAgICAgICAgcmV0dXJuICJNQVhfQ0FNRVJBU19JTl9VU0UiOwotICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gIk1FVEhPRF9OT1RfU1VQUE9SVEVEIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgcmV0dXJuICJPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCI7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgcmV0dXJuICJDQU1FUkFfRElTQ09OTkVDVEVEIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOgotICAgICAgICAgICAgcmV0dXJuICJJTlRFUk5BTF9FUlJPUiI7Ci0gICAgfQotICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBzdGF0dXMgY29kZSAlZCIsIHMpOwotICAgIHJldHVybiAiVU5LTk9XTl9FUlJPUiI7Ci19Ci0KLWNvbnN0IGNoYXIqIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZGV2aWNlU3RhdHVzVG9TdHJpbmcoY29uc3QgQ2FtZXJhRGV2aWNlU3RhdHVzJiBzKSB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOgotICAgICAgICAgICAgcmV0dXJuICJOT1RfUFJFU0VOVCI7Ci0gICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UOgotICAgICAgICAgICAgcmV0dXJuICJQUkVTRU5UIjsKLSAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OkVOVU1FUkFUSU5HOgotICAgICAgICAgICAgcmV0dXJuICJFTlVNRVJBVElORyI7Ci0gICAgfQotICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBkZXZpY2Ugc3RhdHVzIGNvZGUgJWQiLCBzKTsKLSAgICByZXR1cm4gIlVOS05PV05fU1RBVFVTIjsKLX0KLQotY29uc3QgY2hhciogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0b3JjaFN0YXR1c1RvU3RyaW5nKGNvbnN0IFRvcmNoTW9kZVN0YXR1cyYgcykgewotICAgIHN3aXRjaChzKSB7Ci0gICAgICAgIGNhc2UgVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFOgotICAgICAgICAgICAgcmV0dXJuICJOT1RfQVZBSUxBQkxFIjsKLSAgICAgICAgY2FzZSBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkY6Ci0gICAgICAgICAgICByZXR1cm4gIkFWQUlMQUJMRV9PRkYiOwotICAgICAgICBjYXNlIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OOgotICAgICAgICAgICAgcmV0dXJuICJBVkFJTEFCTEVfT04iOwotICAgIH0KLSAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgdG9yY2ggbW9kZSBzdGF0dXMgY29kZSAlZCIsIHMpOwotICAgIHJldHVybiAiVU5LTk9XTl9TVEFUVVMiOwotfQotCi0KLXN0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCi0gICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpIHsKLQotICAgIGludCB0YWdDb3VudCA9IDA7Ci0KLSAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgewotICAgICAgICB0YWdDb3VudCArPSB2dHNbc10udGFncy5zaXplKCk7Ci0gICAgfQotCi0gICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgewotICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciB0YWcgc2VjdGlvbnMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKLSAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOwotCi0KLSAgICBzcDxIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwotICAgIGRlc2MtPm1UYWdDb3VudCA9IHRhZ0NvdW50OwotCi0gICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IHNlY3Rpb25zOwotICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBTdHJpbmc4PiB0YWdUb1NlY3Rpb25NYXA7Ci0KLSAgICBpbnQgaWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgewotICAgICAgICBjb25zdCBjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107Ci0gICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOwotICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcoc2VjdGlvbk5hbWUpOwotICAgICAgICBzZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKLSAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKLQotICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7Ci0gICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKLSAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKLQotICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKLSAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuYWRkKHRhZywgdGFnVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXNjLT5tU2VjdGlvbnMgPSBzZWN0aW9uczsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFnQXJyYXkuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgdWludDMyX3QgdGFnID0gdGFnQXJyYXlbaV07Ci0gICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IHRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOwotCi0gICAgICAgIC8vIFNldCB1cCB0YWcgdG8gc2VjdGlvbiBpbmRleCBtYXAKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IHNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOwotICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOwotCi0gICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKLSAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKLSAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7Ci0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7Ci0gICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOwotICAgICAgICB9Ci0gICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOwotICAgIH0KLQotICAgIGRlc2NyaXB0b3IgPSBzdGQ6Om1vdmUoZGVzYyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiAvLyBFeHBlY3RzIHRvIGhhdmUgbUludGVyZmFjZU11dGV4IGxvY2tlZAogc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q29uY3VycmVudENhbWVyYUlkcygpIGNvbnN0IHsKQEAgLTMwMDQsNTkgKzI2NDQsNiBAQAogICAgIHJldHVybiBkZXZpY2VJZENvbWJpbmF0aW9uczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAotICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCi0gICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgYm9vbCAqZWFybHlFeGl0KSB7Ci0gICAgYmluZGVyOjpTdGF0dXMgYlN0YXR1cyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwotICAgIHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWOwotICAgIGJvb2wgc2hvdWxkRXhpdCA9IGZhbHNlOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotICAgIGZvciAoYXV0byAmY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnIDogY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MpIHsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkID0gY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnLm1DYW1lcmFJZDsKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIGRldmljZUluZm87Ci0gICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MgPQotICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjYW1lcmFJZCwgdGFyZ2V0U2RrVmVyc2lvbik7Ci0gICAgICAgIHJlcyA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjYW1lcmFJZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZkZXZpY2VJbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFN0cmluZzggJmlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsRGV2aWNlSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGlkLnN0cmluZygpLCBvdmVycmlkZUZvclBlcmZDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbERldmljZUluZm8pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGh5c2ljYWxEZXZpY2VJbmZvOwotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgaXNMb2dpY2FsQ2FtZXJhTG9ja2VkKGNhbWVyYUlkLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwotICAgICAgICBiU3RhdHVzID0KLSAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubVNlc3Npb25Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpLCBkZXZpY2VJbmZvLCBnZXRNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmc2hvdWxkRXhpdCk7Ci0gICAgICAgIGlmICghYlN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvdWxkRXhpdCkgewotICAgICAgICAgICAgKmVhcmx5RXhpdCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgQ2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbiBoYWxDYW1lcmFJZEFuZFN0cmVhbTsKLSAgICAgICAgaGFsQ2FtZXJhSWRBbmRTdHJlYW0uY2FtZXJhSWQgPSBjYW1lcmFJZDsKLSAgICAgICAgaGFsQ2FtZXJhSWRBbmRTdHJlYW0uc3RyZWFtQ29uZmlndXJhdGlvbiA9IHN0cmVhbUNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWLnB1c2hfYmFjayhoYWxDYW1lcmFJZEFuZFN0cmVhbSk7Ci0gICAgfQotICAgICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KIC8vIENoZWNrcyBpZiB0aGUgY29udGFpbmluZyB2ZWN0b3Igb2Ygc2V0cyBoYXMgYW55IHNldCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUKIC8vIGNhbWVyYSBpZHMgaW4gY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MuCiBzdGF0aWMgYm9vbCBjaGVja0lmU2V0Q29udGFpbnNBbGwoCkBAIC0zMDkxLDI3ICsyNjc4LDkgQEAKICAgICBmb3IgKGF1dG8gJnByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBpZiAoY2hlY2tJZlNldENvbnRhaW5zQWxsKGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXRDb25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMoKSkpIHsKLSAgICAgICAgICAgIC8vIEZvciBlYWNoIGNhbWVyYSBkZXZpY2UgaW4gY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MgY29sbGVjdAotICAgICAgICAgICAgLy8gdGhlIHN0cmVhbUNvbmZpZ3MgYW5kIGNyZWF0ZSB0aGUgSEFMCi0gICAgICAgICAgICAvLyBDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uLCBleGl0IGVhcmx5IGlmIG5lZWRlZAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uczsKLSAgICAgICAgICAgIGJvb2wga25vd1Vuc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sICZoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsICZrbm93VW5zdXBwb3J0ZWQpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmFibGUgdG8gY29udmVydCBzZXNzaW9uIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGVkIHRvIEhBTCBzdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgImNvbWJpbmF0aW9ucyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrbm93VW5zdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBnb3QgdG8ga25vdyB0aGUgc3RyZWFtcyBhcmVuJ3QgdmFsaWQgYmVmb3JlIGRvaW5nIHRoZSBIQUwKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGl0c2VsZi4KLSAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXItPmlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsIGlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIHRhcmdldFNka1ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIGlzU3VwcG9ydGVkKTsKICAgICAgICAgfQogICAgIH0KICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKQEAgLTMxMjEsNyArMjY5MCw3IEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewotICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezUsMH0pOworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3Mob3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGNoYXJhY3RlcmlzdGljcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IDFiZGJiNDQuLmE2NjU5OGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTI5LDcgKzI5LDEyIEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvSVBDVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvSUNhbWVyYVByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNS9JQ2FtZXJhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjYvSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2suaD4KQEAgLTM3LDI3ICs0MiwyOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNy9JQ2FtZXJhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTm90aWZpY2F0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLyoqCi0gKiBUaGUgdmVuZG9yIHRhZyBkZXNjcmlwdG9yIGNsYXNzIHRoYXQgdGFrZXMgSElETCB2ZW5kb3IgdGFnIGluZm9ybWF0aW9uIGFzCi0gKiBpbnB1dC4gTm90IHBhcnQgb2YgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZAotICogaW4gQUlETCBnZW5lcmF0ZWQgc291cmNlcyB3aGljaCBkb24ndCBoYXZlIGFjY2VzcyB0byBISURMIGhlYWRlcnMuCi0gKi8KLWNsYXNzIEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yIDogcHVibGljIFZlbmRvclRhZ0Rlc2NyaXB0b3IgewotcHVibGljOgotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIEhJREwgVmVuZG9yVGFnU2VjdGlvbgotICAgICAqIHZlY3Rvci4KLSAgICAgKgotICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICAgICAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgdnRzLAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uOworCitlbnVtIGNsYXNzIENhbWVyYURldmljZVN0YXR1cyA6IHVpbnQzMl90IHsKKyAgTk9UX1BSRVNFTlQgPSAwLAorICBQUkVTRU5UID0gMSwKKyAgRU5VTUVSQVRJTkcgPSAyCit9OworCitlbnVtIGNsYXNzIFRvcmNoTW9kZVN0YXR1cyA6IHVpbnQzMl90IHsKKyAgTk9UX0FWQUlMQUJMRSA9IDAsCisgIEFWQUlMQUJMRV9PRkYgPSAxLAorICBBVkFJTEFCTEVfT04gPSAyCit9OworCitzdHJ1Y3QgQ2FtZXJhUmVzb3VyY2VDb3N0IHsKKyAgdWludDMyX3QgcmVzb3VyY2VDb3N0OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uZmxpY3RpbmdEZXZpY2VzOwogfTsKIAogZW51bSBTeXN0ZW1DYW1lcmFLaW5kIHsKQEAgLTkxLDYgKzk3LDI2IEBACiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCA3KQogCiAvKioKKyAqIFRoZSB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgY2xhc3MgdGhhdCB0YWtlcyBISURML0FJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIFZlbmRvclRhZ0Rlc2NyaXB0b3IgY2xhc3MgYmVjYXVzZSB0aGF0IGNsYXNzIGlzIHVzZWQKKyAqIGluIEFJREwgZ2VuZXJhdGVkIHNvdXJjZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gQUlETCAvIEhJREwgaGVhZGVycy4KKyAqLworY2xhc3MgSWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURML0FJREwgVmVuZG9yVGFnU2VjdGlvbgorICAgICAqIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBWZW5kb3JUYWdTZWN0aW9uVmVjdG9yVHlwZSwgY2xhc3MgVmVuZG9yVGFnU2VjdGlvblR5cGU+CisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsKAorICAgICAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvblZlY3RvclR5cGUmIHZ0cywKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKK307CisKKy8qKgogICogQSBtYW5hZ2VyIGZvciBhbGwgY2FtZXJhIHByb3ZpZGVycyBhdmFpbGFibGUgb24gYW4gQW5kcm9pZCBkZXZpY2UuCiAgKgogICogUmVzcG9uc2libGUgZm9yIGVudW1lcmF0aW5nIHByb3ZpZGVycyBhbmQgdGhlIGluZGl2aWR1YWwgY2FtZXJhIGRldmljZXMKQEAgLTEwMCwxNCArMTI2LDE4IEBACiAgKiBvcGVuaW5nIHRoZW0gZm9yIGFjdGl2ZSB1c2UuCiAgKgogICovCi1jbGFzcyBDYW1lcmFQcm92aWRlck1hbmFnZXIgOiB2aXJ0dWFsIHB1YmxpYyBoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU5vdGlmaWNhdGlvbiB7CitjbGFzcyBDYW1lcmFQcm92aWRlck1hbmFnZXIgOiB2aXJ0dWFsIHB1YmxpYyBoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU5vdGlmaWNhdGlvbiwKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVNlcnZpY2VNYW5hZ2VyOjpMb2NhbFJlZ2lzdHJhdGlvbkNhbGxiYWNrIHsKIHB1YmxpYzoKLQorICAgIC8vIG5lZWRzIHRvIGJlIG1hZGUgZnJpZW5kIHN0cmljdCBzaW5jZSBIaWRsUHJvdmlkZXJJbmZvIG5lZWRzIHRvIGluaGVyaXQKKyAgICAvLyBmcm9tIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvIHdoaWNoIGlzbid0IGEgcHVibGljIG1lbWJlci4KKyAgICBmcmllbmQgc3RydWN0IEhpZGxQcm92aWRlckluZm87CisgICAgZnJpZW5kIHN0cnVjdCBBaWRsUHJvdmlkZXJJbmZvOwogICAgIH5DYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKIAogICAgIC8vIFRpbnkgcHJveHkgZm9yIHRoZSBzdGF0aWMgbWV0aG9kcyBpbiBhIEhJREwgaW50ZXJmYWNlIHRoYXQgY29tbXVuaWNhdGUgd2l0aCB0aGUgaGFyZHdhcmUKICAgICAvLyBzZXJ2aWNlIG1hbmFnZXIsIHRvIGJlIHJlcGxhY2FibGUgaW4gdW5pdCB0ZXN0cyB3aXRoIGEgZmFrZS4KLSAgICBzdHJ1Y3QgU2VydmljZUludGVyYWN0aW9uUHJveHkgeworICAgIHN0cnVjdCBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgewogICAgICAgICB2aXJ0dWFsIGJvb2wgcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU5vdGlmaWNhdGlvbj4KQEAgLTExOSwxMiArMTQ5LDEyIEBACiAgICAgICAgIHZpcnR1YWwgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gZ2V0U2VydmljZSgKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUpID0gMDsKICAgICAgICAgdmlydHVhbCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBsaXN0U2VydmljZXMoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgflNlcnZpY2VJbnRlcmFjdGlvblByb3h5KCkge30KKyAgICAgICAgdmlydHVhbCB+SGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KCkge30KICAgICB9OwogCiAgICAgLy8gU3RhbmRhcmQgdXNlIGNhc2UgLSBjYWxsIGludG8gdGhlIG5vcm1hbCBnZW5lcmF0ZWQgc3RhdGljIG1ldGhvZHMgd2hpY2ggaW52b2tlCiAgICAgLy8gdGhlIHJlYWwgaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyCi0gICAgc3RydWN0IEhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkgOiBwdWJsaWMgU2VydmljZUludGVyYWN0aW9uUHJveHkgeworICAgIHN0cnVjdCBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHlJbXBsIDogcHVibGljIEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CiAgICAgICAgIHZpcnR1YWwgYm9vbCByZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uPgpAQCAtMTUxLDEyICsxODEsMTUgQEAKICAgICAgICAgflN0YXR1c0xpc3RlbmVyKCkge30KIAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOworICAgICAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOworICAgICAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgPSAwOworICAgICAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsCisgICAgICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBraW5kKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpID0gMDsKICAgICB9OwogCkBAIC0xNzYsNyArMjA5LDEwIEBACiAgICAgICogdXNlZCBmb3IgdGVzdGluZy4gVGhlIGxpZmV0aW1lIG9mIHRoZSBwcm94eSBtdXN0IGV4Y2VlZCB0aGUgbGlmZXRpbWUgb2YgdGhlIG1hbmFnZXIuCiAgICAgICovCiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSh3cDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIsCi0gICAgICAgICAgICBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSAqcHJveHkgPSAmc0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkpOworICAgICAgICAgICAgSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5ICpoaWRsUHJveHkgPSAmc0hpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSk7CisKKyAgICBzdGF0dXNfdCBnZXRDYW1lcmFJZElQQ1RyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgICAgICAgICBJUENUcmFuc3BvcnQgKnByb3ZpZGVyVHJhbnNwb3J0KSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIGNhbWVyYXMuCkBAIC0xOTUsMTEgKzIzMSw2IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhIGRldmljZSB3aXRoIGEgZ2l2ZW4gSUQgYW5kIG1ham9yIHZlcnNpb24gZXhpc3RzCi0gICAgICovCi0gICAgYm9vbCBpc1ZhbGlkRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWFqb3JWZXJzaW9uKSBjb25zdDsKLQotICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGEgZGV2aWNlIHdpdGggYSBnaXZlbiBJRCBoYXMgYSBmbGFzaCB1bml0LiBSZXR1cm5zIGZhbHNlCiAgICAgICogZm9yIGRldmljZXMgdGhhdCBhcmUgdW5rbm93bi4KICAgICAgKi8KQEAgLTIxNCw3ICsyNDUsNyBAQAogICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgY29zdCBvZiB0aGlzIGNhbWVyYSBkZXZpY2UKICAgICAgKi8KICAgICBzdGF0dXNfdCBnZXRSZXNvdXJjZUNvc3QoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QqIGNvc3QpIGNvbnN0OworICAgICAgICAgICAgQ2FtZXJhUmVzb3VyY2VDb3N0KiBjb3N0KSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgb2xkIGNhbWVyYSBBUEkgY2FtZXJhIGluZm8KQEAgLTI0MCwxNCArMjcxLDE1IEBACiAgICAgICogQ2hlY2sgZm9yIGRldmljZSBzdXBwb3J0IG9mIHNwZWNpZmljIHN0cmVhbSBjb21iaW5hdGlvbi4KICAgICAgKi8KICAgICBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsCiAgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGRldmljZSBpbnRlcmZhY2UgdmVyc2lvbiBmb3IgdGhpcyBJRAogICAgICAqLwogICAgIHN0YXR1c190IGdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gKnYpOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiAqdiwgSVBDVHJhbnNwb3J0ICp0cmFuc3BvcnQpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBjYW1lcmEgZGV2aWNlIHN1cHBvcnQgc2V0VG9yY2hNb2RlIEFQSS4KQEAgLTI1NSw2ICsyODcsMTcgQEAKICAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRvcmNoIHN0cmVuZ3RoIHVwZGF0ZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QuCisgICAgICovCisgICAgYm9vbCBzaG91bGRTa2lwVG9yY2hTdHJlbmd0aFVwZGF0ZShjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGludDMyX3QgdG9yY2hTdHJlbmd0aCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdG9yY2ggc3RyZW5ndGggbGV2ZWwgaWYgdGhlIHRvcmNoIHN0cmVuZ3RoIGNvbnRyb2wKKyAgICAgKiBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGdldFRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFR1cm4gb24gb3Igb2ZmIHRoZSBmbGFzaGxpZ2h0IG9uIGEgZ2l2ZW4gY2FtZXJhIGRldmljZS4KICAgICAgKiBNYXkgZmFpbCBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBBUEksIGlzIGluIGFjdGl2ZSB1c2UsIG9yIGlmIHRoZSBkZXZpY2UKICAgICAgKiBkb2Vzbid0IGV4aXN0LCBldGMuCkBAIC0yNjIsNiArMzA1LDI0IEBACiAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgYm9vbCBlbmFibGVkKTsKIAogICAgIC8qKgorICAgICAqIENoYW5nZSB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvZiB0aGUgZmxhc2ggdW5pdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbWVyYUlkIGFuZAorICAgICAqIHNldCBpdCB0byB0aGUgdmFsdWUgaW4gdG9yY2hTdHJlbmd0aC4KKyAgICAgKiBJZiB0aGUgdG9yY2ggaXMgT0ZGIGFuZCB0b3JjaFN0cmVuZ3RoID4gMCwgdGhlIHRvcmNoIHdpbGwgYmUgdHVybmVkIE9OIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHN0cmVuZ3RoIGxldmVsLiBJZiB0aGUgdG9yY2ggaXMgT04sIG9ubHkgdGhlIGJyaWdodG5lc3MgbGV2ZWwgd2lsbCBiZQorICAgICAqIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIGRldmljZSBkb2VzIG5vdCBoYXZlIGZsYXNoIHVuaXQsIGhhcyBmbGFzaCB1bml0CisgICAgICogYnV0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBBUEksIHRvcmNoU3RyZW5ndGggaXMgaW52YWxpZCBvciBpZiB0aGUgZGV2aWNlIGRvZXNuJ3QKKyAgICAgKiBleGlzdCBldGMuCisgICAgICovCisgICAgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGludDMyX3QgdG9yY2hTdHJlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRvcmNoIHN0cmVuZ3RoIGxldmVsIG9mIHRoaXMgY2FtZXJhIGRldmljZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKTsKKworICAgIC8qKgogICAgICAqIFNldHVwIHZlbmRvciB0YWdzIGZvciBhbGwgcmVnaXN0ZXJlZCBwcm92aWRlcnMKICAgICAgKi8KICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKQEAgLTI2OSw4ICszMzAsMTkgQEAKICAgICAvKioKICAgICAgKiBJbmZvcm0gcmVnaXN0ZXJlZCBwcm92aWRlcnMgYWJvdXQgYSBkZXZpY2Ugc3RhdGUgY2hhbmdlLCBzdWNoIGFzIGZvbGRpbmcgb3IgdW5mb2xkaW5nCiAgICAgICovCi0gICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCi0gICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpOworICAgIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpOworCisgICAgc3RhdHVzX3Qgb3BlbkFpZGxTZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKTsKKworICAgIHN0YXR1c190IG9wZW5BaWRsSW5qZWN0aW9uU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uPiAqc2Vzc2lvbik7CiAKICAgICAvKioKICAgICAgKiBPcGVuIGFuIGFjdGl2ZSBzZXNzaW9uIHRvIGEgY2FtZXJhIGRldmljZS4KQEAgLTI3OCwxOCArMzUwLDEyIEBACiAgICAgICogVGhpcyBmdWxseSBwb3dlcnMgb24gdGhlIGNhbWVyYSBkZXZpY2UgaGFyZHdhcmUsIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEKICAgICAgKiBzZXNzaW9uIHRvIGJlIHVzZWQgZm9yIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gYW5kIG9wZXJhdGlvbi4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgc3RhdHVzX3Qgb3BlbkhpZGxTZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbik7CiAKICAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKLSAgICAgKi8KLSAgICB2b2lkIHNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKLSAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKLQotICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGF0IHRoZSBjYW1lcmEgb3IgdG9yY2ggaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgY2xpZW50CiAgICAgICovCiAgICAgdm9pZCByZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CkBAIC0zMDIsNiArMzY4LDkgQEAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgICAgIGJvb2wgcHJlZXhpc3RpbmcpIG92ZXJyaWRlOwogCisgICAgLy8gTG9jYWxSZWdpc3RyYXRpb25DYWxsYmFjazo6b25TZXJ2aWNlUmVnaXN0cmF0aW9uCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVJlZ2lzdHJhdGlvbihjb25zdCBTdHJpbmcxNiYgbmFtZSwgY29uc3Qgc3A8SUJpbmRlcj4gJmJpbmRlcikgb3ZlcnJpZGU7CisKICAgICAvKioKICAgICAgKiBEdW1wIG91dCBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgcHJvdmlkZXJzIGFuZCBkZXZpY2VzCiAgICAgICovCkBAIC0zMTYsOSArMzg1LDcgQEAKICAgICAvKgogICAgICAqIFJldHVybiBwcm92aWRlciB0eXBlIGZvciBhIHNwZWNpZmljIGRldmljZS4KICAgICAgKi8KLSAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZXRQcm92aWRlclRhZ0lkTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWluVmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MCwwfSwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MTAwMCwwfSkgY29uc3Q7CisgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2V0UHJvdmlkZXJUYWdJZExvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KQEAgLTMzMSwxNDYgKzM5OCwxNjggQEAKIAogICAgIHN0YXR1c190IGZpbHRlclNtYWxsSnBlZ1NpemVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCk7CiAKKyAgICBzdGF0dXNfdCBub3RpZnlVc2JEZXZpY2VFdmVudChpbnQzMl90IGV2ZW50SWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZ1c2JEZXZpY2VJZCk7CisKICAgICBzdGF0aWMgY29uc3QgZmxvYXQga0RlcHRoQVJUb2xlcmFuY2U7CiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUludGVyZmFjZU11dGV4OwogCi0gICAgLy8gdGhlIHN0YXR1cyBsaXN0ZW5lciB1cGRhdGUgY2FsbGJhY2tzIHdpbGwgbG9jayBtU3RhdHVzTXV0ZXgKLSAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0YXR1c0xpc3RlbmVyTXV0ZXg7CiAgICAgd3A8U3RhdHVzTGlzdGVuZXI+IG1MaXN0ZW5lcjsKLSAgICBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogbVNlcnZpY2VQcm94eTsKKyAgICBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkqIG1IaWRsU2VydmljZVByb3h5OwogCiAgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cwotICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworICAgIGludDY0X3QgbURldmljZVN0YXRlOwogCiAgICAgLy8gbVByb3ZpZGVyTGlmZWN5Y2xlTG9jayBpcyBsb2NrZWQgZHVyaW5nIG9uUmVnaXN0cmF0aW9uIGFuZCByZW1vdmVQcm92aWRlcgogICAgIG11dGFibGUgc3RkOjptdXRleCBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrOwogCi0gICAgc3RhdGljIEhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkgc0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk7CisgICAgc3RhdGljIEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eUltcGwgc0hpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKKworICAgIHN0cnVjdCBIYWxDYW1lcmFQcm92aWRlciB7CisgICAgICAvLyBFbXB0eSBwYXJlbnQgc3RydWN0IGZvciBzdG9yaW5nIGVpdGhlciBhaWRsIC8gaGlkbCBjYW1lcmEgcHJvdmlkZXIgcmVmZXJlbmNlCisgICAgICBIYWxDYW1lcmFQcm92aWRlcihjb25zdCBjaGFyICpkZXNjcmlwdG9yKSA6IG1EZXNjcmlwdG9yKGRlc2NyaXB0b3IpIHsgfTsKKyAgICAgIHZpcnR1YWwgfkhhbENhbWVyYVByb3ZpZGVyKCkge307CisgICAgICBzdGQ6OnN0cmluZyBtRGVzY3JpcHRvcjsKKyAgICB9OworCisgICAgc3RydWN0IEhpZGxIYWxDYW1lcmFQcm92aWRlciA6IHB1YmxpYyBIYWxDYW1lcmFQcm92aWRlciB7CisgICAgICAgIEhpZGxIYWxDYW1lcmFQcm92aWRlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiAmcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRvcikgOgorICAgICAgICAgICAgICAgIEhhbENhbWVyYVByb3ZpZGVyKGRlc2NyaXB0b3IpLCBtQ2FtZXJhUHJvdmlkZXIocHJvdmlkZXIpIHsgfTsKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUNhbWVyYVByb3ZpZGVyOworICAgIH07CisKKyAgICBzdHJ1Y3QgQWlkbEhhbENhbWVyYVByb3ZpZGVyIDogcHVibGljIEhhbENhbWVyYVByb3ZpZGVyIHsKKyAgICAgICAgQWlkbEhhbENhbWVyYVByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI+ICZwcm92aWRlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdG9yKSA6CisgICAgICAgICAgICAgICAgSGFsQ2FtZXJhUHJvdmlkZXIoZGVzY3JpcHRvciksIG1DYW1lcmFQcm92aWRlcihwcm92aWRlcikgeyB9OworICAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcj4gbUNhbWVyYVByb3ZpZGVyOworICAgIH07CisKIAogICAgIC8vIE1hcHBpbmcgZnJvbSBDYW1lcmFEZXZpY2UgSURzIHRvIENhbWVyYVByb3ZpZGVycy4gVGhpcyBtYXAgaXMgdXNlZCB0byBrZWVwIHRoZQogICAgIC8vIElDYW1lcmFQcm92aWRlciBhbGl2ZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRCBmb3IgY2FtZXJhCiAgICAgLy8gY2FwYWJpbGl0aWVzCi0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4+CiAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOwogCiAgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCiAgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciB0b3JjaAogICAgIC8vIGNhcGFiaWxpdGllcwotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+PgogICAgICAgICAgICAgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOwogCiAgICAgLy8gTG9jayBmb3IgYWNjZXNzaW5nIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQgYW5kIG1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZAogICAgIHN0ZDo6bXV0ZXggbVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jazsKLQotICAgIHN0cnVjdCBQcm92aWRlckluZm8gOgotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50Ci0gICAgeworICAgIHN0cnVjdCBQcm92aWRlckluZm8gOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBIaWRsUHJvdmlkZXJJbmZvOworICAgICAgICBmcmllbmQgc3RydWN0IEFpZGxQcm92aWRlckluZm87CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Qcm92aWRlck5hbWU7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Qcm92aWRlckluc3RhbmNlOwogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKLSAgICAgICAgaW50IG1NaW5vclZlcnNpb247CisgICAgICAgIGludDMyX3QgbU1pbm9yVmVyc2lvbjsKICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gbVZlbmRvclRhZ0Rlc2NyaXB0b3I7CiAgICAgICAgIGJvb2wgbVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKICAgICAgICAgYm9vbCBtSXNSZW1vdGU7CiAKLSAgICAgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cwotICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG1EZXZpY2VTdGF0ZTsKLQotICAgICAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KLSAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKLQotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtU2F2ZWRJbnRlcmZhY2U7Ci0KICAgICAgICAgUHJvdmlkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlckluc3RhbmNlLAogICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcik7CiAgICAgICAgIH5Qcm92aWRlckluZm8oKTsKIAotICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV2aWNlU3RhdGUpOwotCi0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICAgICAgdmlydHVhbCBJUENUcmFuc3BvcnQgZ2V0SVBDVHJhbnNwb3J0KCkgPSAwOwogCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlKCkgY29uc3Q7CiAKLSAgICAgICAgc3RhdHVzX3QgYWRkRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIGluaXRpYWxTdGF0dXMgPQotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULAotICAgICAgICAgICAgICAgIC8qb3V0Ki8gc3RkOjpzdHJpbmcgKnBhcnNlZElkID0gbnVsbHB0cik7Ci0KICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCi0gICAgICAgIC8vIElDYW1lcmFQcm92aWRlckNhbGxiYWNrcyBpbnRlcmZhY2UgLSB0aGVzZSBsb2NrIHRoZSBwYXJlbnQgbUludGVyZmFjZU11dGV4Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHRvcmNoTW9kZVN0YXR1c0NoYW5nZSgKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKLSAgICAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKLQotICAgICAgICBzdGF0dXNfdCBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCi0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKLSAgICAgICAgc3RhdHVzX3QgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCi0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBzdGQ6OnN0cmluZyogcGh5c2ljYWxJZCwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKLQotICAgICAgICAvLyBoaWRsX2RlYXRoX3JlY2lwaWVudCBpbnRlcmZhY2UgLSB0aGlzIGxvY2tzIHRoZSBwYXJlbnQgbUludGVyZmFjZU11dGV4Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSBvdmVycmlkZTsKLQorICAgICAgICB2b2lkIGluaXRpYWxpemVQcm92aWRlckluZm9Db21tb24oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZkZXZpY2VzKTsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHVwIHZlbmRvciB0YWdzIGZvciB0aGlzIHByb3ZpZGVyCiAgICAgICAgICAqLwotICAgICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKSA9IDA7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5vdGlmeSBwcm92aWRlciBhYm91dCB0b3AtbGV2ZWwgZGV2aWNlIHBoeXNpY2FsIHN0YXRlIGNoYW5nZXMKKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0ICdtSW50ZXJmYWNlTXV0ZXgnIHNob3VsZCBub3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICAgICAqIEl0IGlzIHBvc3NpYmxlIGZvciBjYW1lcmEgcHJvdmlkZXJzIHRvIGFkZC9yZW1vdmUgZGV2aWNlcyBhbmQgdHJ5IHRvCisgICAgICAgICAqIGFjcXVpcmUgaXQuCiAgICAgICAgICAqLwotICAgICAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgIG5ld0RldmljZVN0YXRlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld0RldmljZVN0YXRlKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBib29sIHN1Y2Nlc3NmdWxseVN0YXJ0ZWRQcm92aWRlckludGVyZmFjZSgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RGV2aWNlU3RhdGUoKSA9IDA7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4gZ2V0Q29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zKCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIE5vdGlmeSAnRGV2aWNlSW5mbycgaW5zdGFuY2VkIGFib3V0IHRvcC1sZXZlbCBkZXZpY2UgcGh5c2ljYWwgc3RhdGUgY2hhbmdlcworICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgJ21JbnRlcmZhY2VNdXRleCcgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBub3RpZnlEZXZpY2VJbmZvU3RhdGVDaGFuZ2VMb2NrZWQoaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSk7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFF1ZXJ5IHRoZSBjYW1lcmEgcHJvdmlkZXIgZm9yIGNvbmN1cnJlbnQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gc3VwcG9ydAogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3QgaXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzc6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCi0gICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIGJvb2wgKmlzU3VwcG9ydGVkKSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBhbGwgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm92aWRlciBhbmQgbm90aWZ5IGxpc3RlbmVycworICAgICAgICAgKiB3aXRoIE5PVF9QUkVTRU5UIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVBbGxEZXZpY2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb3ZpZGVyIGlzIGFuIGV4dGVybmFsIGxhenkgSEFMCisgICAgICAgICAqLworICAgICAgICBib29sIGlzRXh0ZXJuYWxMYXp5SEFMKCkgY29uc3Q7CiAKICAgICAgICAgLy8gQmFzaWMgZGV2aWNlIGluZm9ybWF0aW9uLCBjb21tb24gdG8gYWxsIGNhbWVyYSBkZXZpY2VzCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOyAgLy8gRnVsbCBpbnN0YW5jZSBuYW1lCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtSWQ7ICAgIC8vIElEIHNlY3Rpb24gb2YgZnVsbCBuYW1lCisgICAgICAgICAgICAvL0JvdGggaGlkbCBhbmQgYWlkbCBEZXZpY2VJbmZvcy4gQWlkbCBkZXZpY2VJbmZvcyBnZXQgezMsIDh9IHRvCisgICAgICAgICAgICAvL3N0YXJ0IG9mZi4KICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb247CiAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKICAgICAgICAgICAgIGJvb2wgbUlzTG9naWNhbENhbWVyYTsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxJZHM7CiAgICAgICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBtSW5mbzsKLSAgICAgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2U7CiAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIG1TeXN0ZW1DYW1lcmFLaW5kID0gU3lzdGVtQ2FtZXJhS2luZDo6UFVCTElDOwogCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBtUmVzb3VyY2VDb3N0OworICAgICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CiAKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG1TdGF0dXM7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKIAogICAgICAgICAgICAgd3A8UHJvdmlkZXJJbmZvPiBtUGFyZW50UHJvdmlkZXI7CisgICAgICAgICAgICAvLyBUb3JjaCBzdHJlbmd0aCBkZWZhdWx0LCBtYXhpbXVtIGxldmVscyBpZiB0aGUgdG9yY2ggc3RyZW5ndGggY29udHJvbAorICAgICAgICAgICAgLy8gZmVhdHVyZSBpcyBzdXBwb3J0ZWQuCisgICAgICAgICAgICBpbnQzMl90IG1Ub3JjaFN0cmVuZ3RoTGV2ZWw7CisgICAgICAgICAgICBpbnQzMl90IG1Ub3JjaE1heGltdW1TdHJlbmd0aExldmVsOworICAgICAgICAgICAgaW50MzJfdCBtVG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbDsKKworICAgICAgICAgICAgLy8gV2FpdCBmb3IgbGF6eSBIQUxzIHRvIGNvbmZpcm0gZGV2aWNlIGF2YWlsYWJpbGl0eQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RldmljZUF2YWlsYWJsZVRpbWVvdXQgPSAyMDAwZTY7IC8vIDIwMDAgbXMKKyAgICAgICAgICAgIE11dGV4ICAgICBtRGV2aWNlQXZhaWxhYmxlTG9jazsKKyAgICAgICAgICAgIENvbmRpdGlvbiBtRGV2aWNlQXZhaWxhYmxlU2lnbmFsOworICAgICAgICAgICAgYm9vbCBtSXNEZXZpY2VBdmFpbGFibGUgPSB0cnVlOwogCiAgICAgICAgICAgICBib29sIGhhc0ZsYXNoVW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGbGFzaFVuaXQ7IH0KICAgICAgICAgICAgIGJvb2wgc3VwcG9ydE5hdGl2ZVpvb21SYXRpbygpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvOyB9CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChpbnQzMl90IHRvcmNoU3RyZW5ndGgpID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGludDMyX3QgKnRvcmNoU3RyZW5ndGgpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpID0gMDsKQEAgLTQ4OCw0MSArNTc3LDMzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBib29sIC8qb3ZlcnJpZGVGb3JQZXJmQ2xhc3MqLywKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgLypnZXRNZXRhZGF0YSovLAogICAgICAgICAgICAgICAgICAgICBib29sICogLypzdGF0dXMqLykgewogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsdGVyU21hbGxKcGVnU2l6ZXMoKSA9IDA7Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci0gICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZSgpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgLypuZXdTdGF0ZSovKSB7fQogCiAgICAgICAgICAgICBEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uJiB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCiAgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIpIDoKICAgICAgICAgICAgICAgICAgICAgbU5hbWUobmFtZSksIG1JZChpZCksIG1WZXJzaW9uKHZlcnNpb24pLCBtUHJvdmlkZXJUYWdpZCh0YWdJZCksCiAgICAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLCBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCi0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpLAotICAgICAgICAgICAgICAgICAgICBtUGFyZW50UHJvdmlkZXIocGFyZW50UHJvdmlkZXIpLCBtSGFzRmxhc2hVbml0KGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8oZmFsc2UpLCBtUHVibGljQ2FtZXJhSWRzKHB1YmxpY0NhbWVyYUlkcykge30KLSAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpLAorICAgICAgICAgICAgICAgICAgICBtUGFyZW50UHJvdmlkZXIocGFyZW50UHJvdmlkZXIpLCBtVG9yY2hTdHJlbmd0aExldmVsKDApLAorICAgICAgICAgICAgICAgICAgICBtVG9yY2hNYXhpbXVtU3RyZW5ndGhMZXZlbCgwKSwgbVRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwoMCksCisgICAgICAgICAgICAgICAgICAgIG1IYXNGbGFzaFVuaXQoZmFsc2UpLCBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyhmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMocHVibGljQ2FtZXJhSWRzKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbygpIHt9CiAgICAgICAgIHByb3RlY3RlZDoKKwogICAgICAgICAgICAgYm9vbCBtSGFzRmxhc2hVbml0OyAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgYm9vbCBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbzsgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbVB1YmxpY0NhbWVyYUlkczsKLQotICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLSAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLCBib29sIGVuYWJsZWQpOwotCi0gICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlRm9yRGV2aWNlKGJvb2wgZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IHNhdmUgdGhlIElDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoaXMgd2FzCi0gICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoKSwgd2hpY2ggZG9lcyBzYXZlIGl0LgotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShpbnRlcmZhY2UsIGVuYWJsZWQpOwotICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4+IG1EZXZpY2VzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CkBAIC01MzcsMzggKzYxOCw0NyBAQAogCiAgICAgICAgIC8vIEhBTHYzLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8zIDogcHVibGljIERldmljZUluZm8gewotICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKIAotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGludDMyX3QgdG9yY2hTdHJlbmd0aCkgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqdG9yY2hTdHJlbmd0aCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLCBib29sIC8qb3ZlcnJpZGVGb3JQZXJmQ2xhc3MqLywKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgLypnZXRNZXRhZGF0YSovLAorICAgICAgICAgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmaWx0ZXJTbWFsbEpwZWdTaXplcygpIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBuZXdTdGF0ZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgIERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAogICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7Ci0gICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCkge307CisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIC8vIE1vZGlmaWVkIGJ5IGRlcml2ZWQgdHJhbnNwb3J0IHNwZWNpZmljIChoaWRsIC8gYWlkbCkgY2xhc3MKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICAvLyBNYXAgZGV2aWNlIHN0YXRlcyB0byBzZW5zb3Igb3JpZW50YXRpb25zCisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgaW50MzJfdD4gbURldmljZVN0YXRlT3JpZW50YXRpb25NYXA7CiAgICAgICAgICAgICAvLyBBIGNvcHkgb2YgbUNhbWVyYUNoYXJhY3RlcmlzdGljcyB3aXRob3V0IHBlcmZvcm1hbmNlIGNsYXNzCiAgICAgICAgICAgICAvLyBvdmVycmlkZQogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENhbWVyYU1ldGFkYXRhPiBtQ2FtZXJhQ2hhck5vUENPdmVycmlkZTsKKyAgICAgICAgICAgIC8vIE9ubHkgY29udGFpbnMgY2hhcmFjdGVyaXN0aWNzIGZvciBoaWRkZW4gcGh5c2ljYWwgY2FtZXJhcywKKyAgICAgICAgICAgIC8vIG5vdCBmb3IgcHVibGljIHBoeXNpY2FsIGNhbWVyYXMuCiAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICB2b2lkIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOworICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBUb3JjaFN0cmVuZ3RoVGFncygpOwogICAgICAgICAgICAgc3RhdHVzX3QgYWRkRHluYW1pY0RlcHRoVGFncyhib29sIG1heFJlc29sdXRpb24gPSBmYWxzZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBkZXJpdmVIZWljVGFncyhib29sIG1heFJlc29sdXRpb24gPSBmYWxzZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBhZGRSb3RhdGVDcm9wVGFncygpOwpAQCAtNTk4LDggKzY4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpOwogICAgICAgICB9OwotCi0gICAgcHJpdmF0ZToKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIHN0ZDo6c3RyaW5nIG1UeXBlOwogICAgICAgICB1aW50MzJfdCBtSWQ7CiAKQEAgLTYwOSwxMiArNjk4LDEyIEBACiAKICAgICAgICAgc3RydWN0IENhbWVyYVN0YXR1c0luZm9UIHsKICAgICAgICAgICAgIGJvb2wgaXNQaHlzaWNhbENhbWVyYVN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGNhbWVyYUlkOwotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXM7Ci0gICAgICAgICAgICBDYW1lcmFTdGF0dXNJbmZvVChib29sIGlzRm9yUGh5c2ljYWxDYW1lcmEsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgaWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxJZCwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgcykgOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1czsKKyAgICAgICAgICAgIENhbWVyYVN0YXR1c0luZm9UKGJvb2wgaXNGb3JQaHlzaWNhbENhbWVyYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHMpIDoKICAgICAgICAgICAgICAgICAgICAgaXNQaHlzaWNhbENhbWVyYVN0YXR1cyhpc0ZvclBoeXNpY2FsQ2FtZXJhKSwgY2FtZXJhSWQoaWQpLAogICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsSWQpLCBzdGF0dXMocykge30KICAgICAgICAgfTsKQEAgLTYyNiwyMiArNzE1LDE5IEBACiAgICAgICAgIC8vIEVuZCBvZiBzY29wZSBmb3IgbUluaXRMb2NrCiAKICAgICAgICAgc3RkOjpmdXR1cmU8dm9pZD4gbUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgorICAgICAgICB2aXJ0dWFsIGluaXRpYWxpemVEZXZpY2VJbmZvKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSA9IDA7CisKICAgICAgICAgdm9pZCBub3RpZnlJbml0aWFsU3RhdHVzQ2hhbmdlKHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PiBjYWNoZWRTdGF0dXMpOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4+IG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnM7CiAKLSAgICAgICAgLy8gVGVtcGxhdGVkIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgcmlnaHQga2luZCBvZiBEZXZpY2VJbmZvIGFuZCBjYWxsIHRoZQotICAgICAgICAvLyByaWdodCBDYW1lcmFQcm92aWRlciBnZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfKiBtZXRob2QuCi0gICAgICAgIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gaW5pdGlhbGl6ZURldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pOwotCi0gICAgICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgotICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7Ci0KICAgICAgICAgLy8gUGFyc2UgcHJvdmlkZXIgaW5zdGFuY2UgbmFtZSBmb3IgdHlwZSBhbmQgaWQKICAgICAgICAgc3RhdGljIHN0YXR1c190IHBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICp0eXBlLCB1aW50MzJfdCAqaWQpOwpAQCAtNjUzLDQ2ICs3MzksODkgQEAKICAgICAgICAgLy8gR2VuZXJhdGUgdmVuZG9yIHRhZyBpZAogICAgICAgICBzdGF0aWMgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2VuZXJhdGVWZW5kb3JUYWdJZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CiAKKyAgICAgICAgc3RhdHVzX3QgYWRkRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBDYW1lcmFEZXZpY2VTdGF0dXMgaW5pdGlhbFN0YXR1cywKKyAgICAgICAgICAgICAgICAvKm91dCovIHN0ZDo6c3RyaW5nKiBwYXJzZWRJZCk7CisKKyAgICAgICAgdm9pZCBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgICBzdGF0dXNfdCBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgICB2b2lkIHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgc3RhdHVzX3QgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisKKyAgICAgICAgdm9pZCB0b3JjaE1vZGVTdGF0dXNDaGFuZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKTsKKwogICAgICAgICB2b2lkIHJlbW92ZURldmljZShzdGQ6OnN0cmluZyBpZCk7CiAKLSAgICAgICAgLy8gRXhwZWN0cyB0byBoYXZlIG1Mb2NrIGxvY2tlZAotICAgICAgICBzdGF0dXNfdCByZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpOwotICAgICAgICAvLyBFeHBlY3RzIHRvIGhhdmUgbUxvY2sgbG9ja2VkCi0gICAgICAgIHN0YXR1c190IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKLSAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiAmaW50ZXJmYWNlMl82KTsKICAgICB9OwogCisgICAgdGVtcGxhdGUgPGNsYXNzIFByb3ZpZGVySW5mb1R5cGUsIGNsYXNzIEhhbENhbWVyYVByb3ZpZGVyVHlwZT4KKyAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGVUKHNwPFByb3ZpZGVySW5mbz4gJnBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiAqaGFsQ2FtZXJhUHJvdmlkZXIpOworCisgICAgLy8gVHJ5IHRvIGdldCBoaWRsIHByb3ZpZGVyIHNlcnZpY2VzIGRlY2xhcmVkLiBFeHBlY3RzIG1JbnRlcmZhY2VNdXRleCB0byBiZQorICAgIC8vIGxvY2tlZC4gQWxzbyByZWdpc3RlcnMgZm9yIGhpZGwgcHJvdmlkZXIgc2VydmljZSBub3RpZmljYXRpb25zLgorICAgIHN0YXR1c190IHRyeVRvSW5pdEFuZEFkZEhpZGxQcm92aWRlcnNMb2NrZWQoSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5ICpoaWRsUHJveHkpOworCisgICAgLy8gVHJ5IHRvIGdldCBhaWRsIHByb3ZpZGVyIHNlcnZpY2VzIGRlY2xhcmVkLiBFeHBlY3RzIG1JbnRlcmZhY2VNdXRleCB0byBiZQorICAgIC8vIGxvY2tlZC4gQWxzbyByZWdpc3RlcnMgZm9yIGFpZGwgcHJvdmlkZXIgc2VydmljZSBub3RpZmljYXRpb25zLgorICAgIHN0YXR1c190IHRyeVRvQWRkQWlkbFByb3ZpZGVyc0xvY2tlZCgpOworCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgb3IgdG9yY2ggY2xpZW50CisgICAgICovCisgICAgdm9pZCBzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKKwogICAgIC8vIFV0aWxpdHkgdG8gZmluZCBhIERldmljZUluZm8gYnkgSUQ7IHBvaW50ZXIgaXMgb25seSB2YWxpZCB3aGlsZSBtSW50ZXJmYWNlTXV0ZXggaXMgaGVsZAogICAgIC8vIGFuZCB0aGUgY2FsbGluZyBjb2RlIGRvZXNuJ3QgbXV0YXRlIHRoZSBsaXN0IG9mIHByb3ZpZGVycyBvciB0aGVpciBsaXN0cyBvZiBkZXZpY2VzLgotICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBkZXZpY2Ugb2YgdGhlIGdpdmVuIElEIHRoYXQgZmFsbHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZQotICAgIC8vICAgbWluVmVyc2lvbiA8PSBkZXZpY2VWZXJzaW9uIDwgbWF4VmVyc2lvbgogICAgIC8vIE5vIGd1YXJhbnRlZXMgb24gdGhlIG9yZGVyIG9mIHRyYXZlcnNhbAotICAgIFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyogZmluZERldmljZUluZm9Mb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnswLDB9LAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKKyAgICBQcm92aWRlckluZm86OkRldmljZUluZm8qIGZpbmREZXZpY2VJbmZvTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBhZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsIGJvb2wgcHJlZXhpc3RpbmcgPSBmYWxzZSk7CisgICAgLy8gTWFwIGV4dGVybmFsIHByb3ZpZGVycyB0byBVU0IgZGV2aWNlcyBpbiBvcmRlciB0byBoYW5kbGUgVVNCIGhvdHBsdWcKKyAgICAvLyBldmVudHMgZm9yIGxhenkgSEFMcworICAgIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4sIHNwPFByb3ZpZGVySW5mbz4+CisgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlcjsKKyAgICBzcDxQcm92aWRlckluZm8+IHN0YXJ0RXh0ZXJuYWxMYXp5UHJvdmlkZXIoKSBjb25zdDsKIAotICAgIHN0YXR1c190IHRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsCisgICAgc3RhdHVzX3QgYWRkSGlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBwcmVleGlzdGluZyA9IGZhbHNlKTsKKworICAgIHN0YXR1c190IGFkZEFpZGxQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIpOworCisgICAgc3RhdHVzX3QgdHJ5VG9Jbml0aWFsaXplSGlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxQcm92aWRlckluZm8+JiBwcm92aWRlckluZm8pOworCisgICAgc3RhdHVzX3QgdHJ5VG9Jbml0aWFsaXplQWlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxQcm92aWRlckluZm8+JiBwcm92aWRlckluZm8pOwogCiAgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmFMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAorICAgIC8vIE5vIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1lIHByb3ZpZGVyIC8gbWVtYmVyIGJlbG9uZ2luZyB0byB0aGUKKyAgICAvLyBzYW1lIHByb3ZpZGVyIHNob3VsZCBiZSB1c2VkIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBzaW5jZSBpdCdsbCBsZWFkCisgICAgLy8gdG8gaW52YWxpZCBtZW1vcnkgYWNjZXNzIChlc3BlY2lhbGx5IHNpbmNlIHRoaXMgaXMgY2FsbGVkIGJ5IFByb3ZpZGVySW5mbyBtZXRob2RzIG9uIGhhbAorICAgIC8vIHNlcnZpY2UgZGVhdGgpLgogICAgIHN0YXR1c190IHJlbW92ZVByb3ZpZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlcik7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGdldFN0YXR1c0xpc3RlbmVyKCkgY29uc3Q7CiAKLSAgICBib29sIGlzVmFsaWREZXZpY2VMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0OworICAgIGJvb2wgaXNWYWxpZERldmljZUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1ham9yVmVyc2lvbiwKKyAgICAgICAgICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQpIGNvbnN0OwogCiAgICAgc2l6ZV90IG1Qcm92aWRlckluc3RhbmNlSWQgPSAwOwogICAgIHN0ZDo6dmVjdG9yPHNwPFByb3ZpZGVySW5mbz4+IG1Qcm92aWRlcnM7Ci0KLSAgICB2b2lkIGFkZFByb3ZpZGVyVG9NYXAoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCi0gICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciwKLSAgICAgICAgICAgIGJvb2wgaXNUb3JjaFVzYWdlKTsKLSAgICB2b2lkIHJlbW92ZUNhbWVyYUlkRnJvbU1hcCgKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gJm1hcCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKKyAgICAvLyBQcm92aWRlciBuYW1lcyBvZiBBSURMIHByb3ZpZGVycyB3aXRoIHJldHJpZXZlZCBiaW5kZXJzLgorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQWlkbFByb3ZpZGVyV2l0aEJpbmRlcnM7CiAKICAgICBzdGF0aWMgY29uc3QgY2hhciogZGV2aWNlU3RhdHVzVG9TdHJpbmcoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzJik7CkBAIC03MDQsMjAgKzgzMywxNiBAQAogICAgIHZvaWQgZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRldmljZUlkcykgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBnZXRTeXN0ZW1DYW1lcmFLaW5kTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgU3lzdGVtQ2FtZXJhS2luZCAqa2luZCkgY29uc3Q7Ci0gICAgc3RkOjpwYWlyPGJvb2wsIFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyAqPiBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdDsKKyAgICBzdGQ6OnBhaXI8Ym9vbCwgUHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvICo+IGlzSGlkZGVuUGh5c2ljYWxDYW1lcmFJbnRlcm5hbCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgY29uc3Q7CiAKICAgICB2b2lkIGNvbGxlY3REZXZpY2VJZHNMb2NrZWQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZUlkcywKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbm9ybWFsRGV2aWNlSWRzLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzeXN0ZW1DYW1lcmFEZXZpY2VJZHMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKLSAgICAgICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sCi0gICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAotICAgICAgICAgICAgICBib29sICplYXJseUV4aXQpOworICAgIHN0YXR1c190IHVzYkRldmljZURldGFjaGVkKGNvbnN0IHN0ZDo6c3RyaW5nICZ1c2JEZXZpY2VJZCk7CisgICAgbmRrOjpTY29wZWRBU3RhdHVzIG9uQWlkbFJlZ2lzdHJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9iaW5kZXIpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCmluZGV4IGM5OTU2NzAuLjcxOWZmMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKQEAgLTQyLDYgKzQyLDEwIEBACiAjaW5jbHVkZSA8eG1wbWV0YS94bXBfZGF0YS5oPgogI2luY2x1ZGUgPHhtcG1ldGEveG1wX3dyaXRlci5oPgogCisjaWZuZGVmIF9fdW51c2VkCisjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorI2VuZGlmCisKIHVzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYTsKIHVzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYXM7CiB1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmFQYXJhbXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9IYWxDb252ZXJzaW9uc1RlbXBsYXRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTcxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IQUxfQ09OVkVSU0lPTl9URU1QTEFURURfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hBTF9DT05WRVJTSU9OX1RFTVBMQVRFRF9ICisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzPgorSGFsQ2FtZXJhRGV2aWNlU3RhdHVzIG1hcEZyYW1ld29ya1RvSGFsQ2FtZXJhRGV2aWNlU3RhdHVzKAorICAgICAgICBjb25zdCBDYW1lcmFEZXZpY2VTdGF0dXMmIHMpICB7CisgICAgc3dpdGNoKHMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UOworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OkVOVU1FUkFUSU5HOgorICAgICAgICAgICAgcmV0dXJuIEhhbENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc7CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkY2FtZXJhIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzPgorQ2FtZXJhRGV2aWNlU3RhdHVzIEhhbFRvRnJhbWV3b3JrQ2FtZXJhRGV2aWNlU3RhdHVzKAorICAgICAgICBjb25zdCBIYWxDYW1lcmFEZXZpY2VTdGF0dXMmIHMpICB7CisgICAgc3dpdGNoKHMpIHsKKyAgICAgICAgY2FzZSBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UOworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDsKKyAgICAgICAgY2FzZSBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OkVOVU1FUkFUSU5HOgorICAgICAgICAgICAgcmV0dXJuIENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc7CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkY2FtZXJhIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhUmVzb3VyY2VDb3N0PgorQ2FtZXJhUmVzb3VyY2VDb3N0IEhhbFRvRnJhbWV3b3JrUmVzb3VyY2VDb3N0KAorICAgICAgICBjb25zdCBIYWxDYW1lcmFSZXNvdXJjZUNvc3QmIHMpICB7CisgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IGludGVybmFsUmVzb3VyY2VDb3N0OworICAgIGludGVybmFsUmVzb3VyY2VDb3N0LnJlc291cmNlQ29zdCA9ICh1aW50MzJfdClzLnJlc291cmNlQ29zdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZGV2aWNlIDogcy5jb25mbGljdGluZ0RldmljZXMpIHsKKyAgICAgICAgaW50ZXJuYWxSZXNvdXJjZUNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLmVtcGxhY2VfYmFjayhkZXZpY2UuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBpbnRlcm5hbFJlc291cmNlQ29zdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEhhbFRvcmNoTW9kZVN0YXR1cz4KK1RvcmNoTW9kZVN0YXR1cyBIYWxUb0ZyYW1ld29ya1RvcmNoTW9kZVN0YXR1cygKKyAgICAgICAgY29uc3QgSGFsVG9yY2hNb2RlU3RhdHVzJiBzKSAgeworICAgIHN3aXRjaChzKSB7CisgICAgICAgIGNhc2UgSGFsVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgcmV0dXJuIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRTsKKyAgICAgICAgY2FzZSBIYWxUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkY6CisgICAgICAgICAgICByZXR1cm4gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGOworICAgICAgICBjYXNlIEhhbFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OOgorICAgICAgICAgICAgcmV0dXJuIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZGNhbWVyYSB0b3JjaCBtb2RlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEhhbENhbWVyYURldmljZVN0YXR1cz4KKyBjb25zdCBjaGFyKiBIYWxEZXZpY2VTdGF0dXNUb1N0cmluZyhjb25zdCBIYWxDYW1lcmFEZXZpY2VTdGF0dXMmIHMpIHsKKyAgICBzd2l0Y2gocykgeworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIk5PVF9QUkVTRU5UIjsKKyAgICAgICAgY2FzZSBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIlBSRVNFTlQiOworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc6CisgICAgICAgICAgICByZXR1cm4gIkVOVU1FUkFUSU5HIjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiAiVU5LTk9XTl9TVEFUVVMiOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2FpZGwvQWlkbFByb3ZpZGVySW5mby5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWI0Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2FpZGwvQWlkbFByb3ZpZGVySW5mby5jcHAKQEAgLTAsMCArMSw4MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkFpZGxQcm92aWRlckluZm8uaCIKKyNpbmNsdWRlICJjb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJJbmZvVGVtcGxhdGVkLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIgorI2luY2x1ZGUgPHV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCituYW1lc3BhY2UgeworY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgPSA6OmFuZHJvaWQ6OmNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM7CisKK3VzaW5nIG5hbWVzcGFjZSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FtZXJhOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOworCit1c2luZyBIYWxEZXZpY2VTdGF0dXNUeXBlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBJQ2FtZXJhUHJvdmlkZXIgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyOwordXNpbmcgU3RhdHVzTGlzdGVuZXIgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyOworCitzdGF0aWMgc3RhdHVzX3QgbWFwRXhjZXB0aW9uQ29kZVRvU3RhdHVzVChiaW5kZXJfZXhjZXB0aW9uX3QgYmluZGVyRXhjZXB0aW9uKSB7CisgICAgc3dpdGNoIChiaW5kZXJFeGNlcHRpb24pIHsKKyAgICAgICAgY2FzZSBFWF9OT05FOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIEVYX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgIGNhc2UgRVhfTlVMTF9QT0lOVEVSOgorICAgICAgICBjYXNlIEVYX0JBRF9QQVJDRUxBQkxFOgorICAgICAgICBjYXNlIEVYX0lMTEVHQUxfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVYX1VOU1VQUE9SVEVEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBFWF9UUkFOU0FDVElPTl9GQUlMRUQ6CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChjb25zdCBuZGs6OlNjb3BlZEFTdGF0dXMmIHMpIHsKKyAgICB1c2luZyBTdGF0dXMgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlN0YXR1czsKKyAgICBhdXRvIGV4Y2VwdGlvbkNvZGUgPSBzLmdldEV4Y2VwdGlvbkNvZGUoKTsKKyAgICBpZiAoZXhjZXB0aW9uQ29kZSAhPSBFWF9TRVJWSUNFX1NQRUNJRklDKSB7CisgICAgICAgIHJldHVybiBtYXBFeGNlcHRpb25Db2RlVG9TdGF0dXNUKGV4Y2VwdGlvbkNvZGUpOworICAgIH0KKyAgICBTdGF0dXMgc3QgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgc3dpdGNoIChzdCkgeworICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuIC1FVVNFUlM7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIHN0YXR1cyBjb2RlICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdCkpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworQWlkbFByb3ZpZGVySW5mbzo6QWlkbFByb3ZpZGVySW5mbygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJJbnN0YW5jZSwKKyAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcikgOgorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm8ocHJvdmlkZXJOYW1lLCBwcm92aWRlckluc3RhbmNlLCBtYW5hZ2VyKSB7fQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjppbml0aWFsaXplQWlkbFByb3ZpZGVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLCBpbnQ2NF90IGN1cnJlbnREZXZpY2VTdGF0ZSkgeworCisgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBpbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworCisgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKKyAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucworICAgIG1DYWxsYmFja3MgPQorICAgICAgICAgICAgbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEFpZGxQcm92aWRlckNhbGxiYWNrcz4odGhpcyk7CisgICAgbmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKG1DYWxsYmFja3MpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICBtRGVhdGhSZWNpcGllbnQgPSBuZGs6OlNjb3BlZEFJQmluZGVyX0RlYXRoUmVjaXBpZW50KEFJQmluZGVyX0RlYXRoUmVjaXBpZW50X25ldyhiaW5kZXJEaWVkKSk7CisgICAgYXV0byBsaW5rID0gQUlCaW5kZXJfbGlua1RvRGVhdGgoaW50ZXJmYWNlLT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksIHRoaXMpOworICAgIGlmIChsaW5rICE9IFNUQVRVU19PSykgeworICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgfQorCisgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJldERldmljZXM7CisgICAgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoJnJldERldmljZXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBuYW1lIDogcmV0RGV2aWNlcykgeworICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBsaXN0IG9mIGNvbmN1cnJlbnQgc3RyZWFtaW5nIGNhbWVyYSBkZXZpY2UgY29tYmluYXRpb25zCisgICAgcmVzID0gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQgPSB0cnVlOworCisgICAgbUlzUmVtb3RlID0gaW50ZXJmYWNlLT5pc1JlbW90ZSgpOworCisgICAgaW5pdGlhbGl6ZVByb3ZpZGVySW5mb0NvbW1vbihkZXZpY2VzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQWlkbFByb3ZpZGVySW5mbzo6YmluZGVyRGllZCh2b2lkICpjb29raWUpIHsKKyAgICBBaWRsUHJvdmlkZXJJbmZvICpwcm92aWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWlkbFByb3ZpZGVySW5mbyAqPihjb29raWUpOworICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJyVzJyBoYXMgZGllZDsgcmVtb3ZpbmcgaXQiLCBwcm92aWRlci0+bVByb3ZpZGVySW5zdGFuY2UuY19zdHIoKSk7CisgICAgcHJvdmlkZXItPm1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihwcm92aWRlci0+bVByb3ZpZGVySW5zdGFuY2UpOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6Y29tbW9uOjpWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoJnZ0cyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0KKyAgICAgICAgICAgIElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OgorICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yRnJvbUlkbDxzdGQ6OnZlY3RvcjxjYW1lcmE6OmNvbW1vbjo6VmVuZG9yVGFnU2VjdGlvbj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhOjpjb21tb246OlZlbmRvclRhZ1NlY3Rpb24+KHZ0cywgLypvdXQqL21WZW5kb3JUYWdEZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld0RldmljZVN0YXRlKSB7CisKKyAgICBtRGV2aWNlU3RhdGUgPSBuZXdEZXZpY2VTdGF0ZTsKKyAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KKyAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5sb2NrKCk7CisgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKKyAgICAgICAgaW50ZXJmYWNlLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQWlkbFByb3ZpZGVySW5mbzo6c3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIHJldHVybiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgIT0gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPgorQWlkbFByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2UobmFtZSwgJmNhbWVyYUludGVyZmFjZSk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIG9idGFpbiBpbnRlcmZhY2UgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY2FtZXJhSW50ZXJmYWNlOworfQorCitjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUNhbWVyYVByb3ZpZGVyPiBBaWRsUHJvdmlkZXJJbmZvOjpzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIlJlcXVlc3QgdG8gc3RhcnQgY2FtZXJhIHByb3ZpZGVyOiAlcyIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgfQorICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgQUxPR0UoIkJhZCBwcm92aWRlciBzdGF0ZSEgU2hvdWxkIG5vdCBiZSBoZXJlIG9uIGEgbm9uLWxhenkgSEFMISIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIGludGVyZmFjZSA9IG1BY3RpdmVJbnRlcmZhY2UubG9jaygpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBUcnkgdG8gZ2V0IHNlcnZpY2Ugd2l0aG91dCBzdGFydGluZworICAgICAgICBpbnRlcmZhY2UgPQorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhUHJvdmlkZXI6OmZyb21CaW5kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRrOjpTcEFJQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9jaGVja1NlcnZpY2UobVByb3ZpZGVyTmFtZS5jX3N0cigpKSkpOworICAgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgYWN0dWFsbHkgbmVlZHMgcmVzdGFydCwgY2FsbGluZyBnZXRTZXJ2aWNlKCVzKSIsCisgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaW50ZXJmYWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhUHJvdmlkZXI6OmZyb21CaW5kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGs6OlNwQUlCaW5kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZShtUHJvdmlkZXJOYW1lLmNfc3RyKCkpKSk7CisKKyAgICAgICAgICAgIC8vIFNldCBhbGwgZGV2aWNlcyBhcyBFTlVNRVJBVElORywgcHJvdmlkZXIgc2hvdWxkIHVwZGF0ZSBzdGF0dXMKKyAgICAgICAgICAgIC8vIHRvIFBSRVNFTlQgYWZ0ZXIgaW5pdGlhbGl6aW5nLgorICAgICAgICAgICAgLy8gVGhpcyBhdm9pZHMgZmFpbGluZyBnZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeCBiZWZvcmUgZGV2aWNlcworICAgICAgICAgICAgLy8gYXJlIHJlYWR5LgorICAgICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBtRGV2aWNlcykgeworICAgICAgICAgICAgICBkZXZpY2UtPm1Jc0RldmljZUF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKG1DYWxsYmFja3MpOworICAgICAgICAgICAgYXV0byBsaW5rID0gQUlCaW5kZXJfbGlua1RvRGVhdGgoaW50ZXJmYWNlLT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgaWYgKGxpbmsgIT0gU1RBVFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgaW50ZXJmYWNlLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICB9CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLAorICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OkFpZGxQcm92aWRlckNhbGxiYWNrczo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogUGFyZW50IHByb3ZpZGVyIG5vdCBhbGl2ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcmVudC0+Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OkFpZGxQcm92aWRlckNhbGxiYWNrczo6dG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICBzcDxBaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgcHJvdmlkZXIgbm90IGFsaXZlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcGFyZW50LT50b3JjaE1vZGVTdGF0dXNDaGFuZ2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzKTsKKworfTsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbFByb3ZpZGVySW5mbzo6QWlkbFByb3ZpZGVyQ2FsbGJhY2tzOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogUGFyZW50IHByb3ZpZGVyIG5vdCBhbGl2ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcmVudC0+cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoY2FtZXJhRGV2aWNlTmFtZSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgbmV3U3RhdHVzKTsKK307CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgSGFsVG9GcmFtZXdvcmtDYW1lcmFEZXZpY2VTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsUHJvdmlkZXJJbmZvOjp0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICB0b3JjaE1vZGVTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBIYWxUb0ZyYW1ld29ya1RvcmNoTW9kZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9OworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsUHJvdmlkZXJJbmZvOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBIYWxUb0ZyYW1ld29ya0NhbWVyYURldmljZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9OworCitzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8+CisgICAgQWlkbFByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXM7CisKKyAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKG5hbWUpOworICAgIGlmIChjYW1lcmFJbnRlcmZhY2UgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CisKKyAgICBjYW1lcmE6OmNvbW1vbjo6Q2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKKyAgICBzdGF0dXMgPSBjYW1lcmFJbnRlcmZhY2UtPmdldFJlc291cmNlQ29zdCgmcmVzb3VyY2VDb3N0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIHJlc291cmNlIGNvc3RzIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIGNvbmZsaWN0TmFtZSA6IHJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMpIHsKKyAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKGNvbmZsaWN0TmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXJzZSBjb25mbGljdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZsaWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGNvbmZsaWN0TmFtZSA9IGlkOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbzM+KAorICAgICAgICBuZXcgQWlkbERldmljZUluZm8zKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCBIYWxUb0ZyYW1ld29ya1Jlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgIHRoaXMsIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OnJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgeworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UubG9jaygpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBwcm92aWRlciBpbnRlcmZhY2UgZm9yICVzIGlzIG5vdCB2YWxpZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UpOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+ICZpbnRlcmZhY2UpIHsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBudWxsIGludGVyZmFjZSBwcm92aWRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OkNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9uPiBjb21iczsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldENvbmN1cnJlbnRDYW1lcmFJZHMoJmNvbWJzKTsKKworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY29uY3VycmVudCBjYW1lcmEgSUQgbGlzdCBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKyAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLmNsZWFyKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjb21iaW5hdGlvbiA6IGNvbWJzKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZGV2aWNlSWRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNhbWVyYURldmljZUlkIDogY29tYmluYXRpb24uY29tYmluYXRpb24pIHsKKyAgICAgICAgICAgIGRldmljZUlkcy5pbnNlcnQoY2FtZXJhRGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGRldmljZUlkcykpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpBaWRsRGV2aWNlSW5mbzMoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCisgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIDoKKyAgICAgICAgRGV2aWNlSW5mbzMobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIsIHB1YmxpY0NhbWVyYUlkcykgeworCisgICAgLy8gR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKKyAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhIGNoYXJzOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCZjaGFycyk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm1ldGFkYXRhID0gY2hhcnMubWV0YWRhdGE7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJlc1YgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJlc1YgPT0gT0sgfHwgcmVzViA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzID0gYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlcyIKKyAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLAorICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZXhpc3RzKEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdGF0ZU1hcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyk7CisgICAgICAgIGlmICgoc3RhdGVNYXAuY291bnQgPiAwKSAmJiAoKHN0YXRlTWFwLmNvdW50ICUgMikgPT0gMCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVNYXAuY291bnQ7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU9yaWVudGF0aW9uTWFwLmVtcGxhY2Uoc3RhdGVNYXAuZGF0YS5pNjRbaV0sIHN0YXRlTWFwLmRhdGEuaTY0W2krMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnZhbGlkIEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TIG1hcCBzaXplOiAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFwLmNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TeXN0ZW1DYW1lcmFLaW5kID0gZ2V0U3lzdGVtQ2FtZXJhS2luZCgpOworCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZml4IHVwIG1vbm9jaHJvbWUgdGFncyBiYXNlZCBmb3Igb2xkZXIgSEFMIHZlcnNpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBzdGF0ID0gYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgIGlmIChPSyAhPSBzdGF0KSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0KSwKKyAgICAgICAgICAgICAgICBzdGF0KTsKKyAgICB9CisgICAgcmVzID0gZGVyaXZlSGVpY1RhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgaWYgKGNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZGREeW5hbWljRGVwdGhUYWdzKC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3MgZm9yIG1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IGRlcml2ZUhlaWNUYWdzKC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXMgZm9yIgorICAgICAgICAgICAgICAgICAgICAibWF4aW11bSByZXNvbHV0aW9uIG1vZGU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0dXMpLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gYWRkUm90YXRlQ3JvcFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBkZWZhdWx0IFNDQUxFUl9ST1RBVEVfQU5EX0NST1AgdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgcmVzID0gYWRkUHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSgpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIFBSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXMgPSBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI6Om92ZXJyaWRlWm9vbVJhdGlvVGFncygKKyAgICAgICAgICAgICZtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLCAmbVN1cHBvcnROYXRpdmVab29tUmF0aW8pOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3ZlcnJpZGUgem9vbVJhdGlvIHJlbGF0ZWQgdGFnczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmCisgICAgICAgICAgICBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRSkgeworICAgICAgICBtSGFzRmxhc2hVbml0ID0gdHJ1ZTsKKyAgICAgICAgLy8gRml4IHVwIGZsYXNoIHN0cmVuZ3RoIHRhZ3MgZm9yIGRldmljZXMgd2l0aG91dCB0aGVzZSBrZXlzLgorICAgICAgICByZXMgPSBmaXh1cFRvcmNoU3RyZW5ndGhUYWdzKCk7CisgICAgICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBkZWZhdWx0IEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMIGFuZCIKKyAgICAgICAgICAgICAgICAgICAgIkFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9CisgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwgPSAwOworICAgIH0KKyAgICBlbnRyeSA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWwgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVG9yY2hNYXhpbXVtU3RyZW5ndGhMZXZlbCA9IDA7CisgICAgfQorCisgICAgbVRvcmNoU3RyZW5ndGhMZXZlbCA9IDA7CisKKyAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisKKyAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCisgICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhTWV0YWRhdGEgcENoYXJzOworICAgICAgICAgICAgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgJnBDaGFycyk7CisgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBNZXRhZGF0YSA9IHBDaGFycy5tZXRhZGF0YTsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpwQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHBNZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHBNZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShwQnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChwQnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IHBCdWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI6Om92ZXJyaWRlWm9vbVJhdGlvVGFncygKKyAgICAgICAgICAgICAgICAgICAgJm1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0sICZtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyk7CisgICAgICAgICAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3ZlcnJpZGUgem9vbVJhdGlvIHJlbGF0ZWQgdGFnczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCk7CisgICAgaWYgKCFzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgVW5hYmxlIHRvIHNldCB0b3JjaCBtb2RlOiAlcyIsIF9fRlVOQ1RJT05fXywgcy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCgKKyAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcyA9IGludGVyZmFjZS0+dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCh0b3JjaFN0cmVuZ3RoKTsKKyAgICBpZiAoIXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBVbmFibGUgdG8gc2V0IHRvcmNoIG1vZGUgc3RyZW5ndGggJWQgOiAlcyIsIF9fRlVOQ1RJT05fXywgdG9yY2hTdHJlbmd0aCwKKyAgICAgICAgICAgICAgICBzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7CisgICAgfQorICAgIG1Ub3JjaFN0cmVuZ3RoTGV2ZWwgPSB0b3JjaFN0cmVuZ3RoOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqdG9yY2hTdHJlbmd0aCkgeworICAgIGlmICh0b3JjaFN0cmVuZ3RoID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwodG9yY2hTdHJlbmd0aCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IHRvcmNoIHN0cmVuZ3RoIGxldmVsOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPgorQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtRGV2aWNlQXZhaWxhYmxlTG9jayk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBkZXZpY2U7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm8gKj4obVBhcmVudFByb3ZpZGVyLnByb21vdGUoKS5nZXQoKSk7CisgICAgICAgIGlmIChwYXJlbnRQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBsYXp5IEhBTHMgdG8gY29uZmlybSBkZXZpY2UgYXZhaWxhYmlsaXR5CisgICAgICAgICAgICBpZiAocGFyZW50UHJvdmlkZXItPmlzRXh0ZXJuYWxMYXp5SEFMKCkgJiYgIW1Jc0RldmljZUF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogV2FpdCBmb3IgZXh0ZXJuYWwgZGV2aWNlIHRvIGJlY29tZSBhdmFpbGFibGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICBtSWQuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBhdXRvIHJlcyA9IG1EZXZpY2VBdmFpbGFibGVTaWduYWwud2FpdFJlbGF0aXZlKG1EZXZpY2VBdmFpbGFibGVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RldmljZUF2YWlsYWJsZVRpbWVvdXQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgd2FpdGluZyBmb3IgZGV2aWNlIHRvIGJlY29tZSBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldmljZSA9IHBhcmVudFByb3ZpZGVyLT5zdGFydERldmljZUludGVyZmFjZShtTmFtZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UgPSBtU2F2ZWRJbnRlcmZhY2U7CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBjb25zdCBjaGFyICphcmdzID0gbnVsbHB0cjsKKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcChmZCwgJmFyZ3MsIC8qbnVtQXJncyovMCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBib29sICpzdGF0dXMpIHsKKworICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgYm9vbCBlYXJseUV4aXQgPSBmYWxzZTsKKyAgICBhdXRvIGJSZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgU3RyaW5nOChtSWQuY19zdHIoKSksIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MsIGdldE1ldGFkYXRhLCBtUGh5c2ljYWxJZHMsCisgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmVhcmx5RXhpdCk7CisKKyAgICBpZiAoIWJSZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChlYXJseUV4aXQpIHsKKyAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0ID0KKyAgICAgICAgaW50ZXJmYWNlLT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHJldCk7CisgICAgfQorICAgIHJldHVybiBPSzsKKworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpjb252ZXJ0VG9BaWRsSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpwcm92aWRlcjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KKyAgICAgICAgICAgICAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAorICAgICAgICBib29sICplYXJseUV4aXQpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyBiU3RhdHVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpwcm92aWRlcjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgYm9vbCBzaG91bGRFeGl0ID0gZmFsc2U7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChhdXRvICZjYW1lcmFJZEFuZFNlc3Npb25Db25maWcgOiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQgPSBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkOworICAgICAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBkZXZpY2VJbmZvOworICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzID0KKyAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorICAgICAgICAgICAgICAgICAgICAgICAgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY2FtZXJhSWQsIHRhcmdldFNka1ZlcnNpb24pOworICAgICAgICByZXMgPSBtTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmRldmljZUluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxEZXZpY2VJbmZvOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGlkLnN0cmluZygpLCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbERldmljZUluZm8pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGh5c2ljYWxEZXZpY2VJbmZvOworICAgICAgICAgICAgICAgIH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgbU1hbmFnZXItPmlzTG9naWNhbENhbWVyYUxvY2tlZChjYW1lcmFJZCwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgYlN0YXR1cyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnLm1TZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjYW1lcmFJZC5jX3N0cigpKSwgZGV2aWNlSW5mbywgZ2V0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLCBzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcywgJnNob3VsZEV4aXQpOworICAgICAgICBpZiAoIWJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZEV4aXQpIHsKKyAgICAgICAgICAgICplYXJseUV4aXQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTo6cHJvdmlkZXI6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24gaGFsQ2FtZXJhSWRBbmRTdHJlYW07CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLmNhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLnN0cmVhbUNvbmZpZ3VyYXRpb24gPSBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVi5wdXNoX2JhY2soaGFsQ2FtZXJhSWRBbmRTdHJlYW0pOworICAgIH0KKyAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zID0gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjppc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLCBib29sICppc1N1cHBvcnRlZCkgeworCisgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmE6OnByb3ZpZGVyOjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnM7CisgICAgICBib29sIGtub3dVbnN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgc3RhdHVzX3QgcmVzID0gY29udmVydFRvQWlkbEhBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAorICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgJmtub3dVbnN1cHBvcnRlZCk7CisgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgQUxPR0UoIiVzIHVuYWJsZSB0byBjb252ZXJ0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgcHJvdmlkZWQgdG8gSEFMIHN0cmVhbSIKKyAgICAgICAgICAgICAgICAiY29tYmluYXRpb25zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgfQorICAgICAgaWYgKGtub3dVbnN1cHBvcnRlZCkgeworICAgICAgICAgIC8vIFdlIGdvdCB0byBrbm93IHRoZSBzdHJlYW1zIGFyZW4ndCB2YWxpZCBiZWZvcmUgZG9pbmcgdGhlIEhBTAorICAgICAgICAgIC8vIGNhbGwgaXRzZWxmLgorICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5sb2NrKCk7CisgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIHNvbWUgb3RoZXIgcHJvYmxlbQorICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgIH0KKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IGludGVyZmFjZS0+aXNDb25jdXJyZW50U3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgaXNTdXBwb3J0ZWQpOworICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgQUxPR0UoIiVzOiBoYWwgaW50ZXJmYWNlIHNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhOGZlZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9BSURMUFJPVklERVJJTkZPSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0FJRExQUk9WSURFUklORk9ICisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi9TdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyL0JuQ2FtZXJhUHJvdmlkZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQWlkbFByb3ZpZGVySW5mbyA6IHB1YmxpYyBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbyB7CisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGludDY0X3QgbURldmljZVN0YXRlOworCisgICAgLy8gVGhpcyBwb2ludGVyIGlzIHVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgSUNhbWVyYVByb3ZpZGVyIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQuCisgICAgc3RkOjp3ZWFrX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKKworICAgIEFpZGxQcm92aWRlckluZm8oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVySW5zdGFuY2UsCisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpOworCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RhdHVzVChjb25zdCBuZGs6OlNjb3BlZEFTdGF0dXMmIHMpOworCisgICAgLy8gU3RhcnQgY2FtZXJhIGRldmljZSBpbnRlcmZhY2UsIHN0YXJ0IHRoZSBjYW1lcmEgcHJvdmlkZXIgcHJvY2VzcyBmb3IgbGF6eQorICAgIC8vIGhhbHMsIGlmIG5lZWRlZAorICAgIHN0YXR1c190IGluaXRpYWxpemVBaWRsUHJvdmlkZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICBpbnQ2NF90IGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICBzdGF0aWMgdm9pZCBiaW5kZXJEaWVkKHZvaWQgKmNvb2tpZSk7CisKKyAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRJUENUcmFuc3BvcnQoKSBvdmVycmlkZSB7cmV0dXJuIElQQ1RyYW5zcG9ydDo6QUlETDt9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcj4KKyAgICBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RGV2aWNlU3RhdGUoKSBvdmVycmlkZSB7IHJldHVybiBtRGV2aWNlU3RhdGU7IH07CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgY2FtZXJhIHByb3ZpZGVyIGZvciBjb25jdXJyZW50IHN0cmVhbSBjb25maWd1cmF0aW9uIHN1cHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIGJvb2wgKmlzU3VwcG9ydGVkKSBvdmVycmlkZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlTmFtZSk7CisKKyAgICAvLyBBSURMIElDYW1lcmFQcm92aWRlckNhbGxiYWNrIGludGVyZmFjZSAtIHRoZXNlIGxvY2sgdGhlIHBhcmVudAorICAgIC8vIG1JbnRlcmZhY2VNdXRleAorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisKKyAgICBzdHJ1Y3QgQWlkbFByb3ZpZGVyQ2FsbGJhY2tzIDoKKyAgICAgICAgICAgIHB1YmxpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6Qm5DYW1lcmFQcm92aWRlckNhbGxiYWNrIHsKKyAgICAgICAgQWlkbFByb3ZpZGVyQ2FsbGJhY2tzKHdwPEFpZGxQcm92aWRlckluZm8+IHBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgeyB9CisgICAgICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIHRvcmNoTW9kZVN0YXR1c0NoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKworICAgICAgIHByaXZhdGU6CisgICAgICAgIHdwPEFpZGxQcm92aWRlckluZm8+IG1QYXJlbnQgPSBudWxscHRyOworCisgICAgfTsKKworICAgIHN0cnVjdCBBaWRsRGV2aWNlSW5mbzMgOiBwdWJsaWMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zIHsKKworICAgICAgICAvL1RPRE86IGZpeCBpbml0CisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezMsIDJ9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPgorICAgICAgICAgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IG51bGxwdHI7CisKKyAgICAgICAgQWlkbERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiAsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90ICwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmLCB1aW50MTZfdCAsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiAsCisgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiAsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAsCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4pOworCisgICAgICAgIH5BaWRsRGV2aWNlSW5mbzMoKSB7fQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChpbnQzMl90IHRvcmNoU3RyZW5ndGgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICp0b3JjaFN0cmVuZ3RoKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgLypnZXRNZXRhZGF0YSovLAorICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cy8qc3RhdHVzKi8pOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICB9OworCisgcHJpdmF0ZToKKworICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCAsIGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICB1aW50MTZfdCApIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpIG92ZXJyaWRlOworCisgICAgLy9FeHBlY3RzIHRvIGhhdmUgbUxvY2sgbG9ja2VkCisKKyAgICBzdGF0dXNfdCBnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiAmaW50ZXJmYWNlKTsKKworICAgIC8vZXhwZWN0cyB0byBoYXZlIG1NYW5hZ2VyLT5tSW50ZXJmYWNlTXV0ZXggbG9ja2VkCisKKyAgICBzdGF0dXNfdCBjb252ZXJ0VG9BaWRsSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+CisgICAgICAgICAgICAgICAgKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKKyAgICAgICAgYm9vbCAqZWFybHlFeGl0KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFByb3ZpZGVyQ2FsbGJhY2tzPiBtQ2FsbGJhY2tzID0gbnVsbHB0cjsKKyAgICBuZGs6OlNjb3BlZEFJQmluZGVyX0RlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWQ5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmNwcApAQCAtMCwwICsxLDEwNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZGxQcm92aWRlckluZm8uaCIKKyNpbmNsdWRlICJjb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJJbmZvVGVtcGxhdGVkLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKworI2luY2x1ZGUgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmgiCisjaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNy9JQ2FtZXJhRGV2aWNlLmg+CisKK25hbWVzcGFjZSB7Citjb25zdCBib29sIGtFbmFibGVMYXp5SGFsKHByb3BlcnR5X2dldF9ib29sKCJyby5jYW1lcmEuZW5hYmxlTGF6eUhhbCIsIGZhbHNlKSk7Cit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FtZXJhOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbjsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbjsKKworCit1c2luZyBTdGF0dXNMaXN0ZW5lciA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXI7Cit1c2luZyBIYWxEZXZpY2VTdGF0dXNUeXBlID0gYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTsKK3VzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTsKKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGNvbnN0IFN0YXR1cyYgcykgIHsKKyAgICBzd2l0Y2gocykgeworICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuIC1FVVNFUlM7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1RSQU5TQUNUSU9OOworICAgICAgICBjYXNlIFN0YXR1czo6T1BFUkFUSU9OX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBjYXNlIFN0YXR1czo6SU5URVJOQUxfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdGljIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBtYXBUb0hpZGxEZXZpY2VTdGF0ZShpbnQ2NF90IG5ld1N0YXRlKSB7CisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRle307CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkJBQ0tfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GUk9OVF9DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGUk9OVF9DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZPTERFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6Rk9MREVEOworICAgIH0KKyAgICAvLyBPbmx5IG1hcCB2ZW5kb3IgYml0cyBkaXJlY3RseQorICAgIHVpbnQ2NF90IHZlbmRvckJpdHMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3U3RhdGUpICYgMHhGRkZGRkZGRjAwMDAwMDAwbDsKKyAgICBuZXdEZXZpY2VTdGF0ZSB8PSB2ZW5kb3JCaXRzOworCisgICAgQUxPR1YoIiVzOiBOZXcgZGV2aWNlIHN0YXRlIDB4JSIgUFJJeDY0LCBfX0ZVTkNUSU9OX18sIG5ld0RldmljZVN0YXRlKTsKKyAgICByZXR1cm4gbmV3RGV2aWNlU3RhdGU7Cit9CisKK2NvbnN0IGNoYXIqIHN0YXR1c1RvU3RyaW5nKGNvbnN0IFN0YXR1cyYgcykgeworICAgIHN3aXRjaChzKSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHJldHVybiAiSUxMRUdBTF9BUkdVTUVOVCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuICJDQU1FUkFfSU5fVVNFIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHJldHVybiAiTUFYX0NBTUVSQVNfSU5fVVNFIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuICJNRVRIT0RfTk9UX1NVUFBPUlRFRCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiAiT1BFUkFUSU9OX05PVF9TVVBQT1JURUQiOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiAiQ0FNRVJBX0RJU0NPTk5FQ1RFRCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAiSU5URVJOQUxfRVJST1IiOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgc3RhdHVzIGNvZGUgJWQiLCBzKTsKKyAgICByZXR1cm4gIlVOS05PV05fRVJST1IiOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjppbml0aWFsaXplSGlkbFByb3ZpZGVyKAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICBpbnQ2NF90IGN1cnJlbnREZXZpY2VTdGF0ZSkgeworICAgIHN0YXR1c190IHJlcyA9IHBhcnNlUHJvdmlkZXJOYW1lKG1Qcm92aWRlck5hbWUsICZtVHlwZSwgJm1JZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJvdmlkZXIgbmFtZSwgaWdub3JpbmciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgaW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKworICAgIC8vIERldGVybWluZSBtaW5vciB2ZXJzaW9uCisgICAgbU1pbm9yVmVyc2lvbiA9IDQ7CisgICAgYXV0byBjYXN0Ml82ID0gcHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzYgPSBudWxscHRyOworICAgIGlmIChjYXN0Ml82LmlzT2soKSkgeworICAgICAgICBpbnRlcmZhY2UyXzYgPSBjYXN0Ml82OworICAgICAgICBpZiAoaW50ZXJmYWNlMl82ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA2OworICAgICAgICB9CisgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gc2luY2UgY2FzdDJfNi5pc09rKCkgc3VjY2VlZHMgZXZlbiBpZiB0aGUgcHJvdmlkZXIKKyAgICAvLyB2ZXJzaW9uIGlzbid0IGFjdHVhbGx5IDIuNi4KKyAgICBpZiAoaW50ZXJmYWNlMl82ID09IG51bGxwdHIpeworICAgICAgICBhdXRvIGNhc3QyXzUgPQorICAgICAgICAgICAgICAgIHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNSA9IG51bGxwdHI7CisgICAgICAgIGlmIChjYXN0Ml81LmlzT2soKSkgeworICAgICAgICAgICAgaW50ZXJmYWNlMl81ID0gY2FzdDJfNTsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBjYXN0Ml83ID0gcHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgaWYgKGNhc3QyXzcuaXNPaygpKSB7CisgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzcgPSBjYXN0Ml83OworICAgICAgICAgICAgaWYgKGludGVyZmFjZTJfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQorICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igc2V0dGluZyB1cCBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgeworICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IFNldHRpbmcgZGV2aWNlIHN0YXRlIGZvciAlczogMHglIiBQUkl4NjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKKyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgcmVzID0gc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgdXAgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKAorICAgICAgICAgICAgU3RhdHVzIGlkU3RhdHVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgIHN0YXR1cyA9IGlkU3RhdHVzOworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmFtZSA6IGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBJRCBsaXN0IGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgZm9yIGNhbWVyYSBkZXZpY2VzIGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gR2V0IGxpc3Qgb2YgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGRldmljZSBjb21iaW5hdGlvbnMKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7CisgICAgICAgIHJlcyA9IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UyXzYpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKKyAgICAgICAgW3RoaXNdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbVNldFRvcmNoTW9kZVN1cHBvcnRlZCA9IHN1cHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBtSXNSZW1vdGUgPSBpbnRlcmZhY2UtPmlzUmVtb3RlKCk7CisKKyAgICBpbml0aWFsaXplUHJvdmlkZXJJbmZvQ29tbW9uKGRldmljZXMpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKKyAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOworICAgICAgICAgICAgfQorICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoKHJlcyA9IElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+LAorICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPih2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9tVmVuZG9yVGFnRGVzY3JpcHRvcikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKKyAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgeworICAgIG1EZXZpY2VTdGF0ZSA9IG1hcFRvSGlkbERldmljZVN0YXRlKG5ld0RldmljZVN0YXRlKTsKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CitIaWRsUHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIG9idGFpbiBpbnRlcmZhY2UgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjYW1lcmFJbnRlcmZhY2U7Cit9CisKK2Jvb2wgSGlkbFByb3ZpZGVySW5mbzo6c3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIHJldHVybiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgIT0gbnVsbHB0cjsKK30KKworY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4KK0hpZGxQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICBBTE9HRSgiQmFkIHByb3ZpZGVyIHN0YXRlISBTaG91bGQgbm90IGJlIGhlcmUgb24gYSBub24tbGF6eSBIQUwhIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gaW50ZXJmYWNlID0gbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRyeSB0byBnZXQgc2VydmljZSB3aXRob3V0IHN0YXJ0aW5nCisgICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tSGlkbFNlcnZpY2VQcm94eS0+dHJ5R2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVigiQ2FtZXJhIHByb3ZpZGVyIGFjdHVhbGx5IG5lZWRzIHJlc3RhcnQsIGNhbGxpbmcgZ2V0U2VydmljZSglcykiLAorICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tSGlkbFNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKworICAgICAgICAgICAgLy8gU2V0IGFsbCBkZXZpY2VzIGFzIEVOVU1FUkFUSU5HLCBwcm92aWRlciBzaG91bGQgdXBkYXRlIHN0YXR1cworICAgICAgICAgICAgLy8gdG8gUFJFU0VOVCBhZnRlciBpbml0aWFsaXppbmcuCisgICAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBmYWlsaW5nIGdldENhbWVyYURldmljZUludGVyZmFjZV9WM194IGJlZm9yZSBkZXZpY2VzCisgICAgICAgICAgICAvLyBhcmUgcmVhZHkuCisgICAgICAgICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CisgICAgICAgICAgICAgIGRldmljZS0+bUlzRGV2aWNlQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+CisgICAgICAgICAgICAgICAgbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgICAgICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIGlmICghbGlua2VkKSB7CisgICAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgeworICAgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBJbml0aWFsIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4ICUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgKCVzKSBhbHJlYWR5IGluIHVzZS4gUmUtdXNpbmcgaW5zdGFuY2UuIiwKKyAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBIYWxEZXZpY2VTdGF0dXNUeXBlIG5ld1N0YXR1cykgeworICAgIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUludGVybmFsKGNhbWVyYURldmljZU5hbWUsIEhhbFRvRnJhbWV3b3JrQ2FtZXJhRGV2aWNlU3RhdHVzKG5ld1N0YXR1cykpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBIYWxEZXZpY2VTdGF0dXNUeXBlIG5ld1N0YXR1cykgeworICAgIHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgSGFsVG9GcmFtZXdvcmtDYW1lcmFEZXZpY2VTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbFByb3ZpZGVySW5mbzo6dG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgeworCisgICAgdG9yY2hNb2RlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgSGFsVG9GcmFtZXdvcmtUb3JjaE1vZGVTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK3ZvaWQgSGlkbFByb3ZpZGVySW5mbzo6c2VydmljZURpZWQodWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgeworICAgICh2b2lkKSB3aG87CisgICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAnJXMnIGhhcyBkaWVkOyByZW1vdmluZyBpdCIsIG1Qcm92aWRlckluc3RhbmNlLmNfc3RyKCkpOworICAgIGlmIChjb29raWUgIT0gbUlkKSB7CisgICAgICAgIEFMT0dXKCIlczogVW5leHBlY3RlZCBzZXJ2aWNlRGllZCBjb29raWUgJSIgUFJJdTY0ICIsIGV4cGVjdGVkICUiIFBSSXUzMiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvb2tpZSwgbUlkKTsKKyAgICB9CisgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlckluc3RhbmNlKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgorICAgIEhpZGxQcm92aWRlckluZm86OmluaXRpYWxpemVEZXZpY2VJbmZvKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSB7CisgICAgU3RhdHVzIHN0YXR1czsKKworICAgIGF1dG8gY2FtZXJhSW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UobmFtZSk7CisgICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKworICAgIGNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKKyAgICBjYW1lcmFJbnRlcmZhY2UtPmdldFJlc291cmNlQ29zdChbJnN0YXR1cywgJnJlc291cmNlQ29zdF0oCisgICAgICAgIFN0YXR1cyBzLCBjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QgPSBjb3N0OworICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZSBjb3N0cyBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBjb25mbGljdE5hbWUgOiByZXNvdXJjZUNvc3QuY29uZmxpY3RpbmdEZXZpY2VzKSB7CisgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShjb25mbGljdE5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcGFyc2UgY29uZmxpY3RpbmcgZGV2aWNlICVzIiwgX19GVU5DVElPTl9fLCBjb25mbGljdE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBjb25mbGljdE5hbWUgPSBpZDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8zPigKKyAgICAgICAgbmV3IEhpZGxEZXZpY2VJbmZvMyhuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgSGFsVG9GcmFtZXdvcmtSZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKKyAgICAgICAgICAgICAgICB0aGlzLCBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMsIGNhbWVyYUludGVyZmFjZSkpOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpyZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpIHsKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA8IDYpIHsKKyAgICAgIC8vIFVuc3VwcG9ydGVkIG9wZXJhdGlvbiwgbm90aGluZyB0byBkbyBoZXJlCisgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgcHJvdmlkZXIgaW50ZXJmYWNlIGZvciAlcyBpcyBub3QgdmFsaWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworCisgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNiA9IGNhc3RSZXN1bHQ7CisgICAgICAgIGlmIChpbnRlcmZhY2UyXzYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UyXzYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzaW5jZSBtTWlub3JWZXJzaW9uID49IDYKKyAgICAgICAgICAgIEFMT0dFKCIlczogbU1pbm9yVmVyc2lvbiB3YXMgPj0gNiwgYnV0IGludGVyZmFjZTJfNiB3YXMgbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OmdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gJmludGVyZmFjZTJfNikgeworICAgIGlmIChpbnRlcmZhY2UyXzYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG51bGwgaW50ZXJmYWNlIHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPQorICAgICAgICAgICAgaW50ZXJmYWNlMl82LT5nZXRDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzKFsmc3RhdHVzLCB0aGlzXSgKKyAgICAgICAgICAgIFN0YXR1cyBjb25jdXJyZW50SWRTdGF0dXMsIC8vIFRPRE86IE1vdmUgYWxsIGluc3RhbmNlcyBvZiBoaWRsX3N0cmluZyB0byAndXNpbmcnCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4+JgorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNvbmN1cnJlbnRJZFN0YXR1czsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGNvbWJpbmF0aW9uIDogY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byAmY2FtZXJhRGV2aWNlSWQgOiBjb21iaW5hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWRzLmluc2VydChjYW1lcmFEZXZpY2VJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGV2aWNlSWRzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNvbmN1cnJlbnQgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBmb3IgY2FtZXJhIGRldmljZXMgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjpIaWRsRGV2aWNlSW5mbzMoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCisgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgOgorICAgICAgICBEZXZpY2VJbmZvMyhuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlciwgcHVibGljQ2FtZXJhSWRzKSB7CisKKyAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQorICAgIFN0YXR1cyBzdGF0dXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgorICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmV4aXN0cyhBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUykpIHsKKyAgICAgICAgY29uc3QgYXV0byAmc3RhdGVNYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMpOworICAgICAgICBpZiAoKHN0YXRlTWFwLmNvdW50ID4gMCkgJiYgKChzdGF0ZU1hcC5jb3VudCAlIDIpID09IDApKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlTWFwLmNvdW50OyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcC5lbXBsYWNlKHN0YXRlTWFwLmRhdGEuaTY0W2ldLCBzdGF0ZU1hcC5kYXRhLmk2NFtpKzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW52YWxpZCBBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyBtYXAgc2l6ZTogJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hcC5jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3lzdGVtQ2FtZXJhS2luZCA9IGdldFN5c3RlbUNhbWVyYUtpbmQoKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gc3RhdCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCisgICAgICAgICAgICAgICAgc3RhdCk7CisgICAgfQorICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKworICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IobUNhbWVyYUNoYXJhY3RlcmlzdGljcykpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWRkRHluYW1pY0RlcHRoVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOworICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzIGZvciBtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBkZXJpdmVIZWljVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOworICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzIGZvciIKKyAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGFkZFJvdGF0ZUNyb3BUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBTQ0FMRVJfUk9UQVRFX0FORF9DUk9QIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJlcyA9IGFkZFByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBQUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgcmVzID0gY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyOjpvdmVycmlkZVpvb21SYXRpb1RhZ3MoCisgICAgICAgICAgICAmbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG92ZXJyaWRlIHpvb21SYXRpbyByZWxhdGVkIHRhZ3M6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KKyAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKKyAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJgorICAgICAgICAgICAgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUUpIHsKKyAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7CisgICAgICAgIC8vIEZpeCB1cCBmbGFzaCBzdHJlbmd0aCB0YWdzIGZvciBkZXZpY2VzIHdpdGhvdXQgdGhlc2Uga2V5cy4KKyAgICAgICAgcmVzID0gZml4dXBUb3JjaFN0cmVuZ3RoVGFncygpOworICAgICAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCBhbmQiCisgICAgICAgICAgICAgICAgICAgICJBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1IYXNGbGFzaFVuaXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBtVG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbCA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsID0gMDsKKyAgICB9CisgICAgZW50cnkgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG1Ub3JjaE1heGltdW1TdHJlbmd0aExldmVsID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWwgPSAwOworICAgIH0KKworICAgIG1Ub3JjaFN0cmVuZ3RoTGV2ZWwgPSAwOworCisgICAgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworCisgICAgLy8gR2V0IHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaWYgYXBwbGljYWJsZQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoIWNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dWKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byB2ZXJzaW9uIDMuNSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29udmVydGVkIElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICBmb3IgKGF1dG8mIGlkIDogbVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1QdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpICE9CisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGhpZGxJZChpZCk7CisgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhoaWRsSWQsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaWQsIHRoaXNdKFN0YXR1cyBzLCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0gPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAorICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSwgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKKyAgICAgICAgICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworCit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlOworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBTdGF0dXMgcyA9IGludGVyZmFjZS0+c2V0VG9yY2hNb2RlKGVuYWJsZWQgPyBUb3JjaE1vZGU6Ok9OIDogVG9yY2hNb2RlOjpPRkYpOworICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCgKKyAgICAgICAgaW50MzJfdCAvKnRvcmNoU3RyZW5ndGhMZXZlbCovKSB7CisgICAgQUxPR0UoIiVzIEhJREwgZG9lcyBub3Qgc3VwcG9ydCB0dXJuaW5nIG9uIHRvcmNoIHdpdGggdmFyaWFibGUgc3RyZW5ndGgiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqIC8qdG9yY2hTdHJlbmd0aCovKSB7CisgICAgQUxPR0UoIiVzIEhJREwgZG9lcyBub3Qgc3VwcG9ydCB2YXJpYWJsZSB0b3JjaCBzdHJlbmd0aCBsZXZlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CitIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzM6OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1EZXZpY2VBdmFpbGFibGVMb2NrKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGRldmljZTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxIaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbyAqPihtUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpLmdldCgpKTsKKyAgICAgICAgaWYgKHBhcmVudFByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGxhenkgSEFMcyB0byBjb25maXJtIGRldmljZSBhdmFpbGFiaWxpdHkKKyAgICAgICAgICAgIGlmIChwYXJlbnRQcm92aWRlci0+aXNFeHRlcm5hbExhenlIQUwoKSAmJiAhbUlzRGV2aWNlQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBXYWl0IGZvciBleHRlcm5hbCBkZXZpY2UgdG8gYmVjb21lIGF2YWlsYWJsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIG1JZC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIGF1dG8gcmVzID0gbURldmljZUF2YWlsYWJsZVNpZ25hbC53YWl0UmVsYXRpdmUobURldmljZUF2YWlsYWJsZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGV2aWNlQXZhaWxhYmxlVGltZW91dCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB3YWl0aW5nIGZvciBkZXZpY2UgdG8gYmVjb21lIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlID0gcGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IChoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBib29sICpzdGF0dXMpIHsKKworICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uXzNfNzsKKyAgICBib29sIGVhcmx5RXhpdCA9IGZhbHNlOworICAgIGF1dG8gYlJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBTdHJpbmc4KG1JZC5jX3N0cigpKSwgbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgZ2V0TWV0YWRhdGEsIG1QaHlzaWNhbElkcywKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fM183LCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmVhcmx5RXhpdCk7CisKKyAgICBpZiAoIWJSZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChlYXJseUV4aXQpIHsKKyAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICBhdXRvIGNhc3RSZXN1bHRfM183ID0gZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNyA9IGNhc3RSZXN1bHRfM183OworCisgICAgc3RhdHVzX3QgcmVzOworICAgIFN0YXR1cyBjYWxsU3RhdHVzOworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgYXV0byBoYWxDYiA9CisgICAgICAgICAgICBbJmNhbGxTdGF0dXMsICZzdGF0dXNdIChTdGF0dXMgcywgYm9vbCBjb21iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGNvbWJTdGF0dXM7CisgICAgICAgICAgICB9OworICAgIGlmIChpbnRlcmZhY2VfM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNy0+aXNTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZF8zXzcoY29uZmlndXJhdGlvbl8zXzcsIGhhbENiKTsKKyAgICB9IGVsc2UgaWYgKGludGVyZmFjZV8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbl8zXzQ7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uXzNfNCwgY29uZmlndXJhdGlvbl8zXzcpOworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb25fM180LCBoYWxDYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAorICAgICAgICBib29sICplYXJseUV4aXQpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyBiU3RhdHVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgYm9vbCBzaG91bGRFeGl0ID0gZmFsc2U7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChhdXRvICZjYW1lcmFJZEFuZFNlc3Npb25Db25maWcgOiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQgPSBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyA9CisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6dGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNhbWVyYUlkLCB0YXJnZXRTZGtWZXJzaW9uKTsKKyAgICAgICAgcmVzID0gbU1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjYW1lcmFJZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZkZXZpY2VJbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFN0cmluZzggJmlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsRGV2aWNlSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChpZC5zdHJpbmcoKSwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxEZXZpY2VJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBoeXNpY2FsRGV2aWNlSW5mbzsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIG1NYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmFMb2NrZWQoY2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGJTdGF0dXMgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tU2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQuY19zdHIoKSksIGRldmljZUluZm8sIGdldE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcywgc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZzaG91bGRFeGl0KTsKKyAgICAgICAgaWYgKCFiU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRFeGl0KSB7CisgICAgICAgICAgICAqZWFybHlFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uIGhhbENhbWVyYUlkQW5kU3RyZWFtOworICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5jYW1lcmFJZCA9IGNhbWVyYUlkOworICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5zdHJlYW1Db25maWd1cmF0aW9uID0gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1YucHVzaF9iYWNrKGhhbENhbWVyYUlkQW5kU3RyZWFtKTsKKyAgICB9CisgICAgKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucyA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6aXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKworICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uczsKKyAgICAgIGJvb2wga25vd1Vuc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICBzdGF0dXNfdCByZXMgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgICAgICAgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sICZoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsICZrbm93VW5zdXBwb3J0ZWQpOworICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgIEFMT0dFKCIlcyB1bmFibGUgdG8gY29udmVydCBzZXNzaW9uIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGVkIHRvIEhBTCBzdHJlYW0iCisgICAgICAgICAgICAgICAgImNvbWJpbmF0aW9ucyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgIH0KKyAgICAgIGlmIChrbm93VW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAvLyBXZSBnb3QgdG8ga25vdyB0aGUgc3RyZWFtcyBhcmVuJ3QgdmFsaWQgYmVmb3JlIGRvaW5nIHRoZSBIQUwKKyAgICAgICAgICAvLyBjYWxsIGl0c2VsZi4KKyAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm4gT0s7CisgICAgICB9CisKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBtaWdodCBiZSBzb21lIG90aGVyIHByb2JsZW0KKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzYgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzcgPSBwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICBTdGF0dXMgY2FsbFN0YXR1czsKKyAgICAgICAgYXV0byBjYiA9CisgICAgICAgICAgICAgICAgWyZpc1N1cHBvcnRlZCwgJmNhbGxTdGF0dXNdKFN0YXR1cyBzLCBib29sIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHN1cHBvcnRlZDsgfTsKKworICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OworICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl83OworICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl82OworICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA3ICYmIGNhc3RSZXN1bHQyXzcuaXNPaygpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VfMl83ID0gY2FzdFJlc3VsdDJfNzsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl83ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfMl83LT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZF8yXzcoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsIGNiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtTWlub3JWZXJzaW9uID09IDYgJiYgY2FzdFJlc3VsdDJfNi5pc09rKCkpIHsKKyAgICAgICAgICAgIGludGVyZmFjZV8yXzYgPSBjYXN0UmVzdWx0Ml82OworICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxwcm92aWRlcjo6VjJfNjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzY7CisgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzYucmVzaXplKG51bVN0cmVhbXMpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBjb21iaW5hdGlvbiA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNltpXS5jYW1lcmFJZCA9IGNvbWJpbmF0aW9uLmNhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzZbaV0uc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uLnN0cmVhbUNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8yXzYtPmlzQ29uY3VycmVudFN0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNiwgY2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGludGVyZmFjZV8yXzcgIT0gbnVsbHB0ciB8fCBpbnRlcmZhY2VfMl82ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYxNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0hJRExQUk9WSURFUklORk9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfSElETFBST1ZJREVSSU5GT0gKKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSGlkbFByb3ZpZGVySW5mbyA6IHB1YmxpYyBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbywKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaywKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgLy8gVGhpcyBwb2ludGVyIGlzIHVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgSUNhbWVyYVByb3ZpZGVyIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQuCisgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKKworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKKyAgICBIaWRsUHJvdmlkZXJJbmZvKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlckluc3RhbmNlLAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKSA6CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbyhwcm92aWRlck5hbWUsIHByb3ZpZGVySW5zdGFuY2UsIG1hbmFnZXIpIHt9CisKKyAgICB2aXJ0dWFsIH5IaWRsUHJvdmlkZXJJbmZvKCkge30KKworICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0YXR1c1QoY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgJnN0YXR1cyk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplSGlkbFByb3ZpZGVyKAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgICAgIGludDY0X3QgY3VycmVudERldmljZVN0YXRlKTsKKworICAgIElQQ1RyYW5zcG9ydCBnZXRJUENUcmFuc3BvcnQoKSBvdmVycmlkZSB7cmV0dXJuIElQQ1RyYW5zcG9ydDo6SElETDt9CisKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RGV2aWNlU3RhdGUoKSBvdmVycmlkZSB7cmV0dXJuIG1EZXZpY2VTdGF0ZTt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIGNhbWVyYSBwcm92aWRlciBmb3IgY29uY3VycmVudCBzdHJlYW0gY29uZmlndXJhdGlvbiBzdXBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLCBib29sICppc1N1cHBvcnRlZCkgb3ZlcnJpZGU7CisKKyAgICAvLyBIZWxwZXIgZm9yIGluaXRpYWxpemVEZXZpY2VJbmZvIHRvIHVzZSB0aGUgcmlnaHQgQ2FtZXJhUHJvdmlkZXIgZ2V0IG1ldGhvZC4KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlTmFtZSk7CisKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXJDYWxsYmFja3MgaW50ZXJmYWNlIC0gdGhlc2UgbG9jayB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyApIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyApIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmICwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgKSBvdmVycmlkZTsKKworICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mICkgb3ZlcnJpZGU7CisKKyAgICBzdHJ1Y3QgSGlkbERldmljZUluZm8zIDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMyB7CisKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtVmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgMn07CisgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2UgPSBudWxscHRyOworCisgICAgICAgIEhpZGxEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCAsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJiwgdWludDE2X3QgLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgLAorICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLAorICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4pOworCisgICAgICAgIH5IaWRsRGV2aWNlSW5mbzMoKSB7fQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChpbnQzMl90IHRvcmNoU3RyZW5ndGgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICp0b3JjaFN0cmVuZ3RoKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzLypzdGF0dXMqLyk7CisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICB9OworCisgcHJpdmF0ZToKKworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCAsIGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICB1aW50MTZfdCApIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSBvdmVycmlkZTsKKworICAgIC8vRXhwZWN0cyB0byBoYXZlIG1Mb2NrIGxvY2tlZAorICAgIHN0YXR1c190IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+ICYpOworCisgICAgLy9leHBlY3RzIHRvIGhhdmUgbU1hbmFnZXItPm1JbnRlcmZhY2VNdXRleCBsb2NrZWQKKyAgICBzdGF0dXNfdCBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiYKKyAgICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPioKKyAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCisgICAgICAgIGJvb2wgKmVhcmx5RXhpdCk7Cit9OyAvLyBIaWRsUHJvdmlkZXJJbmZvCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcAppbmRleCBmM2FkZjIwLi5jMGQ0N2Q1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcApAQCAtMjgsMTYgKzI4LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAotY2FtZXJhX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cykgewotICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzOwotCi0gICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok9LOiByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0s7Ci0gICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpFUlJPUjogcmV0dXJuIENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci19Ci0KIHZvaWQgQnVmZmVyUmVjb3Jkczo6dGFrZUluZmxpZ2h0QnVmZmVyTWFwKEJ1ZmZlclJlY29yZHMmIG90aGVyKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IG9Mb2NrKG90aGVyLm1JbmZsaWdodExvY2spOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbmZsaWdodExvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5oCmluZGV4IDFlMWNkNjAuLjk2ZmMxMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmgKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiAgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3ZlZCBidWZmZXIgSUQgaWYgaW5wdXQgY2FjaGUgaXMgZm91bmQuCiAgICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4gQlVGRkVSX0lEX05PX0JVRkZFUgotICAgICAgICB1aW50NjRfdCByZW1vdmVPbmVCdWZmZXJDYWNoZShpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKTsKKyAgICAgICAgdWludDY0X3QgcmVtb3ZlT25lQnVmZmVyQ2FjaGUoaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlcyBmb3IgaW5wdXQgc3RyZWFtLCBidXQgZG8gbm90IHJlbW92ZSB0aGUgc3RyZWFtCiAgICAgICAgIC8vIFJlbW92ZWQgYnVmZmVycycgSUQgYXJlIHJldHVybmVkCkBAIC0xNTQsOSArMTU0LDYgQEAKICAgICB9OyAvLyBjbGFzcyBCdWZmZXJSZWNvcmRzCiAKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7Ci0KLSAgICBjYW1lcmFfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCBmZDY0NWM3Li43YzJmMzRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTcwLDE5ICs3MCwxOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpWM182OjpDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUNhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOgorQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4ICZpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCBsZWdhY3lDbGllbnQpOgogICAgICAgICBtSWQoaWQpLAorICAgICAgICBtTGVnYWN5Q2xpZW50KGxlZ2FjeUNsaWVudCksCiAgICAgICAgIG1PcGVyYXRpbmdNb2RlKE5PX01PREUpLAogICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24oZmFsc2UpLAogICAgICAgICBtU3RhdHVzKFNUQVRVU19VTklOSVRJQUxJWkVEKSwKICAgICAgICAgbVN0YXR1c1dhaXRlcnMoMCksCiAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0KGZhbHNlKSwKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAorICAgICAgICBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lKGZhbHNlKSwKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCgwKSwKICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcigwKSwKQEAgLTExMSwxNjYgKzExMSwxMiBAQAogICAgIHJldHVybiBtSWQ7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0KLSAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBISURMIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwotICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIENMT0dFKCJBbHJlYWR5IGluaXRpYWxpemVkISIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiBzZXNzaW9uOwotICAgIEFUUkFDRV9CRUdJTigiQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOwotICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5TZXNzaW9uKG1JZC5zdHJpbmcoKSwgdGhpcywKLSAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOwotICAgIEFUUkFDRV9FTkQoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MobUlkLnN0cmluZygpLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZtRGV2aWNlSW5mbyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHNlc3Npb24tPmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvID0gbWFuYWdlci0+c3VwcG9ydE5hdGl2ZVpvb21SYXRpbyhtSWQuc3RyaW5nKCkpOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgIGJvb2wgaXNMb2dpY2FsID0gbWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1JZC5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICBpZiAoaXNMb2dpY2FsKSB7Ci0gICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3Qgb3ZlcnJpZGUgY2hhcmFjdGVyaXN0aWNzIGZvciBwaHlzaWNhbCBjYW1lcmFzCi0gICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQsIC8qb3ZlcnJpZGVGb3JQZXJmQ2xhc3MqL2ZhbHNlLCAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCB1c2VQcmVjb3JyZWN0QXJyYXkgPQotICAgICAgICAgICAgICAgICAgICBEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQobVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7Ci0gICAgICAgICAgICBpZiAodXNlUHJlY29ycmVjdEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gbURpc3RvcnRpb25NYXBwZXJzW3BoeXNpY2FsSWRdLnNldHVwU3RhdGljSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOwotICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gcmVhZCBjYW1lcmEgJXMncyBjYWxpYnJhdGlvbiBmaWVsZHMgZm9yIGRpc3RvcnRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZWN0aW9uIiwgcGh5c2ljYWxJZC5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzW3BoeXNpY2FsSWRdID0gWm9vbVJhdGlvTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKLSAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8sIHVzZVByZWNvcnJlY3RBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoCi0gICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pKSB7Ci0gICAgICAgICAgICAgICAgbVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnNbcGh5c2ljYWxJZF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZWNvcnJlY3RBcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOwotICAgIGF1dG8gcmVxdWVzdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAotICAgICAgICBbJnF1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXF1ZXN0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOwotICAgICAgICAgICAgICAgIHF1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHF1ZXVlIG9ud2FyZHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlcXVlc3QgbWV0YWRhdGEgZm1xOiAlcywgbm90IHVzZSBpdCIsCi0gICAgICAgICAgICAgICAgcmVxdWVzdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7Ci0gICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAotICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKLSAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSByZXNRdWV1ZSBvbndhcmRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCi0gICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oW10oCi0gICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZz4gaW50ZXJmYWNlQ2hhaW4pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiU2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQotICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOwotICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgewotICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIgPSAoYnVmTWdyTW9kZS5kYXRhLnU4WzBdID09Ci0gICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKLSAgICB9Ci0KLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBjYXBhYmlsaXRpZXMgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5kYXRhLnU4W2ldOwotICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19PRkZMSU5FX1BST0NFU1NJTkcpIHsKLSAgICAgICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKLSAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7Ci0gICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOwotICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKLSAgICBpZiAoIW1vbml0b3JUYWdzLmlzRW1wdHkoKSkgewotICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOwotICAgIH0KLQotICAgIC8vIE1ldGFkYXRhIHRhZ3MgbmVlZHMgZml4dXAgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGxlc3MKLSAgICAvLyB0aGFuIDMuNS4KLSAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKLSAgICByZXMgPSBtYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihtSWQuc3RyaW5nKCksICZtYXhWZXJzaW9uKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgZGV2aWNlIHZlcnNpb24gaWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAotICAgICAgICAgICAgbWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7Ci0KLSAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKLSAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07Ci0gICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKLSAgICAgICAgICAgIGlzTW9ub2Nocm9tZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gKGlzTW9ub2Nocm9tZSAmJiBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpOwotCi0gICAgcmV0dXJuIGluaXRpYWxpemVDb21tb25Mb2NrZWQoKTsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpIHsKIAorICAgIC8qKiBTdGFydCB3YXRjaGRvZyB0aHJlYWQgKi8KKyAgICBtQ2FtZXJhU2VydmljZVdhdGNoZG9nID0gbmV3IENhbWVyYVNlcnZpY2VXYXRjaGRvZygpOworICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2ctPnJ1bigiQ2FtZXJhU2VydmljZVdhdGNoZG9nIik7CisKICAgICAvKiogU3RhcnQgdXAgc3RhdHVzIHRyYWNrZXIgdGhyZWFkICovCiAgICAgbVN0YXR1c1RyYWNrZXIgPSBuZXcgU3RhdHVzVHJhY2tlcih0aGlzKTsKICAgICBzdGF0dXNfdCByZXMgPSBtU3RhdHVzVHJhY2tlci0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJXMtU3RhdHVzIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CkBAIC0zMjIsNyArMTY4LDcgQEAKICAgICB9CiAKICAgICAvKiogU3RhcnQgdXAgcmVxdWVzdCBxdWV1ZSB0aHJlYWQgKi8KLSAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKAorICAgIG1SZXF1ZXN0VGhyZWFkID0gY3JlYXRlTmV3UmVxdWVzdFRocmVhZCgKICAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLAogICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1TdXBwb3J0Q2FtZXJhTXV0ZSk7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CkBAIC0zNDQsMTEgKzE5MCwxMiBAQAogICAgIG1Jc0lucHV0U3RyZWFtTXVsdGlSZXNvbHV0aW9uID0gZmFsc2U7CiAKICAgICAvLyBNZWFzdXJlIHRoZSBjbG9jayBkb21haW4gb2Zmc2V0IGJldHdlZW4gY2FtZXJhIGFuZCB2aWRlby9od19jb21wb3NlcgorICAgIG1UaW1lc3RhbXBPZmZzZXQgPSBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0aW1lc3RhbXBTb3VyY2UgPQogICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UpOwogICAgIGlmICh0aW1lc3RhbXBTb3VyY2UuY291bnQgPiAwICYmIHRpbWVzdGFtcFNvdXJjZS5kYXRhLnU4WzBdID09CiAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0VfUkVBTFRJTUUpIHsKLSAgICAgICAgbVRpbWVzdGFtcE9mZnNldCA9IGdldE1vbm9Ub0Jvb3R0aW1lT2Zmc2V0KCk7CisgICAgICAgIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIFdpbGwgdGhlIEhBTCBiZSBzZW5kaW5nIGluIGVhcmx5IHBhcnRpYWwgcmVzdWx0IG1ldGFkYXRhPwpAQCAtMzgwLDcgKzIyNyw4IEBACiAgICAgICAgIG1Sb3RhdGVBbmRDcm9wTWFwcGVycy5lbXBsYWNlKG1JZC5jX3N0cigpLCAmbURldmljZUluZm8pOwogICAgIH0KIAotICAgIG1JbmplY3Rpb25NZXRob2RzID0gbmV3IENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHRoaXMpOworICAgIC8vIEhpZGwvQWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzCisgICAgbUluamVjdGlvbk1ldGhvZHMgPSBjcmVhdGVDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh0aGlzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ3MCw3ICszMTgsNyBAQAogCiAgICAgICAgIC8vIENhbGwgY2xvc2Ugd2l0aG91dCBpbnRlcm5hbCBtdXRleCBoZWxkLCBhcyB0aGUgSEFMIGNsb3NlIG1heSBuZWVkIHRvCiAgICAgICAgIC8vIHdhaXQgb24gYXNzb3J0ZWQgY2FsbGJhY2tzLGV0YywgdG8gY29tcGxldGUgYmVmb3JlIGl0IGNhbiByZXR1cm4uCi0gICAgICAgIGludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2VXYXRjaGRvZy0+V0FUQ0goaW50ZXJmYWNlLT5jbG9zZSgpKTsKIAogICAgICAgICBmbHVzaEluZmxpZ2h0UmVxdWVzdHMoKTsKIApAQCAtNDkzLDYgKzM0MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIEFMT0dJKCIlczogWCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAobUNhbWVyYVNlcnZpY2VXYXRjaGRvZyAhPSBOVUxMKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2ctPnJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY2xlYXIoKTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC01MzAsODYgKzM4NCwxNiBAQAogICAgIHJldHVybiBtZWFzdXJlZDsKIH0KIAotaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoCi0gICAgICAgIGludCBmcmFtZXdvcmtGb3JtYXQpIHsKLSAgICByZXR1cm4gKGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCkgZnJhbWV3b3JrRm9ybWF0OwotfQotCi1EYXRhc3BhY2VGbGFncyBDYW1lcmEzRGV2aWNlOjptYXBUb0hpZGxEYXRhc3BhY2UoCi0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgewotICAgIHJldHVybiBkYXRhU3BhY2U7Ci19Ci0KLUJ1ZmZlclVzYWdlRmxhZ3MgQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKAotICAgICAgICB1aW50NjRfdCB1c2FnZSkgewotICAgIHJldHVybiB1c2FnZTsKLX0KLQotU3RyZWFtUm90YXRpb24gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Sb3RhdGlvbihjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIHsKLSAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOgotICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOwotICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fOTA6Ci0gICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzkwOwotICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMTgwOgotICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8xODA7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8yNzA6Ci0gICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzI3MDsKLSAgICB9Ci0gICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSByb3RhdGlvbiAlZCIsIF9fRlVOQ1RJT05fXywgcm90YXRpb24pOwotICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMDsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKLSAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLCBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSkgewotICAgIGlmIChtb2RlID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaWYgKG9wZXJhdGlvbk1vZGUgPCBDQU1FUkFfVkVORE9SX1NUUkVBTV9DT05GSUdVUkFUSU9OX01PREVfU1RBUlQpIHsKLSAgICAgICAgc3dpdGNoKG9wZXJhdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFOgotICAgICAgICAgICAgICAgICptb2RlID0gU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOgotICAgICAgICAgICAgICAgICptb2RlID0gU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSBjb25maWd1cmF0aW9uIG1vZGUgJWQiLCBfX0ZVTkNUSU9OX18sIG9wZXJhdGlvbk1vZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAqbW9kZSA9IHN0YXRpY19jYXN0PFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlPihvcGVyYXRpb25Nb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1pbnQgQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtGb3JtYXQoCi0gICAgICAgIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGl4ZWxGb3JtYXQpOwotfQotCi1hbmRyb2lkX2RhdGFzcGFjZSBDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKLSAgICAgICAgRGF0YXNwYWNlRmxhZ3MgZGF0YVNwYWNlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihkYXRhU3BhY2UpOwotfQotCi11aW50NjRfdCBDYW1lcmEzRGV2aWNlOjptYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgIEJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpIHsKLSAgICByZXR1cm4gdXNhZ2U7Ci19Ci0KLXVpbnQ2NF90IENhbWVyYTNEZXZpY2U6Om1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgewotICAgIHJldHVybiB1c2FnZTsKLX0KLQotc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7Citzc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICZpbmZvLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CiAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkgZm9yIGRlZmF1bHQgc2Vuc29yIHBpeGVsIG1vZGUKICAgICBjYW1lcmEzOjpTaXplIG1heERlZmF1bHRKcGVnUmVzb2x1dGlvbiA9Ci0gICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihtRGV2aWNlSW5mbywKKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldE1heEpwZWdSZXNvbHV0aW9uKGluZm8sCiAgICAgICAgICAgICAgICAgICAgIC8qaXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKi9mYWxzZSk7CiAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkgZm9yIG1heCByZXNvbHV0aW9uIHNlbnNvciBwaXhlbCBtb2RlIC8gMCBpZgogICAgIC8vIG5vdCB1bHRyYSBoaWdoIHJlcyBzZW5zb3IKICAgICBjYW1lcmEzOjpTaXplIHVock1heEpwZWdSZXNvbHV0aW9uID0KLSAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldE1heEpwZWdSZXNvbHV0aW9uKG1EZXZpY2VJbmZvLAorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0TWF4SnBlZ1Jlc29sdXRpb24oaW5mbywKICAgICAgICAgICAgICAgICAgICAgLyppc1VsdHJhSGlnaFJlc29sdXRpb24qL3RydWUpOwogICAgIGlmIChtYXhEZWZhdWx0SnBlZ1Jlc29sdXRpb24ud2lkdGggPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogQ2FuJ3QgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKQEAgLTYyNSw3ICs0MDksNyBAQAogCiAgICAgLy8gR2V0IG1heCBqcGVnIGJ1ZmZlciBzaXplCiAgICAgc3NpemVfdCBtYXhKcGVnQnVmZmVyU2l6ZSA9IDA7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGpwZWdCdWZNYXhTaXplID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBqcGVnQnVmTWF4U2l6ZSA9IGluZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOwogICAgIGlmIChqcGVnQnVmTWF4U2l6ZS5jb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkLnN0cmluZygpKTsKQEAgLTY1NSw5ICs0MzksOSBAQAogICAgIHJldHVybiBqcGVnQnVmZmVyU2l6ZTsKIH0KIAotc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRQb2ludENsb3VkQnVmZmVyU2l6ZSgpIGNvbnN0IHsKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8pIGNvbnN0IHsKICAgICBjb25zdCBpbnQgRkxPQVRTX1BFUl9QT0lOVD00OwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBtYXhQb2ludENvdW50ID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0RFUFRIX01BWF9ERVBUSF9TQU1QTEVTKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgbWF4UG9pbnRDb3VudCA9IGluZm8uZmluZChBTkRST0lEX0RFUFRIX01BWF9ERVBUSF9TQU1QTEVTKTsKICAgICBpZiAobWF4UG9pbnRDb3VudC5jb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDYW4ndCBmaW5kIG1heGltdW0gZGVwdGggcG9pbnQgY2xvdWQgc2l6ZSBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CkBAIC02NjgsMTQgKzQ1MiwxNCBAQAogICAgIHJldHVybiBtYXhCeXRlc0ZvclBvaW50Q2xvdWQ7CiB9CiAKLXNzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0UmF3T3BhcXVlQnVmZmVyU2l6ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgYm9vbCBtYXhSZXNvbHV0aW9uKSBjb25zdCB7Citzc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldFJhd09wYXF1ZUJ1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8sIGludDMyX3Qgd2lkdGgsCisgICAgICAgIGludDMyX3QgaGVpZ2h0LCBib29sIG1heFJlc29sdXRpb24pIGNvbnN0IHsKICAgICBjb25zdCBpbnQgUEVSX0NPTkZJR1VSQVRJT05fU0laRSA9IDM7CiAgICAgY29uc3QgaW50IFdJRFRIX09GRlNFVCA9IDA7CiAgICAgY29uc3QgaW50IEhFSUdIVF9PRkZTRVQgPSAxOwogICAgIGNvbnN0IGludCBTSVpFX09GRlNFVCA9IDI7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHJhd09wYXF1ZVNpemVzID0KLSAgICAgICAgbURldmljZUluZm8uZmluZCgKKyAgICAgICAgaW5mby5maW5kKAogICAgICAgICAgICAgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAogICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgIG1heFJlc29sdXRpb24pKTsKQEAgLTc1MiwxMCArNTM2LDkgQEAKICAgICB9CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtIGNvbmZpZ3VyYXRpb246XG4iKTsKICAgICBjb25zdCBjaGFyICptb2RlID0KLSAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IHN0YXRpY19jYXN0PGludD4oU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFKSA/ICJOT1JNQUwiIDoKLSAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkgPyAiQ09OU1RSQUlORURfSElHSF9TUEVFRCIgOgotICAgICAgICAgICAgIkNVU1RPTSI7CisgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSA9PSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUgPyAiTk9STUFMIiA6CisgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSA9PSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFID8KKyAgICAgICAgICAgICAgICAgICAgIkNPTlNUUkFJTkVEX0hJR0hfU1BFRUQiIDogIkNVU1RPTSI7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgT3BlcmF0aW9uIG1vZGU6ICVzICglZCkgXG4iLCBtb2RlLCBtT3BlcmF0aW5nTW9kZSk7CiAKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwpIHsKQEAgLTg0OCw2ICs2MzEsMjEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MpIHsKKyAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IodGFncyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdG9wV2F0Y2hpbmdUYWdzKCkgeworICAgIG1UYWdNb25pdG9yLmRpc2FibGVNb25pdG9yaW5nKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgbVRhZ01vbml0b3IuZ2V0TGF0ZXN0TW9uaXRvcmVkVGFnRXZlbnRzKG91dCk7CisgICAgcmV0dXJuIE9LOworfQorCiBjb25zdCBDYW1lcmFNZXRhZGF0YSYgQ2FtZXJhM0RldmljZTo6aW5mb1BoeXNpY2FsKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIGNvbnN0IHsKICAgICBBTE9HVlYoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkobVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCB8fApAQCAtMTAyNywxNzYgKzgyNSw2IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCi0gICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7Ci0gICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKLSAgICAgICAgKnRoaXMsICptSW50ZXJmYWNlLCAqdGhpc307Ci0gICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cmV0dXJuU3RyZWFtQnVmZmVycygKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgewotICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsICptSW50ZXJmYWNlfTsKLSAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewotICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKLSAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcwotICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKLSAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKLSAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgotICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZwotICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KLSAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KLSAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKLSAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAotICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCi0gICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKLSAgICAgICAgKm1JbnRlcmZhY2UKLSAgICB9OwotCi0gICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LnYzXzIsIHJlc3VsdC5waHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKLSAgICB9Ci0gICAgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotLy8gT25seSBvbmUgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgc2hvdWxkIGJlIGNhbGxlZCBhdCBhIHRpbWUsIHNvCi0vLyB0aGUgbG9ja3Mgd29uJ3QgYmxvY2suIFRoZSBsb2NrcyBhcmUgcHJlc2VudCBoZXJlIHNpbXBseSB0byBlbmZvcmNlIHRoaXMuCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOwotCi0gICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAotICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCi0gICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQotICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgewotICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCi0gICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCi0gICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgotICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOwotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgfQotCi0gICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgotICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwKLSAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCi0gICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCi0gICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAotICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCi0gICAgICAgICptSW50ZXJmYWNlCi0gICAgfTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgbm9QaHlzTWV0YWRhdGEpOwotICAgIH0KLSAgICBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnVubG9jaygpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6Om5vdGlmeSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgewotICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKLSAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcwotICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKLSAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKLSAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgotICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZwotICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KLSAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBub3RpZnkgbWVzc2FnZSBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKLSAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAotICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCi0gICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKLSAgICAgICAgKm1JbnRlcmZhY2UKLSAgICB9OwotICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgewotICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOwotICAgIH0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJnJlcXVlc3RzTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKQEAgLTEzNTcsNyArOTg1LDggQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLCBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSwgaW50IG1pcnJvck1vZGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKQEAgLTEzNzAsNyArOTk5LDggQEAKIAogICAgIHJldHVybiBjcmVhdGVTdHJlYW0oY29uc3VtZXJzLCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLyBmYWxzZSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdXJmYWNlSWRzLAotICAgICAgICAgICAgc3RyZWFtU2V0SWQsIGlzU2hhcmVkLCBpc011bHRpUmVzb2x1dGlvbiwgY29uc3VtZXJVc2FnZSk7CisgICAgICAgICAgICBzdHJlYW1TZXRJZCwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uLCBjb25zdW1lclVzYWdlLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiB9CiAKIHN0YXRpYyBib29sIGlzUmF3Rm9ybWF0KGludCBmb3JtYXQpIHsKQEAgLTEzOTAsMTYgKzEwMjAsMjAgQEAKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwKLSAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UsIGludCBtaXJyb3JNb2RlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIEFMT0dWKCJDYW1lcmEgJXM6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgZGF0YXNwYWNlICVkIHJvdGF0aW9uICVkIgotICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQsIHBoeXNpY2FsQ2FtZXJhSWQgJXMsIGlzTXVsdGlSZXNvbHV0aW9uICVkIiwKKyAgICAgICAgICAgICIgY29uc3VtZXIgdXNhZ2UgJSIgUFJJdTY0ICIsIGlzU2hhcmVkICVkLCBwaHlzaWNhbENhbWVyYUlkICVzLCBpc011bHRpUmVzb2x1dGlvbiAlZCIKKyAgICAgICAgICAgICIgZHluYW1pY1JhbmdlUHJvZmlsZSAweCUiIFBSSXg2NCAiLCBzdHJlYW1Vc2VDYXNlICUiIFBSSWQ2NCAiLCB0aW1lc3RhbXBCYXNlICVkLCIKKyAgICAgICAgICAgICIgbWlycm9yTW9kZSAlZCIsCiAgICAgICAgICAgICBtSWQuc3RyaW5nKCksIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpLCBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICBjb25zdW1lclVzYWdlLCBpc1NoYXJlZCwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwpAQCAtMTQ0OCwxMCArMTA4MiwxMSBAQAogICAgICAgICBBTE9HRSgiJXM6IFJBVyBvcGFxdWUgc3RyZWFtIGNhbm5vdCBiZSB1c2VkIHdpdGggPiAxIHNlbnNvciBwaXhlbCBtb2RlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBnZXRUcmFuc3BvcnRUeXBlKCk7CiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgc3NpemVfdCBibG9iQnVmZmVyU2l6ZTsKICAgICAgICAgaWYgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7Ci0gICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCk7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKGluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSk7CiAgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgewogICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBwb2ludCBjbG91ZCBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE0NTksNyArMTA5NCw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKSkgewogICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSB3aWR0aCAqIGhlaWdodDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKGluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgewogICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBqcGVnIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTQ2NywzNiArMTEwMiw0MiBAQAogICAgICAgICB9CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBibG9iQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdHJlYW1TZXRJZCwKLSAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHRyYW5zcG9ydCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24sIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFKSB7CiAgICAgICAgIGJvb2wgbWF4UmVzb2x1dGlvbiA9CiAgICAgICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuZmluZChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTikgIT0KICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkLmVuZCgpOwotICAgICAgICBzc2l6ZV90IHJhd09wYXF1ZUJ1ZmZlclNpemUgPSBnZXRSYXdPcGFxdWVCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQsIG1heFJlc29sdXRpb24pOworICAgICAgICBzc2l6ZV90IHJhd09wYXF1ZUJ1ZmZlclNpemUgPSBnZXRSYXdPcGFxdWVCdWZmZXJTaXplKGluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCBtYXhSZXNvbHV0aW9uKTsKICAgICAgICAgaWYgKHJhd09wYXF1ZUJ1ZmZlclNpemUgPD0gMCkgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIFJBVyBvcGFxdWUgYnVmZmVyIHNpemUgJXpkIiwgcmF3T3BhcXVlQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCByYXdPcGFxdWVCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAotICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgdHJhbnNwb3J0LCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbiwgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKICAgICB9IGVsc2UgaWYgKGlzU2hhcmVkKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVycywKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAotICAgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgdHJhbnNwb3J0LCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKICAgICB9IGVsc2UgaWYgKGNvbnN1bWVycy5zaXplKCkgPT0gMCAmJiBoYXNEZWZlcnJlZENvbnN1bWVyKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdHJlYW1TZXRJZCwKLSAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHRyYW5zcG9ydCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24sIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCB0cmFuc3BvcnQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgIH0KIAogICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gY29uc3VtZXJzLnNpemUoKTsKQEAgLTE1ODMsNiArMTIyNCw3IEBACiAgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxGb3JtYXQgPSBzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCk7CiAgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlT3ZlcnJpZGRlbiA9IHN0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7CiAgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+ZHluYW1pY1JhbmdlUHJvZmlsZSA9IHN0cmVhbS0+Z2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTYxNCw3ICsxMjU2LDcgQEAKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmV0dXJuIHN0cmVhbS0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgcmV0dXJuIHN0cmVhbS0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSwgZmFsc2UgLyptYXlDaGFuZ2VNaXJyb3IqLyk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmRlbGV0ZVN0cmVhbShpbnQgaWQpIHsKQEAgLTE5MTUsMTMgKzE1NTcsMjIgQEAKICAgICB9CiAKICAgICBib29sIHN0YXRlU2VlbiA9IGZhbHNlOworICAgIG5zZWNzX3Qgc3RhcnRUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGRvIHsKICAgICAgICAgaWYgKGFjdGl2ZSA9PSAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSkgewogICAgICAgICAgICAgLy8gRGVzaXJlZCBzdGF0ZSBpcyBjdXJyZW50CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IG1TdGF0dXNDaGFuZ2VkLndhaXRSZWxhdGl2ZShtTG9jaywgdGltZW91dCk7CisgICAgICAgIG5zZWNzX3QgdGltZUVsYXBzZWQgPSBzeXN0ZW1UaW1lKCkgLSBzdGFydFRpbWU7CisgICAgICAgIG5zZWNzX3QgdGltZVRvV2FpdCA9IHRpbWVvdXQgLSB0aW1lRWxhcHNlZDsKKyAgICAgICAgaWYgKHRpbWVUb1dhaXQgPD0gMCkgeworICAgICAgICAgICAgLy8gVGhyZWFkIHdva2UgdXAgc3B1cmlvdXNseSBidXQgaGFzIHRpbWVkIG91dCBzaW5jZS4KKyAgICAgICAgICAgIC8vIEZvcmNlIG91dCBvZiBsb29wIHdpdGggVElNRURfT1VUIHJlc3VsdC4KKyAgICAgICAgICAgIHJlcyA9IFRJTUVEX09VVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1TdGF0dXNDaGFuZ2VkLndhaXRSZWxhdGl2ZShtTG9jaywgdGltZVRvV2FpdCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIGJyZWFrOwogCiAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3NzaWJsZSwgYnV0IGlmIG5vdCwgY291bGQgcmVzdWx0IGluIHN1YnRsZSBkZWFkbG9ja3MgYW5kIGludmFsaWQgc3RhdGUKQEAgLTIwODUsNyArMTczNiwxMiBAQAogICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlci5zdG9wQ291bnRlcigpOwogICAgIH0KIAotICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+Zmx1c2goKTsKKyAgICAvLyBDYWxjdWxhdGUgZXhwZWN0ZWQgZHVyYXRpb24gZm9yIGZsdXNoIHdpdGggYWRkaXRpb25hbCBidWZmZXIgdGltZSBpbiBtcyBmb3Igd2F0Y2hkb2cKKyAgICB1aW50NjRfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gKGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpICsga0Jhc2VHZXRCdWZmZXJXYWl0KSAvIDFlNjsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhU2VydmljZVdhdGNoZG9nLT5XQVRDSF9DVVNUT01fVElNRVIobVJlcXVlc3RUaHJlYWQtPmZsdXNoKCksCisgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uIC8ga0N5Y2xlTGVuZ3RoTXMsIGtDeWNsZUxlbmd0aE1zKTsKKworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnByZXBhcmUoaW50IHN0cmVhbUlkKSB7CkBAIC0yMTU0LDYgKzE4MTAsMjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2Zsb2F0IENhbWVyYTNEZXZpY2U6OmdldE1heFByZXZpZXdGcHMoc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG1pbkR1cmF0aW9ucyA9CisgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbkR1cmF0aW9ucy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGlmIChtaW5EdXJhdGlvbnMuZGF0YS5pNjRbaV0gPT0gc3RyZWFtLT5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgICYmIG1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpKzFdID09IHN0cmVhbS0+Z2V0V2lkdGgoKQorICAgICAgICAgICAgICAgICYmIG1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpKzJdID09IHN0cmVhbS0+Z2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IG1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpKzNdOworICAgICAgICAgICAgcmV0dXJuIDFlOWYgLyBtaW5GcmFtZUR1cmF0aW9uOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwLjBmOworfQorCiAvKioKICAqIE1ldGhvZHMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMKICAqLwpAQCAtMjE2Miw2ICsxODMyLDcgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0ZDo6dmVjdG9yPGludD4gc3RyZWFtSWRzOwogICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4gc3RyZWFtU3RhdHM7CisgICAgZmxvYXQgc2Vzc2lvbk1heFByZXZpZXdGcHMgPSAwLjBmOwogCiAgICAgewogICAgICAgICAvLyBOZWVkIG1Mb2NrIHRvIHNhZmVseSB1cGRhdGUgc3RhdGUgYW5kIHN5bmNocm9uaXplIHRvIGN1cnJlbnQKQEAgLTIxODEsMjEgKzE4NTIsMjggQEAKICAgICAgICAgLy8gc3RhdGUgY2hhbmdlcwogICAgICAgICBpZiAobVBhdXNlU3RhdGVOb3RpZnkpIHJldHVybjsKIAotICAgICAgICAvLyBQb3B1bGF0ZSBzdHJlYW0gc3RhdGlzdGljcyBpbiBjYXNlIG9mIElkbGUKLSAgICAgICAgaWYgKGlkbGUpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhdXRvIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgY29udGludWU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1dG8gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoc3RyZWFtLmdldCgpID09IG51bGxwdHIpIGNvbnRpbnVlOworCisgICAgICAgICAgICBmbG9hdCBzdHJlYW1NYXhQcmV2aWV3RnBzID0gZ2V0TWF4UHJldmlld0ZwcyhzdHJlYW0pOworICAgICAgICAgICAgc2Vzc2lvbk1heFByZXZpZXdGcHMgPSBzdGQ6Om1heChzZXNzaW9uTWF4UHJldmlld0Zwcywgc3RyZWFtTWF4UHJldmlld0Zwcyk7CisKKyAgICAgICAgICAgIC8vIFBvcHVsYXRlIHN0cmVhbSBzdGF0aXN0aWNzIGluIGNhc2Ugb2YgSWRsZQorICAgICAgICAgICAgaWYgKGlkbGUpIHsKICAgICAgICAgICAgICAgICBzdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbS0+Z2V0SWQoKSk7CiAgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtZXJhM1N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3RyZWFtLT5hc0hhbFN0cmVhbSgpKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHVzYWdlID0gMExMOworICAgICAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICAgaWYgKGNhbWVyYTNTdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICB1c2FnZSA9IGNhbWVyYTNTdHJlYW0tPmdldFVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UgPSBjYW1lcmEzU3RyZWFtLT5nZXRTdHJlYW1Vc2VDYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRzLmVtcGxhY2VfYmFjayhzdHJlYW0tPmdldFdpZHRoKCksIHN0cmVhbS0+Z2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0Rm9ybWF0KCksIHN0cmVhbS0+Z2V0RGF0YVNwYWNlKCksIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldEZvcm1hdCgpLCBzdHJlYW1NYXhQcmV2aWV3RnBzLCBzdHJlYW0tPmdldERhdGFTcGFjZSgpLCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRNYXhIYWxCdWZmZXJzKCksCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0TWF4VG90YWxCdWZmZXJzKCkgLSBzdHJlYW0tPmdldE1heEhhbEJ1ZmZlcnMoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0TWF4VG90YWxCdWZmZXJzKCkgLSBzdHJlYW0tPmdldE1heEhhbEJ1ZmZlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCksIHN0cmVhbVVzZUNhc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjIzMyw3ICsxOTExLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlJZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IGxpc3RlbmVyLT5ub3RpZnlBY3RpdmUoKTsKKyAgICAgICAgICAgIHJlcyA9IGxpc3RlbmVyLT5ub3RpZnlBY3RpdmUoc2Vzc2lvbk1heFByZXZpZXdGcHMpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI0NTUsMjIgKzIxMzMsMjQgQEAKICAgICB9CiAKICAgICBpZiAobVN1cHBvcnRDYW1lcmFNdXRlKSB7Ci0gICAgICAgIGF1dG8gdGVzdFBhdHRlcm5Nb2RlRW50cnkgPQotICAgICAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSk7Ci0gICAgICAgIG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZSA9IHRlc3RQYXR0ZXJuTW9kZUVudHJ5LmNvdW50ID4gMCA/Ci0gICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5Nb2RlRW50cnkuZGF0YS5pMzJbMF0gOgotICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRjsKKyAgICAgICAgZm9yIChhdXRvJiBzZXR0aW5ncyA6IG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QpIHsKKyAgICAgICAgICAgIGF1dG8gdGVzdFBhdHRlcm5Nb2RlRW50cnkgPQorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5tZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFKTsKKyAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZSA9IHRlc3RQYXR0ZXJuTW9kZUVudHJ5LmNvdW50ID4gMCA/CisgICAgICAgICAgICAgICAgICAgIHRlc3RQYXR0ZXJuTW9kZUVudHJ5LmRhdGEuaTMyWzBdIDoKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfT0ZGOwogCi0gICAgICAgIGF1dG8gdGVzdFBhdHRlcm5EYXRhRW50cnkgPQotICAgICAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSk7Ci0gICAgICAgIGlmICh0ZXN0UGF0dGVybkRhdGFFbnRyeS5jb3VudCA+PSA0KSB7Ci0gICAgICAgICAgICBtZW1jcHkobmV3UmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhLCB0ZXN0UGF0dGVybkRhdGFFbnRyeS5kYXRhLmkzMiwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENhcHR1cmVSZXF1ZXN0OjptT3JpZ2luYWxUZXN0UGF0dGVybkRhdGEpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVswXSA9IDA7Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMV0gPSAwOwotICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzJdID0gMDsKLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVszXSA9IDA7CisgICAgICAgICAgICBhdXRvIHRlc3RQYXR0ZXJuRGF0YUVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSk7CisgICAgICAgICAgICBpZiAodGVzdFBhdHRlcm5EYXRhRW50cnkuY291bnQgPj0gNCkgeworICAgICAgICAgICAgICAgIG1lbWNweShzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGEsIHRlc3RQYXR0ZXJuRGF0YUVudHJ5LmRhdGEuaTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M6Om1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMF0gPSAwOworICAgICAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsxXSA9IDA7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MubU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzJdID0gMDsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbM10gPSAwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjAzLDggKzIyODMsNyBAQAogICAgIH0KIAogICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpID09Ci0gICAgICAgICAgICBvcGVyYXRpbmdNb2RlOworICAgICAgICAgICAgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSA9PSBvcGVyYXRpbmdNb2RlOwogCiAgICAgaWYgKG1PcGVyYXRpbmdNb2RlICE9IG9wZXJhdGluZ01vZGUpIHsKICAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOwpAQCAtMjYxMiw2ICsyMjkxLDkgQEAKICAgICAgICAgbU9wZXJhdGluZ01vZGUgPSBvcGVyYXRpbmdNb2RlOwogICAgIH0KIAorICAgIC8vIFJlc2V0IG1pbiBleHBlY3RlZCBkdXJhdGlvbiB3aGVuIHNlc3Npb24gaXMgcmVjb25maWd1cmVkLgorICAgIG1NaW5FeHBlY3RlZER1cmF0aW9uID0gMDsKKwogICAgIC8vIEluIGNhc2UgY2FsbGVkIGZyb20gY29uZmlndXJlU3RyZWFtcywgYWJvcnQgcXVldWVkIGlucHV0IGJ1ZmZlcnMgbm90IGJlbG9uZ2luZyB0bwogICAgIC8vIGFueSBwZW5kaW5nIHJlcXVlc3RzLgogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBub3RpZnlSZXF1ZXN0VGhyZWFkKSB7CkBAIC0yNjc3LDYgKzIzNTksNyBAQAogICAgIH0KIAogICAgIG1Hcm91cElkUGh5c2ljYWxDYW1lcmFNYXAuY2xlYXIoKTsKKyAgICBib29sIGNvbXBvc2VyU3VyZmFjZVByZXNlbnQgPSBmYWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CiAKICAgICAgICAgLy8gRG9uJ3QgY29uZmlndXJlIGJpZGkgc3RyZWFtcyB0d2ljZSwgbm9yIGFkZCB0aGVtIHR3aWNlIHRvIHRoZSBsaXN0CkBAIC0yNzAxLDcgKzIzODQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBvY2N1cHkgdGhlIGluaXRpYWwgZW50cnkuCiAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5kYXRhX3NwYWNlID09IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRikgewogICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVzW2tdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUob3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEpwZWdCdWZmZXJTaXplKGluZm9QaHlzaWNhbChTdHJpbmc4KG91dHB1dFN0cmVhbS0+cGh5c2ljYWxfY2FtZXJhX2lkKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+d2lkdGgsIG91dHB1dFN0cmVhbS0+aGVpZ2h0KSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9KUEVHX0FQUF9TRUdNRU5UUykpIHsKICAgICAgICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IG91dHB1dFN0cmVhbS0+d2lkdGggKiBvdXRwdXRTdHJlYW0tPmhlaWdodDsKQEAgLTI3MTYsNiArMjQwMCwxMCBAQAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCA9IG1PdXRwdXRTdHJlYW1zW2ldLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CiAgICAgICAgICAgICBtR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwW3N0cmVhbUdyb3VwSWRdLmluc2VydChwaHlzaWNhbENhbWVyYUlkKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPnVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVIpIHsKKyAgICAgICAgICAgIGNvbXBvc2VyU3VyZmFjZVByZXNlbnQgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgY29uZmlnLnN0cmVhbXMgPSBzdHJlYW1zLmVkaXRBcnJheSgpOwpAQCAtMjc4Myw2ICsyNDcxLDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXRDb21wb3NlclN1cmZhY2UoY29tcG9zZXJTdXJmYWNlUHJlc2VudCk7CisKICAgICAvLyBSZXF1ZXN0IHRocmVhZCBuZWVkcyB0byBrbm93IHRvIGF2b2lkIHVzaW5nIHJlcGVhdC1sYXN0LXNldHRpbmdzIHByb3RvY29sCiAgICAgLy8gYWNyb3NzIGNvbmZpZ3VyZV9zdHJlYW1zKCkgY2FsbHMKICAgICBpZiAobm90aWZ5UmVxdWVzdFRocmVhZCkgewpAQCAtMjgzNiwxNyArMjUyNiwyOCBAQAogICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKICAgICB9CiAKKyAgICAvLyBGaXJzdCBjYWxsIGluamVjdENhbWVyYSgpIGFuZCB0aGVuIHJ1biBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCkgY2FzZToKICAgICAvLyBTaW5jZSB0aGUgc3RyZWFtcyBjb25maWd1cmF0aW9uIG9mIHRoZSBpbmplY3Rpb24gY2FtZXJhIGlzIGJhc2VkIG9uIHRoZSBpbnRlcm5hbCBjYW1lcmEsIHdlCi0gICAgLy8gbXVzdCB3YWl0IHVudGlsIHRoZSBpbnRlcm5hbCBjYW1lcmEgY29uZmlndXJlIHN0cmVhbXMgYmVmb3JlIGNhbGxpbmcgaW5qZWN0Q2FtZXJhKCkgdG8KKyAgICAvLyBtdXN0IHdhaXQgdW50aWwgdGhlIGludGVybmFsIGNhbWVyYSBjb25maWd1cmUgc3RyZWFtcyBiZWZvcmUgcnVubmluZyB0aGUgaW5qZWN0aW9uIGpvYiB0bwogICAgIC8vIGNvbmZpZ3VyZSB0aGUgaW5qZWN0aW9uIHN0cmVhbXMuCiAgICAgaWYgKG1JbmplY3Rpb25NZXRob2RzLT5pc0luamVjdGluZygpKSB7Ci0gICAgICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSAlczogU3RhcnQgdG8gY29uZmlndXJlIHN0cmVhbXMuIiwKKyAgICAgICAgQUxPR0QoIiVzOiBJbmplY3Rpb24gY2FtZXJhICVzOiBTdGFydCB0byBjb25maWd1cmUgc3RyZWFtcy4iLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbmplY3Rpb25NZXRob2RzLT5nZXRJbmplY3RlZENhbUlkKCkuc3RyaW5nKCkpOwogICAgICAgICByZXMgPSBtSW5qZWN0aW9uTWV0aG9kcy0+aW5qZWN0Q2FtZXJhKGNvbmZpZywgYnVmZmVyU2l6ZXMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgZmluaXNoIGluamVjdCBjYW1lcmEgcHJvY2VzcyEiKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGaXJzdCBydW4gY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpIGFuZCB0aGVuIGNhbGwgaW5qZWN0Q2FtZXJhKCkgY2FzZToKKyAgICAgICAgLy8gSWYgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgY2FtZXJhIGRlaXZlIGlzIGFjdGl2ZSwgYnV0IHRoZQorICAgICAgICAvLyBpbmplY3Rpb24gY2FtZXJhIGhhcyBub3QgYmVlbiBpbmplY3RlZCB5ZXQsIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIG9mCisgICAgICAgIC8vIHRoZSBpbnRlcm5hbCBjYW1lcmEgKGJlY2F1c2UgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIG9mIHRoZSBpbmplY3Rpb24gY2FtZXJhIGlzIGJhc2VkCisgICAgICAgIC8vIG9uIHRoZSBpbnRlcm5hbCBjYW1lcmEpLiBXaGVuIGluamVjdGluZyBvY2N1cnMgbGF0ZXIsIHRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCBieQorICAgICAgICAvLyB0aGUgaW5qZWN0aW9uIGNhbWVyYS4KKyAgICAgICAgQUxPR1YoIiVzOiBUaGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGUgYW5kIHRoZSBjYW1lcmEgZGV2aWNlIGlzIGFjdGl2ZSwgYnV0IHRoZSIKKyAgICAgICAgICAgICAgIiBpbmplY3Rpb24gY2FtZXJhIGhhcyBub3QgYmVlbiBpbmplY3RlZCB5ZXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbUluamVjdGlvbk1ldGhvZHMtPnN0b3JlSW5qZWN0aW9uQ29uZmlnKGNvbmZpZywgYnVmZmVyU2l6ZXMpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTI5NzIsNyArMjY3Myw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKKyAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtaW5FeHBlY3RlZER1cmF0aW9uLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c2V0PFN0cmluZzg+PiYgcGh5c2ljYWxDYW1lcmFJZHMsCiAgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUsIGJvb2wgaXNac2xDYXB0dXJlLCBib29sIHJvdGF0ZUFuZENyb3BBdXRvLAogICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLApAQCAtMjk4Miw4ICsyNjgzLDkgQEAKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAotICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAotICAgICAgICAgICAgcm90YXRlQW5kQ3JvcEF1dG8sIGNhbWVyYUlkc1dpdGhab29tLCByZXF1ZXN0VGltZU5zLCBvdXRwdXRTdXJmYWNlcykpOworICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1pbkV4cGVjdGVkRHVyYXRpb24sIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICAgICAgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwgcm90YXRlQW5kQ3JvcEF1dG8sIGNhbWVyYUlkc1dpdGhab29tLCByZXF1ZXN0VGltZU5zLAorICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDEpIHsKQEAgLTMwNzIsNzEzICsyNzc0LDE1IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6bW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OmV2ZW50U291cmNlIHNvdXJjZSwKICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEsCisgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsIHVpbnQzMl90IG51bU91dHB1dEJ1ZmZlcnMsCisgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCkgewogCiAgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbWV0YWRhdGEsCi0gICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhKTsKKyAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEsIG91dHB1dEJ1ZmZlcnMsIG51bU91dHB1dEJ1ZmZlcnMsIGlucHV0U3RyZWFtSWQpOwogfQogCi0vKioKLSAqIEhhbEludGVyZmFjZSBpbm5lciBjbGFzcyBtZXRob2RzCi0gKi8KLQotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoCi0gICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAotICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgOgotICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSksCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpLAotICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCh0cnVlKSwKLSAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyhzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpIHsKLSAgICAvLyBDaGVjayB3aXRoIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpZiB3ZSBjYW4gZG93bmNhc3QgdGhlc2UgaW50ZXJmYWNlcwotICAgIC8vIFNvbWV3aGF0IGV4cGVuc2l2ZSwgc28gY2FjaGUgdGhlIHJlc3VsdHMgYXQgc3RhcnR1cAotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfNy5pc09rKCkpIHsKLSAgICAgICAgbUhpZGxTZXNzaW9uXzNfNyA9IGNhc3RSZXN1bHRfM183OwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM182ID0gZGV2aWNlOjpWM182OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzYuaXNPaygpKSB7Ci0gICAgICAgIG1IaWRsU2Vzc2lvbl8zXzYgPSBjYXN0UmVzdWx0XzNfNjsKLSAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM181LmlzT2soKSkgewotICAgICAgICBtSGlkbFNlc3Npb25fM181ID0gY2FzdFJlc3VsdF8zXzU7Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKLSAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM18zID0gZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzMuaXNPaygpKSB7Ci0gICAgICAgIG1IaWRsU2Vzc2lvbl8zXzMgPSBjYXN0UmVzdWx0XzNfMzsKLSAgICB9Ci19Ci0KLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkgOgotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihmYWxzZSksCi0gICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcoZmFsc2UpIHt9Ci0KLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSYgb3RoZXIpIDoKLSAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvdGhlci5tVXNlSGFsQnVmTWFuYWdlciksCi0gICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3Npbmcob3RoZXIubVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykge30KLQotYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnZhbGlkKCkgewotICAgIHJldHVybiAobUhpZGxTZXNzaW9uICE9IG51bGxwdHIpOwotfQotCi12b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y2xlYXIoKSB7Ci0gICAgbUhpZGxTZXNzaW9uXzNfNy5jbGVhcigpOwotICAgIG1IaWRsU2Vzc2lvbl8zXzYuY2xlYXIoKTsKLSAgICBtSGlkbFNlc3Npb25fM181LmNsZWFyKCk7Ci0gICAgbUhpZGxTZXNzaW9uXzNfNC5jbGVhcigpOwotICAgIG1IaWRsU2Vzc2lvbl8zXzMuY2xlYXIoKTsKLSAgICBtSGlkbFNlc3Npb24uY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKAotICAgICAgICBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90IHRlbXBsYXRlSWQsCi0gICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0KLSAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7Ci0KLSAgICBhdXRvIHJlcXVlc3RDYWxsYmFjayA9IFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQotICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVxdWVzdC5kYXRhKCkpOwotICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSByZXF1ZXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLCAmZXhwZWN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0VGVtcGxhdGUgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEocik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqcmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNsb25lIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZXJyOwotICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKLSAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfUFJFVklFVzoKLSAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpQUkVWSUVXOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkU6Ci0gICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6U1RJTExfQ0FQVFVSRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19SRUNPUkQ6Ci0gICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fUkVDT1JEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgotICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1NOQVBTSE9UOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6Ci0gICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6WkVST19TSFVUVEVSX0xBRzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9NQU5VQUw6Ci0gICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6TUFOVUFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBVbmtub3duIHRlbXBsYXRlIElELCBvciB0aGlzIEhBTCBpcyB0b28gb2xkIHRvIHN1cHBvcnQgaXQKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwgcmVxdWVzdENhbGxiYWNrKTsKLQotICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCi0gICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSB7Ci0gICAgLy8gV2UgZG8gcmVjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQ7Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIGlmICgobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSAmJiBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgewotICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gb2xkUGFyYW1zLCBuZXdQYXJhbXM7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBvbGRTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAotICAgICAgICAgICAgICAgIG9sZFNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCi0gICAgICAgICAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOwotICAgICAgICBvbGRQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9NZXRhKSwKLSAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvTWV0YSkpOwotICAgICAgICBuZXdQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihuZXdTZXNzaW9NZXRhKSwKLSAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobmV3U2Vzc2lvTWV0YSkpOwotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBjYWxsU3RhdHVzOwotICAgICAgICBib29sIHJlcXVpcmVkOwotICAgICAgICBhdXRvIGhpZGxDYiA9IFsmY2FsbFN0YXR1cywgJnJlcXVpcmVkXSAoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgcywKLSAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkRmxhZykgewotICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7Ci0gICAgICAgICAgICByZXF1aXJlZCA9IHJlcXVpcmVkRmxhZzsKLSAgICAgICAgfTsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCBoaWRsQ2IpOwotICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9NZXRhKTsKLSAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvTWV0YSk7Ci0gICAgICAgIGlmIChlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSzoKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCi0gICAgICAgIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotCi0gICAgaWYgKGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbiAmJiBtSGlkbFNlc3Npb25fM183ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gQ29udmVydCBzdHJlYW0gY29uZmlnIHRvIEhJREwKLSAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7Ci0gICAgZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzI7Ci0gICAgZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzc7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgZGV2aWNlOjpWM18yOjpTdHJlYW0gJmRzdDNfMiA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXTsKLSAgICAgICAgZGV2aWNlOjpWM180OjpTdHJlYW0gJmRzdDNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXTsKLSAgICAgICAgZGV2aWNlOjpWM183OjpTdHJlYW0gJmRzdDNfNyA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtc1tpXTsKLSAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICpzcmMgPSBjb25maWctPnN0cmVhbXNbaV07Ci0KLSAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtM3N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjKTsKLSAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKLSAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW1UeXBlOwotICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9JTlBVVDoKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6SU5QVVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBjb25maWctPnN0cmVhbXNbaV0tPnN0cmVhbV90eXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRzdDNfMi5pZCA9IHN0cmVhbUlkOwotICAgICAgICBkc3QzXzIuc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGRzdDNfMi53aWR0aCA9IHNyYy0+d2lkdGg7Ci0gICAgICAgIGRzdDNfMi5oZWlnaHQgPSBzcmMtPmhlaWdodDsKLSAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOwotICAgICAgICBkc3QzXzIucm90YXRpb24gPSBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOwotICAgICAgICAvLyBGb3IgSGlkbFNlc3Npb24gdmVyc2lvbiAzLjUgb3IgbmV3ZXIsIHRoZSBmb3JtYXQgYW5kIGRhdGFTcGFjZSBzZW50Ci0gICAgICAgIC8vIHRvIEhBTCBhcmUgb3JpZ2luYWwsIG5vdCB0aGUgb3ZlcnJpZGRlbiBvbmVzLgotICAgICAgICBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkc3QzXzIuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChjYW0zc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKSA/Ci0gICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkgOiBzcmMtPmZvcm1hdCk7Ci0gICAgICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKGNhbTNzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpID8KLSAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKSA6IHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkc3QzXzIuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChzcmMtPmZvcm1hdCk7Ci0gICAgICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0M180LnYzXzIgPSBkc3QzXzI7Ci0gICAgICAgIGRzdDNfNC5idWZmZXJTaXplID0gYnVmZmVyU2l6ZXNbaV07Ci0gICAgICAgIGlmIChzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkc3QzXzQucGh5c2ljYWxDYW1lcmFJZCA9IHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkOwotICAgICAgICB9Ci0gICAgICAgIGRzdDNfNy52M180ID0gZHN0M180OwotICAgICAgICBkc3QzXzcuZ3JvdXBJZCA9IGNhbTNzdHJlYW0tPmdldEhhbFN0cmVhbUdyb3VwSWQoKTsKLSAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkLnNpemUoKSk7Ci0gICAgICAgIHNpemVfdCBqID0gMDsKLSAgICAgICAgZm9yIChpbnQgbW9kZSA6IHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQpIHsKLSAgICAgICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqKytdID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZT4obW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aXZlU3RyZWFtcy5pbnNlcnQoc3RyZWFtSWQpOwotICAgICAgICAvLyBDcmVhdGUgQnVmZmVyIElEIG1hcCBpZiBuZWNlc3NhcnkKLSAgICAgICAgbUJ1ZmZlclJlY29yZHMudHJ5Q3JlYXRlQnVmZmVyQ2FjaGUoc3RyZWFtSWQpOwotICAgIH0KLSAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcwotICAgIG1CdWZmZXJSZWNvcmRzLnJlbW92ZUluYWN0aXZlQnVmZmVyQ2FjaGVzKGFjdGl2ZVN0cmVhbXMpOwotCi0gICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKLSAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAotICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCi0gICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOwotICAgIHNpemVfdCBzZXNzaW9uUGFyYW1TaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKLSAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAotICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7Ci0KLSAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwotICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247Ci0gICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKLSAgICBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM182OwotICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKLQotICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQotICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH07Ci0KLSAgICBhdXRvIGNvbmZpZ1N0cmVhbTM2Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNl0KLSAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzYgPSBoYWxDb25maWd1cmF0aW9uOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICB9OwotCi0gICAgYXV0byBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0ID0gWyZmaW5hbENvbmZpZ3VyYXRpb24sICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCi0gICAgICAgICAgICAoaGFyZHdhcmU6OlJldHVybjx2b2lkPiYgZXJyKSAtPiBzdGF0dXNfdCB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV0udjNfMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfTsKLQotICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNiA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM182XQotICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgewotICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNi5zdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNi5zdHJlYW1zW2ldLnYzXzQudjNfMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfTsKLQotICAgIC8vIFNlZSB3aGljaCB2ZXJzaW9uIG9mIEhBTCB3ZSBoYXZlCi0gICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVigiJXM6IHYzLjcgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9IGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM183LT5jb25maWd1cmVTdHJlYW1zXzNfNygKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LCBjb25maWdTdHJlYW0zNkNiKTsKLSAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNihlcnIpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM182ICE9IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1YoIiVzOiB2My42IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM182LT5jb25maWd1cmVTdHJlYW1zXzNfNigKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNkNiKTsKLSAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNihlcnIpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1YoIiVzOiB2My41IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5jb25maWd1cmVTdHJlYW1zXzNfNSgKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNENiKTsKLSAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAotICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNCgKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LCBjb25maWdTdHJlYW0zNENiKTsKLSAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbAotICAgICAgICBBTE9HVigiJXM6IHYzLjMgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM18zLT5jb25maWd1cmVTdHJlYW1zXzNfMyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLAotICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25dCi0gICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uID0gaGFsQ29uZmlndXJhdGlvbjsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2UgZG9uJ3Q7IHVzZSB2My4yIGNhbGwgYW5kIGNvbnN0cnVjdCBhIHYzLjMgSGFsU3RyZWFtQ29uZmlndXJhdGlvbgotICAgICAgICBBTE9HVigiJXM6IHYzLjIgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb25fM18yOwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uZmlndXJlU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLAotICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXzNfMl0KLSAgICAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb25fM18yID0gaGFsQ29uZmlndXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0udjNfMiA9IGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLm92ZXJyaWRlRGF0YVNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldLmRhdGFTcGFjZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LICkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBISURMCi0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgewotICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKLSAgICAgICAgaW50IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpLT5nZXRJZCgpOwotCi0gICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcwotICAgICAgICBzaXplX3QgcmVhbElkeCA9IGk7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgc2l6ZV90IGhhbFN0cmVhbUNvdW50ID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBoYWxTdHJlYW1Db3VudDsgaWR4KyspIHsKLSAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGhhbFN0cmVhbUNvdW50IC0gMSkgPyAwIDogcmVhbElkeCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOwotICAgICAgICBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbSAmc3JjXzM2ID0gZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXNbcmVhbElkeF07Ci0KLSAgICAgICAgQ2FtZXJhM1N0cmVhbSogZHN0U3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpOwotICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMudjNfMi5vdmVycmlkZUZvcm1hdCk7Ci0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKLQotICAgICAgICBpZiAobUhpZGxTZXNzaW9uXzNfNiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChzcmNfMzYuc3VwcG9ydE9mZmxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRzdFN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUoZmFsc2UpOwotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IERhdGFTcGFjZSBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbCBuZWVkRm9ybWF0T3ZlcnJpZGUgPQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZm9ybWF0ICE9IHNyYy52M18yLm92ZXJyaWRlRm9ybWF0OwotICAgICAgICAgICAgYm9vbCBuZWVkRGF0YXNwYWNlT3ZlcnJpZGUgPQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlICE9IHNyYy5vdmVycmlkZURhdGFTcGFjZTsKLSAgICAgICAgICAgIC8vIE92ZXJyaWRlIGFsbG93ZWQgd2l0aCBJTVBMRU1FTlRBVElPTl9ERUZJTkVECi0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKG5lZWRGb3JtYXRPdmVycmlkZSk7Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKG5lZWREYXRhc3BhY2VPdmVycmlkZSk7Ci0gICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OwotICAgICAgICAgICAgZHN0LT5kYXRhX3NwYWNlID0gb3ZlcnJpZGVEYXRhU3BhY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkFfU1RSRUFNX0lOUFVUKSB7Ci0gICAgICAgICAgICBpZiAoc3JjLnYzXzIucHJvZHVjZXJVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IElOUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIHByb2R1Y2VyIHVzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCi0gICAgICAgICAgICAgICAgICAgIG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZShzcmMudjNfMi5jb25zdW1lclVzYWdlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPVVRQVVQKLSAgICAgICAgICAgIGlmIChzcmMudjNfMi5jb25zdW1lclVzYWdlICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogT1VUUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIGNvbnN1bWVyIHVzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCi0gICAgICAgICAgICAgICAgICAgIG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZShzcmMudjNfMi5wcm9kdWNlclVzYWdlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0LT5tYXhfYnVmZmVycyA9IHNyYy52M18yLm1heEJ1ZmZlcnM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCi0gICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXNzaW9uUGFyYW1zLCBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24qIGNvbmZpZywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcywKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNhbWVyYUNoYXJhY3RlcmlzdGljcykgewotICAgIEFUUkFDRV9OQU1FKCJJbmplY3Rpb25DYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIGlmIChjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbmplY3Rpb24gY2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBpbnB1dCAiCi0gICAgICAgICAgICAgICAgInN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gQ29udmVydCBzdHJlYW0gY29uZmlnIHRvIEhJREwKLSAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7Ci0gICAgZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzI7Ci0gICAgZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzc7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgZGV2aWNlOjpWM18yOjpTdHJlYW0mIGRzdDNfMiA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXTsKLSAgICAgICAgZGV2aWNlOjpWM180OjpTdHJlYW0mIGRzdDNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXTsKLSAgICAgICAgZGV2aWNlOjpWM183OjpTdHJlYW0mIGRzdDNfNyA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtc1tpXTsKLSAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90KiBzcmMgPSBjb25maWctPnN0cmVhbXNbaV07Ci0KLSAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtM3N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjKTsKLSAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKLSAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW1UeXBlOwotICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9JTlBVVDoKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6SU5QVVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBjb25maWctPnN0cmVhbXNbaV0tPnN0cmVhbV90eXBlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0M18yLmlkID0gc3RyZWFtSWQ7Ci0gICAgICAgIGRzdDNfMi5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgZHN0M18yLndpZHRoID0gc3JjLT53aWR0aDsKLSAgICAgICAgZHN0M18yLmhlaWdodCA9IHNyYy0+aGVpZ2h0OwotICAgICAgICBkc3QzXzIudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7Ci0gICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9Ci0gICAgICAgICAgICAgICAgbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90KXNyYy0+cm90YXRpb24pOwotICAgICAgICAvLyBGb3IgSGlkbFNlc3Npb24gdmVyc2lvbiAzLjUgb3IgbmV3ZXIsIHRoZSBmb3JtYXQgYW5kIGRhdGFTcGFjZSBzZW50Ci0gICAgICAgIC8vIHRvIEhBTCBhcmUgb3JpZ2luYWwsIG5vdCB0aGUgb3ZlcnJpZGRlbiBvbmVzLgotICAgICAgICBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkc3QzXzIuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChjYW0zc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcmMtPmZvcm1hdCk7Ci0gICAgICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgbWFwVG9IaWRsRGF0YXNwYWNlKGNhbTNzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3JjLT5kYXRhX3NwYWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKLSAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKLSAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0M183LnYzXzQgPSBkc3QzXzQ7Ci0gICAgICAgIGRzdDNfNy5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOwotICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKLSAgICAgICAgc2l6ZV90IGogPSAwOwotICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgewotICAgICAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKLSAgICAgICAgfQotICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7Ci0gICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQotICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7Ci0gICAgfQotICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCi0gICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7Ci0KLSAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOwotICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCi0gICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCljb25maWctPm9wZXJhdGlvbl9tb2RlLAotICAgICAgICAgICAgLypvdXQqLyAmb3BlcmF0aW9uTW9kZSk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOwotICAgIHNpemVfdCBzZXNzaW9uUGFyYW1TaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAotICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7Ci0KLSAgICAvLyBTZWUgd2hpY2ggdmVyc2lvbiBvZiBIQUwgd2UgaGF2ZQotICAgIGlmIChtSGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9Ci0gICAgICAgICAgICAgICAgY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOwotCi0gICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiByYXdNZXRhZGF0YSA9IGNhbWVyYUNoYXJhY3RlcmlzdGljcy5nZXRBbmRMb2NrKCk7Ci0gICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBoaWRsQ2hhcnMgPSB7fTsKLSAgICAgICAgaGlkbENoYXJzLnNldFRvRXh0ZXJuYWwoCi0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHJhd01ldGFkYXRhKSksCi0gICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKSk7Ci0gICAgICAgIGNhbWVyYUNoYXJhY3RlcmlzdGljcy51bmxvY2socmF3TWV0YWRhdGEpOwotCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+Ci0gICAgICAgICAgICAgICAgaGlkbEluamVjdGlvblNlc3Npb25fM183OwotICAgICAgICBhdXRvIGNhc3RJbmplY3Rpb25SZXN1bHRfM183ID0KLSAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzc6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb25fM183KTsKLSAgICAgICAgaWYgKGNhc3RJbmplY3Rpb25SZXN1bHRfM183LmlzT2soKSkgewotICAgICAgICAgICAgaGlkbEluamVjdGlvblNlc3Npb25fM183ID0gY2FzdEluamVjdGlvblJlc3VsdF8zXzc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgY2FzdEluamVjdGlvblJlc3VsdF8zXzcuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gZXJyID0gaGlkbEluamVjdGlvblNlc3Npb25fM183LT5jb25maWd1cmVJbmplY3Rpb25TdHJlYW1zKAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcsIGhpZGxDaGFycyk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzOiBtSGlkbFNlc3Npb25fM183IGRvZXMgbm90IGV4aXN0LCB0aGUgbG93ZXN0IHZlcnNpb24gb2YgaW5qZWN0aW9uICIKLSAgICAgICAgICAgICAgICAic2Vzc2lvbiBpcyAzLjciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCi0gICAgICAgIC8qb3V0Ki9kZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKLSAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKLSAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0ciB8fCBpbmZsaWdodEJ1ZmZlcnMgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCksIGhhbmRsZXNDcmVhdGVkICglcCksIGFuZCBpbmZsaWdodEJ1ZmZlcnMoJXApICIKLSAgICAgICAgICAgICAgICAibXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkLCBpbmZsaWdodEJ1ZmZlcnMpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKLQotICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwOwotCi0gICAgewotICAgICAgICBpZiAocmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+c3RyZWFtKS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyKTsKLSAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwotICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBidWZmZXJJZDsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gYnVmIDogbnVsbHB0cjsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKLQotICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucHVzaEluZmxpZ2h0QnVmZmVyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyKTsKLSAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IC0xOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzLnJlc2l6ZShyZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnMpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpzcmMgPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyArIGk7Ci0gICAgICAgICAgICBTdHJlYW1CdWZmZXIgJmRzdCA9IGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzW2ldOwotICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjLT5zdHJlYW0pLT5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKHNyYy0+YnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgcGF0aAotICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7Ci0gICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHNlbmQgYSBudWxsIGJ1ZmZlciBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKLSAgICAgICAgICAgIGRzdC5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwotCi0gICAgICAgICAgICAvLyBPdXRwdXQgYnVmZmVycyBhcmUgZW1wdHkgd2hlbiB1c2luZyBIQUwgYnVmZmVyIG1hbmFnZXIKLSAgICAgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wdXNoSW5mbGlnaHRCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzcmMtPmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFudXBOYXRpdmVIYW5kbGVzKAordm9pZCBDYW1lcmEzRGV2aWNlOjpjbGVhbnVwTmF0aXZlSGFuZGxlcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gKmhhbmRsZXMsIGJvb2wgY2xvc2VGZCkgewogICAgIGlmIChoYW5kbGVzID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMzc5NSwzMDEgKzI3OTksOSBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIHNwPGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfNDsKLSAgICBzcDxkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzc7Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM183LmlzT2soKSkgewotICAgICAgICBoaWRsU2Vzc2lvbl8zXzcgPSBjYXN0UmVzdWx0XzNfNzsKLSAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgewotICAgICAgICBoaWRsU2Vzc2lvbl8zXzQgPSBjYXN0UmVzdWx0XzNfNDsKLSAgICB9Ci0KLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzOwotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHNfM180OwotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzc6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHNfM183OwotICAgIHNpemVfdCBiYXRjaFNpemUgPSByZXF1ZXN0cy5zaXplKCk7Ci0gICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzcucmVzaXplKGJhdGNoU2l6ZSk7Ci0gICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180LnJlc2l6ZShiYXRjaFNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhcHR1cmVSZXF1ZXN0cy5yZXNpemUoYmF0Y2hTaXplKTsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEJ1ZmZlcnM7Ci0KLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS52M180LnYzXzIsCi0gICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKLSAgICAgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAotICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sCi0gICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKLSAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8ZGV2aWNlOjpWM18yOjpCdWZmZXJDYWNoZT4gY2FjaGVzVG9SZW1vdmU7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJlZWRCdWZmZXJzTG9jayk7Ci0gICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1GcmVlZEJ1ZmZlcnMpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2Ugb25CdWZmZXJGcmVlZAotICAgICAgICAgICAgaWYgKG1CdWZmZXJSZWNvcmRzLmlzU3RyZWFtQ2FjaGVkKHBhaXIuZmlyc3QpKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVzVG9SZW1vdmUucHVzaF9iYWNrKHtwYWlyLmZpcnN0LCBwYWlyLnNlY29uZH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1GcmVlZEJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOwotCi0gICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0ID0gcmVxdWVzdHNbaV07Ci0gICAgICAgIGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0OwotICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC52M18yOwotICAgICAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVxdWVzdC0+c2V0dGluZ3MgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncyk7Ci0gICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+c2V0dGluZ3MpLCBzZXR0aW5nc1NpemUpKSB7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLnJlc2l6ZSgwKTsKLSAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gc2V0dGluZ3NTaXplOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjb3VsZG4ndCB1dGlsaXplIGZtcSwgZmFsbGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3Muc2V0VG9FeHRlcm5hbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihyZXF1ZXN0LT5zZXR0aW5ncykpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnNldHRpbmdzKSk7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IDB1OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQSBudWxsIHJlcXVlc3Qgc2V0dGluZ3MgbWFwcyB0byBhIHNpemUtMCBDYW1lcmFNZXRhZGF0YQotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLnJlc2l6ZSgwKTsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwdTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhpZGwgc2Vzc2lvbiAzLjcgc3BlY2lmaWMgaGFuZGxpbmcuCi0gICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS5pbnB1dFdpZHRoID0gcmVxdWVzdC0+aW5wdXRfd2lkdGg7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLmlucHV0SGVpZ2h0ID0gcmVxdWVzdC0+aW5wdXRfaGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGlkbCBzZXNzaW9uIDMuNyBhbmQgMy40IHNwZWNpZmljIGhhbmRsaW5nLgotICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIgfHwgaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZz4mIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpID8KLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS52M180LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgOgotICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Ci0gICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZShyZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5ncyk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5ncyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZXR0aW5nc1NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJiBtUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NTaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5yZXNpemUoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IHNldHRpbmdzU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY291bGRuJ3QgdXRpbGl6ZSBmbXEsIGZhbGxiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3Muc2V0VG9FeHRlcm5hbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gMHU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OwotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5waHlzaWNhbENhbWVyYUlkID0gcmVxdWVzdC0+cGh5c2NhbV9pZFtqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKLSAgICBhdXRvIHJlc3VsdENhbGxiYWNrID0KLSAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47Ci0gICAgICAgIH07Ci0gICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGVyciA9IGhpZGxTZXNzaW9uXzNfNy0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0XzNfNyhjYXB0dXJlUmVxdWVzdHNfM183LCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKLSAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGVyciA9IGhpZGxTZXNzaW9uXzNfNC0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0XzNfNChjYXB0dXJlUmVxdWVzdHNfM180LCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBtSGlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7Ci0gICAgfQotICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LICYmICpudW1SZXF1ZXN0UHJvY2Vzc2VkICE9IGJhdGNoU2l6ZSkgewotICAgICAgICBBTE9HRSgiJXM6IHByb2Nlc3NDYXB0dXJlUmVxdWVzdCByZXR1cm5zIE9LIGJ1dCBwcm9jZXNzZWQgJWQvJXp1IHJlcXVlc3RzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICpudW1SZXF1ZXN0UHJvY2Vzc2VkLCBiYXRjaFNpemUpOwotICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgfQotCi0gICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGlmIChtSGlkbFNlc3Npb24tPmlzUmVtb3RlKCkpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgYWNxdWlyZSBmZW5jZSBGRHMgd2hlbiB0aGUgSElETCB0cmFuc2FjdGlvbiBzdWNjZWVkcyAoc28gdGhlIEZEcyBoYXZlIGJlZW4KLSAgICAgICAgICAgIC8vIHNlbnQgdG8gY2FtZXJhIEhBTCBwcm9jZXNzZXMpCi0gICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQsIC8qY2xvc2VGZCovdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlIHRoZSBGRHMgYXJlIG5vdyBvd25lZCBieSBIQUwKLSAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKLSAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpmbHVzaCgpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpmbHVzaCIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotCi0gICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmZsdXNoKCk7Ci0gICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmR1bXAoaW50IC8qZmQqLykgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmR1bXAiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIC8vIEhhbmRsZWQgYnkgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpkdW1wCi0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y2xvc2UoKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y2xvc2UoKSIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotCi0gICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmNsb3NlKCk7Ci0gICAgLy8gSW50ZXJmYWNlIHdpbGwgYmUgZGVhZCBzaG9ydGx5IGFueXdheSwgc28gZG9uJ3QgbG9nIGVycm9ycwotICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7Ci0gICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyIC0gMSk7Ci0gICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpzd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKLSAgICAgICAgLypvdXQqL3NwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiogb2ZmbGluZVNlc3Npb24sCi0gICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c3dpdGNoVG9PZmZsaW5lIik7Ci0gICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAob2ZmbGluZVNlc3Npb25JbmZvID09IG51bGxwdHIgfHwgb2ZmbGluZVNlc3Npb24gPT0gbnVsbHB0ciB8fCBidWZmZXJSZWNvcmRzID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBvdXRwdXQgYXJndW1lbnRzIG11c3Qgbm90IGJlIG51bGwhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBhdXRvIHJlc3VsdENhbGxiYWNrID0KLSAgICAgICAgWyZzdGF0dXMsICZvZmZsaW5lU2Vzc2lvbkluZm8sICZvZmZsaW5lU2Vzc2lvbl0gKGF1dG8gcywgYXV0byBpbmZvLCBhdXRvIHNlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpvZmZsaW5lU2Vzc2lvbkluZm8gPSBpbmZvOwotICAgICAgICAgICAgICAgICpvZmZsaW5lU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIH07Ci0gICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM182LT5zd2l0Y2hUb09mZmxpbmUoc3RyZWFtc1RvS2VlcCwgcmVzdWx0Q2FsbGJhY2spOwotCi0gICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHN0YXR1c190IHJldCA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8vIFRPRE86IGFzc2VydCBubyBvbmdvaW5nIHJlcXVlc3RCdWZmZXIvcmV0dXJuQnVmZmVyIGNhbGwgaGVyZQotICAgIC8vIFRPRE86IHVwZGF0ZSBSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lIHRvIGJsb2NrIHJlcXVlc3RCdWZmZXIvcmV0dXJuQnVmZmVyIG9uY2UgSEFMCi0gICAgLy8gICAgICAgcmV0dXJucyBmcm9tIHN3aXRjaFRvT2ZmbGluZS4KLQotCi0gICAgLy8gVmFsaWRhdGUgYnVmZmVyIGNhY2hlcwotICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN0cmVhbXM7Ci0gICAgc3RyZWFtcy5yZXNlcnZlKG9mZmxpbmVTZXNzaW9uSW5mby0+b2ZmbGluZVN0cmVhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby0+b2ZmbGluZVN0cmVhbXMpIHsKLSAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7Ci0gICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGlkKTsKLSAgICAgICAgLy8gVmVyaWZ5IGJ1ZmZlciBjYWNoZXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGJ1ZklkcyhvZmZsaW5lU3RyZWFtLmNpcmN1bGF0aW5nQnVmZmVySWRzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgb2ZmbGluZVN0cmVhbS5jaXJjdWxhdGluZ0J1ZmZlcklkcy5lbmQoKSk7Ci0gICAgICAgIGlmICghdmVyaWZ5QnVmZmVySWRzKGlkLCBidWZJZHMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSBJRCAlZCBidWZmZXIgY2FjaGUgcmVjb3JkcyBtaXNtYXRjaCEiLCBfX0ZVTkNUSU9OX18sIGlkKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTW92ZSBidWZmZXIgcmVjb3JkcwotICAgIGJ1ZmZlclJlY29yZHMtPnRha2VCdWZmZXJDYWNoZXMobUJ1ZmZlclJlY29yZHMsIHN0cmVhbXMpOwotICAgIGJ1ZmZlclJlY29yZHMtPnRha2VJbmZsaWdodEJ1ZmZlck1hcChtQnVmZmVyUmVjb3Jkcyk7Ci0gICAgYnVmZmVyUmVjb3Jkcy0+dGFrZVJlcXVlc3RlZEJ1ZmZlck1hcChtQnVmZmVyUmVjb3Jkcyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KKy8qKgorICogSGFsSW50ZXJmYWNlIGlubmVyIGNsYXNzIG1ldGhvZHMKKyAqLwogCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Z2V0SW5mbGlnaHRCdWZmZXJLZXlzKAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpIHsKQEAgLTQxMzIsNiArMjg0NCwxMSBAQAogICAgIHJldHVybiBtQnVmZmVyUmVjb3Jkcy5nZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKIH0KIAordWludDY0X3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpyZW1vdmVPbmVCdWZmZXJDYWNoZShpbnQgc3RyZWFtSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSB7CisgICAgcmV0dXJuIG1CdWZmZXJSZWNvcmRzLnJlbW92ZU9uZUJ1ZmZlckNhY2hlKHN0cmVhbUlkLCBoYW5kbGUpOworfQorCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6b25CdWZmZXJGcmVlZCgKICAgICAgICAgaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewogICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gbUJ1ZmZlclJlY29yZHMucmVtb3ZlT25lQnVmZmVyQ2FjaGUoc3RyZWFtSWQsIGhhbmRsZSk7CkBAIC00MTY0LDYgKzI4ODEsNyBAQAogICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1MaXN0ZW5lcihudWxscHRyKSwKICAgICAgICAgbUlkKGdldElkKHBhcmVudCkpLAorICAgICAgICBtUmVxdWVzdENsZWFyaW5nKGZhbHNlKSwKICAgICAgICAgbUZpcnN0UmVwZWF0aW5nKGZhbHNlKSwKICAgICAgICAgbVJlY29uZmlndXJlZChmYWxzZSksCiAgICAgICAgIG1Eb1BhdXNlKGZhbHNlKSwKQEAgLTQxNzQsNiArMjg5Miw3IEBACiAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQoMCksCiAgICAgICAgIG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZCgwKSwKICAgICAgICAgbVJvdGF0ZUFuZENyb3BPdmVycmlkZShBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfTk9ORSksCisgICAgICAgIG1Db21wb3Nlck91dHB1dChmYWxzZSksCiAgICAgICAgIG1DYW1lcmFNdXRlKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRiksCiAgICAgICAgIG1DYW1lcmFNdXRlQ2hhbmdlZChmYWxzZSksCiAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoCkBAIC00MzI5LDEwICszMDQ4LDIwIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlcXVlc3QgOiBtUmVwZWF0aW5nUmVxdWVzdHMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiByZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcykgeworICAgICAgICAgICAgc3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW0tPmdldElkKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CiAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CiAgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOwogICAgIH0KKworICAgIG1JbnRlcmZhY2UtPnJlcGVhdGluZ1JlcXVlc3RFbmQobVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciwgc3RyZWFtSWRzKTsKKwogICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTQzODYsNiArMzExNSw3IEBACiAgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOwogICAgIH0KICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKKyAgICBtUmVxdWVzdENsZWFyaW5nID0gdHJ1ZTsKICAgICBtUmVxdWVzdFNpZ25hbC5zaWduYWwoKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC00NTEzLDEzICszMjQzLDE2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLW5zZWNzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCkgewotICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbjsKK3N0ZDo6cGFpcjxuc2Vjc190LCBuc2Vjc190PiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjYWxjdWxhdGVFeHBlY3RlZER1cmF0aW9uUmFuZ2UoCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KSB7CisgICAgc3RkOjpwYWlyPG5zZWNzX3QsIG5zZWNzX3Q+IGV4cGVjdGVkUmFuZ2UoCisgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3Q6OmtEZWZhdWx0TWluRXhwZWN0ZWREdXJhdGlvbiwKKyAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdDo6a0RlZmF1bHRNYXhFeHBlY3RlZER1cmF0aW9uKTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShyZXF1ZXN0LAogICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX01PREUsCiAgICAgICAgICAgICAmZSk7Ci0gICAgaWYgKGUuY291bnQgPT0gMCkgcmV0dXJuIG1heEV4cGVjdGVkRHVyYXRpb247CisgICAgaWYgKGUuY291bnQgPT0gMCkgcmV0dXJuIGV4cGVjdGVkUmFuZ2U7CiAKICAgICBzd2l0Y2ggKGUuZGF0YS51OFswXSkgewogICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRjoKQEAgLTQ1MjcsMTMgKzMyNjAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSwKICAgICAgICAgICAgICAgICAgICAgJmUpOwogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGUuZGF0YS5pNjRbMF07CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5maXJzdCA9IGUuZGF0YS5pNjRbMF07CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5zZWNvbmQgPSBleHBlY3RlZFJhbmdlLmZpcnN0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkocmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICZlKTsKICAgICAgICAgICAgIGlmIChlLmNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24gPSBzdGQ6Om1heChlLmRhdGEuaTY0WzBdLCBtYXhFeHBlY3RlZER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLmZpcnN0ID0gc3RkOjptYXgoZS5kYXRhLmk2NFswXSwgZXhwZWN0ZWRSYW5nZS5maXJzdCk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5zZWNvbmQgPSBleHBlY3RlZFJhbmdlLmZpcnN0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00NTQxLDEyICszMjc2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFLAogICAgICAgICAgICAgICAgICAgICAmZSk7CiAgICAgICAgICAgICBpZiAoZS5jb3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uID0gMWU5IC8gZS5kYXRhLnU4WzBdOworICAgICAgICAgICAgICAgIGV4cGVjdGVkUmFuZ2UuZmlyc3QgPSAxZTkgLyBlLmRhdGEuaTMyWzFdOworICAgICAgICAgICAgICAgIGV4cGVjdGVkUmFuZ2Uuc2Vjb25kID0gMWU5IC8gZS5kYXRhLmkzMlswXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBtYXhFeHBlY3RlZER1cmF0aW9uOworICAgIHJldHVybiBleHBlY3RlZFJhbmdlOwogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNraXBIRlJUYXJnZXRGUFNVcGRhdGUoaW50MzJfdCB0YWcsCkBAIC00NTc4LDkgKzMzMTQsMTUgQEAKIAogICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICAgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSAtMTsKKyAgICAgICAgICAgIGlmIChoYWxSZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGhhbFJlcXVlc3QuaW5wdXRfYnVmZmVyLT5zdHJlYW0pLT5nZXRJZCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwYXJlbnQtPm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVFVRVNULAogICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgMCwgbUxhdGVzdFJlcXVlc3QsIG1MYXRlc3RQaHlzaWNhbFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAwLCBtTGF0ZXN0UmVxdWVzdCwgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdCwgaGFsUmVxdWVzdC5vdXRwdXRfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgaGFsUmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMsIGlucHV0U3RyZWFtSWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00Nzc4LDYgKzM1MjAsMjYgQEAKICAgICByZXR1cm4gc3VibWl0UmVxdWVzdFN1Y2Nlc3M7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlbW92ZUZ3a09ubHlSZWdpb25LZXlzKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDMyX3QsIDQ+IGtGd2tPbmx5UmVnaW9uS2V5cyA9IHtBTkRST0lEX0NPTlRST0xfQUZfUkVHSU9OU19TRVQsCisgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9SRUdJT05TX1NFVCwgQU5EUk9JRF9DT05UUk9MX0FXQl9SRUdJT05TX1NFVCwKKyAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT05fU0VUfTsKKyAgICBpZiAocmVxdWVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyByZXF1ZXN0IG1ldGFkYXRhIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmtleSA6IGtGd2tPbmx5UmVnaW9uS2V5cykgeworICAgICAgICBpZiAocmVxdWVzdC0+ZXhpc3RzKGtleSkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPmVyYXNlKGtleSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnByZXBhcmVIYWxSZXF1ZXN0cygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCkBAIC00ODA0LDcgKzM1NjYsMTEgQEAKICAgICAgICAgYm9vbCB0cmlnZ2Vyc01peGVkSW4gPSAodHJpZ2dlckNvdW50ID4gMCB8fCBtUHJldlRyaWdnZXJzID4gMCk7CiAgICAgICAgIG1QcmV2VHJpZ2dlcnMgPSB0cmlnZ2VyQ291bnQ7CiAKLSAgICAgICAgYm9vbCByb3RhdGVBbmRDcm9wQ2hhbmdlZCA9IG92ZXJyaWRlQXV0b1JvdGF0ZUFuZENyb3AoY2FwdHVyZVJlcXVlc3QpOworICAgICAgICAvLyBEbyBub3Qgb3ZlcnJpZGUgcm90YXRlJmNyb3AgZm9yIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IGluY2x1ZGUKKyAgICAgICAgLy8gU3VyZmFjZVZpZXdzKEhXX0NPTVBPU0VSKSBvdXRwdXQuIFRoZSBkaXNwbGF5IHJvdGF0aW9uIHRoZXJlIHdpbGwgYmUKKyAgICAgICAgLy8gY29tcGVuc2F0ZWQgYnkgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSU5WRVJTRV9ESVNQTEFZCisgICAgICAgIGJvb2wgcm90YXRlQW5kQ3JvcENoYW5nZWQgPSBtQ29tcG9zZXJPdXRwdXQgPyBmYWxzZSA6CisgICAgICAgICAgICBvdmVycmlkZUF1dG9Sb3RhdGVBbmRDcm9wKGNhcHR1cmVSZXF1ZXN0KTsKICAgICAgICAgYm9vbCB0ZXN0UGF0dGVybkNoYW5nZWQgPSBvdmVycmlkZVRlc3RQYXR0ZXJuKGNhcHR1cmVSZXF1ZXN0KTsKIAogICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyB0aGUgc2FtZSBhcyBsYXN0LCBvciB3ZSBoYWQgdHJpZ2dlcnMgbm93IG9yIGxhc3QgdGltZSBvcgpAQCAtNDgzNyw2ICszNjAzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuZW5kKCk7IGl0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQtPm1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzLmZpbmQoaXQtPmNhbWVyYUlkKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZUZ3a09ubHlSZWdpb25LZXlzKCYoaXQtPm1ldGFkYXRhKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlbW92ZSBmd2stb25seSBrZXlzIGZyb20gcmVxdWVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQ6ICVzICglZCkiLCBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ4NTEsNiArMzYyMywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uc1VwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVGd2tPbmx5UmVnaW9uS2V5cygmKGl0LT5tZXRhZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byByZW1vdmUgZndrLW9ubHkga2V5cyBmcm9tIHJlcXVlc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkOiAlcyAoJWQpIiwgaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTUxMTksMTEgKzM4OTcsMTMgQEAKICAgICAgICAgICAgICAgICBpc1pzbENhcHR1cmUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGF1dG8gZXhwZWN0ZWREdXJhdGlvblJhbmdlID0gY2FsY3VsYXRlRXhwZWN0ZWREdXJhdGlvblJhbmdlKHNldHRpbmdzKTsKICAgICAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAotICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oc2V0dGluZ3MpLAorICAgICAgICAgICAgICAgIC8qbWluKi9leHBlY3RlZER1cmF0aW9uUmFuZ2UuZmlyc3QsCisgICAgICAgICAgICAgICAgLyptYXgqL2V4cGVjdGVkRHVyYXRpb25SYW5nZS5zZWNvbmQsCiAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUm90YXRlQW5kQ3JvcEF1dG8sIG1QcmV2Q2FtZXJhSWRzV2l0aFpvb20sCiAgICAgICAgICAgICAgICAgKG1Vc2VIYWxCdWZNYW5hZ2VyKSA/IHVuaXF1ZVN1cmZhY2VJZE1hcCA6CkBAIC01MjU1LDM4ICs0MDM1LDYgQEAKICAgICBtUHJldlJlcXVlc3QuY2xlYXIoKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCi0gICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7Ci0gICAgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKmxhc3RGcmFtZU51bWJlciovbnVsbHB0cik7Ci0KLSAgICAvLyBXYWl0IHVudGlsIHJlcXVlc3QgdGhyZWFkIGlzIGZ1bGx5IHN0b3BwZWQKLSAgICAvLyBUQkQ6IGNoZWNrIGlmIHJlcXVlc3QgdGhyZWFkIGlzIGJlaW5nIHBhdXNlZCBieSBvdGhlciBBUElzIChzaG91bGRuJ3QgYmUpCi0KLSAgICAvLyBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSwgYnV0IHRoZSBBUEkgaW50ZXJmYWNlCi0gICAgLy8gaXMgc2VyaWFsaXplZCBieSBDYW1lcmEzRGV2aWNlOjptSW50ZXJmYWNlTG9jayBzbyBubyBvbmUgc2hvdWxkIGJlIGFibGUgdG8gc3VibWl0IGFueQotICAgIC8vIG5ldyByZXF1ZXN0cyBkdXJpbmcgdGhlIGNhbGw7IGhlbmNlIHNraXAgdGhhdCBjaGVjay4KLSAgICBib29sIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOwotICAgIHdoaWxlICghcXVldWVFbXB0eSkgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFN1Ym1pdFRpbWVvdXQpOwotICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IG9uZSByZXF1ZXN0IHdpdGhpbiB0aW1lb3V0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IGEgcmVxdWVzdDogJXMgKCVkKSEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBxdWV1ZUVtcHR5ID0gbU5leHRSZXF1ZXN0cy5lbXB0eSgpICYmIG1SZXF1ZXN0UXVldWUuZW1wdHkoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUludGVyZmFjZS0+c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgb2ZmbGluZVNlc3Npb25JbmZvLCBvZmZsaW5lU2Vzc2lvbiwgYnVmZmVyUmVjb3Jkcyk7Ci19Ci0KIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3IoCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90IHJvdGF0ZUFuZENyb3BWYWx1ZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC01Mjk4LDYgKzQwNDYsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldENvbXBvc2VyU3VyZmFjZShib29sIGNvbXBvc2VyU3VyZmFjZVByZXNlbnQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmlnZ2VyTXV0ZXgpOworICAgIG1Db21wb3Nlck91dHB1dCA9IGNvbXBvc2VyU3VyZmFjZVByZXNlbnQ7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXRDYW1lcmFNdXRlKGludDMyX3QgbXV0ZU1vZGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmlnZ2VyTXV0ZXgpOwpAQCAtNTM3Niw3ICs0MTMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5hY3F1aXJlX2ZlbmNlID0gLTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwLAorICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoKCpvdXRwdXRCdWZmZXJzKVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wKi8wLCAvKnJlYWRvdXRUaW1lc3RhbXAqLzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CiAgICAgICAgICAgICB9CkBAIC01NDg4LDcgKzQyNDQsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBtUmVxdWVzdFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFRpbWVvdXQpOworICAgICAgICBpZiAoIW1SZXF1ZXN0Q2xlYXJpbmcpIHsKKyAgICAgICAgICAgIHJlcyA9IG1SZXF1ZXN0U2lnbmFsLndhaXRSZWxhdGl2ZShtUmVxdWVzdExvY2ssIGtSZXF1ZXN0VGltZW91dCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoKG1SZXF1ZXN0UXVldWUuZW1wdHkoKSAmJiBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSkgfHwKICAgICAgICAgICAgICAgICBleGl0UGVuZGluZygpKSB7CkBAIC01NTExLDYgKzQyNjksNyBAQAogICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RDbGVhcmluZyA9IGZhbHNlOwogICAgICAgICAgICAgLy8gU3RvcCB3YWl0aW5nIGZvciBub3cgYW5kIGxldCB0aHJlYWQgbWFuYWdlbWVudCBoYXBwZW4KICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC01ODcxLDQ4ICs0NjMwLDUzIEBACiAKICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKIAotICAgIGludDMyX3QgdGVzdFBhdHRlcm5Nb2RlID0gcmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5Nb2RlOwotICAgIGludDMyX3QgdGVzdFBhdHRlcm5EYXRhWzRdID0gewotICAgICAgICByZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMF0sCi0gICAgICAgIHJlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsxXSwKLSAgICAgICAgcmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzJdLAotICAgICAgICByZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbM10KLSAgICB9OworICAgIC8vIEZvciBhIG11bHRpLWNhbWVyYSwgdGhlIHBoeXNpY2FsIGNhbWVyYXMgc3VwcG9ydCB0aGUgc2FtZSBzZXQgb2YKKyAgICAvLyB0ZXN0IHBhdHRlcm4gbW9kZXMgYXMgdGhlIGxvZ2ljYWwgY2FtZXJhLgorICAgIGZvciAoYXV0byYgc2V0dGluZ3MgOiByZXF1ZXN0LT5tU2V0dGluZ3NMaXN0KSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHNldHRpbmdzLm1ldGFkYXRhOwogCi0gICAgaWYgKG1DYW1lcmFNdXRlICE9IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRikgewotICAgICAgICB0ZXN0UGF0dGVybk1vZGUgPSBtQ2FtZXJhTXV0ZTsKLSAgICAgICAgdGVzdFBhdHRlcm5EYXRhWzBdID0gMDsKLSAgICAgICAgdGVzdFBhdHRlcm5EYXRhWzFdID0gMDsKLSAgICAgICAgdGVzdFBhdHRlcm5EYXRhWzJdID0gMDsKLSAgICAgICAgdGVzdFBhdHRlcm5EYXRhWzNdID0gMDsKLSAgICB9Ci0KLSAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhOwotCi0gICAgYXV0byB0ZXN0UGF0dGVybkVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSk7Ci0gICAgaWYgKHRlc3RQYXR0ZXJuRW50cnkuY291bnQgPiAwKSB7Ci0gICAgICAgIGlmICh0ZXN0UGF0dGVybkVudHJ5LmRhdGEuaTMyWzBdICE9IHRlc3RQYXR0ZXJuTW9kZSkgewotICAgICAgICAgICAgdGVzdFBhdHRlcm5FbnRyeS5kYXRhLmkzMlswXSA9IHRlc3RQYXR0ZXJuTW9kZTsKLSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICBpbnQzMl90IHRlc3RQYXR0ZXJuTW9kZSA9IHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZTsKKyAgICAgICAgaW50MzJfdCB0ZXN0UGF0dGVybkRhdGFbNF0gPSB7CisgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMF0sCisgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMV0sCisgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMl0sCisgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbM10KKyAgICAgICAgfTsKKyAgICAgICAgaWYgKG1DYW1lcmFNdXRlICE9IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRikgeworICAgICAgICAgICAgdGVzdFBhdHRlcm5Nb2RlID0gbUNhbWVyYU11dGU7CisgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGFbMF0gPSAwOworICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhWzFdID0gMDsKKyAgICAgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVsyXSA9IDA7CisgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGFbM10gPSAwOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFLAotICAgICAgICAgICAgICAgICZ0ZXN0UGF0dGVybk1vZGUsIDEpOwotICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICB9CiAKLSAgICBhdXRvIHRlc3RQYXR0ZXJuQ29sb3IgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBKTsKLSAgICBpZiAodGVzdFBhdHRlcm5Db2xvci5jb3VudCA+PSA0KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodGVzdFBhdHRlcm5Db2xvci5kYXRhLmkzMltpXSAhPSB0ZXN0UGF0dGVybkRhdGFbaV0pIHsKLSAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkNvbG9yLmRhdGEuaTMyW2ldID0gdGVzdFBhdHRlcm5EYXRhW2ldOworICAgICAgICBhdXRvIHRlc3RQYXR0ZXJuRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFKTsKKyAgICAgICAgYm9vbCBzdXBwb3J0VGVzdFBhdHRlcm5Nb2RlS2V5ID0gc2V0dGluZ3MubUhhc1Rlc3RQYXR0ZXJuTW9kZVRhZzsKKyAgICAgICAgaWYgKHRlc3RQYXR0ZXJuRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBpZiAodGVzdFBhdHRlcm5FbnRyeS5kYXRhLmkzMlswXSAhPSB0ZXN0UGF0dGVybk1vZGUpIHsKKyAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkVudHJ5LmRhdGEuaTMyWzBdID0gdGVzdFBhdHRlcm5Nb2RlOwogICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnRUZXN0UGF0dGVybk1vZGVLZXkpIHsKKyAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgJnRlc3RQYXR0ZXJuTW9kZSwgMSk7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSwKLSAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGEsIDQpOwotICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICBhdXRvIHRlc3RQYXR0ZXJuQ29sb3IgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBKTsKKyAgICAgICAgYm9vbCBzdXBwb3J0VGVzdFBhdHRlcm5EYXRhS2V5ID0gc2V0dGluZ3MubUhhc1Rlc3RQYXR0ZXJuRGF0YVRhZzsKKyAgICAgICAgaWYgKHRlc3RQYXR0ZXJuQ29sb3IuY291bnQgPj0gNCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGVzdFBhdHRlcm5Db2xvci5kYXRhLmkzMltpXSAhPSB0ZXN0UGF0dGVybkRhdGFbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5Db2xvci5kYXRhLmkzMltpXSA9IHRlc3RQYXR0ZXJuRGF0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnRUZXN0UGF0dGVybkRhdGFLZXkpIHsKKyAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhLCA0KTsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGNoYW5nZWQ7CkBAIC02MzA0LDIyMCArNTA2OCw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiBzZXNzaW9uKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwotCi0gICAgYm9vbCBoYXNJbnB1dFN0cmVhbSA9IG1JbnB1dFN0cmVhbSAhPSBudWxscHRyOwotICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IGhhc0lucHV0U3RyZWFtID8gbUlucHV0U3RyZWFtLT5nZXRJZCgpIDogLTE7Ci0gICAgYm9vbCBpbnB1dFN0cmVhbVN1cHBvcnRzT2ZmbGluZSA9IGhhc0lucHV0U3RyZWFtID8KLSAgICAgICAgICAgIG1JbnB1dFN0cmVhbS0+Z2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KCkgOiBmYWxzZTsKLSAgICBhdXRvIG91dHB1dFN0cmVhbUlkcyA9IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpOwotICAgIGF1dG8gc3RyZWFtSWRzID0gb3V0cHV0U3RyZWFtSWRzOwotICAgIGlmIChoYXNJbnB1dFN0cmVhbSkgewotICAgICAgICBzdHJlYW1JZHMucHVzaF9iYWNrKG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgYWxsIHN0cmVhbXMgaW4gc3RyZWFtc1RvS2VlcCBzdXBwb3J0cyBvZmZsaW5lIG1vZGUKLSAgICBmb3IgKGF1dG8gaWQgOiBzdHJlYW1zVG9LZWVwKSB7Ci0gICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSBJRCAlZCIsIF9fRlVOQ1RJT05fXywgaWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBpbnB1dFN0cmVhbUlkKSB7Ci0gICAgICAgICAgICBpZiAoIWlucHV0U3RyZWFtU3VwcG9ydHNPZmZsaW5lKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnB1dCBzdHJlYW0gJWQgY2Fubm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbS0+Z2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBzdHJlYW0gJWQgY2Fubm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGJsb2NrIHN1cmZhY2Ugc2hhcmluZyBhbmQgc3VyZmFjZSBncm91cCBzdHJlYW1zIHVudGlsIHdlIGNhbiBzdXBwb3J0IHRoZW0KLQotICAgIC8vIFN0b3AgcmVwZWF0aW5nIHJlcXVlc3QsIHdhaXQgdW50aWwgYWxsIHJlbWFpbmluZyByZXF1ZXN0cyBhcmUgc3VibWl0dGVkLCB0aGVuIGNhbGwgaW50bwotICAgIC8vIEhBTCBzd2l0Y2hUb09mZmxpbmUKLSAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyBvZmZsaW5lU2Vzc2lvbkluZm87Ci0gICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+IG9mZmxpbmVTZXNzaW9uOwotICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMgYnVmZmVyUmVjb3JkczsKLSAgICBzdGF0dXNfdCByZXQgPSBtUmVxdWVzdFRocmVhZC0+c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uLCAmYnVmZmVyUmVjb3Jkcyk7Ci0KLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIFNFVF9FUlIoIlN3aXRjaCB0byBvZmZsaW5lIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGJvb2wgc3VjYyA9IG1SZXF1ZXN0QnVmZmVyU00ub25Td2l0Y2hUb09mZmxpbmVTdWNjZXNzKCk7Ci0gICAgaWYgKCFzdWNjKSB7Ci0gICAgICAgIFNFVF9FUlIoIkhBTCBtdXN0IG5vdCBiZSBjYWxsaW5nIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwiKTsKLSAgICAgICAgLy8gVE9ETzogYmxvY2sgQUxMIGNhbGxiYWNrcyBmcm9tIEhBTCB0aWxsIGFwcCBjb25maWd1cmVkIG5ldyBzdHJlYW1zPwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBWZXJpZnkgb2ZmbGluZVNlc3Npb25JbmZvCi0gICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gb2ZmbGluZVN0cmVhbUlkczsKLSAgICBvZmZsaW5lU3RyZWFtSWRzLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKLSAgICAgICAgLy8gdmVyaWZ5IHN0cmVhbSBJRHMKLSAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7Ci0gICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgewotICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG5vdCBmb3VuZCEiLCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoZW4gbm90IHVzaW5nIEhBTCBidWYgbWFuYWdlciwgb25seSBhbGxvdyBzdHJlYW1zIHJlcXVlc3RlZCBieSBhcHAgdG8gYmUgcHJlc2VydmVkCi0gICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKLSAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtc1RvS2VlcC5iZWdpbigpLCBzdHJlYW1zVG9LZWVwLmVuZCgpLCBpZCkgPT0gc3RyZWFtc1RvS2VlcC5lbmQoKSkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoInN0cmVhbSBJRCAlZCBtdXN0IG5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lISIsIGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG9mZmxpbmVTdHJlYW1JZHMucHVzaF9iYWNrKGlkKTsKLSAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gKGlkID09IGlucHV0U3RyZWFtSWQpID8KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obUlucHV0U3RyZWFtKSA6Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4+KG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOwotICAgICAgICAvLyBWZXJpZnkgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMKLSAgICAgICAgaWYgKHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSAhPSBvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycykgewotICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSBzdHJlYW0gJWQgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJXp1LCVkKSAoc2VydmljZS9IQUwpIiwKLSAgICAgICAgICAgICAgICAgICAgaWQsIHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSwgb2ZmbGluZVN0cmVhbS5udW1PdXRzdGFuZGluZ0J1ZmZlcnMpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBWZXJpZnkgYWxsIHN0cmVhbXMgdG8gYmUgZGVsZXRlZCBkb24ndCBoYXZlIGFueSBvdXRzdGFuZGluZyBidWZmZXJzCi0gICAgaWYgKGhhc0lucHV0U3RyZWFtICYmIHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCi0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgewotICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSkgewotICAgICAgICAgICAgU0VUX0VSUigiSW5wdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCi0gICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQsIG1JbnB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgb3V0U3RyZWFtSWQgOiBvdXRwdXRTdHJlYW1JZHMpIHsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCi0gICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQpID09IG9mZmxpbmVTdHJlYW1JZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIGF1dG8gb3V0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG91dFN0cmVhbUlkKTsKLSAgICAgICAgICAgIGlmIChvdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUigiT3V0cHV0IHN0cmVhbSAlZCBzdGlsbCBoYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlciEiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQsIG91dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBJbkZsaWdodFJlcXVlc3RNYXAgb2ZmbGluZVJlcXM7Ci0gICAgLy8gVmVyaWZ5IGluZmxpZ2h0IHJlcXVlc3RzIGFuZCB0aGVpciBwZW5kaW5nIGJ1ZmZlcnMKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1JbkZsaWdodExvY2spOwotICAgICAgICBmb3IgKGF1dG8gb2ZmbGluZVJlcSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lUmVxdWVzdHMpIHsKLSAgICAgICAgICAgIGludCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgZnJhbWUgbnVtYmVyICVkIG5vdCBmb3VuZCEiLCBvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29uc3QgYXV0byYgaW5mbGlnaHRSZXEgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOwotICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgc3BlY2lmaWMgc3RyZWFtIElEcwotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnNMZWZ0ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCk7Ci0gICAgICAgICAgICBpZiAobnVtQnVmZmVyc0xlZnQgIT0gb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJWQsJWQpIChzZXJ2aWNlL0hBTCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGlnaHRSZXEubnVtQnVmZmVyc0xlZnQsIG9mZmxpbmVSZXEucGVuZGluZ1N0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZmxpbmVSZXFzLmFkZChvZmZsaW5lUmVxLmZyYW1lTnVtYmVyLCBpbmZsaWdodFJlcSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGFuZCB0cmFuc2ZlciBvYmplY3Qgb3duZXJzaGlwCi0gICAgLy8gICAoc3RyZWFtcywgaW5mbGlnaHQgcmVxdWVzdHMsIGJ1ZmZlciBjYWNoZXMpCi0gICAgY2FtZXJhMzo6U3RyZWFtU2V0IG9mZmxpbmVTdHJlYW1TZXQ7Ci0gICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gaW5wdXRTdHJlYW07Ci0gICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKLSAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0ciAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKLSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2ZmbGluZVN0cmVhbVNldC5hZGQoaWQsIG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBsb2NrIGJlZm9yZSBjb3B5aW5nIHN0YXRlcwotICAgIC8vICAgICAgIHRob3VnaCB0ZWNobmljYWxseSBubyBvdGhlciB0aHJlYWQgc2hvdWxkIGJlIHRhbGtpbmcgdG8gQ2FtZXJhM0RldmljZSBhdCB0aGlzIHBvaW50Ci0gICAgQ2FtZXJhM09mZmxpbmVTdGF0ZXMgb2ZmbGluZVN0YXRlcygKLSAgICAgICAgICAgIG1UYWdNb25pdG9yLCBtVmVuZG9yVGFnSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCwgbU51bVBhcnRpYWxSZXN1bHRzLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsIG1EaXN0b3J0aW9uTWFwcGVycywKLSAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMpOwotCi0gICAgKnNlc3Npb24gPSBuZXcgQ2FtZXJhM09mZmxpbmVTZXNzaW9uKG1JZCwgaW5wdXRTdHJlYW0sIG9mZmxpbmVTdHJlYW1TZXQsCi0gICAgICAgICAgICBzdGQ6Om1vdmUoYnVmZmVyUmVjb3JkcyksIG9mZmxpbmVSZXFzLCBvZmZsaW5lU3RhdGVzLCBvZmZsaW5lU2Vzc2lvbik7Ci0KLSAgICAvLyBEZWxldGUgYWxsIHN0cmVhbXMgdGhhdCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBvZmZsaW5lIHNlc3Npb24KLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKLSAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0ciAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKLSAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGRpc2Nvbm5lY3QgYWxsIG90aGVyIHN0cmVhbXMgYW5kIHN3aXRjaCB0byBVTkNPTkZJR1VSRUQgc3RhdGUKLSAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0ID0gbUlucHV0U3RyZWFtLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiZGlzY29ubmVjdCBpbnB1dCBzdHJlYW0gZmFpbGVkISIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gc3RyZWFtSWQgOiBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKSkgewotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOwotICAgICAgICByZXQgPSBzdHJlYW0tPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJkaXNjb25uZWN0IG91dHB1dCBzdHJlYW0gJWQgZmFpbGVkISIsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7Ci0gICAgbU91dHB1dFN0cmVhbXMuY2xlYXIoKTsKLSAgICBtTmVlZENvbmZpZyA9IHRydWU7Ci0gICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7Ci0gICAgbU9wZXJhdGluZ01vZGUgPSBOT19NT0RFOwotICAgIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiA9IGZhbHNlOwotICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclByZXZpb3VzUmVxdWVzdCgpOwotCi0gICAgcmV0dXJuIE9LOwotICAgIC8vIFRPIGJlIGRvbmUgYnkgQ2FtZXJhRGV2aWNlQ2xpZW50L0NhbWVyYTNPZmZsaW5lU2Vzc2lvbgotICAgIC8vIHJlZ2lzdGVyIHRoZSBvZmZsaW5lIGNsaWVudCB0byBjYW1lcmEgc2VydmljZQotICAgIC8vIFNldHVwIHJlc3VsdCBwYXNzdGhpbmcgdGhyZWFkcyBldGMKLSAgICAvLyBJbml0aWFsaXplIG9mZmxpbmUgc2Vzc2lvbiBzbyBIQUwgY2FuIHN0YXJ0IHNlbmRpbmcgY2FsbGJhY2sgdG8gaXQgKHJlc3VsdCBGbXEpCi0gICAgLy8gVE9ETzogY2hlY2sgaG93IG1hbnkgb25JZGxlIGNhbGxiYWNrIHdpbGwgYmUgc2VudAotICAgIC8vIEphdmEgc2lkZSB0byBtYWtlIHN1cmUgdGhlIENhbWVyYUNhcHR1cmVTZXNzaW9uIGlzIHByb3Blcmx5IGNsb3NlZAotfQotCiB2b2lkIENhbWVyYTNEZXZpY2U6OmdldE9mZmxpbmVTdHJlYW1JZHMoc3RkOjp2ZWN0b3I8aW50PiAqb2ZmbGluZVN0cmVhbUlkcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTY1ODIsNiArNTEzMiwxMyBAQAogICAgIEFMT0dJKCIlcyBJbmplY3Rpb24gY2FtZXJhOiBpbmplY3RlZENhbUlkID0gJXMiLCBfX0ZVTkNUSU9OX18sIGluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOwogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICAvLyBXaGVuIHRoZSBjYW1lcmEgZGV2aWNlIGlzIGFjdGl2ZSwgaW5qZWN0Q2FtZXJhKCkgYW5kIHN0b3BJbmplY3Rpb24oKSB3aWxsIGNhbGwKKyAgICAvLyBpbnRlcm5hbFBhdXNlQW5kV2FpdExvY2tlZCgpIGFuZCBpbnRlcm5hbFJlc3VtZUxvY2tlZCgpLCBhbmQgdGhlbiB0aGV5IHdpbGwgY2FsbAorICAgIC8vIG1TdGF0dXNDaGFuZ2VkLndhaXRSZWxhdGl2ZShtTG9jaywgdGltZW91dCkgb2Ygd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKCkuIEJ1dAorICAgIC8vIG1TdGF0dXNDaGFuZ2VkLndhaXRSZWxhdGl2ZShtTG9jaywgdGltZW91dCkncyBwYXJhbWV0ZXI6IG11dGV4ICJtTG9jayIgbXVzdCBiZSBpbiB0aGUgbG9ja2VkCisgICAgLy8gc3RhdGUsIHNvIHdlIG5lZWQgdG8gYWRkICJNdXRleDo6QXV0b2xvY2sgbChtTG9jaykiIHRvIGxvY2sgdGhlICJtTG9jayIgYmVmb3JlIGNhbGxpbmcKKyAgICAvLyB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKS4KKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKICAgICBpZiAobUluamVjdGlvbk1ldGhvZHMtPmlzSW5qZWN0aW5nKCkpIHsKQEAgLTY1OTcsMjMgKzUxNTQsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5pbmplY3Rpb25Jbml0aWFsaXplKGluamVjdGVkQ2FtSWQsIG1hbmFnZXIsIHRoaXMpOworICAgIHJlcyA9IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoaW5qZWN0ZWRDYW1JZCwgbWFuYWdlcik7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBpbmplY3Rpb24gY2FtZXJhISByZXQgIT0gTk9fRVJST1I6ICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uIGluamVjdGlvbkNvbmZpZzsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5qZWN0aW9uQnVmZmVyU2l6ZXM7Ci0gICAgbUluamVjdGlvbk1ldGhvZHMtPmdldEluamVjdGlvbkNvbmZpZygmaW5qZWN0aW9uQ29uZmlnLCAmaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOwogICAgIC8vIFdoZW4gdGhlIHNlY29uZCBkaXNwbGF5IG9mIGFuZHJvaWQgaXMgY2FzdCB0byB0aGUgcmVtb3RlIGRldmljZSwgYW5kIHRoZSBvcGVuZWQgY2FtZXJhIGlzCiAgICAgLy8gYWxzbyBjYXN0IHRvIHRoZSBzZWNvbmQgZGlzcGxheSwgaW4gdGhpcyBjYXNlLCBiZWNhdXNlIHRoZSBjYW1lcmEgaGFzIGNvbmZpZ3VyZWQgdGhlIHN0cmVhbXMKICAgICAvLyBhdCB0aGlzIHRpbWUsIHdlIGNhbiBkaXJlY3RseSBjYWxsIGluamVjdENhbWVyYSgpIHRvIHJlcGxhY2UgdGhlIGludGVybmFsIGNhbWVyYSB3aXRoCiAgICAgLy8gaW5qZWN0aW9uIGNhbWVyYS4KLSAgICBpZiAobU9wZXJhdGluZ01vZGUgPj0gMCAmJiBpbmplY3Rpb25Db25maWcubnVtX3N0cmVhbXMgPiAwCi0gICAgICAgICAgICAgICAgJiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICBBTE9HVigiJXM6IFRoZSBvcGVuZWQgY2FtZXJhIGlzIGRpcmVjdGx5IGNhc3QgdG8gdGhlIHJlbW90ZSBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAobUluamVjdGlvbk1ldGhvZHMtPmlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZCgpKSB7CisgICAgICAgIEFMT0dEKCIlczogVGhlIG9wZW5lZCBjYW1lcmEgaXMgZGlyZWN0bHkgY2FzdCB0byB0aGUgcmVtb3RlIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiBpbmplY3Rpb25Db25maWc7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmplY3Rpb25CdWZmZXJTaXplczsKKyAgICAgICAgbUluamVjdGlvbk1ldGhvZHMtPmdldEluamVjdGlvbkNvbmZpZygmaW5qZWN0aW9uQ29uZmlnLCAmaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgPCAwIHx8IGluamVjdGlvbkNvbmZpZy5udW1fc3RyZWFtcyA8PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IGluamVjdGlvbkJ1ZmZlclNpemVzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluamVjdCBjYW1lcmEgZHVlIHRvIGFiYW5kb25lZCBjb25maWd1cmF0aW9uISAiCisgICAgICAgICAgICAgICAgICAgICJtT3BlcmF0aW5nTW9kZTogJWQgaW5qZWN0aW9uQ29uZmlnLm51bV9zdHJlYW1zOiAlZCAiCisgICAgICAgICAgICAgICAgICAgICJpbmplY3Rpb25CdWZmZXJTaXplcy5zaXplKCk6ICV6dSIsIG1PcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb25Db25maWcubnVtX3N0cmVhbXMsIGluamVjdGlvbkJ1ZmZlclNpemVzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSBtSW5qZWN0aW9uTWV0aG9kcy0+aW5qZWN0Q2FtZXJhKAogICAgICAgICAgICAgICAgIGluamVjdGlvbkNvbmZpZywgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC02NjI4LDYgKzUxOTQsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c3RvcEluamVjdGlvbigpIHsKICAgICBBTE9HSSgiJXM6IEluamVjdGlvbiBjYW1lcmE6IHN0b3BJbmplY3Rpb24iLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHJldHVybiBtSW5qZWN0aW9uTWV0aG9kcy0+c3RvcEluamVjdGlvbigpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDM5NzE0ZjAuLmY5MjdiNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0yOSwyMCArMjksMTEgQEAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjYvSUNhbWVyYURldmljZVNlc3Npb24uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotCiAjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIAorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZy5oIgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2IuaD4KKwogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9CdWZmZXJVdGlscy5oIgogI2luY2x1ZGUgImRldmljZTMvU3RhdHVzVHJhY2tlci5oIgpAQCAtNTYsMTEgKzQ3LDExIEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSAidXRpbHMvSVBDVHJhbnNwb3J0LmgiCiAjaW5jbHVkZSAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5oIgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90OwotdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX2pwZWdfYmxvYl90OwogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX3JlcXVlc3RfdGVtcGxhdGU7CiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2J1ZmZlcl90OwogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3Q7CkBAIC04MywxNiArNzQsMjQgQEAKICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OlNldEVycm9ySW50ZXJmYWNlLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkluZmxpZ2h0UmVxdWVzdFVwZGF0ZUludGVyZmFjZSwKICAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpSZXF1ZXN0QnVmZmVySW50ZXJmYWNlLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkZsdXNoQnVmZmVySW50ZXJmYWNlIHsKKyAgZnJpZW5kIGNsYXNzIEhpZGxDYW1lcmEzRGV2aWNlOworICBmcmllbmQgY2xhc3MgQWlkbENhbWVyYTNEZXZpY2U7CiAgIHB1YmxpYzoKIAotICAgIGV4cGxpY2l0IENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOworICAgIGV4cGxpY2l0IENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGJvb2wgbGVnYWN5Q2xpZW50ID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM0RldmljZSgpOworICAgIC8vIERlbGV0ZSBhbmQgb3B0aW9uYWxseSBjbG9zZSBuYXRpdmUgaGFuZGxlcyBhbmQgY2xlYXIgdGhlIGlucHV0IHZlY3RvciBhZnRlcndhcmQKKyAgICBzdGF0aWMgdm9pZCBjbGVhbnVwTmF0aXZlSGFuZGxlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ICpoYW5kbGVzLCBib29sIGNsb3NlRmQgPSBmYWxzZSk7CisKKyAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRUcmFuc3BvcnRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGVyZmFjZS0+Z2V0VHJhbnNwb3J0VHlwZSgpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIENhbWVyYURldmljZUJhc2UgaW50ZXJmYWNlCkBAIC0xMDIsMTAgKzEwMSwxOCBAQAogCiAgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2V0VmVuZG9yVGFnSWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtVmVuZG9yVGFnSWQ7IH0KIAorICAgIC8vIFdhdGNoZG9nIHRocmVhZAorICAgIHNwPENhbWVyYVNlcnZpY2VXYXRjaGRvZz4gbUNhbWVyYVNlcnZpY2VXYXRjaGRvZzsKKwogICAgIC8vIFRyYW5zaXRpb25zIHRvIGlkbGUgc3RhdGUgb24gc3VjY2Vzcy4KLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IC8qbWFuYWdlciovLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyptb25pdG9yVGFncyovKSA9IDA7CisKICAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN0b3BXYXRjaGluZ1RhZ3MoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSBvdmVycmlkZTsKICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0IG92ZXJyaWRlOwogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvUGh5c2ljYWwoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgY29uc3Qgb3ZlcnJpZGU7CiAKQEAgLTEzNyw3ICsxNDQsMTIgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlID0KKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IGNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKQEAgLTE0Nyw3ICsxNTksMTIgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlID0KKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IGNyZWF0ZUlucHV0U3RyZWFtKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwKQEAgLTE5Miw5ICsyMDksMTEgQEAKIAogICAgIHN0YXR1c190IHByZXBhcmUoaW50IG1heENvdW50LCBpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCi0gICAgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCBvdmVycmlkZTsKLSAgICBzc2l6ZV90IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgc3NpemVfdCBnZXRSYXdPcGFxdWVCdWZmZXJTaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBib29sIG1heFJlc29sdXRpb24pIGNvbnN0OworICAgIHNzaXplX3QgZ2V0SnBlZ0J1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8sIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0KSBjb25zdCBvdmVycmlkZTsKKyAgICBzc2l6ZV90IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICZpbmZvKSBjb25zdDsKKyAgICBzc2l6ZV90IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8sIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgYm9vbCBtYXhSZXNvbHV0aW9uKSBjb25zdDsKIAogICAgIC8vIE1ldGhvZHMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMKICAgICB2b2lkICAgICAgICAgICAgIG5vdGlmeVN0YXR1cyhib29sIGlkbGUpOyAvLyB1cGRhdGVzIGZyb20gU3RhdHVzVHJhY2tlcgpAQCAtMjIzLDggKzI0MiwxMCBAQAogCiAgICAgbnNlY3NfdCBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mICwKKyAgICAgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogKSAgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH07CiAKICAgICAvLyBSZXF1ZXN0QnVmZmVySW50ZXJmYWNlCiAgICAgYm9vbCBzdGFydFJlcXVlc3RCdWZmZXIoKSBvdmVycmlkZTsKQEAgLTI3NSwzMSArMjk2LDExIEBACiAgICAgICovCiAgICAgc3RhdHVzX3Qgc3RvcEluamVjdGlvbigpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwotICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgotICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7Ci0gICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOwotICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotCi0gIHByaXZhdGU6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkaXNjb25uZWN0SW1wbCgpOworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVGd2tPbmx5UmVnaW9uS2V5cyhDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAKLSAgICAvLyBpbnRlcm5hbCB0eXBlZGVmcwotICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisgICAgZmxvYXQgZ2V0TWF4UHJldmlld0ZwcyhzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pOwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0R1bXBMb2NrQXR0ZW1wdHMgID0gMTA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0R1bXBTbGVlcER1cmF0aW9uID0gMTAwMDAwOyAvLyAwLjEwIHNlYwpAQCAtMzA3LDcgKzMwOCw2IEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga01pbldhcm5JbmZsaWdodER1cmF0aW9uID0gNTAwMDAwMDAwMDsgLy8gNSBzCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0ID0gMzA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0SGlnaFNwZWVkID0gMjU2OyAvLyBiYXRjaCBzaXplIDMyICogcGlwZSBkZXB0aCA4Ci0gICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uID0gMTAwMDAwMDAwOyAvLyAxMDAgbXMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrTWluSW5mbGlnaHREdXJhdGlvbiA9IDUwMDAwMDAwMDA7IC8vIDUgcwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtCYXNlR2V0QnVmZmVyV2FpdCA9IDMwMDAwMDAwMDA7IC8vIDMgc2VjLgogICAgIC8vIFNDSEVEX0ZJRk8gcHJpb3JpdHkgZm9yIHJlcXVlc3Qgc3VibWlzc2lvbiB0aHJlYWQgaW4gSEZSIG1vZGUKQEAgLTMxNSw3ICszMTUsOCBAQAogCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CiAgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCi0gICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmFfanBlZ19ibG9iX3QpOworICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90ICAgICAgIGtNaW5KcGVnQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAyNTYgKiAxMDI0ICsgc2l6ZW9mKGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYik7CiAgICAgLy8gQ29uc3RhbnQgdG8gdXNlIGZvciBzdHJlYW0gSUQgd2hlbiBvbmUgZG9lc24ndCBleGlzdAogICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIE5PX1NUUkVBTSA9IC0xOwogCkBAIC0zMzIsNiArMzMzLDkgQEAKICAgICAvLyBDYW1lcmEgZGV2aWNlIElECiAgICAgY29uc3QgU3RyaW5nOCAgICAgICAgICAgICAgbUlkOwogCisgICAgLy8gTGVnYWN5IGNhbWVyYSBjbGllbnQgZmxhZworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lDbGllbnQ7CisKICAgICAvLyBDdXJyZW50IHN0cmVhbSBjb25maWd1cmF0aW9uIG1vZGU7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGU7CiAgICAgLy8gQ3VycmVudCBzZXNzaW9uIHdpZGUgcGFyYW1ldGVycwpAQCAtMzQzLDY4ICszNDcsNjUgQEAKICAgICAvLyBGbGFnIGluZGljYXRpbmcgaXMgdGhlIGN1cnJlbnQgYWN0aXZlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQuCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uOwogCi0gICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCi0gICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOwotCiAgICAgLyoqKiogU2NvcGUgZm9yIG1Mb2NrICoqKiovCiAKLSAgICAvKioKLSAgICAgKiBBZGFwdGVyIGZvciBsZWdhY3kgSEFMIC8gSElETCBIQUwgaW50ZXJmYWNlIGNhbGxzOyBjYWxscyBlaXRoZXIgaW50byBsZWdhY3kgSEFMdjMgb3IgdGhlCi0gICAgICogSElETCBIQUx2MyBpbnRlcmZhY2VzLgotICAgICAqLwogICAgIGNsYXNzIEhhbEludGVyZmFjZSA6IHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lciwKICAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzSW50ZXJmYWNlIHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgSGFsSW50ZXJmYWNlKHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgICAgICBIYWxJbnRlcmZhY2UoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgOgorICAgICAgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKKyAgICAgICAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQodHJ1ZSksCisgICAgICAgICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3Npbmcoc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKQorICAgICAgICAgICAgICAge307CiAgICAgICAgIEhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UgJm90aGVyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKCk7CiAKKyAgICAgICAgdmlydHVhbCBJUENUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0VHlwZSgpIGNvbnN0ID0gMDsKKwogICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgY29uc3RydWN0ZWQgd2l0aCBhIHZhbGlkIGRldmljZSBvciBzZXNzaW9uLCBhbmQgbm90IHlldCBjbGVhcmVkCi0gICAgICAgIGJvb2wgdmFsaWQoKTsKKyAgICAgICAgdmlydHVhbCBib29sIHZhbGlkKCkgPSAwOwogCiAgICAgICAgIC8vIFJlc2V0IHRoaXMgSGFsSW50ZXJmYWNlIG9iamVjdCAoZG9lcyBub3QgY2FsbCBjbG9zZSgpKQotICAgICAgICB2b2lkIGNsZWFyKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpID0gMDsKIAogICAgICAgICAvLyBDYWxscyBpbnRvIHRoZSBIQUwgaW50ZXJmYWNlCiAKICAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKLSAgICAgICAgc3RhdHVzX3QgY29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAotICAgICAgICAgICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpOwotICAgICAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAotICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqY29uZmlnLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICogc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3QgKiBjb25maWcsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgPSAwOwogCiAgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gY2FtZXJhIGNvbmZpZ3VyZXMgdGhlIHN0cmVhbXMgdG8gaGFsLgotICAgICAgICBzdGF0dXNfdCBjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlSW5qZWN0ZWRTdHJlYW1zKAogICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXNzaW9uUGFyYW1zLAogICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCogY29uZmlnLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMsCi0gICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNhbWVyYUNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNhbWVyYUNoYXJhY3RlcmlzdGljcykgPSAwOwogCiAgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgc3VjY2VlZHMsIHRoZSBvd25lcnNoaXAgb2YgYWNxdWlyZSBmZW5jZXMgaW4gcmVxdWVzdHMgaXMgdHJhbnNmZXJyZWQgdG8KICAgICAgICAgLy8gSGFsSW50ZXJmYWNlLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIHRoZSBmZW5jZSB0bwogICAgICAgICAvLyBIQUwgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIEZEIGluIGNhbWVyYXNlcnZlciBwcm9jZXNzLiBXaGVuIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3duZXJzaGlwCiAgICAgICAgIC8vIG9mIHRoZSBhY3F1aXJlIGZlbmNlIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGNhbGxlci4KLSAgICAgICAgc3RhdHVzX3QgcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqPiYgcmVxdWVzdHMsCi0gICAgICAgICAgICAgICAgLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKTsKLSAgICAgICAgc3RhdHVzX3QgZmx1c2goKTsKLSAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotICAgICAgICBzdGF0dXNfdCBjbG9zZSgpOworICAgICAgICAgICAgICAgIC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgPSAwOwogCi0gICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOwotICAgICAgICBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCi0gICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkgPSAwOwogCi0gICAgICAgIC8vIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIEhhbEludGVyZmFjZSB3aWxsIHJldHVybiBidWZmZXIgbWFwcyBuZWVkZWQgZm9yIG9mZmxpbmUKLSAgICAgICAgLy8gcHJvY2Vzc2luZywgYW5kIGNsZWFyIGFsbCBpdHMgaW50ZXJuYWwgYnVmZmVyIG1hcHMuCi0gICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKLSAgICAgICAgICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgPSAwOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzdHJlYW1JZHMpID0gMDsKIAogICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgLy8gSW1wbGVtZW50cyBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlCkBAIC00MTIsNiArNDEzLDggQEAKICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZCgKICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIAorICAgICAgICB1aW50NjRfdCByZW1vdmVPbmVCdWZmZXJDYWNoZShpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKKwogICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodEJ1ZmZlcihpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKSBvdmVycmlkZTsKIApAQCAtNDMzLDQxICs0MzYsMzUgQEAKIAogICAgICAgICB2b2lkIG9uU3RyZWFtUmVDb25maWd1cmVkKGludCBzdHJlYW1JZCk7CiAKLSAgICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIEFsd2F5cyB2YWxpZAotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247Ci0gICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjMgb3IgbmV3ZXIKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKLSAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OwotICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7Ci0gICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjYgb3IgbmV3ZXIKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNjsKLSAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNyBvciBuZXdlcgotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM183OwotCi0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gbVJlcXVlc3RNZXRhZGF0YVF1ZXVlOwotCi0gICAgICAgIC8vIFRoZSBvdXRwdXQgSElETCByZXF1ZXN0IHN0aWxsIGRlcGVuZHMgb24gaW5wdXQgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Ci0gICAgICAgIC8vIERvIG5vdCBmcmVlIGlucHV0IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCBiZWZvcmUgb3V0cHV0IEhJREwgcmVxdWVzdAotICAgICAgICBzdGF0dXNfdCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBvdXQsCi0gICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKLSAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiogaW5mbGlnaHRCdWZmZXJzKTsKLQotICAgICAgICBzdGF0dXNfdCBwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwKLSAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7Ci0KLSAgICAgICAgLy8gUG9wIGluZmxpZ2h0IGJ1ZmZlcnMgYmFzZWQgb24gcGFpcnMgb2YgKGZyYW1lTnVtYmVyLHN0cmVhbUlkKQotICAgICAgICB2b2lkIHBvcEluZmxpZ2h0QnVmZmVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+JiBidWZmZXJzKTsKKyAgICAgIHByb3RlY3RlZDoKIAogICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5wdXQgY2FjaGVzIG1hdGNoIHdoYXQgd2UgaGF2ZTsgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICAgIGJvb2wgdmVyaWZ5QnVmZmVySWRzKGludDMyX3Qgc3RyZWFtSWQsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiYgaW5CdWZJZHMpOwogCi0gICAgICAgIC8vIERlbGV0ZSBhbmQgb3B0aW9uYWxseSBjbG9zZSBuYXRpdmUgaGFuZGxlcyBhbmQgY2xlYXIgdGhlIGlucHV0IHZlY3RvciBhZnRlcndhcmQKLSAgICAgICAgc3RhdGljIHZvaWQgY2xlYW51cE5hdGl2ZUhhbmRsZXMoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gKmhhbmRsZXMsIGJvb2wgY2xvc2VGZCA9IGZhbHNlKTsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE9mZmxpbmVTZXNzaW9uSW5mb1Q+CisgICAgICAgIHN0YXR1c190IHZlcmlmeUJ1ZmZlckNhY2hlcygKKyAgICAgICAgICAgIGNvbnN0IE9mZmxpbmVTZXNzaW9uSW5mb1QgKm9mZmxpbmVTZXNzaW9uSW5mbywgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyAqYnVmZmVyUmVjb3JkcykgeworICAgICAgICAgICAgLy8gVmFsaWRhdGUgYnVmZmVyIGNhY2hlcworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3RyZWFtczsKKyAgICAgICAgICAgIHN0cmVhbXMucmVzZXJ2ZShvZmZsaW5lU2Vzc2lvbkluZm8tPm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby0+b2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKKyAgICAgICAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IGJ1ZmZlciBjYWNoZXMKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gYnVmSWRzKG9mZmxpbmVTdHJlYW0uY2lyY3VsYXRpbmdCdWZmZXJJZHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxpbmVTdHJlYW0uY2lyY3VsYXRpbmdCdWZmZXJJZHMuZW5kKCkpOworICAgICAgICAgICAgICAgIGlmICghdmVyaWZ5QnVmZmVySWRzKGlkLCBidWZJZHMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc3RyZWFtIElEICVkIGJ1ZmZlciBjYWNoZSByZWNvcmRzIG1pc21hdGNoISIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgYnVmZmVyIHJlY29yZHMKKyAgICAgICAgICAgIGJ1ZmZlclJlY29yZHMtPnRha2VCdWZmZXJDYWNoZXMobUJ1ZmZlclJlY29yZHMsIHN0cmVhbXMpOworICAgICAgICAgICAgYnVmZmVyUmVjb3Jkcy0+dGFrZUluZmxpZ2h0QnVmZmVyTWFwKG1CdWZmZXJSZWNvcmRzKTsKKyAgICAgICAgICAgIGJ1ZmZlclJlY29yZHMtPnRha2VSZXF1ZXN0ZWRCdWZmZXJNYXAobUJ1ZmZlclJlY29yZHMpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyRnJlZWQoaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CiAKQEAgLTQ4Myw3ICs0ODAsNyBAQAogICAgICAgICBib29sIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkOwogCiAgICAgICAgIGNvbnN0IGJvb2wgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZzsKLSAgICB9OworICAgIH07IC8vIGNsYXNzIEhhbEludGVyZmFjZQogCiAgICAgc3A8SGFsSW50ZXJmYWNlPiBtSW50ZXJmYWNlOwogCkBAIC01NDMsNiArNTQwLDcgQEAKIAogICAgIC8qKioqIEVuZCBzY29wZSBmb3IgbUxvY2sgKioqKi8KIAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWU7CiAgICAgLy8gVGhlIG9mZnNldCBjb252ZXJ0aW5nIGZyb20gY2xvY2sgZG9tYWluIG9mIG90aGVyIHN1YnN5c3RlbQogICAgIC8vICh2aWRlby9oYXJkd2FyZSBjb21wb3NlcikgdG8gdGhhdCBvZiBjYW1lcmEuIEFzc3VtcHRpb24gaXMgdGhhdCB0aGlzCiAgICAgLy8gb2Zmc2V0IHdvbid0IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNhbWVyYSBkZXZpY2UuIEluIG90aGVyCkBAIC01NzAsMTAgKzU2OCw2IEBACiAgICAgICAgIC8vIG92ZXJyaWRpbmcgb2YgUk9UQVRFX0FORF9DUk9QIHZhbHVlIGFuZCBhZGp1c3RtZW50IG9mIGNvb3JkaW5hdGVzCiAgICAgICAgIC8vIGluIHNldmVyYWwgb3RoZXIgY29udHJvbHMgaW4gYm90aCB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3VsdAogICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm90YXRlQW5kQ3JvcEF1dG87Ci0gICAgICAgIC8vIE9yaWdpbmFsIHZhbHVlIG9mIFRFU1RfUEFUVEVSTl9NT0RFIGFuZCBEQVRBIHNvIHRoYXQgdGhleSBjYW4gYmUKLSAgICAgICAgLy8gcmVzdG9yZWQgd2hlbiBzZW5zb3IgbXV0aW5nIGlzIHR1cm5lZCBvZmYKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsVGVzdFBhdHRlcm5Nb2RlOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbNF07CiAKICAgICAgICAgLy8gV2hldGhlciB0aGlzIGNhcHR1cmUgcmVxdWVzdCBoYXMgaXRzIHpvb20gcmF0aW8gc2V0IHRvIDEuMHggYmVmb3JlCiAgICAgICAgIC8vIHRoZSBmcmFtZXdvcmsgb3ZlcnJpZGVzIGl0IGZvciBjYW1lcmEgSEFMIGNvbnN1bXB0aW9uLgpAQCAtNTgxLDcgKzU3NSw2IEBACiAgICAgICAgIC8vIFRoZSBzeXN0ZW1UaW1lIHRpbWVzdGFtcCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNyZWF0ZWQuCiAgICAgICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0VGltZU5zOwogCi0KICAgICAgICAgLy8gV2hldGhlciB0aGlzIGNhcHR1cmUgcmVxdWVzdCdzIGRpc3RvcnRpb24gY29ycmVjdGlvbiB1cGRhdGUgaGFzCiAgICAgICAgIC8vIGJlZW4gZG9uZS4KICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc3RvcnRpb25Db3JyZWN0aW9uVXBkYXRlZCA9IGZhbHNlOwpAQCAtNjE0LDMzICs2MDcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCi0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawotICAgICAqLwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKLQotICAgIC8vIEhhbmRsZSBvbmUgbm90aWZ5IG1lc3NhZ2UKLSAgICB2b2lkIG5vdGlmeShjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKTsKLQogICAgIC8vIGxvY2sgdG8gZW5zdXJlIG9ubHkgb25lIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGlzIGNhbGxlZCBhdCBhIHRpbWUuCiAgICAgTXV0ZXggbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jazsKIApAQCAtNjU4LDYgKzYyNCw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBDYW1lcmFNZXRhZGF0YSBnZXRMYXRlc3RSZXF1ZXN0TG9ja2VkKCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0Q2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdHVzIGFuZCB3YWtlIGFsbCB3YWl0aW5nIHRocmVhZHMuCiAgICAgICoKQEAgLTkwNiwxNiArODc1LDExIEBACiAgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOwogICAgICAgICB2b2lkIHJlc2V0UGlwZWxpbmVEcmFpbigpOwogCi0gICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKLSAgICAgICAgICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7Ci0KICAgICAgICAgdm9pZCBjbGVhclByZXZpb3VzUmVxdWVzdCgpOwogCiAgICAgICAgIHN0YXR1c190IHNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3Qgcm90YXRlQW5kQ3JvcFZhbHVlKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0Q29tcG9zZXJTdXJmYWNlKGJvb2wgY29tcG9zZXJTdXJmYWNlUHJlc2VudCk7CiAKICAgICAgICAgc3RhdHVzX3Qgc2V0Q2FtZXJhTXV0ZShpbnQzMl90IG11dGVNb2RlKTsKIApAQCAtOTI1LDcgKzg4OSw2IEBACiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIAotICAgICAgcHJpdmF0ZToKICAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzgmIGdldElkKGNvbnN0IHdwPENhbWVyYTNEZXZpY2U+ICZkZXZpY2UpOwogCiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICBxdWV1ZVRyaWdnZXJMb2NrZWQoUmVxdWVzdFRyaWdnZXIgdHJpZ2dlcik7CkBAIC05OTksOCArOTYyLDkgQEAKICAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGluIG1OZXh0UmVxdWVzdHMgdG8gSEFMIGluIGEgYmF0Y2guIFJldHVybiB0cnVlID0gc3Vjc3Nlc3MKICAgICAgICAgYm9vbCBzZW5kUmVxdWVzdHNCYXRjaCgpOwogCi0gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwZWN0ZWQgbWF4aW11bSBkdXJhdGlvbiBmb3IgYSByZXF1ZXN0Ci0gICAgICAgIG5zZWNzX3QgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCk7CisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwZWN0ZWQgKG1pbmltdW0sIG1heGltdW0pIGR1cmF0aW9uIHJhbmdlIGZvciBhIHJlcXVlc3QKKyAgICAgICAgc3RkOjpwYWlyPG5zZWNzX3QsIG5zZWNzX3Q+IGNhbGN1bGF0ZUV4cGVjdGVkRHVyYXRpb25SYW5nZSgKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCk7CiAKICAgICAgICAgLy8gQ2hlY2sgYW5kIHVwZGF0ZSBsYXRlc3Qgc2Vzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlcXVlc3Qgc2V0dGluZ3MuCiAgICAgICAgIGJvb2wgdXBkYXRlU2Vzc2lvblBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKTsKQEAgLTEwMjUsNiArOTg5LDggQEAKIAogICAgICAgICBNdXRleCAgICAgICAgICAgICAgbVJlcXVlc3RMb2NrOwogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVJlcXVlc3RTaWduYWw7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUmVxdWVzdENsZWFyaW5nOworCiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbDsKICAgICAgICAgUmVxdWVzdExpc3QgICAgICAgIG1SZXF1ZXN0UXVldWU7CiAgICAgICAgIFJlcXVlc3RMaXN0ICAgICAgICBtUmVwZWF0aW5nUmVxdWVzdHM7CkBAIC0xMDY4LDYgKzEwMzQsNyBAQAogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZDsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgIG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZDsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3QgbVJvdGF0ZUFuZENyb3BPdmVycmlkZTsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Db21wb3Nlck91dHB1dDsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG1DYW1lcmFNdXRlOyAvLyAwID0gbm8gbXV0ZSwgb3RoZXJ3aXNlIHRoZSBURVNUX1BBVFRFUk5fTU9ERSB0byB1c2UKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1DYW1lcmFNdXRlQ2hhbmdlZDsKIApAQCAtMTA4OSw2ICsxMDU2LDE0IEBACiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcjsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgIG1TdXBwb3J0Q2FtZXJhTXV0ZTsKICAgICB9OworCisgICAgdmlydHVhbCBzcDxSZXF1ZXN0VGhyZWFkPiBjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IC8qcGFyZW50Ki8sCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gLypzdGF0dXNUcmFja2VyKi8sCisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiAvKmludGVyZmFjZSovLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgLypzZXNzaW9uUGFyYW1LZXlzKi8sCisgICAgICAgICAgICAgICAgYm9vbCAvKnVzZUhhbEJ1Zk1hbmFnZXIqLywKKyAgICAgICAgICAgICAgICBib29sIC8qc3VwcG9ydENhbWVyYU11dGUqLykgPSAwOworCiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKICAgICAvKioKQEAgLTExMDYsNyArMTA4MSw3IEBACiAKICAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWluRXhwZWN0ZWREdXJhdGlvbiwgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzZXQ8U3RyaW5nOD4+JiBwaHlzaWNhbENhbWVyYUlkcywKICAgICAgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUsIGJvb2wgaXNac2xDYXB0dXJlLCBib29sIHJvdGF0ZUFuZENyb3BBdXRvLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBjYW1lcmFJZHNXaXRoWm9vbSwgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCkBAIC0xMjQ5LDcgKzEyMjQsOSBAQAogCiAgICAgdm9pZCBtb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6ZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgdWludDMyX3QgbnVtT3V0cHV0QnVmZmVycywKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCk7CiAKICAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtVmVuZG9yVGFnSWQ7CiAKQEAgLTEzNTUsNiArMTMzMiw5IEBACiAgICAgLy8gcGVyZm9ybWFuY2UgY2xhc3MuCiAgICAgYm9vbCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3M7CiAKKyAgICAvLyBUaGUgY3VycmVudCBtaW5pbXVtIGV4cGVjdGVkIGZyYW1lIGR1cmF0aW9uIGJhc2VkIG9uIEFFX1RBUkdFVF9GUFNfUkFOR0UKKyAgICBuc2Vjc190IG1NaW5FeHBlY3RlZER1cmF0aW9uID0gMDsKKwogICAgIC8vIEluamVjdGlvbiBjYW1lcmEgcmVsYXRlZCBtZXRob2RzLgogICAgIGNsYXNzIENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiAgICAgICBwdWJsaWM6CkBAIC0xMzYyLDQ0ICsxMzQyLDQ2IEBACiAKICAgICAgICAgfkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKCk7CiAKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgZ2VuZXJhdGUgYW4gaGFsIGludGVyZmFjZS4KLSAgICAgICAgc3RhdHVzX3QgaW5qZWN0aW9uSW5pdGlhbGl6ZSgKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMiA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKLQogICAgICAgICAvLyBJbmplY3Rpb24gY2FtZXJhIHdpbGwgcmVwbGFjZSB0aGUgaW50ZXJuYWwgY2FtZXJhIGFuZCBjb25maWd1cmUgc3RyZWFtcwogICAgICAgICAvLyB3aGVuIGRldmljZSBpcyBJRExFIGFuZCByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQuCiAgICAgICAgIHN0YXR1c190IGluamVjdENhbWVyYSgKICAgICAgICAgICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKIAogICAgICAgICAvLyBTdG9wIHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCBzd2l0Y2ggYmFjayB0byBiYWNrdXAgaGFsIGludGVyZmFjZS4KICAgICAgICAgc3RhdHVzX3Qgc3RvcEluamVjdGlvbigpOwogCiAgICAgICAgIGJvb2wgaXNJbmplY3RpbmcoKTsKIAorICAgICAgICBib29sIGlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZCgpOworCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGdldEluamVjdGVkQ2FtSWQoKSBjb25zdDsKIAogICAgICAgICB2b2lkIGdldEluamVjdGlvbkNvbmZpZygvKm91dCovIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogaW5qZWN0aW9uQ29uZmlnLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAKLSAgICAgIHByaXZhdGU6CisgICAgICAgIC8vIFdoZW4gdGhlIHN0cmVhbWluZyBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlZCBhbmQgdGhlIGNhbWVyYSBkZXZpY2UgaXMgYWN0aXZlLCBidXQgdGhlCisgICAgICAgIC8vIGluamVjdGlvbiBjYW1lcmEgaGFzIG5vdCB5ZXQgYmVlbiBpbmplY3RlZCwgdGhlIHN0cmVhbWluZyBjb25maWd1cmF0aW9uIG9mIHRoZSBpbnRlcm5hbAorICAgICAgICAvLyBjYW1lcmEgd2lsbCBiZSBzdG9yZWQgZmlyc3QuCisgICAgICAgIHZvaWQgc3RvcmVJbmplY3Rpb25Db25maWcoCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CisKKyAgICAgIHByb3RlY3RlZDoKICAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzdHJlYW1zIG9mIGluamVjdGlvbiBjYW1lcmEsIGl0IG5lZWQgd2FpdCB1bnRpbCB0aGUKICAgICAgICAgLy8gb3V0cHV0IHN0cmVhbXMgYXJlIGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgdG8gdGhlIG9yaWdpbmFsIGNhbWVyYSBiZWZvcmUKICAgICAgICAgLy8gcHJvY2VlZGluZy4KICAgICAgICAgc3RhdHVzX3QgaW5qZWN0aW9uQ29uZmlndXJlU3RyZWFtcygKICAgICAgICAgICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKIAogICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCBkZWxldGUgdGhlIGhhbCBpbnRlcmZhY2UuCiAgICAgICAgIHZvaWQgaW5qZWN0aW9uRGlzY29ubmVjdEltcGwoKTsKIAogICAgICAgICAvLyBVc2UgaW5qZWN0aW9uIGNhbWVyYSBoYWwgaW50ZXJmYWNlIHRvIHJlcGxhY2UgYW5kIGJhY2t1cCBvcmlnaW5hbAogICAgICAgICAvLyBjYW1lcmEgaGFsIGludGVyZmFjZS4KLSAgICAgICAgc3RhdHVzX3QgcmVwbGFjZUhhbEludGVyZmFjZShzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBib29sIGtlZXBCYWNrdXApOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiAvKm5ld0hhbEludGVyZmFjZSovLAorICAgICAgICAgICAgICAgIGJvb2wgLyprZWVwQmFja3VwKi8pID0gMDsKIAogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiBtUGFyZW50OwogCkBAIC0xNDA5LDkgKzEzOTEsMTYgQEAKICAgICAgICAgLy8gR2VuZXJhdGVkIGluamVjdGlvbiBjYW1lcmEgaGFsIGludGVyZmFjZS4KICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2U7CiAKKyAgICAgICAgLy8gVGhlIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlLCB0aGUgY2FtZXJhIGRldmljZSBpcworICAgICAgICAvLyBhY3RpdmUsIGJ1dCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBoYXMgbm90IHlldCBiZWVuIGluamVjdGVkLgorICAgICAgICBib29sIG1Jc1N0cmVhbUNvbmZpZ0NvbXBsZXRlQnV0Tm90SW5qZWN0ZWQgPSBmYWxzZTsKKwogICAgICAgICAvLyBDb3B5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjYW1lcmEuCiAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiBtSW5qZWN0aW9uQ29uZmlnOwogCisgICAgICAgIC8vIENvcHkgdGhlIHN0cmVhbXMgb2YgdGhlIGludGVybmFsIGNhbWVyYS4KKyAgICAgICAgVmVjdG9yPGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCo+IG1JbmplY3Rpb25TdHJlYW1zOworCiAgICAgICAgIC8vIENvcHkgdGhlIGJ1ZmZlclNpemVzIG9mIHRoZSBvdXRwdXQgc3RyZWFtcyBvZiB0aGUgaW50ZXJuYWwgY2FtZXJhLgogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbUluamVjdGlvbkJ1ZmZlclNpemVzOwogCkBAIC0xNDIyLDYgKzE0MTEsMTAgQEAKICAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgSUQuCiAgICAgICAgIFN0cmluZzggbUluamVjdGVkQ2FtSWQ7CiAgICAgfTsKKworICAgIHZpcnR1YWwgc3A8Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+CisgICAgICAgICAgICBjcmVhdGVDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh3cDxDYW1lcmEzRGV2aWNlPikgPSAwOworCiAgICAgc3A8Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+IG1JbmplY3Rpb25NZXRob2RzOwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzRGV2aWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMuY3BwCmluZGV4IGYxNDVkYWMuLjAzMWMyNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMuY3BwCkBAIC0yNiw4ICsyNiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjsKLQogQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKAogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQpCiAgICAgICAgIDogbVBhcmVudChwYXJlbnQpIHsKQEAgLTM5LDk4ICszNywxMCBAQAogICAgIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjppbmplY3Rpb25Jbml0aWFsaXplKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgIGNvbnN0IHNwPGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYKLSAgICAgICAgICAgICAgICBjYWxsYmFjaykgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvbkxvY2spOwotCi0gICAgaWYgKG1hbmFnZXIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IG1hbmFnZXIgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwotICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUluamVjdGVkQ2FtSWQgPSBpbmplY3RlZENhbUlkOwotICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiBzZXNzaW9uOwotICAgIEFUUkFDRV9CRUdJTigiSW5qZWN0aW9uIENhbWVyYUhhbDo6b3BlblNlc3Npb24iKTsKLSAgICBzdGF0dXNfdCByZXMgPSBtYW5hZ2VyLT5vcGVuU2Vzc2lvbihpbmplY3RlZENhbUlkLnN0cmluZygpLCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOwotICAgIEFUUkFDRV9FTkQoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIGNvdWxkIG5vdCBvcGVuIGNhbWVyYSBzZXNzaW9uOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOwotICAgIGF1dG8gcmVxdWVzdFF1ZXVlUmV0ID0KLSAgICAgICAgc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKFsmcXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoIXF1ZXVlLT5pc1ZhbGlkKCkgfHwgcXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgSEFMIHJldHVybnMgZW1wdHkgcmVxdWVzdCBtZXRhZGF0YSBmbXEsIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAidXNlIGl0Iik7Ci0gICAgICAgICAgICAgICAgcXVldWUgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSB0aGUgcXVldWUgb253YXJkcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIHRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXF1ZXN0IG1ldGFkYXRhIGZtcTogIgotICAgICAgICAgICAgICAgICIlcywgbm90IHVzZSBpdCIsIHJlcXVlc3RRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IHBhcmVudC0+bVJlc3VsdE1ldGFkYXRhUXVldWU7Ci0gICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAotICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiaXQiKTsKLSAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSByZXNRdWV1ZSBvbndhcmRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSB0cmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlICIKLSAgICAgICAgICAgICAgICAiZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLCByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIElGX0FMT0dWKCkgewotICAgICAgICBzZXNzaW9uLT5pbnRlcmZhY2VDaGFpbigKLSAgICAgICAgICAgICAgICBbXSg6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZUNoYWluKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiSW5qZWN0aW9uIGNhbWVyYSBzZXNzaW9uIGludGVyZmFjZSBjaGFpbjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWZhY2UgOiBpbnRlcmZhY2VDaGFpbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQUxPR1YoIiVzOiBJbmplY3Rpb24gY2FtZXJhIGludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2UoKSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID0KLSAgICAgICAgICAgIG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIHBhcmVudC0+bVVzZUhhbEJ1Zk1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7Ci0gICAgaWYgKG1JbmplY3RlZENhbUhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjppbmplY3RDYW1lcmEoCiAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpIHsKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKLSAgICBtSW5qZWN0aW9uQ29uZmlnID0gaW5qZWN0aW9uQ29uZmlnOwotICAgIG1JbmplY3Rpb25CdWZmZXJTaXplcyA9IGluamVjdGlvbkJ1ZmZlclNpemVzOwogCiAgICAgaWYgKG1JbmplY3RlZENhbUhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xNDgsNyArNTgsNiBAQAogICAgIGlmIChwYXJlbnQtPm1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgewogICAgICAgICBBTE9HVigiJXM6IExldCB0aGUgZGV2aWNlIGJlIElETEUgYW5kIHRoZSByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHBhcmVudC0+bVBhdXNlU3RhdGVOb3RpZnkgPSB0cnVlOwogICAgICAgICByZXMgPSBwYXJlbnQtPmludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKG1heEV4cGVjdGVkRHVyYXRpb24pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHBhdXNlIGNhcHR1cmVzIHRvIGluamVjdCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKQEAgLTE4OCw3ICs5Nyw3IEBACiAgICAgICAgIEFMT0dWKCIlczogUmVzdGFydGluZyBhY3Rpdml0eSB0byBpbmplY3QgY2FtZXJhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgLy8gUmV1c2UgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBhbmQgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciBuZXcgc3RyZWFtCiAgICAgICAgIC8vIGNvbmZpZy4KLSAgICAgICAgcGFyZW50LT5pbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfQUNUSVZFKTsKKyAgICAgICAgcGFyZW50LT5pbnRlcm5hbFJlc3VtZUxvY2tlZCgpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTIwOCw3ICsxMTcsNiBAQAogICAgIGlmIChwYXJlbnQtPm1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgewogICAgICAgICBBTE9HVigiJXM6IExldCB0aGUgZGV2aWNlIGJlIElETEUgYW5kIHRoZSByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHBhcmVudC0+bVBhdXNlU3RhdGVOb3RpZnkgPSB0cnVlOwogICAgICAgICByZXMgPSBwYXJlbnQtPmludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKG1heEV4cGVjdGVkRHVyYXRpb24pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHBhdXNlIGNhcHR1cmVzIHRvIHN0b3AgaW5qZWN0aW9uISIsIF9fRlVOQ1RJT05fXyk7CkBAIC0yMjksNyArMTM3LDcgQEAKICAgICAgICAgQUxPR1YoIiVzOiBSZXN0YXJ0aW5nIGFjdGl2aXR5IHRvIHN0b3AgaW5qZWN0aW9uIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgLy8gUmV1c2UgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBhbmQgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciBuZXcgc3RyZWFtCiAgICAgICAgIC8vIGNvbmZpZy4KLSAgICAgICAgcGFyZW50LT5pbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfQUNUSVZFKTsKKyAgICAgICAgcGFyZW50LT5pbnRlcm5hbFJlc3VtZUxvY2tlZCgpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTI0Myw2ICsxNTEsMTAgQEAKICAgICB9CiB9CiAKK2Jvb2wgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZCgpIHsKKyAgICByZXR1cm4gbUlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZDsKK30KKwogY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmdldEluamVjdGVkQ2FtSWQoKQogICAgICAgICBjb25zdCB7CiAgICAgcmV0dXJuIG1JbmplY3RlZENhbUlkOwpAQCAtMjYwLDEwICsxNzIsMjIgQEAKICAgICAqaW5qZWN0aW9uQnVmZmVyU2l6ZXMgPSBtSW5qZWN0aW9uQnVmZmVyU2l6ZXM7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OnN0b3JlSW5qZWN0aW9uQ29uZmlnKAorICAgICAgICBjb25zdCBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcykgeworICAgIG1Jc1N0cmVhbUNvbmZpZ0NvbXBsZXRlQnV0Tm90SW5qZWN0ZWQgPSB0cnVlOworICAgIG1JbmplY3Rpb25Db25maWcgPSBpbmplY3Rpb25Db25maWc7CisgICAgbUluamVjdGlvblN0cmVhbXMuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluamVjdGlvbkNvbmZpZy5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIG1JbmplY3Rpb25TdHJlYW1zLnB1c2hfYmFjayhpbmplY3Rpb25Db25maWcuc3RyZWFtc1tpXSk7CisgICAgfQorICAgIG1JbmplY3Rpb25Db25maWcuc3RyZWFtcyA9IG1JbmplY3Rpb25TdHJlYW1zLmVkaXRBcnJheSgpOworICAgIG1JbmplY3Rpb25CdWZmZXJTaXplcyA9IGluamVjdGlvbkJ1ZmZlclNpemVzOworfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uQ29uZmlndXJlU3RyZWFtcygKICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CiAKQEAgLTMyNiw3ICsyNTAsNiBAQAogICAgICAgICAgICAgbUluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOwogCiAgICAgYXV0byByYyA9IHBhcmVudC0+bVByZXBhcmVyVGhyZWFkLT5yZXN1bWUoKTsKLQogICAgIGlmIChyYyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEluamVjdGlvbiBjYW1lcmEgJXM6IFByZXBhcmVyIHRocmVhZCBmYWlsZWQgdG8gcmVzdW1lISIsCiAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOwpAQCAtMzM5LDYgKzI2Miw5IEBACiB2b2lkIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjppbmplY3Rpb25EaXNjb25uZWN0SW1wbCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dJKCIlczogSW5qZWN0aW9uIGNhbWVyYSBkaXNjb25uZWN0IiwgX19GVU5DVElPTl9fKTsKKyAgICBtSXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkID0gZmFsc2U7CisgICAgbUluamVjdGlvblN0cmVhbXMuY2xlYXIoKTsKKyAgICBtSW5qZWN0aW9uQ29uZmlnLnN0cmVhbXMgPSBudWxscHRyOwogCiAgICAgbUJhY2t1cEhhbEludGVyZmFjZSA9IG51bGxwdHI7CiAgICAgSGFsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBudWxscHRyOwpAQCAtMzY1LDI5ICsyOTEsNCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OnJlcGxhY2VIYWxJbnRlcmZhY2UoCi0gICAgICAgIHNwPEhhbEludGVyZmFjZT4gbmV3SGFsSW50ZXJmYWNlLCBib29sIGtlZXBCYWNrdXApIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7Ci0gICAgaWYgKG5ld0hhbEludGVyZmFjZS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGhlIG5ld0hhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCwgdG8gc3RvcCByZXBsYWNpbmcuIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7Ci0gICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoa2VlcEJhY2t1cCAmJiBtQmFja3VwSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgbUJhY2t1cEhhbEludGVyZmFjZSA9IHBhcmVudC0+bUludGVyZmFjZTsKLSAgICB9IGVsc2UgaWYgKCFrZWVwQmFja3VwKSB7Ci0gICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBudWxscHRyOwotICAgIH0KLSAgICBwYXJlbnQtPm1JbnRlcmZhY2UgPSBuZXdIYWxJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcAppbmRleCA4Y2M2ODMzLi4xOWFmZDY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcApAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgeworICAgICAgICBuc2Vjc190LCBuc2Vjc190LCBpbnQzMl90LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZha2Ugc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNTYsOCArNTYsOSBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6cmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgICAgICBuc2Vjc190LAorICAgICAgICAgICAgbnNlY3NfdCwgbnNlY3NfdCwKICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBpbnQzMl90LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4qKSB7CkBAIC03NSw3ICs3Niw3IEBACiAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7CiB9CiAKLXN0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpzZXRUcmFuc2Zvcm0oaW50KSB7CitzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCwgYm9vbCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgLy8gRG8gbm90aGluZwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaAppbmRleCA5MTRjY2JmLi44Y2VjYWJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgICAgICAgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOworICAgIHN0YXR1c190ICAgICAgICAgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0sIGJvb2wgbWF5Q2hhbmdlTWlycm9yKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGV0YWNoQnVmZmVyKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCk7CiAKQEAgLTEwMCw2ICsxMDAsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYXRjaFNpemUoc2l6ZV90IGJhdGNoU2l6ZSkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsIHZvaWQgb25NaW5EdXJhdGlvbkNoYW5nZWQobnNlY3NfdCAvKmR1cmF0aW9uKi8pIHt9CiAgIHByb3RlY3RlZDoKIAogICAgIC8qKgpAQCAtMTA4LDcgKzEwOSw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwpAQCAtMTM0LDcgKzEzNyw4IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsIGludDMyX3QgdHJhbnNmb3JtLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCAwMjA0ZDQ5Li5hZGQxNDgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTM0LDEwICszNCwxMiBAQAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKSA6CisgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLCBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsCisgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSkgOgogICAgICAgICBDYW1lcmEzU3RyZWFtKGlkLCB0eXBlLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgdGltZXN0YW1wQmFzZSksCiAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQoMCksCkBAIC04MiwxMSArODQsMTUgQEAKICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW06OndpZHRoLCBjYW1lcmFfc3RyZWFtOjpoZWlnaHQsCiAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjpmb3JtYXQsIGNhbWVyYV9zdHJlYW06OmRhdGFfc3BhY2UpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICV6dVxuIiwgbU1heFNpemUpOwotICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6ICUiIFBSSXU2NCAiLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAorICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6IDB4JSIgUFJJeDY0ICIsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCiAgICAgICAgICAgICBtVXNhZ2UgfCBjb25zdW1lclVzYWdlLCBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyk7CiAgICAgaWYgKHN0cmxlbihjYW1lcmFfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpID4gMCkgewogICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFBoeXNpY2FsIGNhbWVyYSBpZDogJXNcbiIsIGNhbWVyYV9zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCk7CiAgICAgfQorICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRHluYW1pYyBSYW5nZSBQcm9maWxlOiAweCUiIFBSSXg2NCAiXG4iLAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbTo6ZHluYW1pY19yYW5nZV9wcm9maWxlKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFN0cmVhbSB1c2UgY2FzZTogJSIgUFJJZDY0ICJcbiIsIGNhbWVyYV9zdHJlYW06OnVzZV9jYXNlKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRpbWVzdGFtcCBiYXNlOiAlZFxuIiwgZ2V0VGltZXN0YW1wQmFzZSgpKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLApAQCAtMjI0LDcgKzIzMCw5IEBACiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpyZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTI0MSw3ICsyNDksOCBAQAogICAgIH0KIAogICAgIHNwPEZlbmNlPiByZWxlYXNlRmVuY2U7Ci0gICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LCBzdXJmYWNlX2lkcywKKyAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCB0cmFuc2Zvcm0sIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlbGVhc2VGZW5jZSk7CiAgICAgLy8gUmVzIG1heSBiZSBhbiBlcnJvciwgYnV0IHdlIHN0aWxsIHdhbnQgdG8gZGVjcmVtZW50IG91ciBvd25lZCBjb3VudAogICAgIC8vIHRvIGVuYWJsZSBjbGVhbiBzaHV0ZG93bi4gU28gd2UnbGwganVzdCByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggOTBjOGE3Yi4uZjM4OWQ1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTM3LDcgKzM3LDExIEBACiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCk7CiAKICAgcHVibGljOgogCkBAIC02NywxMyArNzEsMTcgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDZkODMxN2IuLjlhM2Y3ZWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTEwNSwxMiArMTA1LDE1IEBACiBzdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGludDMyX3QgLyp0cmFuc2Zvcm0qLywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIAogICAgICh2b2lkKXRpbWVzdGFtcDsKKyAgICAodm9pZClyZWFkb3V0VGltZXN0YW1wOwogICAgICh2b2lkKW91dHB1dDsKICAgICBBTE9HX0FTU0VSVCghb3V0cHV0LCAiRXhwZWN0ZWQgb3V0cHV0IHRvIGJlIGZhbHNlIik7CiAKQEAgLTE3NSw3ICsxNzgsOCBAQAogICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAotICAgIHJldHVybiByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCAvKnRpbWVzdGFtcCovMCwgLypvdXRwdXQqL2ZhbHNlKTsKKyAgICByZXR1cm4gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgLyp0aW1lc3RhbXAqLzAsIC8qcmVhZG91dFRpbWVzdGFtcCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0cHV0Ki9mYWxzZSwgLyp0cmFuc2Zvcm0qLyAtMSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDQ2MjIxZDEuLjVlMDU4N2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNjEsNyArNjEsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcAppbmRleCBhN2U2NGNlLi43Y2ZhMjU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCkBAIC00NywxNCArNDcsMTIgQEAKICAgICAgICAgY29uc3QgY2FtZXJhMzo6U3RyZWFtU2V0JiBvZmZsaW5lU3RyZWFtU2V0LAogICAgICAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzJiYgYnVmZmVyUmVjb3JkcywKICAgICAgICAgY29uc3QgY2FtZXJhMzo6SW5GbGlnaHRSZXF1ZXN0TWFwJiBvZmZsaW5lUmVxcywKLSAgICAgICAgY29uc3QgQ2FtZXJhM09mZmxpbmVTdGF0ZXMmIG9mZmxpbmVTdGF0ZXMsCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBvZmZsaW5lU2Vzc2lvbikgOgorICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcykgOgogICAgICAgICBtSWQoaWQpLAogICAgICAgICBtSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pLAogICAgICAgICBtT3V0cHV0U3RyZWFtcyhvZmZsaW5lU3RyZWFtU2V0KSwKICAgICAgICAgbUJ1ZmZlclJlY29yZHMoc3RkOjptb3ZlKGJ1ZmZlclJlY29yZHMpKSwKICAgICAgICAgbU9mZmxpbmVSZXFzKG9mZmxpbmVSZXFzKSwKLSAgICAgICAgbVNlc3Npb24ob2ZmbGluZVNlc3Npb24pLAogICAgICAgICBtVGFnTW9uaXRvcihvZmZsaW5lU3RhdGVzLm1UYWdNb25pdG9yKSwKICAgICAgICAgbVZlbmRvclRhZ0lkKG9mZmxpbmVTdGF0ZXMubVZlbmRvclRhZ0lkKSwKICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIob2ZmbGluZVN0YXRlcy5tVXNlSGFsQnVmTWFuYWdlciksCkBAIC05MCw0MyArODgsNiBAQAogICAgIHJldHVybiBtSWQ7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6aW5pdGlhbGl6ZSh3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotCi0gICAgaWYgKG1TZXNzaW9uID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBISURMIHNlc3Npb24gaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0KLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0KLSAgICAgICAgLy8gc2V0dXAgcmVzdWx0IEZNUQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7Ci0gICAgICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBtU2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCi0gICAgICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIGlmICghcmVzUXVldWUtPmlzVmFsaWQoKSB8fCByZXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOwotICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB1c2UgcmVzUXVldWUgb253YXJkcy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBtU3RhdHVzID0gU1RBVFVTX0FDVElWRTsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbi0+c2V0Q2FsbGJhY2sodGhpcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6ZHVtcChpbnQgLypmZCovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gaWwobUludGVyZmFjZUxvY2spOwpAQCAtMTM1LDYgKzk2LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkaXNjb25uZWN0KCkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgZGlzY29ubmVjdFNlc3Npb24oKTsKICAgICByZXR1cm4gZGlzY29ubmVjdEltcGwoKTsKIH0KIApAQCAtMTcwLDEwICsxMzIsNiBAQAogICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhtSW5wdXRTdHJlYW0pOwogICAgIH0KIAotICAgIGlmIChtU2Vzc2lvbiAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1TZXNzaW9uLT5jbG9zZSgpOwotICAgIH0KLQogICAgIEZsdXNoSW5mbGlnaHRSZXFTdGF0ZXMgc3RhdGVzIHsKICAgICAgICAgbUlkLCBtT2ZmbGluZVJlcXNMb2NrLCBtT2ZmbGluZVJlcXMsIG1Vc2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICBsaXN0ZW5lciwgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpcywgbVNlc3Npb25TdGF0c0J1aWxkZXJ9OwpAQCAtMTgyLDcgKzE0MCw2IEBACiAKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgbVNlc3Npb24uY2xlYXIoKTsKICAgICAgICAgbU91dHB1dFN0cmVhbXMuY2xlYXIoKTsKICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQ0xPU0VEOwpAQCAtMjM1LDE0OSArMTkyLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7Ci0gICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICB9Ci0KLSAgICBDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwKLSAgICAgICAgbU9mZmxpbmVSZXFzTG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCi0gICAgICAgIG1PZmZsaW5lUmVxcywgbU91dHB1dExvY2ssIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKLSAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAotICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCi0gICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKLSAgICAgICAgbUJ1ZmZlclJlY29yZHMKLSAgICB9OwotCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LnYzXzIsIHJlc3VsdC5waHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKLSAgICAvLyBUT0RPOiBjaGFuZ2VkIGltcGwgdG8gY2FsbCBpbnRvIHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCBpbnN0ZWFkPwotICAgIC8vICAgICAgIG1pZ2h0IG5lZWQgdG8gZmlndXJlIGhvdyB0byByZWR1Y2UgY29weSB0aG91Z2guCi0gICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICB9Ci0KLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBub1BoeXNNZXRhZGF0YTsKLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAotICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKLSAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAotICAgICAgICBtQnVmZmVyUmVjb3JkcwotICAgIH07Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQsIG5vUGh5c01ldGFkYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpub3RpZnkoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKLSAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAotICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKLSAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAotICAgICAgICBtQnVmZmVyUmVjb3JkcwotICAgIH07Ci0gICAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiBtc2dzKSB7Ci0gICAgICAgIGNhbWVyYTM6Om5vdGlmeShzdGF0ZXMsIG1zZyk7Ci0gICAgfQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAotICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgewotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKLSAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpc307Ci0gICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBSZXR1cm5CdWZmZXJTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBtQnVmZmVyUmVjb3Jkc307Ci0gICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCiB2b2lkIENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6c2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgKaW5kZXggNTU4MTk2NC4uYTc5OTcxOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCkBAIC0xMzEsNyArMTMxLDYgQEAKICAqLwogY2xhc3MgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UsCi0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjaywKICAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpTZXRFcnJvckludGVyZmFjZSwKICAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpJbmZsaWdodFJlcXVlc3RVcGRhdGVJbnRlcmZhY2UsCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6UmVxdWVzdEJ1ZmZlckludGVyZmFjZSwKQEAgLTE0NCwxMiArMTQzLDExIEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpTdHJlYW1TZXQmIG9mZmxpbmVTdHJlYW1TZXQsCiAgICAgICAgICAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzJiYgYnVmZmVyUmVjb3JkcywKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OkluRmxpZ2h0UmVxdWVzdE1hcCYgb2ZmbGluZVJlcXMsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcywKLSAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBvZmZsaW5lU2Vzc2lvbik7CisgICAgICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcyk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzT2ZmbGluZVNlc3Npb24oKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZSh3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZSh3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gLypsaXN0ZW5lciovKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UgaW50ZXJmYWNlCkBAIC0xNzEsMzggKzE2OSw3IEBACiAgICAgICogRW5kIG9mIENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZSBpbnRlcmZhY2UKICAgICAgKi8KIAotICAgIC8qKgotICAgICAqIEhJREwgSUNhbWVyYURldmljZUNhbGxiYWNrIGludGVyZmFjZQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKLSAgICAgKi8KLQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0KAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG5vdGlmeSgKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+JiBtc2dzKSBvdmVycmlkZTsKLQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCi0gICAgICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0KLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldHVyblN0cmVhbUJ1ZmZlcnMoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7Ci0KLSAgICAvKioKLSAgICAgKiBFbmQgb2YgQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlIGludGVyZmFjZQotICAgICAqLwotCi0gIHByaXZhdGU6CisgIHByb3RlY3RlZDoKICAgICAvLyBDYW1lcmEgZGV2aWNlIElECiAgICAgY29uc3QgU3RyaW5nOCBtSWQ7CiAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gbUlucHV0U3RyZWFtOwpAQCAtMjEzLDggKzE4MCw2IEBACiAgICAgc3RkOjptdXRleCBtT2ZmbGluZVJlcXNMb2NrOwogICAgIGNhbWVyYTM6OkluRmxpZ2h0UmVxdWVzdE1hcCBtT2ZmbGluZVJlcXM7CiAKLSAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gbVNlc3Npb247Ci0KICAgICBUYWdNb25pdG9yIG1UYWdNb25pdG9yOwogICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1WZW5kb3JUYWdJZDsKIApAQCAtMjY5LDggKzIzNCw2IEBACiAgICAgLy8gRW5kIG9mIG1Mb2NrIHByb3RlY3Qgc2NvcGUKIAogICAgIHN0ZDo6bXV0ZXggbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jazsKLSAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbVJlc3VsdE1ldGFkYXRhUXVldWU7CiAKICAgICAvLyBUcmFja2luZyBjYXVzZSBvZiBmYXRhbCBlcnJvcnMgd2hlbiBpbiBTVEFUVVNfRVJST1IKICAgICBTdHJpbmc4IG1FcnJvckNhdXNlOwpAQCAtMjgzLDYgKzI0Niw5IEBACiAgICAgLy8gRm9yIGNsaWVudCBtZXRob2RzIHN1Y2ggYXMgZGlzY29ubmVjdC9kdW1wCiAgICAgc3RkOjptdXRleCBtSW50ZXJmYWNlTG9jazsKIAorICAgIC8vIFRoZSBjdXJyZW50IG1pbmltdW0gZXhwZWN0ZWQgZnJhbWUgZHVyYXRpb24gYmFzZWQgb24gQUVfVEFSR0VUX0ZQU19SQU5HRQorICAgIG5zZWNzX3QgbU1pbkV4cGVjdGVkRHVyYXRpb24gPSAwOworCiAgICAgLy8gU2V0RXJyb3JJbnRlcmZhY2UKICAgICB2b2lkIHNldEVycm9yU3RhdGUoY29uc3QgY2hhciAqZm10LCAuLi4pIG92ZXJyaWRlOwogICAgIHZvaWQgc2V0RXJyb3JTdGF0ZUxvY2tlZChjb25zdCBjaGFyICpmbXQsIC4uLikgb3ZlcnJpZGU7CkBAIC0zMDUsNiArMjcxLDggQEAKICAgICB2b2lkIHNldEVycm9yU3RhdGVMb2NrZWRWKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIAogICAgIHN0YXR1c190IGRpc2Nvbm5lY3RJbXBsKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3RTZXNzaW9uKCkgPSAwOworCiB9OyAvLyBjbGFzcyBDYW1lcmEzT2ZmbGluZVNlc3Npb24KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dEludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0SW50ZXJmYWNlLmgKaW5kZXggODgxNzgzMy4uNDBlZWYxZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0SW50ZXJmYWNlLmgKQEAgLTUwLDYgKzUwLDEwIEBACiAgICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKICAgICAgICAgdmlydHVhbCBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpID0gMDsKIAorICAgICAgICAvLyBSZXR1cm4gdGhlIHJlbW92ZWQgYnVmZmVyIElEIGlmIGlucHV0IGNhY2hlIGlzIGZvdW5kLgorICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIEJVRkZFUl9JRF9OT19CVUZGRVIKKyAgICAgICAgdmlydHVhbCB1aW50NjRfdCByZW1vdmVPbmVCdWZmZXJDYWNoZShpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSA9IDA7CisKICAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBmcmFtZSBudW1iZXIgYW5kIHN0cmVhbSBJRAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHBvcEluZmxpZ2h0QnVmZmVyKGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDAzYjc3ZmMuLjFlMjBlZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMTgsMTQgKzE4LDIwIEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjdGltZT4KICNpbmNsdWRlIDxmc3RyZWFtPgogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2JJZC5oPgorCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oPgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCkBAIC0zOSwxNiArNDUsMjMgQEAKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2I7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2JJZDsKKwogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UsCisgICAgICAgIGludCBtaXJyb3JNb2RlKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQV9TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UpLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTU2LDcgKzY5LDkgQEAKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZSgwKSwKICAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKLSAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKKyAgICAgICAgbU1pcnJvck1vZGUobWlycm9yTW9kZSksCisgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbUlQQ1RyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIAogICAgIGlmIChtQ29uc3VtZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENvbnN1bWVyIGlzIE5VTEwhIiwgX19GVU5DVElPTl9fKTsKQEAgLTcyLDIwICs4NywyNCBAQAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlLAorICAgICAgICBpbnQgbWlycm9yTW9kZSkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkFfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgdGltZXN0YW1wQmFzZSksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLAotICAgICAgICBtVXNlTW9ub1RpbWVzdGFtcChmYWxzZSksCiAgICAgICAgIG1Vc2VCdWZmZXJNYW5hZ2VyKGZhbHNlKSwKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZSgwKSwKICAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKLSAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKKyAgICAgICAgbU1pcnJvck1vZGUobWlycm9yTW9kZSksCisgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbUlQQ1RyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIAogICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmIGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgZm9ybWF0IGZvciBzaXplLW9ubHkgc3RyZWFtOiAlZCIsIF9fRlVOQ1RJT05fXywKQEAgLTEwNywxMSArMTI2LDE1IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKSA6CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgaW50IG1pcnJvck1vZGUpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSksCiAgICAgICAgIG1Db25zdW1lcihudWxscHRyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCkBAIC0xMTksNyArMTQyLDkgQEAKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZShjb25zdW1lclVzYWdlKSwKICAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKLSAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKKyAgICAgICAgbU1pcnJvck1vZGUobWlycm9yTW9kZSksCisgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbUlQQ1RyYW5zcG9ydCh0cmFuc3BvcnQpIHsKICAgICAvLyBEZWZlcnJlZCBjb25zdW1lciBvbmx5IHN1cHBvcnQgcHJldmlldyBzdXJmYWNlIGZvcm1hdCBub3cuCiAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lciBvbmx5IHN1cHBvcnRzIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0IG5vdyEiLApAQCAtMTQ2LDIxICsxNzEsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaXJyb3JNb2RlKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIHR5cGUsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCi0gICAgICAgIG1Vc2VNb25vVGltZXN0YW1wKGZhbHNlKSwKICAgICAgICAgbVVzZUJ1ZmZlck1hbmFnZXIoZmFsc2UpLAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KHRpbWVzdGFtcE9mZnNldCksCiAgICAgICAgIG1Db25zdW1lclVzYWdlKGNvbnN1bWVyVXNhZ2UpLAogICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAotICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgeworICAgICAgICBtTWlycm9yTW9kZShtaXJyb3JNb2RlKSwKKyAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpLAorICAgICAgICBtSVBDVHJhbnNwb3J0KHRyYW5zcG9ydCkgewogCiAgICAgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkgPSBzZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEOwogICAgIG1CdWZmZXJQcm9kdWNlckxpc3RlbmVyID0gbmV3IEJ1ZmZlclByb2R1Y2VyTGlzdGVuZXIodGhpcywgbmVlZHNSZWxlYXNlTm90aWZ5KTsKQEAgLTI2MywxNCArMjk1LDE2IEBACiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCisgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9IRlJfQ0FMTCgpOwogCiAgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAxKSB7CiAgICAgICAgIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXRwdXQqL3RydWUsIHRyYW5zZm9ybSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjgyLDEwICszMTYsODEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmZpeFVwSGlkbEpwZWdCbG9iSGVhZGVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFud0J1ZmZlciwgaW50IGZlbmNlKSB7CisgICAgLy8gTG9jayB0aGUgSlBFRyBidWZmZXIgZm9yIENQVSByZWFkCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IEdyYXBoaWNCdWZmZXI6OmZyb20oYW53QnVmZmVyKTsKKyAgICB2b2lkKiBtYXBwZWQgPSBudWxscHRyOworICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKGR1cChmZW5jZSkpOworICAgIC8vIFVzZSBVU0FHRV9TV19XUklURV9SQVJFTFkgc2luY2Ugd2UncmUgZ29pbmcgdG8gcmUtd3JpdGUgdGhlIENhbWVyYUJsb2IKKyAgICAvLyBoZWFkZXIuCisgICAgR3JhcGhpY0J1ZmZlckxvY2tlciBnYkxvY2tlcihncmFwaGljQnVmZmVyKTsKKyAgICBzdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgZ2JMb2NrZXIubG9ja0FzeW5jKAorICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX09GVEVOIHwgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZLAorICAgICAgICAgICAgICAgICAgICAmbWFwcGVkLCBmZW5jZUZkLmdldCgpKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGxvY2sgdGhlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgdWludDhfdCAqaGlkbEhlYWRlclN0YXJ0ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtYXBwZWQpICsgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSAtIHNpemVvZihjYW1lcmFfanBlZ19ibG9iX3QpOworICAgIC8vIENoZWNrIHRoYXQgdGhlIGpwZWcgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gY29udGFpbiBISURMIGNhbWVyYSBibG9iCisgICAgaWYgKGhpZGxIZWFkZXJTdGFydCA8IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWFwcGVkKSkgeworICAgICAgICBBTE9HRSgiJXMsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gZml0IEhJREwgY2FtZXJhIGJsb2IgJSIgUFJJdTMyLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNhbWVyYV9qcGVnX2Jsb2JfdCAqaGlkbEJsb2JIZWFkZXIgPSByZWludGVycHJldF9jYXN0PGNhbWVyYV9qcGVnX2Jsb2JfdCAqPihoaWRsSGVhZGVyU3RhcnQpOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYmxvYiBpcyBpbmRlZWQgdGhlIGpwZWcgYmxvYiBpZC4KKyAgICBpZiAoaGlkbEJsb2JIZWFkZXItPmpwZWdfYmxvYl9pZCAhPSBDQU1FUkFfSlBFR19CTE9CX0lEKSB7CisgICAgICAgIEFMT0dFKCIlcywganBlZyBibG9iIGlkICVkIGlzIG5vdCBjb3JyZWN0IiwgX19GVU5DVElPTl9fLCBoaWRsQmxvYkhlYWRlci0+anBlZ19ibG9iX2lkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSBpZCBhbmQgYmxvYiBzaXplCisgICAgQ2FtZXJhQmxvYklkIGJsb2JJZCA9IHN0YXRpY19jYXN0PENhbWVyYUJsb2JJZD4oaGlkbEJsb2JIZWFkZXItPmpwZWdfYmxvYl9pZCk7CisgICAgdWludDMyX3QgYmxvYlNpemVCeXRlcyA9IGhpZGxCbG9iSGVhZGVyLT5qcGVnX3NpemU7CisKKyAgICBpZiAoYmxvYlNpemVCeXRlcyA+IChncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKGNhbWVyYV9qcGVnX2Jsb2JfdCkpKSB7CisgICAgICAgIEFMT0dFKCIlcywgYmxvYlNpemUgaW4gSElETCBqcGVnIGJsb2IgOiAlZCBpcyBjb3JydXB0LCBidWZmZXIgc2l6ZSAlIiBQUkl1MzIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIGJsb2JTaXplQnl0ZXMsIGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkpOworICAgIH0KKworICAgIHVpbnQ4X3QgKmFpZGxIZWFkZXJTdGFydCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4obWFwcGVkKSArIGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgLSBzaXplb2YoQ2FtZXJhQmxvYik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBqcGVnIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gQUlETCBjYW1lcmEgYmxvYgorICAgIGlmIChhaWRsSGVhZGVyU3RhcnQgPCBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1hcHBlZCkpIHsKKyAgICAgICAgQUxPR0UoIiVzLCBqcGVnIGJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIHRvIGZpdCBBSURMIGNhbWVyYSBibG9iICUiIFBSSXUzMiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDx1aW50OF90Kj4obWFwcGVkKSArIGJsb2JTaXplQnl0ZXMgPiBhaWRsSGVhZGVyU3RhcnQpIHsKKyAgICAgICAgQUxPR0UoIiVzLCBqcGVnIGJsb2Igd2l0aCBzaXplICVkICwgYnVmZmVyIHNpemUgJSIgUFJJdTMyICIgbm90IGxhcmdlIGVub3VnaCB0byBmaXQiCisgICAgICAgICAgICAgICAgIiBBSURMIGNhbWVyYSBibG9iIHdpdGhvdXQgY29ycnVwdGluZyBqcGVnIiwgX19GVU5DVElPTl9fLCBibG9iU2l6ZUJ5dGVzLAorICAgICAgICAgICAgICAgIGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEZpbGwgaW4gSlBFRyBoZWFkZXIKKyAgICBDYW1lcmFCbG9iIGFpZGxIZWFkZXIgPSB7CisgICAgICAgICAgICAuYmxvYklkID0gYmxvYklkLAorICAgICAgICAgICAgLmJsb2JTaXplQnl0ZXMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihibG9iU2l6ZUJ5dGVzKQorICAgIH07CisgICAgbWVtY3B5KGFpZGxIZWFkZXJTdGFydCwgJmFpZGxIZWFkZXIsIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgZ3JhcGhpY0J1ZmZlci0+dW5sb2NrKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKQEAgLTM0NSwyOCArNDUwLDQ3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2VydGFpbiBjb25zdW1lcnMgKHN1Y2ggYXMgQXVkaW9Tb3VyY2Ugb3IgSGFyZHdhcmVDb21wb3NlcikgdXNlCi0gICAgICAgICAqIE1PTk9UT05JQyB0aW1lLCBjYXVzaW5nIHRpbWUgbWlzYWxpZ25tZW50IGlmIGNhbWVyYSB0aW1lc3RhbXAgaXMKLSAgICAgICAgICogaW4gQk9PVFRJTUUuIERvIHRoZSBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeS4gKi8KLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvbnN1bWVyLmdldCgpLAotICAgICAgICAgICAgICAgIG1Vc2VNb25vVGltZXN0YW1wID8gdGltZXN0YW1wIC0gbVRpbWVzdGFtcE9mZnNldCA6IHRpbWVzdGFtcCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoaXMgaXMgYSBKUEVHIG91dHB1dCwgYW5kIGltYWdlIGR1bXAgbWFzayBpcyBzZXQsIHNhdmUgaW1hZ2UgdG8KLSAgICAgICAgLy8gZGlzay4KLSAgICAgICAgaWYgKGdldEZvcm1hdCgpID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJiBnZXREYXRhU3BhY2UoKSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYgJiYKLSAgICAgICAgICAgICAgICBtSW1hZ2VEdW1wTWFzaykgewotICAgICAgICAgICAgZHVtcEltYWdlVG9EaXNrKHRpbWVzdGFtcCwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAvLyBGaXggQ2FtZXJhQmxvYiBpZCB0eXBlIGRpc2NyZXBhbmN5IGJldHdlZW4gSElETCBhbmQgQUlETCwgZGV0YWlscyA6IGh0dHA6Ly9iLzIyOTY4ODgxMAorICAgICAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmIGdldERhdGFTcGFjZSgpID09IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRikgeworICAgICAgICAgICAgaWYgKG1JUENUcmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSB7CisgICAgICAgICAgICAgICAgZml4VXBIaWRsSnBlZ0Jsb2JIZWFkZXIoYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEpQRUcgb3V0cHV0LCBhbmQgaW1hZ2UgZHVtcCBtYXNrIGlzIHNldCwgc2F2ZSBpbWFnZSB0bworICAgICAgICAgICAgLy8gZGlzay4KKyAgICAgICAgICAgIGlmIChtSW1hZ2VEdW1wTWFzaykgeworICAgICAgICAgICAgICAgIGR1bXBJbWFnZVRvRGlzayh0aW1lc3RhbXAsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7Ci0gICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIHN0YXRlKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiIKLSAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgaWYgKG1QcmV2aWV3RnJhbWVTcGFjZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVzID0gbVByZXZpZXdGcmFtZVNwYWNlci0+cXVldWVQcmV2aWV3QnVmZmVyKHRpbWVzdGFtcCAtIG1UaW1lc3RhbXBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHJlYWRvdXRUaW1lc3RhbXAgLSBtVGltZXN0YW1wT2Zmc2V0LCB0cmFuc2Zvcm0sIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWluZyBidWZmZXIgdG8gcHJldmlldyBidWZmZXIgc3BhY2VyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnNlY3NfdCBjYXB0dXJlVGltZSA9IChtU3luY1RvRGlzcGxheSA/IHJlYWRvdXRUaW1lc3RhbXAgOiB0aW1lc3RhbXApCisgICAgICAgICAgICAgICAgICAgIC0gbVRpbWVzdGFtcE9mZnNldDsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJlc2VudFRpbWUgPSBtU3luY1RvRGlzcGxheSA/CisgICAgICAgICAgICAgICAgICAgIHN5bmNUaW1lc3RhbXBUb0Rpc3BsYXlMb2NrZWQoY2FwdHVyZVRpbWUpIDogY2FwdHVyZVRpbWU7CisKKyAgICAgICAgICAgIHNldFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHRydWUvKm1heUNoYW5nZU1pcnJvciovKTsKKyAgICAgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db25zdW1lci5nZXQoKSwgcHJlc2VudFRpbWUpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHF1ZXVlSERSTWV0YWRhdGEoYW53QnVmZmVyLT5oYW5kbGUsIGN1cnJlbnRDb25zdW1lciwgZHluYW1pY19yYW5nZV9wcm9maWxlKTsKKworICAgICAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UsIHN1cmZhY2VfaWRzKTsKKyAgICAgICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIHN0YXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzoiCisgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIG1Mb2NrLmxvY2soKTsKQEAgLTM5OSwxNCArNTIzLDIzIEBACiAgICAgICAgICIgICAgICBEZXF1ZXVlQnVmZmVyIGxhdGVuY3kgaGlzdG9ncmFtOiIpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSkgeworc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0sIGJvb2wgbWF5Q2hhbmdlTWlycm9yKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1NaXJyb3JNb2RlICE9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8gJiYgbWF5Q2hhbmdlTWlycm9yKSB7CisgICAgICAgIC8vIElmIHRoZSBtaXJyb3JpbmcgbW9kZSBpcyBub3QgQVVUTywgZG8gbm90IGFsbG93IHRyYW5zZm9ybSB1cGRhdGUKKyAgICAgICAgLy8gd2hpY2ggbWF5IGNoYW5nZSBtaXJyb3IuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICByZXR1cm4gc2V0VHJhbnNmb3JtTG9ja2VkKHRyYW5zZm9ybSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnNldFRyYW5zZm9ybUxvY2tlZChpbnQgdHJhbnNmb3JtKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBpZiAodHJhbnNmb3JtID09IC0xKSByZXR1cm4gcmVzOworCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSBpbiBlcnJvciBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTQzMiw3ICs1NjUsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIGlmICgocmVzID0gY29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZCgpKSAhPSBPSykgeworICAgIGlmICgocmVzID0gY29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZCh0cnVlIC8qYWxsb3dQcmV2aWV3UmVzcGFjZSovKSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKQEAgLTQ1Niw3ICs1ODksNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZCgpIHsKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoYm9vbCBhbGxvd1ByZXZpZXdSZXNwYWNlKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgbVRyYWNlRmlyc3RCdWZmZXIgPSB0cnVlOwpAQCAtNTQyLDEwICs2NzUsNTYgQEAKICAgICB9CiAKICAgICBtVG90YWxCdWZmZXJDb3VudCA9IG1heENvbnN1bWVyQnVmZmVycyArIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzOworCisgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBnZXRUaW1lc3RhbXBCYXNlKCk7CisgICAgYm9vbCBpc0RlZmF1bHRUaW1lQmFzZSA9ICh0aW1lc3RhbXBCYXNlID09CisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxUKTsKKyAgICBpZiAoYWxsb3dQcmV2aWV3UmVzcGFjZSkgIHsKKyAgICAgICAgYm9vbCBmb3JjZUNob3Jlb2dyYXBoZXIgPSAodGltZXN0YW1wQmFzZSA9PQorICAgICAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0NIT1JFT0dSQVBIRVJfU1lOQ0VEKTsKKyAgICAgICAgYm9vbCBkZWZhdWx0VG9DaG9yZW9ncmFwaGVyID0gKGlzRGVmYXVsdFRpbWVCYXNlICYmCisgICAgICAgICAgICAgICAgaXNDb25zdW1lZEJ5SFdDb21wb3NlcigpKTsKKyAgICAgICAgYm9vbCBkZWZhdWx0VG9TcGFjZXIgPSAoaXNEZWZhdWx0VGltZUJhc2UgJiYKKyAgICAgICAgICAgICAgICBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSAmJgorICAgICAgICAgICAgICAgICFpc0NvbnN1bWVkQnlDUFUoKSAmJgorICAgICAgICAgICAgICAgICFpc1ZpZGVvU3RyZWFtKCkpOworICAgICAgICBpZiAoZm9yY2VDaG9yZW9ncmFwaGVyIHx8IGRlZmF1bHRUb0Nob3Jlb2dyYXBoZXIpIHsKKyAgICAgICAgICAgIG1TeW5jVG9EaXNwbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50ICs9IGtEaXNwbGF5U3luY0V4dHJhQnVmZmVyOworICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRUb1NwYWNlcikgeworICAgICAgICAgICAgbVByZXZpZXdGcmFtZVNwYWNlciA9IG5ldyBQcmV2aWV3RnJhbWVTcGFjZXIodGhpcywgbUNvbnN1bWVyKTsKKyAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50ICsrOworICAgICAgICAgICAgcmVzID0gbVByZXZpZXdGcmFtZVNwYWNlci0+cnVuKFN0cmluZzg6OmZvcm1hdCgiUHJldmlld1NwYWNlci0lZCIsIG1JZCkuc3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IHByZXZpZXcgc3BhY2VyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9IDA7CiAgICAgbUZyYW1lQ291bnQgPSAwOwogICAgIG1MYXN0VGltZXN0YW1wID0gMDsKLSAgICBtVXNlTW9ub1RpbWVzdGFtcCA9IChpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgfCBpc1ZpZGVvU3RyZWFtKCkpOworCisgICAgaWYgKGlzRGV2aWNlVGltZUJhc2VSZWFsdGltZSgpKSB7CisgICAgICAgIGlmIChpc0RlZmF1bHRUaW1lQmFzZSAmJiAhaXNDb25zdW1lZEJ5SFdDb21wb3NlcigpICYmICFpc1ZpZGVvU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIC8vIERlZmF1bHQgdGltZSBiYXNlLCBidXQgbm90IGhhcmR3YXJlIGNvbXBvc2VyIG9yIHZpZGVvIGVuY29kZXIKKyAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcEJhc2UgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfUkVBTFRJTUUgfHwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX1NFTlNPUikgeworICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGltZXN0YW1wQmFzZSBpcyBDSE9SRU9HUkFQSEVSIFNZTkNFRCBvciBNT05PVE9OSUMsIGxlYXZlCisgICAgICAgIC8vIHRpbWVzdGFtcCBvZmZzZXQgYXMgYm9vdFRpbWUgLSBtb25vdG9uaWNUaW1lLgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0aW1lc3RhbXBCYXNlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX1JFQUxUSU1FKSB7CisgICAgICAgICAgICAvLyBSZXZlcnNlIG9mZnNldCBmb3IgbW9ub3RvbmljVGltZSAtPiBib290VGltZQorICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCA9IC1tVGltZXN0YW1wT2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGltZXN0YW1wQmFzZSBpcyBERUZBVUxULCBNT05PVE9OSUMsIFNFTlNPUiwgb3IKKyAgICAgICAgICAgIC8vIENIT1JFT0dSQVBIRVJfU1lOQ0VELCB0aW1lc3RhbXAgb2Zmc2V0IGlzIDAuCisgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQ29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCk7CkBAIC03OTQsNiArOTczLDEwIEBACiAKICAgICByZXR1cm5QcmVmZXRjaGVkQnVmZmVyc0xvY2tlZCgpOwogCisgICAgaWYgKG1QcmV2aWV3RnJhbWVTcGFjZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtUHJldmlld0ZyYW1lU3BhY2VyLT5yZXF1ZXN0RXhpdCgpOworICAgIH0KKwogICAgIEFMT0dWKCIlczogZGlzY29ubmVjdGluZyBzdHJlYW0gJWQgZnJvbSBuYXRpdmUgd2luZG93IiwgX19GVU5DVElPTl9fLCBnZXRJZCgpKTsKIAogICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobUNvbnN1bWVyLmdldCgpLApAQCAtMTA4Nyw2ICsxMjcwLDE3IEBACiAgICAgcmV0dXJuICh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSkgIT0gMDsKIH0KIAorYm9vbCBDYW1lcmEzT3V0cHV0U3RyZWFtOjppc0NvbnN1bWVkQnlDUFUoKSBjb25zdCB7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgIHN0YXR1c190IHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogZ2V0dGluZyBlbmQgcG9pbnQgdXNhZ2UgZmFpbGVkOiAlcyAoJWQpLiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0spICE9IDA7Cit9CisKIHZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6ZHVtcEltYWdlVG9EaXNrKG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndCdWZmZXIsIGludCBmZW5jZSkgewogICAgIC8vIERlcml2ZXIgb3V0cHV0IGZpbGUgbmFtZQpAQCAtMTE2Myw2ICsxMzU3LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06Om9uTWluRHVyYXRpb25DaGFuZ2VkKG5zZWNzX3QgZHVyYXRpb24pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgbU1pbkV4cGVjdGVkRHVyYXRpb24gPSBkdXJhdGlvbjsKK30KKwogdm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5QcmVmZXRjaGVkQnVmZmVyc0xvY2tlZCgpIHsKICAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlOjpCYXRjaEJ1ZmZlcj4gYmF0Y2hlZEJ1ZmZlcnM7CiAKQEAgLTExODAsNiArMTM3OSw5OSBAQAogICAgIH0KIH0KIAorbnNlY3NfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpzeW5jVGltZXN0YW1wVG9EaXNwbGF5TG9ja2VkKG5zZWNzX3QgdCkgeworICAgIFBhcmNlbGFibGVWc3luY0V2ZW50RGF0YSBwYXJjZWxhYmxlVnN5bmNFdmVudERhdGE7CisgICAgYXV0byByZXMgPSBtRGlzcGxheUV2ZW50UmVjZWl2ZXIuZ2V0TGF0ZXN0VnN5bmNFdmVudERhdGEoJnBhcmNlbGFibGVWc3luY0V2ZW50RGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgZ2V0dGluZyBsYXRlc3QgdnN5bmMgZXZlbnQgZGF0YTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtTGFzdENhcHR1cmVUaW1lID0gdDsKKyAgICAgICAgbUxhc3RQcmVzZW50VGltZSA9IHQ7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIGNvbnN0IFZzeW5jRXZlbnREYXRhJiB2c3luY0V2ZW50RGF0YSA9IHBhcmNlbGFibGVWc3luY0V2ZW50RGF0YS52c3luYzsKKyAgICBuc2Vjc190IGN1cnJlbnRUaW1lID0gc3lzdGVtVGltZSgpOworCisgICAgLy8gUmVzZXQgY2FwdHVyZSB0byBwcmVzZW50IHRpbWUgb2Zmc2V0IGlmOgorICAgIC8vIC0gTW9yZSB0aGFuIDEgc2Vjb25kIGJldHdlZW4gZnJhbWVzLgorICAgIC8vIC0gVGhlIGZyYW1lIGR1cmF0aW9uIGRldmlhdGVzIGZyb20gbXVsdGlwbGVzIG9mIHZzeW5jIGZyYW1lIGludGVydmFscy4KKyAgICBuc2Vjc190IGNhcHR1cmVJbnRlcnZhbCA9IHQgLSBtTGFzdENhcHR1cmVUaW1lOworICAgIGZsb2F0IGNhcHR1cmVUb1ZzeW5jSW50ZXJ2YWxSYXRpbyA9IDEuMGYgKiBjYXB0dXJlSW50ZXJ2YWwgLyB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsOworICAgIGZsb2F0IHJhdGlvRGV2aWF0aW9uID0gc3RkOjpmYWJzKAorICAgICAgICAgICAgY2FwdHVyZVRvVnN5bmNJbnRlcnZhbFJhdGlvIC0gc3RkOjpyb3VuZGYoY2FwdHVyZVRvVnN5bmNJbnRlcnZhbFJhdGlvKSk7CisgICAgaWYgKGNhcHR1cmVJbnRlcnZhbCA+IGtTcGFjaW5nUmVzZXRJbnRlcnZhbE5zIHx8CisgICAgICAgICAgICByYXRpb0RldmlhdGlvbiA+PSBrTWF4SW50ZXJ2YWxSYXRpb0RldmlhdGlvbikgeworICAgICAgICBuc2Vjc190IG1pblByZXNlbnRUID0gbUxhc3RQcmVzZW50VGltZSArIHZzeW5jRXZlbnREYXRhLmZyYW1lSW50ZXJ2YWwgLyAyOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFZzeW5jRXZlbnREYXRhOjprRnJhbWVUaW1lbGluZXNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgdGltZWxpbmUgPSB2c3luY0V2ZW50RGF0YS5mcmFtZVRpbWVsaW5lc1tpXTsKKyAgICAgICAgICAgIGlmICh0aW1lbGluZS5kZWFkbGluZVRpbWVzdGFtcCA+PSBjdXJyZW50VGltZSAmJgorICAgICAgICAgICAgICAgICAgICB0aW1lbGluZS5leHBlY3RlZFByZXNlbnRhdGlvblRpbWUgPiBtaW5QcmVzZW50VCkgeworICAgICAgICAgICAgICAgIG5zZWNzX3QgcHJlc2VudFQgPSB2c3luY0V2ZW50RGF0YS5mcmFtZVRpbWVsaW5lc1tpXS5leHBlY3RlZFByZXNlbnRhdGlvblRpbWU7CisgICAgICAgICAgICAgICAgbUNhcHR1cmVUb1ByZXNlbnRPZmZzZXQgPSBwcmVzZW50VCAtIHQ7CisgICAgICAgICAgICAgICAgbUxhc3RDYXB0dXJlVGltZSA9IHQ7CisgICAgICAgICAgICAgICAgbUxhc3RQcmVzZW50VGltZSA9IHByZXNlbnRUOworCisgICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgZXhwZWN0ZWQgcHJlc2VudGF0aW9uIHRpbWUgYmFjayBieSAxLzMgb2YgZnJhbWUgaW50ZXJ2YWwgdG8KKyAgICAgICAgICAgICAgICAvLyBtaXRpZ2F0ZSB0aGUgdGltZSBkcmlmdC4gRHVlIHRvIHRpbWUgZHJpZnQsIGlmIHdlIGRpcmVjdGx5IHVzZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZSwgb2Z0ZW4gdGltZXMgMiBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZQorICAgICAgICAgICAgICAgIC8vIGZhbGxzIGludG8gdGhlIHNhbWUgVlNZTkMgaW50ZXJ2YWwuCisgICAgICAgICAgICAgICAgcmV0dXJuIHByZXNlbnRUIC0gdnN5bmNFdmVudERhdGEuZnJhbWVJbnRlcnZhbC8zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbnNlY3NfdCBpZGVhbFByZXNlbnRUID0gdCArIG1DYXB0dXJlVG9QcmVzZW50T2Zmc2V0OworICAgIG5zZWNzX3QgZXhwZWN0ZWRQcmVzZW50VCA9IG1MYXN0UHJlc2VudFRpbWU7CisgICAgbnNlY3NfdCBtaW5EaWZmID0gSU5UNjRfTUFYOworICAgIC8vIERlcml2ZSBtaW5pbXVtIGludGVydmFscyBiZXR3ZWVuIHByZXNlbnRhdGlvbiB0aW1lcyBiYXNlZCBvbiBtaW5pbWFsCisgICAgLy8gZXhwZWN0ZWQgZHVyYXRpb24uIFRoZSBtaW5pbXVtIG51bWJlciBvZiBWc3luY3MgaXM6CisgICAgLy8gLSAwIGlmIG1pbkZyYW1lRHVyYXRpb24gaW4gKDAsIDEuNV0gKiB2U3luY0ludGVydmFsLAorICAgIC8vIC0gMSBpZiBtaW5GcmFtZUR1cmF0aW9uIGluICgxLjUsIDIuNV0gKiB2U3luY0ludGVydmFsLAorICAgIC8vIC0gYW5kIHNvIG9uLgorICAgIGludCBtaW5Wc3luY3MgPSAobU1pbkV4cGVjdGVkRHVyYXRpb24gLSB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsIC8gMikgLworICAgICAgICAgICAgdnN5bmNFdmVudERhdGEuZnJhbWVJbnRlcnZhbDsKKyAgICBpZiAobWluVnN5bmNzIDwgMCkgbWluVnN5bmNzID0gMDsKKyAgICBuc2Vjc190IG1pbkludGVydmFsID0gbWluVnN5bmNzICogdnN5bmNFdmVudERhdGEuZnJhbWVJbnRlcnZhbDsKKyAgICAvLyBGaW5kIGJlc3QgdGltZXN0YW1wIGluIHRoZSB2c3luYyB0aW1lbGluZXM6CisgICAgLy8gLSBPbmx5IHVzZSBhdCBtb3N0IDMgdGltZWxpbmVzIHRvIGF2b2lkIGxvbmcgbGF0ZW5jeQorICAgIC8vIC0gY2xvc2VzdCB0byB0aGUgaWRlYWwgcHJlc2VudCB0aW1lLAorICAgIC8vIC0gZGVhZGxpbmUgdGltZXN0YW1wIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lLCBhbmQKKyAgICAvLyAtIHRoZSBjYW5kaWRhdGUgcHJlc2VudCB0aW1lIGlzIGF0IGxlYXN0IG1pbkludGVydmFsIGluIHRoZSBmdXR1cmUKKyAgICAvLyAgIGNvbXBhcmVkIHRvIGxhc3QgcHJlc2VudCB0aW1lLgorICAgIGludCBtYXhUaW1lbGluZXMgPSBzdGQ6Om1pbihrTWF4VGltZWxpbmVzLCAoaW50KVZzeW5jRXZlbnREYXRhOjprRnJhbWVUaW1lbGluZXNMZW5ndGgpOworICAgIGZsb2F0IGJpYXNGb3JTaG9ydERlbGF5ID0gMS4wZjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFRpbWVsaW5lczsgaSArKykgeworICAgICAgICBjb25zdCBhdXRvJiB2c3luY1RpbWUgPSB2c3luY0V2ZW50RGF0YS5mcmFtZVRpbWVsaW5lc1tpXTsKKyAgICAgICAgaWYgKG1pblZzeW5jcyA+IDApIHsKKyAgICAgICAgICAgIC8vIEJpYXMgdG93YXJkcyB1c2luZyBzbWFsbGVyIHRpbWVsaW5lIGluZGV4OgorICAgICAgICAgICAgLy8gICBpID0gMDogICAgICAgICAgICAgICAgYmlhcyA9IDEKKyAgICAgICAgICAgIC8vICAgaSA9IG1heFRpbWVsaW5lcy0xOiAgIGJpYXMgPSAtMQorICAgICAgICAgICAgYmlhc0ZvclNob3J0RGVsYXkgPSAxLjAgLSAyLjAgKiBpIC8gKG1heFRpbWVsaW5lcyAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OmFicyh2c3luY1RpbWUuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lIC0gaWRlYWxQcmVzZW50VCkgPCBtaW5EaWZmICYmCisgICAgICAgICAgICAgICAgdnN5bmNUaW1lLmRlYWRsaW5lVGltZXN0YW1wID49IGN1cnJlbnRUaW1lICYmCisgICAgICAgICAgICAgICAgdnN5bmNUaW1lLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSA+CisgICAgICAgICAgICAgICAgbUxhc3RQcmVzZW50VGltZSArIG1pbkludGVydmFsICsgYmlhc0ZvclNob3J0RGVsYXkgKiBrVGltZWxpbmVUaHJlc2hvbGROcykgeworICAgICAgICAgICAgZXhwZWN0ZWRQcmVzZW50VCA9IHZzeW5jVGltZS5leHBlY3RlZFByZXNlbnRhdGlvblRpbWU7CisgICAgICAgICAgICBtaW5EaWZmID0gc3RkOjphYnModnN5bmNUaW1lLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSAtIGlkZWFsUHJlc2VudFQpOworICAgICAgICB9CisgICAgfQorICAgIG1MYXN0Q2FwdHVyZVRpbWUgPSB0OworICAgIG1MYXN0UHJlc2VudFRpbWUgPSBleHBlY3RlZFByZXNlbnRUOworCisgICAgLy8gTW92ZSB0aGUgZXhwZWN0ZWQgcHJlc2VudGF0aW9uIHRpbWUgYmFjayBieSAxLzMgb2YgZnJhbWUgaW50ZXJ2YWwgdG8KKyAgICAvLyBtaXRpZ2F0ZSB0aGUgdGltZSBkcmlmdC4gRHVlIHRvIHRpbWUgZHJpZnQsIGlmIHdlIGRpcmVjdGx5IHVzZSB0aGUKKyAgICAvLyBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZSwgb2Z0ZW4gdGltZXMgMiBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZQorICAgIC8vIGZhbGxzIGludG8gdGhlIHNhbWUgVlNZTkMgaW50ZXJ2YWwuCisgICAgcmV0dXJuIGV4cGVjdGVkUHJlc2VudFQgLSB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsLzM7Cit9CisKK2Jvb2wgQ2FtZXJhM091dHB1dFN0cmVhbTo6c2hvdWxkTG9nRXJyb3Ioc3RhdHVzX3QgcmVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBzaG91bGRMb2dFcnJvcihyZXMsIG1TdGF0ZSk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IGFkMDNiNTMuLmU4MDY1Y2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC0yMSwxMiArMjEsMTUgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KIAorI2luY2x1ZGUgInV0aWxzL0lQQ1RyYW5zcG9ydC5oIgogI2luY2x1ZGUgInV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uaCIKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIgogI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKICNpbmNsdWRlICJDYW1lcmEzQnVmZmVyTWFuYWdlci5oIgorI2luY2x1ZGUgIlByZXZpZXdGcmFtZVNwYWNlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg3LDggKzkwLDEzIEBACiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyk7CiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlIGJ1ZmZlciBzaXplIGZvciB0aGUgc2FtZQogICAgICAqIGRpbWVuc2lvbnMsIHN1Y2ggYXMgY29tcHJlc3NlZCBKUEVHLgpAQCAtOTksOCArMTA3LDEzIEBACiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lID0gZmFsc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pOwogICAgIC8qKgogICAgICAqIFNldCB1cCBhIHN0cmVhbSB3aXRoIGRlZmVycmVkIGNvbnN1bWVyIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSAyIGRpbWVuc2lvbnMsIHN1Y2ggYXMKICAgICAgKiBSQVcgYW5kIFlVVi4gVGhlIGNvbnN1bWVyIG11c3QgYmUgc2V0IGJlZm9yZSB1c2luZyB0aGlzIHN0cmVhbSBmb3Igb3V0cHV0LiBBIHZhbGlkCkBAIC0xMTAsOCArMTIzLDEzIEBACiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTEyNSw3ICsxNDMsNyBAQAogICAgICAqIFNldCB0aGUgdHJhbnNmb3JtIG9uIHRoZSBvdXRwdXQgc3RyZWFtOyBvbmUgb2YgdGhlCiAgICAgICogSEFMX1RSQU5TRk9STV8qIC8gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fKiBjb25zdGFudHMuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7CisgICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSwgYm9vbCBtYXlDaGFuZ2VNaXJyb3IpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBmb3IgdmlkZW8gZW5jb2RpbmcuCkBAIC0xNDIsNiArMTYwLDExIEBACiAgICAgYm9vbCBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGlzIG91dHB1dCBzdHJlYW0gaXMgY29uc3VtZWQgYnkgQ1BVLgorICAgICAqLworICAgIGJvb2wgaXNDb25zdW1lZEJ5Q1BVKCkgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gaWYgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBzdHJlYW0gaXMgZGVmZXJyZWQuCiAgICAgICovCiAgICAgdmlydHVhbCBib29sIGlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoc2l6ZV90IHN1cmZhY2VfaWQpIGNvbnN0OwpAQCAtMjI0LDIwICsyNDcsMzEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhdGNoU2l6ZShzaXplX3QgYmF0Y2hTaXplID0gMSkgb3ZlcnJpZGU7CiAKICAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIHN0cmVhbSBvbiBjaGFuZ2Ugb2YgbWluIGZyYW1lIGR1cmF0aW9ucy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25NaW5EdXJhdGlvbkNoYW5nZWQobnNlY3NfdCBkdXJhdGlvbikgb3ZlcnJpZGU7CisKKyAgICAvKioKICAgICAgKiBBcHBseSBaU0wgcmVsYXRlZCBjb25zdW1lciB1c2FnZSBxdWlyay4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBhcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKTsKIAogICAgIHZvaWQgc2V0SW1hZ2VEdW1wTWFzayhpbnQgbWFzaykgeyBtSW1hZ2VEdW1wTWFzayA9IG1hc2s7IH0KKyAgICBib29sIHNob3VsZExvZ0Vycm9yKHN0YXR1c190IHJlcyk7CiAKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmFfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0ID0gMCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lID0gZmFsc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pOwogCiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IHdlIHJlbGVhc2UgdGhlIGxvY2sgYnJpZWZseSBpbiB0aGlzIGZ1bmN0aW9uCkBAIC0yNDUsMTYgKzI3OSwxOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOworICAgIHN0YXR1c190IGZpeFVwSGlkbEpwZWdCbG9iSGVhZGVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFud0J1ZmZlciwgaW50IGZlbmNlKTsKIAogICAgIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdDsKLSAgICBzdGF0dXNfdCBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKCk7CisgICAgc3RhdHVzX3QgY29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZChib29sIGFsbG93UHJldmlld1Jlc3BhY2UpOwogCiAgICAgLy8gQ29uc3VtZXIgYXMgdGhlIG91dHB1dCBvZiBjYW1lcmEgSEFMCiAgICAgc3A8U3VyZmFjZT4gbUNvbnN1bWVyOwpAQCAtMjc3LDkgKzMxNCw2IEBACiAgICAgLy8gTmFtZSBvZiBTdXJmYWNlIGNvbnN1bWVyCiAgICAgU3RyaW5nOCAgICAgICAgICAgbUNvbnN1bWVyTmFtZTsKIAotICAgIC8vIFdoZXRoZXIgY29uc3VtZXIgYXNzdW1lcyBNT05PVE9OSUMgdGltZXN0YW1wCi0gICAgYm9vbCBtVXNlTW9ub1RpbWVzdGFtcDsKLQogICAgIC8qKgogICAgICAqIEdyYXBoaWNCdWZmZXIgbWFuYWdlciB0aGlzIHN0cmVhbSBpcyByZWdpc3RlcmVkIHRvLiBVc2VkIHRvIHJlcGxhY2UgdGhlIGJ1ZmZlcgogICAgICAqIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIHJvbGUgb2YgQnVmZmVyUXVldWUuCkBAIC0yOTgsNyArMzMyLDExIEBACiAgICAgYm9vbCBtVXNlQnVmZmVyTWFuYWdlcjsKIAogICAgIC8qKgotICAgICAqIFRpbWVzdGFtcCBvZmZzZXQgZm9yIHZpZGVvIGFuZCBoYXJkd2FyZSBjb21wb3NlciBjb25zdW1lZCBzdHJlYW1zCisgICAgICogT2Zmc2V0IHVzZWQgdG8gb3ZlcnJpZGUgY2FtZXJhIEhBTCBwcm9kdWNlZCB0aW1lc3RhbXBzCisgICAgICoKKyAgICAgKiBUaGUgb2Zmc2V0IGlzIGZpcnN0IGluaXRpYWxpemVkIHRvIGJvb3RUaW1lIC0gbW9ub3RvbmljVGltZSBpbgorICAgICAqIGNvbnN0cnVjdG9yLCBhbmQgbWF5IGxhdGVyIGJlIHVwZGF0ZWQgYmFzZWQgb24gdGhlIGNsaWVudCdzIHRpbWVzdGFtcEJhc2UKKyAgICAgKiBzZXR0aW5nLgogICAgICAqLwogICAgIG5zZWNzX3QgbVRpbWVzdGFtcE9mZnNldDsKIApAQCAtMzIyLDYgKzM2MCw4IEBACiAgICAgc3RkOjp2ZWN0b3I8U3VyZmFjZTo6QmF0Y2hCdWZmZXI+IG1CYXRjaGVkQnVmZmVyczsKICAgICAvLyAtLS0tIEVuZCBvZiBtQmF0Y2hMb2NrIHByb3RlY3RlZCBzY29wZSAtLS0tCiAKKyAgICBjb25zdCBpbnQgbU1pcnJvck1vZGU7CisKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQogICAgICAqLwpAQCAtMzMyLDcgKzM3Miw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCiAgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCkBAIC0zNjQsMTEgKzQwNSwzMiBAQAogCiAgICAgdm9pZCByZXR1cm5QcmVmZXRjaGVkQnVmZmVyc0xvY2tlZCgpOwogCisKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVxdWV1ZUxhdGVuY3lCaW5TaXplID0gNTsgLy8gaW4gbXMKICAgICBDYW1lcmFMYXRlbmN5SGlzdG9ncmFtIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeTsKKyAgICBJUENUcmFuc3BvcnQgbUlQQ1RyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SU5WQUxJRDsKIAogICAgIGludCBtSW1hZ2VEdW1wTWFzayA9IDA7CiAKKyAgICAvLyBSZS1zcGFjZSBmcmFtZXMgYnkgb3ZlcnJpZGluZyB0aW1lc3RhbXAgdG8gYWxpZ24gd2l0aCBkaXNwbGF5IFZzeW5jLgorICAgIC8vIERlZmF1bHQgaXMgb24gZm9yIFN1cmZhY2VWaWV3IGJvdW5kIHN0cmVhbXMuCisgICAgbnNlY3NfdCBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IDA7CisgICAgYm9vbCBtU3luY1RvRGlzcGxheSA9IGZhbHNlOworICAgIERpc3BsYXlFdmVudFJlY2VpdmVyIG1EaXNwbGF5RXZlbnRSZWNlaXZlcjsKKyAgICBuc2Vjc190IG1MYXN0Q2FwdHVyZVRpbWUgPSAwOworICAgIG5zZWNzX3QgbUxhc3RQcmVzZW50VGltZSA9IDA7CisgICAgbnNlY3NfdCBtQ2FwdHVyZVRvUHJlc2VudE9mZnNldCA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0Rpc3BsYXlTeW5jRXh0cmFCdWZmZXIgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrU3BhY2luZ1Jlc2V0SW50ZXJ2YWxOcyA9IDUwMDAwMDAwTEw7IC8vIDUwIG1pbGxpc2Vjb25kCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtUaW1lbGluZVRocmVzaG9sZE5zID0gMTAwMDAwMExMOyAvLyAxIG1pbGxpc2Vjb25kCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrTWF4SW50ZXJ2YWxSYXRpb0RldmlhdGlvbiA9IDAuMDVmOworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhUaW1lbGluZXMgPSAzOworICAgIG5zZWNzX3Qgc3luY1RpbWVzdGFtcFRvRGlzcGxheUxvY2tlZChuc2Vjc190IHQpOworCisgICAgLy8gUmUtc3BhY2UgZnJhbWVzIGJ5IGRlbGF5aW5nIHF1ZXVlQnVmZmVyIHNvIHRoYXQgZnJhbWUgZGVsaXZlcnkgaGFzCisgICAgLy8gdGhlIHNhbWUgY2FkZW5jZSBhcyBjYXB0dXJlLiBEZWZhdWx0IGlzIG9uIGZvciBTdXJmYWNlVGV4dHVyZSBib3VuZAorICAgIC8vIHN0cmVhbXMuCisgICAgc3A8UHJldmlld0ZyYW1lU3BhY2VyPiBtUHJldmlld0ZyYW1lU3BhY2VyOwogfTsgLy8gY2xhc3MgQ2FtZXJhM091dHB1dFN0cmVhbQogCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCmluZGV4IDQ5ZjlmNjIuLmE2ZDRiOTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCkBAIC0zNCw3ICszNCw3IEBACiAgICAgICogU2V0IHRoZSB0cmFuc2Zvcm0gb24gdGhlIG91dHB1dCBzdHJlYW07IG9uZSBvZiB0aGUKICAgICAgKiBIQUxfVFJBTlNGT1JNXyogLyBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV8qIGNvbnN0YW50cy4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSwgYm9vbCBtYXlDaGFuZ2VNaXJyb3IpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiBpZiB0aGlzIG91dHB1dCBzdHJlYW0gaXMgZm9yIHZpZGVvIGVuY29kaW5nLgpAQCAtMTA4LDYgKzEwOCwxNCBAQAogICAgICAqIGluc3RlYWQuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYXRjaFNpemUoc2l6ZV90IGJhdGNoU2l6ZSA9IDEpID0gMDsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgb3V0cHV0IHN0cmVhbSB0aGF0IHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGhhcyBjaGFuZ2VkLgorICAgICAqCisgICAgICogVGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgdXBwZXIgYm91bmQgb2YKKyAgICAgKiBBRV9UQVJHRVRfRlBTX1JBTkdFIGluIHRoZSBjYXB0dXJlIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uTWluRHVyYXRpb25DaGFuZ2VkKG5zZWNzX3QgZHVyYXRpb24pID0gMDsKIH07CiAKIC8vIEhlbHBlciBjbGFzcyB0byBvcmdhbml6ZSBhIHN5bmNocm9uaXplZCBtYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwCmluZGV4IDlmMjI1ZDAuLmVkNjZkZjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAKQEAgLTQyLDEwICs0MiwxMyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaCIKIAorI2luY2x1ZGUgInN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaCIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKIApAQCAtMzczLDQzICszNzYsNiBAQAogICAgIGluc2VydFJlc3VsdExvY2tlZChzdGF0ZXMsICZjYXB0dXJlUmVzdWx0LCBmcmFtZU51bWJlcik7CiB9CiAKLS8vIFJlYWRpbmcgb25lIGNhbWVyYSBtZXRhZGF0YSBmcm9tIHJlc3VsdCBhcmd1bWVudCB2aWEgZm1xIG9yIGZyb20gdGhlIHJlc3VsdAotLy8gQXNzdW1pbmcgdGhlIGZtcSBpcyBwcm90ZWN0ZWQgYnkgYSBsb2NrIGFscmVhZHkKLXN0YXR1c190IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZCgKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiBmbXEsCi0gICAgICAgIHVpbnQ2NF90IGZtcVJlc3VsdFNpemUsCi0gICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXN1bHQpIHsKLSAgICBpZiAoZm1xUmVzdWx0U2l6ZSA+IDApIHsKLSAgICAgICAgcmVzdWx0TWV0YWRhdGEucmVzaXplKGZtcVJlc3VsdFNpemUpOwotICAgICAgICBpZiAoZm1xID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7IC8vIGxvZ2dlZCBpbiBpbml0aWFsaXplKCkKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZtcS0+cmVhZChyZXN1bHRNZXRhZGF0YS5kYXRhKCksIGZtcVJlc3VsdFNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFkIGNhbWVyYSBtZXRhZGF0YSBmcm9tIGZtcSwgc2l6ZSA9ICUiIFBSSXU2NCwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmbXFSZXN1bHRTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdE1ldGFkYXRhLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KHJlc3VsdC5kYXRhKCkpLAotICAgICAgICAgICAgICAgIHJlc3VsdC5zaXplKCkpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHRNZXRhZGF0YS5zaXplKCkgIT0gMCkgewotICAgICAgICBzdGF0dXNfdCByZXM7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7Ci0gICAgICAgIHNpemVfdCBleHBlY3RlZF9tZXRhZGF0YV9zaXplID0gcmVzdWx0TWV0YWRhdGEuc2l6ZSgpOwotICAgICAgICBpZiAoKHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUobWV0YWRhdGEsICZleHBlY3RlZF9tZXRhZGF0YV9zaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgYnkgY2FtZXJhIHNlcnZpY2UgZnJvbSBIQUw6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCiB2b2lkIHJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLCBpbnQgaWR4KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBJbkZsaWdodFJlcXVlc3RNYXAmIGluZmxpZ2h0TWFwID0gc3RhdGVzLmluZmxpZ2h0TWFwOwpAQCAtNDYwLDE2ICs0MjYsMTYgQEAKICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgIHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBzdGF0ZXMubGlzdGVuZXIsCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAogICAgICAgICAgICAgLypyZXF1ZXN0ZWQqL3RydWUsIHJlcXVlc3QucmVxdWVzdFRpbWVOcywgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIsCiAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCiAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKLSAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JCdWZTdHJhdGVneSk7CisgICAgICAgICAgICByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3ksIHJlcXVlc3QudHJhbnNmb3JtKTsKIAogICAgICAgICAvLyBOb3RlIGRvd24gdGhlIGp1c3QgY29tcGxldGVkIGZyYW1lIG51bWJlcgogICAgICAgICBpZiAocmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcikgewogICAgICAgICAgICAgc3RhdGVzLmxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwotICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuenNsQ2FwdHVyZSkgeworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuenNsQ2FwdHVyZSAmJiByZXF1ZXN0LnN0aWxsQ2FwdHVyZSkgewogICAgICAgICAgICAgc3RhdGVzLmxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RhdGVzLmxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKQEAgLTU1NSw2ICs1MjEsMzEgQEAKICAgICAgICAgaWYgKHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgIT0gMCkKICAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQ7CiAKKyAgICAgICAgaWYgKChyZXN1bHQtPnJlc3VsdCAhPSBudWxscHRyKSAmJiAhc3RhdGVzLmxlZ2FjeUNsaWVudCkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5OworICAgICAgICAgICAgYXV0byByZXQgPSBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShyZXN1bHQtPnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQsICZlbnRyeSk7CisgICAgICAgICAgICBpZiAoKHJldCA9PSBPSykgJiYgKGVudHJ5LmNvdW50ID4gMCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbElkKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihlbnRyeS5kYXRhLnU4KSk7CisgICAgICAgICAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gc3RhdGVzLnBoeXNpY2FsRGV2aWNlSW5mb01hcC5maW5kKHBoeXNpY2FsSWQpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvICE9IHN0YXRlcy5waHlzaWNhbERldmljZUluZm9NYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBvcmllbnRhdGlvbiA9IGRldmljZUluZm8tPnNlY29uZC5maW5kKEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uLmNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKGRldmljZUluZm8tPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTywgJnJlcXVlc3QudHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjYWxjdWxhdGUgY3VycmVudCBzdHJlYW0gdHJhbnNmb3JtYXRpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUGh5c2ljYWwgZGV2aWNlIG9yaWVudGF0aW9uIGFic2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBQaHlzaWNhbCBkZXZpY2Ugbm90IGZvdW5kIGluIGRldmljZSBpbmZvIG1hcCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVzdWx0IGNhcnJpZXMgb25seSBwYXJ0aWFsIG1ldGFkYXRhCiAgICAgICAgIGlmIChzdGF0ZXMudXNlUGFydGlhbFJlc3VsdCAmJiByZXN1bHQtPnJlc3VsdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAocmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCA+IHN0YXRlcy5udW1QYXJ0aWFsUmVzdWx0cyB8fCByZXN1bHQtPnBhcnRpYWxfcmVzdWx0IDwgMSkgewpAQCAtNjkxLDE2MiArNjgyLDE1IEBACiAgICAgfQogfQogCi12b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAotICAgICAgICBDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKSB7Ci0gICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI7Ci0gICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiBmbXEgPSBzdGF0ZXMuZm1xOwotICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGY7Ci0gICAgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHI7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHIuZnJhbWVfbnVtYmVyID0gcmVzdWx0LmZyYW1lTnVtYmVyOwotCi0gICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdCBtZXRhZGF0YS4KLSAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIHJlc3VsdE1ldGFkYXRhOwotICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZCgKLSAgICAgICAgICAgIGZtcSwgcmVzdWx0LmZtcVJlc3VsdFNpemUsCi0gICAgICAgICAgICByZXN1bHRNZXRhZGF0YSwgcmVzdWx0LnJlc3VsdCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHIucmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7Ci0KLSAgICAvLyBSZWFkIGFuZCB2YWxpZGF0ZSBwaHlzaWNhbCBjYW1lcmEgbWV0YWRhdGEKLSAgICBzaXplX3QgcGh5c1Jlc3VsdENvdW50ID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNDYW1JZHMocGh5c1Jlc3VsdENvdW50KTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqPiBwaHlDYW1NZXRhZGF0YXMocGh5c1Jlc3VsdENvdW50KTsKLSAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhPiBwaHlzUmVzdWx0TWV0YWRhdGE7Ci0gICAgcGh5c1Jlc3VsdE1ldGFkYXRhLnJlc2l6ZShwaHlzUmVzdWx0Q291bnQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgICByZXMgPSByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQoZm1xLCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLmZtcU1ldGFkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0sIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ubWV0YWRhdGEpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBmb3IgY2FtZXJhICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwaHlzQ2FtSWRzW2ldID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCk7Ci0gICAgICAgIHBoeUNhbU1ldGFkYXRhc1tpXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPigKLSAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0uZGF0YSgpKTsKLSAgICB9Ci0gICAgci5udW1fcGh5c2NhbV9tZXRhZGF0YSA9IHBoeXNSZXN1bHRDb3VudDsKLSAgICByLnBoeXNjYW1faWRzID0gcGh5c0NhbUlkcy5kYXRhKCk7Ci0gICAgci5waHlzY2FtX21ldGFkYXRhID0gcGh5Q2FtTWV0YWRhdGFzLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBzdGQ6OnZlY3RvcjxidWZmZXJfaGFuZGxlX3Q+IG91dHB1dEJ1ZmZlckhhbmRsZXMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOwotICAgICAgICBjb25zdCBTdHJlYW1CdWZmZXIgJmJTcmMgPSByZXN1bHQub3V0cHV0QnVmZmVyc1tpXTsKLQotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQoYlNyYy5zdHJlYW1JZCk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogSW52YWxpZCBvdXRwdXQgc3RyZWFtIGlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJEc3Quc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwotCi0gICAgICAgIGJvb2wgbm9CdWZmZXJSZXR1cm5lZCA9IGZhbHNlOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChzdGF0ZXMudXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBzdXNwaWNpb3VzIG1vc3Qgb2YgdGhlIHRpbWUgYnV0IGNhbiBiZSBjb3JyZWN0IGR1cmluZyBmbHVzaCB3aGVyZSBIQUwKLSAgICAgICAgICAgIC8vIGhhcyB0byByZXR1cm4gY2FwdHVyZSByZXN1bHQgYmVmb3JlIGEgYnVmZmVyIGlzIHJlcXVlc3RlZAotICAgICAgICAgICAgaWYgKGJTcmMuYnVmZmVySWQgPT0gQlVGRkVSX0lEX05PX0JVRkZFUikgewotICAgICAgICAgICAgICAgIGlmIChiU3JjLnN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGJ1ZmZlcklkIGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgcHJvY2VlZHMgc28gb3RoZXIgYnVmZmVycyBjYW4gYmUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9CdWZmZXJSZXR1cm5lZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgewotICAgICAgICAgICAgICAgIHJlcyA9IE9LOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSBidWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEhpZGxCdWZmZXJTdGF0dXMoYlNyYy5zdGF0dXMpOwotICAgICAgICBiRHN0LmFjcXVpcmVfZmVuY2UgPSAtMTsKLSAgICAgICAgaWYgKGJTcmMucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IC0xOwotICAgICAgICB9IGVsc2UgaWYgKGJTcmMucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdvdCByZWxlYXNlRmVuY2Ugd2l0aG91dCBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSBkdXAoYlNyYy5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBidWZmZXIgJXp1LCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5yZWxlYXNlRmVuY2UtPm51bUZkcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgci5udW1fb3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLnNpemUoKTsKLSAgICByLm91dHB1dF9idWZmZXJzID0gb3V0cHV0QnVmZmVycy5kYXRhKCk7Ci0KLSAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOwotICAgIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQgPT0gLTEpIHsKLSAgICAgICAgci5pbnB1dF9idWZmZXIgPSBudWxscHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzdGF0ZXMuaW5wdXRTdHJlYW0tPmdldElkKCkgIT0gcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGlucHV0IHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZyYW1lTnVtYmVyLCByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlucHV0QnVmZmVyLnN0cmVhbSA9IHN0YXRlcy5pbnB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7Ci0gICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmJ1ZmZlcik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IElucHV0IGJ1ZmZlcjogTm8gaW4tZmxpZ2h0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXRCdWZmZXIuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBpbnB1dEJ1ZmZlci5zdGF0dXMgPSBtYXBIaWRsQnVmZmVyU3RhdHVzKHJlc3VsdC5pbnB1dEJ1ZmZlci5zdGF0dXMpOwotICAgICAgICBpbnB1dEJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgICAgIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgewotICAgICAgICAgICAgaW5wdXRCdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgaW5wdXQgYnVmZmVyLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZS0+bnVtRmRzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByLmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKLSAgICB9Ci0KLSAgICByLnBhcnRpYWxfcmVzdWx0ID0gcmVzdWx0LnBhcnRpYWxSZXN1bHQ7Ci0KLSAgICBwcm9jZXNzQ2FwdHVyZVJlc3VsdChzdGF0ZXMsICZyKTsKLX0KLQogdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCiAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lciwKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAotICAgICAgICBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCi0gICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAorICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwKKyAgICAgICAgbnNlY3NfdCByZXF1ZXN0VGltZU5zLCBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZpblJlc3VsdEV4dHJhcywKLSAgICAgICAgRVJST1JfQlVGX1NUUkFURUdZIGVycm9yQnVmU3RyYXRlZ3kpIHsKKyAgICAgICAgRVJST1JfQlVGX1NUUkFURUdZIGVycm9yQnVmU3RyYXRlZ3ksIGludDMyX3QgdHJhbnNmb3JtKSB7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykKICAgICB7CkBAIC04ODgsMTIgKzczMiwxMiBAQAogICAgICAgICAgICAgICAgIGVycm9yQnVmU3RyYXRlZ3kgIT0gRVJST1JfQlVGX0NBQ0hFKSB7CiAgICAgICAgICAgICBpZiAoaXQgIT0gb3V0cHV0U3VyZmFjZXMuZW5kKCkpIHsKICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgaXQtPnNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQsIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCB0cmFuc2Zvcm0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCB0cmFuc2Zvcm0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzCkBAIC05MjMsOSArNzY3LDkgQEAKICAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgYnVmZmVyCiAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IHNiID0gb3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgICAgIHNiLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLAorICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLCAvKnJlYWRvdXRUaW1lc3RhbXAqLzAsCiAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCi0gICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHRyYW5zZm9ybSk7CiAKICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMgPSBpblJlc3VsdEV4dHJhczsKQEAgLTk0MSwxNCArNzg1LDE1IEBACiB2b2lkIHJldHVybkFuZFJlbW92ZVBlbmRpbmdPdXRwdXRCdWZmZXJzKGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyLCBJbkZsaWdodFJlcXVlc3QmIHJlcXVlc3QsCiAgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIpIHsKLSAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHJlcXVlc3QuenNsQ2FwdHVyZSB8fCByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKTsKKyAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPQorICAgICAgICAgICAgISgocmVxdWVzdC56c2xDYXB0dXJlICYmIHJlcXVlc3Quc3RpbGxDYXB0dXJlKSB8fCByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKTsKICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHVzZUhhbEJ1Zk1hbmFnZXIsIGxpc3RlbmVyLAogICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAogICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksCi0gICAgICAgICAgICByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXAsIC8qcmVxdWVzdGVkKi90cnVlLAotICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzZXNzaW9uU3RhdHNCdWlsZGVyLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgcmVxdWVzdC5zaHV0dGVyVGltZXN0YW1wLCByZXF1ZXN0LnNodXR0ZXJSZWFkb3V0VGltZXN0YW1wLAorICAgICAgICAgICAgLypyZXF1ZXN0ZWQqL3RydWUsIHJlcXVlc3QucmVxdWVzdFRpbWVOcywgc2Vzc2lvblN0YXRzQnVpbGRlciwgdGltZXN0YW1wSW5jcmVhc2luZywKICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLAotICAgICAgICAgICAgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JCdWZTdHJhdGVneSwgcmVxdWVzdC50cmFuc2Zvcm0pOwogCiAgICAgLy8gUmVtb3ZlIGVycm9yIGJ1ZmZlcnMgdGhhdCBhcmUgbm90IGNhY2hlZC4KICAgICBmb3IgKGF1dG8gaXRlciA9IHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKQEAgLTEwMDcsNiArODUyLDE0IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHIuc2h1dHRlclRpbWVzdGFtcCA9IG1zZy50aW1lc3RhbXA7CisgICAgICAgICAgICByLnNodXR0ZXJSZWFkb3V0VGltZXN0YW1wID0gbXNnLnJlYWRvdXRfdGltZXN0YW1wOworICAgICAgICAgICAgaWYgKHIubWluRXhwZWN0ZWREdXJhdGlvbiAhPSBzdGF0ZXMubWluRnJhbWVEdXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVzLm91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBvdXRwdXRTdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5vbk1pbkR1cmF0aW9uQ2hhbmdlZChyLm1pbkV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ZXMubWluRnJhbWVEdXJhdGlvbiA9IHIubWluRXhwZWN0ZWREdXJhdGlvbjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyLmhhc0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgQUxPR1ZWKCJDYW1lcmEgJXM6ICVzOiBTaHV0dGVyIGZpcmVkIGZvciBmcmFtZSAlZCAoaWQgJWQpIGF0ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLmNhbWVyYUlkLnN0cmluZygpLCBfX0ZVTkNUSU9OX18sCkBAIC0xMTY0LDI4OSArMTAxNyw2IEBACiAgICAgfQogfQogCi12b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpIHsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok1zZ1R5cGU7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpFcnJvckNvZGU7Ci0KLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNhbWVyYV9ub3RpZnlfbXNnIG07Ci0gICAgc3dpdGNoIChtc2cudHlwZSkgewotICAgICAgICBjYXNlIE1zZ1R5cGU6OkVSUk9SOgotICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19FUlJPUjsKLSAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLmVycm9yLmZyYW1lTnVtYmVyOwotICAgICAgICAgICAgaWYgKG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBudWxscHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChtc2cubXNnLmVycm9yLmVycm9yQ29kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVFVRVNUOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVRVUVTVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFU1VMVDoKLSAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0JVRkZFUjoKLSAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNc2dUeXBlOjpTSFVUVEVSOgotICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19TSFVUVEVSOwotICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gbXNnLm1zZy5zaHV0dGVyLmZyYW1lTnVtYmVyOwotICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wID0gbXNnLm1zZy5zaHV0dGVyLnRpbWVzdGFtcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBub3RpZnkoc3RhdGVzLCAmbSk7Ci19Ci0KLXZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s6OnJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzOwotICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0OwotICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOwotCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVzLnJlcUJ1ZmZlckxvY2spOwotCi0gICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gYnVmUmV0czsKLSAgICBpZiAoIXN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXRlcy5jYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOwotICAgIHNzaXplX3Qgc3ogPSBzdHJlYW1JZHMuc2V0Q2FwYWNpdHkoYnVmUmVxcy5zaXplKCkpOwotICAgIGlmIChzeiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzeikgIT0gYnVmUmVxcy5zaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlenUgYnVmZmVyIHJlcXVlc3RzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpKTsKLSAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChidWZSZXFzLnNpemUoKSA+IHN0YXRlcy5vdXRwdXRTdHJlYW1zLnNpemUoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHRvbyBtYW55IGJ1ZmZlciByZXF1ZXN0cyAoJXp1ID4gIyBvZiBvdXRwdXQgc3RyZWFtcyAlenUpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpLCBzdGF0ZXMub3V0cHV0U3RyZWFtcy5zaXplKCkpOwotICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIHN0cmVhbUlkCi0gICAgZm9yIChjb25zdCBhdXRvJiBidWZSZXEgOiBidWZSZXFzKSB7Ci0gICAgICAgIGlmIChzdHJlYW1JZHMuaW5kZXhPZihidWZSZXEuc3RyZWFtSWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gYnVmZmVyIHJlcXVlc3RzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXEuc3RyZWFtSWQpOwotICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1JZHMuYWRkKGJ1ZlJlcS5zdHJlYW1JZCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdGF0ZXMucmVxQnVmZmVySW50Zi5zdGFydFJlcXVlc3RCdWZmZXIoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgYnVmZmVyIGRpc2FsbG93ZWQgd2hpbGUgY2FtZXJhIHNlcnZpY2UgaXMgY29uZmlndXJpbmciLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9DT05GSUdVUklORywgYnVmUmV0cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBidWZSZXRzLnJlc2l6ZShidWZSZXFzLnNpemUoKSk7Ci0KLSAgICBib29sIGFsbFJlcXNTdWNjZWVkcyA9IHRydWU7Ci0gICAgYm9vbCBvbmVSZXFTdWNjZWVkcyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmUmVxcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBhdXRvJiBidWZSZXEgPSBidWZSZXFzW2ldOwotICAgICAgICBhdXRvJiBidWZSZXQgPSBidWZSZXRzW2ldOwotICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gYnVmUmVxLnN0cmVhbUlkOwotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOwotICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBlbXB0eUJ1ZlJldHM7Ci0gICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGVtcHR5QnVmUmV0cyk7Ci0gICAgICAgICAgICBzdGF0ZXMucmVxQnVmZmVySW50Zi5lbmRSZXF1ZXN0QnVmZmVyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBidWZSZXQuc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgewotICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBoYW5kT3V0QnVmZmVyQ291bnQgPSBvdXRwdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCk7Ci0gICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQgPSBidWZSZXEubnVtQnVmZmVyc1JlcXVlc3RlZDsKLSAgICAgICAgc2l6ZV90IHRvdGFsSGFuZG91dCA9IGhhbmRPdXRCdWZmZXJDb3VudCArIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7Ci0gICAgICAgIHVpbnQzMl90IG1heEJ1ZmZlcnMgPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCktPm1heF9idWZmZXJzOwotICAgICAgICBpZiAodG90YWxIYW5kb3V0ID4gbWF4QnVmZmVycykgewotICAgICAgICAgICAgLy8gTm90IGFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIGJ1ZmZlci4gRXhpdCBlYXJseSBmb3IgdGhpcyBzdHJlYW0KLSAgICAgICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCB0b28gbXVjaCBidWZmZXJzIGZvciBzdHJlYW0gJWQ6IGF0IEhBTDogJXp1ICsgcmVxdWVzdGluZzogJWQiCi0gICAgICAgICAgICAgICAgICAgICIgPiBtYXg6ICVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgaGFuZE91dEJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJzUmVxdWVzdGVkLCBtYXhCdWZmZXJzKTsKLSAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKLSAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyPiB0bXBSZXRCdWZmZXJzKG51bUJ1ZmZlcnNSZXF1ZXN0ZWQpOwotICAgICAgICBib29sIGN1cnJlbnRSZXFTdWNjZWVkcyA9IHRydWU7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7Ci0gICAgICAgIHNpemVfdCBudW1BbGxvY2F0ZWRCdWZmZXJzID0gMDsKLSAgICAgICAgc2l6ZV90IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycyA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQnVmZmVyc1JlcXVlc3RlZDsgYisrKSB7Ci0gICAgICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07Ci0gICAgICAgICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlcXVlc3QgdGhyZWFkCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgd2FpdCBkdXJhdGlvbiBldmVyeXRpbWUgd2UgY2FsbCBnZXRidWZmZXIKLSAgICAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0gIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmdldFdhaXREdXJhdGlvbigpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJnNiLCB3YWl0RHVyYXRpb24pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlci5zdG9wQ291bnRlcihzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQgfHwgcmVzID09IE5PX01FTU9SWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtQWxsb2NhdGVkQnVmZmVycysrOwotCi0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IHNiLmJ1ZmZlcjsKLSAgICAgICAgICAgIGF1dG8gcGFpciA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5nZXRCdWZmZXJJZCgqYnVmZmVyLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOwotCi0gICAgICAgICAgICBoQnVmLnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBoQnVmLmJ1ZmZlcklkID0gYnVmZmVySWQ7Ci0gICAgICAgICAgICBoQnVmLmJ1ZmZlciA9IChpc05ld0J1ZmZlcikgPyAqYnVmZmVyIDogbnVsbHB0cjsKLSAgICAgICAgICAgIGhCdWYuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKLSAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKLQotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHNiLmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNiLmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoQnVmLmFjcXVpcmVGZW5jZS5zZXRUbyhhY3F1aXJlRmVuY2UsIC8qc2hvdWxkT3duKi90cnVlKTsKLSAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKLQotICAgICAgICAgICAgcmVzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlciwgc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IHJlZ2lzdGVyIHJlcXVlc3QgYnVmZmVycyBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycysrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50UmVxU3VjY2VlZHMpIHsKLSAgICAgICAgICAgIGJ1ZlJldC52YWwuYnVmZmVycyhzdGQ6Om1vdmUodG1wUmV0QnVmZmVycykpOwotICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVyczsgYisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKLSAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCIlczogcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyIGZhaWxlZCBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgewotICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKLSAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCwgLypyZXF1ZXN0ZWQqL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAvKnJlcXVlc3RUaW1lTnMqLzAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIF9oaWRsX2NiKGFsbFJlcXNTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6Ok9LIDoKLSAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1BBUlRJQUwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfVU5LTk9XTiwKLSAgICAgICAgICAgIGJ1ZlJldHMpOwotICAgIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmVuZFJlcXVlc3RCdWZmZXIoKTsKLX0KLQotdm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7Ci0gICAgaWYgKCFzdGF0ZXMudXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlcm1lbnQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdGVzLmNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgYnVmIDogYnVmZmVycykgewotICAgICAgICBpZiAoYnVmLmJ1ZmZlcklkID09IEJVRkZFUl9JRF9OT19CVUZGRVIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIGJ1ZmZlciB3aXRob3V0IGJ1ZmZlcklkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKLQotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0ICIgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLmJ1ZmZlcklkLCBidWYuc3RyZWFtSWQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKLSAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICBzdHJlYW1CdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOwotICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOwotCi0gICAgICAgIGlmIChidWYucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnVmLnJlbGVhc2VGZW5jZS0+bnVtRmRzID09IDEpIHsKLSAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKGJ1Zi5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLnJlbGVhc2VGZW5jZS0+bnVtRmRzKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KGJ1Zi5zdHJlYW1JZCk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIGJ1Zi5zdHJlYW1JZCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwotICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAotICAgICAgICAgICAgICAgICZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwLCAvKnJlcXVlc3RlZCovZmFsc2UsCi0gICAgICAgICAgICAgICAgLypyZXF1ZXN0VGltZU5zKi8wLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlcik7Ci0gICAgfQotfQotCiB2b2lkIGZsdXNoSW5mbGlnaHRSZXF1ZXN0cyhGbHVzaEluZmxpZ2h0UmVxU3RhdGVzJiBzdGF0ZXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHsgLy8gRmlyc3QgcmV0dXJuIGJ1ZmZlcnMgY2FjaGVkIGluIGluRmxpZ2h0TWFwCkBAIC0xNDU2LDkgKzEwMjYsMTAgQEAKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwKICAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsIC8qcmVxdWVzdGVkKi90cnVlLAotICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdFRpbWVOcywgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIsIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgLyp0aW1lc3RhbXAqLzAsIC8qcmVhZG91dFRpbWVzdGFtcCovMCwKKyAgICAgICAgICAgICAgICAvKnJlcXVlc3RlZCovdHJ1ZSwgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JCdWZTdHJhdGVneSk7CiAgICAgICAgICAgICBBTE9HVygiJXM6IEZyYW1lICVkIHwgIFRpbWVzdGFtcDogJSIgUFJJZDY0ICIsIG1ldGFkYXRhIgogICAgICAgICAgICAgICAgICAgICAiIGFycml2ZWQ6ICVzLCBidWZmZXJzIGxlZnQ6ICVkLlxuIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuaW5mbGlnaHRNYXAua2V5QXQoaWR4KSwgcmVxdWVzdC5zaHV0dGVyVGltZXN0YW1wLApAQCAtMTUzMCw3ICsxMTAxLDcgQEAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhbFN0cmVhbS0+c3RyZWFtX3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVhZG91dFRpbWVzdGFtcCovMCwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCByZXR1cm4gb3V0cHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaAppbmRleCAxNDI4ODlhLi5kNjEwN2MyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgKQEAgLTM4LDcwICszOCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwotCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gewotICAgICAgICB1aW50MzJfdCBudW1fc3RyZWFtczsKLSAgICAgICAgY2FtZXJhX3N0cmVhbV90ICoqc3RyZWFtczsKLSAgICAgICAgdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7Ci0gICAgICAgIGJvb2wgaW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKLSAgICB9IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdCB7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNldHRpbmdzOwotICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICppbnB1dF9idWZmZXI7Ci0gICAgICAgIHVpbnQzMl90IG51bV9vdXRwdXRfYnVmZmVyczsKLSAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0X2J1ZmZlcnM7Ci0gICAgICAgIHVpbnQzMl90IG51bV9waHlzY2FtX3NldHRpbmdzOwotICAgICAgICBjb25zdCBjaGFyICoqcGh5c2NhbV9pZDsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKipwaHlzY2FtX3NldHRpbmdzOwotICAgICAgICBpbnQzMl90IGlucHV0X3dpZHRoOwotICAgICAgICBpbnQzMl90IGlucHV0X2hlaWdodDsKLSAgICB9IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCB7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJlc3VsdDsKLSAgICAgICAgdWludDMyX3QgbnVtX291dHB1dF9idWZmZXJzOwotICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRfYnVmZmVyczsKLSAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqaW5wdXRfYnVmZmVyOwotICAgICAgICB1aW50MzJfdCBwYXJ0aWFsX3Jlc3VsdDsKLSAgICAgICAgdWludDMyX3QgbnVtX3BoeXNjYW1fbWV0YWRhdGE7Ci0gICAgICAgIGNvbnN0IGNoYXIgKipwaHlzY2FtX2lkczsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKipwaHlzY2FtX21ldGFkYXRhOwotICAgIH0gY2FtZXJhX2NhcHR1cmVfcmVzdWx0X3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfc2h1dHRlcl9tc2cgewotICAgICAgICB1aW50MzJfdCBmcmFtZV9udW1iZXI7Ci0gICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcDsKLSAgICB9IGNhbWVyYV9zaHV0dGVyX21zZ190OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2Vycm9yX21zZyB7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKLSAgICAgICAgY2FtZXJhX3N0cmVhbV90ICplcnJvcl9zdHJlYW07Ci0gICAgICAgIGludCBlcnJvcl9jb2RlOwotICAgIH0gY2FtZXJhX2Vycm9yX21zZ190OwotCi0gICAgdHlwZWRlZiBlbnVtIGNhbWVyYV9lcnJvcl9tc2dfY29kZSB7Ci0gICAgICAgIENBTUVSQV9NU0dfRVJST1JfREVWSUNFID0gMSwKLSAgICAgICAgQ0FNRVJBX01TR19FUlJPUl9SRVFVRVNUID0gMiwKLSAgICAgICAgQ0FNRVJBX01TR19FUlJPUl9SRVNVTFQgPSAzLAotICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUiA9IDQsCi0gICAgICAgIENBTUVSQV9NU0dfTlVNX0VSUk9SUwotICAgIH0gY2FtZXJhX2Vycm9yX21zZ19jb2RlX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfbm90aWZ5X21zZyB7Ci0gICAgICAgIGludCB0eXBlOwotCi0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIGNhbWVyYV9lcnJvcl9tc2dfdCBlcnJvcjsKLSAgICAgICAgICAgIGNhbWVyYV9zaHV0dGVyX21zZ190IHNodXR0ZXI7Ci0gICAgICAgIH0gbWVzc2FnZTsKLSAgICB9IGNhbWVyYV9ub3RpZnlfbXNnX3Q7Ci0KICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBDYW1lcmEzRGV2aWNlL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbiBmb3IgSEFMIGNhbGxiYWNrcwogICAgICAqLwpAQCAtMTEyLDEzICs1MCwxNSBAQAogICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyLCAvLyBPbmx5IG5lZWRlZCB3aGVuIG91dHB1dFN1cmZhY2VzIGlzIG5vdCBlbXB0eQogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywKLSAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCByZXF1ZXN0ZWQsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgYm9vbCByZXF1ZXN0ZWQsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKICAgICAgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCiAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgb25seSBtZWFudCBmb3Igc3VyZmFjZSBzaGFyaW5nIHVzZSBjYXNlCiAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSwKICAgICAgICAgICAgIC8vIFVzZWQgdG8gc2VuZCBidWZmZXIgZXJyb3IgY2FsbGJhY2sgd2hlbiBmYWlsaW5nIHRvIHJldHVybiBidWZmZXIKICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcyA9IENhcHR1cmVSZXN1bHRFeHRyYXN7fSwKLSAgICAgICAgICAgIEVSUk9SX0JVRl9TVFJBVEVHWSBlcnJvckJ1ZlN0cmF0ZWd5ID0gRVJST1JfQlVGX1JFVFVSTik7CisgICAgICAgICAgICBFUlJPUl9CVUZfU1RSQVRFR1kgZXJyb3JCdWZTdHJhdGVneSA9IEVSUk9SX0JVRl9SRVRVUk4sCisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSA9IC0xKTsKIAogICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG91dHB1dCBidWZmZXJzIHRvIG91dHB1dCBzdHJlYW1zLCBhbmQKICAgICAvLyByZW1vdmUgdGhlIHJldHVybmVkIGJ1ZmZlcnMgZnJvbSB0aGUgaW5mbGlnaHQgcmVxdWVzdCdzIHBlbmRpbmcgYnVmZmVycwpAQCAtMTUzLDcgKzkzLDYgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdmVuZG9yVGFnSWQ7CiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvOwogICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxEZXZpY2VJbmZvTWFwOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBjYW1lcmEzOjpEaXN0b3J0aW9uTWFwcGVyPiYgZGlzdG9ydGlvbk1hcHBlcnM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyPiYgem9vbVJhdGlvTWFwcGVyczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBjYW1lcmEzOjpSb3RhdGVBbmRDcm9wTWFwcGVyPiYgcm90YXRlQW5kQ3JvcE1hcHBlcnM7CkBAIC0xNjUsMTkgKzEwNCwxMiBAQAogICAgICAgICBTZXRFcnJvckludGVyZmFjZSYgc2V0RXJySW50ZjsKICAgICAgICAgSW5mbGlnaHRSZXF1ZXN0VXBkYXRlSW50ZXJmYWNlJiBpbmZsaWdodEludGY7CiAgICAgICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHNJbnRmOworICAgICAgICBib29sIGxlZ2FjeUNsaWVudDsKKyAgICAgICAgbnNlY3NfdCYgbWluRnJhbWVEdXJhdGlvbjsKICAgICB9OwogCi0gICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIGNhbGxlcnMgaG9sZCB0aGUgbG9jayB0byBzZXJpYWxpemUgYWxsCi0gICAgLy8gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbHMKLSAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAotICAgICAgICAgICAgQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7Ci0KLSAgICAvLyBIYW5kbGUgb25lIG5vdGlmeSBtZXNzYWdlCi0gICAgdm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2cmIG1zZyk7CisgICAgdm9pZCBwcm9jZXNzQ2FwdHVyZVJlc3VsdChDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGNvbnN0IGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KTsKKyAgICB2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGNvbnN0IGNhbWVyYV9ub3RpZnlfbXNnICptc2cpOwogCiAgICAgc3RydWN0IFJlcXVlc3RCdWZmZXJTdGF0ZXMgewogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZDsKQEAgLTE5MCwxMCArMTIyLDYgQEAKICAgICAgICAgUmVxdWVzdEJ1ZmZlckludGVyZmFjZSYgcmVxQnVmZmVySW50ZjsKICAgICB9OwogCi0gICAgdm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrOjpyZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYik7Ci0KICAgICBzdHJ1Y3QgUmV0dXJuQnVmZmVyU3RhdGVzIHsKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQ7CiAgICAgICAgIGNvbnN0IGJvb2wgdXNlSGFsQnVmTWFuYWdlcjsKQEAgLTIwMiw5ICsxMzAsNiBAQAogICAgICAgICBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlJiBidWZmZXJSZWNvcmRzSW50ZjsKICAgICB9OwogCi0gICAgdm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycyk7Ci0KICAgICBzdHJ1Y3QgRmx1c2hJbmZsaWdodFJlcVN0YXRlcyB7CiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkOwogICAgICAgICBzdGQ6Om11dGV4JiBpbmZsaWdodExvY2s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHNUZW1wbGF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA1ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHNUZW1wbGF0ZWQuaApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfT1VUUFVUX1RFTVBMVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19PVVRQVVRfVEVNUExVVElMU19ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jb21tb24vTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oIgorCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK3RlbXBsYXRlIDxjbGFzcyBCdWZmZXJTdGF0dXNUeXBlPgorY2FtZXJhX2J1ZmZlcl9zdGF0dXNfdCBtYXBCdWZmZXJTdGF0dXMoQnVmZmVyU3RhdHVzVHlwZSBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1c1R5cGU6Ok9LOiByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0s7CisgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzVHlwZTo6RVJST1I6IHJldHVybiBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOworfQorCitpbmxpbmUgdm9pZCByZWFkQnVmZmVyRnJvbVZlYyhoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gJmRzdCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+ICZzcmMpIHsKKyAgICAvLyBOb3QgY2xvbmluZyBoZXJlIHNpbmNlIHRoYXQgd2lsbCBiZSBkb25lIGluIHByb2Nlc3NDYXB0dXJlUmVzdWx0IHdoaWwKKyAgICAvLyBhc3NpZ25pbmcgdG8gQ2FtZXJhTWV0YWRhdGEuCisgICAgZHN0LnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KHNyYy5kYXRhKCkpLCBzcmMuc2l6ZSgpKTsKK30KKworaW5saW5lIHZvaWQgcmVhZEJ1ZmZlckZyb21WZWMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNyYykgeworICAgIGRzdCA9IHNyYzsKK30KKworLy8gUmVhZGluZyBvbmUgY2FtZXJhIG1ldGFkYXRhIGZyb20gcmVzdWx0IGFyZ3VtZW50IHZpYSBmbXEgb3IgZnJvbSB0aGUgcmVzdWx0CisvLyBBc3N1bWluZyB0aGUgZm1xIGlzIHByb3RlY3RlZCBieSBhIGxvY2sgYWxyZWFkeQordGVtcGxhdGUgPGNsYXNzIEZtcVR5cGUsIGNsYXNzIEZtcVBheWxvYWRUeXBlLCBjbGFzcyBNZXRhZGF0YVR5cGU+CitzdGF0dXNfdCByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWRUKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Rm1xVHlwZT4mIGZtcSwKKyAgICAgICAgdWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKKyAgICAgICAgTWV0YWRhdGFUeXBlJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgTWV0YWRhdGFUeXBlJiByZXN1bHQpIHsKKyAgICBpZiAoZm1xUmVzdWx0U2l6ZSA+IDApIHsKKyAgICAgICAgcmVzdWx0TWV0YWRhdGEucmVzaXplKGZtcVJlc3VsdFNpemUpOworICAgICAgICBpZiAoZm1xID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7IC8vIGxvZ2dlZCBpbiBpbml0aWFsaXplKCkKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZtcS0+cmVhZChyZWludGVycHJldF9jYXN0PEZtcVBheWxvYWRUeXBlICo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSksIGZtcVJlc3VsdFNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFkIGNhbWVyYSBtZXRhZGF0YSBmcm9tIGZtcSwgc2l6ZSA9ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmbXFSZXN1bHRTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRCdWZmZXJGcm9tVmVjKHJlc3VsdE1ldGFkYXRhLCByZXN1bHQpOworICAgIH0KKworICAgIGlmIChyZXN1bHRNZXRhZGF0YS5zaXplKCkgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCByZXM7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgIHNpemVfdCBleHBlY3RlZF9tZXRhZGF0YV9zaXplID0gcmVzdWx0TWV0YWRhdGEuc2l6ZSgpOworICAgICAgICBpZiAoKHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUobWV0YWRhdGEsICZleHBlY3RlZF9tZXRhZGF0YV9zaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgYnkgY2FtZXJhIHNlcnZpY2UgZnJvbSBIQUw6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbmxpbmUgYm9vbCBpc0hhbmRsZU51bGwoY29uc3QgaGFyZHdhcmU6OmhpZGxfaGFuZGxlICZoYW5kbGUpIHsKKyAgICByZXR1cm4gaGFuZGxlID09IG51bGxwdHI7Cit9CisKK2lubGluZSBib29sIGlzSGFuZGxlTnVsbChjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiAoaGFuZGxlLmZkcy5zaXplKCkgPT0gMCkgJiYgKGhhbmRsZS5pbnRzLnNpemUoKSA9PSAwKTsKK30KKworaW5saW5lIHNpemVfdCBudW1GZHNJbkhhbmRsZShjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiBoYW5kbGUtPm51bUZkczsKK30KKworaW5saW5lIHNpemVfdCBudW1GZHNJbkhhbmRsZShjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiBoYW5kbGUuZmRzLnNpemUoKTsKK30KKworaW5saW5lIGludDMyX3QgZ2V0SGFuZGxlRmlyc3RGZChjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUgJmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZS0+ZGF0YVswXTsKK30KKworaW5saW5lIGludDMyX3QgZ2V0SGFuZGxlRmlyc3RGZChjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUgJmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUuZmRzLnNpemUoKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZS5mZHNbMF0uZ2V0KCk7Cit9CisKK2lubGluZSBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4mCitnZXRSZXN1bHRNZXRhZGF0YShjb25zdCBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhICZyZXN1bHQpIHsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mCitnZXRSZXN1bHRNZXRhZGF0YShjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhICZyZXN1bHQpIHsKKyAgICByZXR1cm4gcmVzdWx0Lm1ldGFkYXRhOworfQorCisvLyBGbXFwYXlsb2FkIHR5cGUgaXMgbmVlZGVkIHNpbmNlIEFJREwgZ2VuZXJhdGVzIGFuIGZtcSBvZiBwYXlsb2FkIHR5cGUgaW50OF90CisvLyBmb3IgYSBieXRlIGZtcSB2cyBNZXRhZGF0YVR5cGUgd2hpY2ggaXMgdWludDhfdC4gRm9yIEhJREwsIHRoZSBzYW1lIHR5cGUgaXMKKy8vIGdlbmVyYXRlZCBmb3IgbWV0YWRhdGEgYW5kIGZtcSBwYXlsb2FkIDogdWludDhfdC4KK3RlbXBsYXRlIDxjbGFzcyBTdGF0ZXNUeXBlLCBjbGFzcyBDYXB0dXJlUmVzdWx0VHlwZSwgY2xhc3MgUGh5c01ldGFkYXRhVHlwZSwgY2xhc3MgTWV0YWRhdGFUeXBlLAorICAgICAgICAgY2xhc3MgRm1xVHlwZSwgY2xhc3MgQnVmZmVyU3RhdHVzVHlwZSwgY2xhc3MgRm1xUGF5bG9hZFR5cGUgPSB1aW50OF90Pgordm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZFQoCisgICAgICAgIFN0YXRlc1R5cGUmIHN0YXRlcywKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdFR5cGUmIHJlc3VsdCwKKyAgICAgICAgY29uc3QgUGh5c01ldGFkYXRhVHlwZSAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxGbXFUeXBlPiYgZm1xID0gc3RhdGVzLmZtcTsKKyAgICBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlJiBidWZmZXJSZWNvcmRzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmOworICAgIGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCByOworICAgIHN0YXR1c190IHJlczsKKyAgICByLmZyYW1lX251bWJlciA9IHJlc3VsdC5mcmFtZU51bWJlcjsKKworICAgIC8vIFJlYWQgYW5kIHZhbGlkYXRlIHRoZSByZXN1bHQgbWV0YWRhdGEuCisgICAgTWV0YWRhdGFUeXBlIHJlc3VsdE1ldGFkYXRhOworICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZFQ8Rm1xVHlwZSwgRm1xUGF5bG9hZFR5cGUsIE1ldGFkYXRhVHlwZT4oCisgICAgICAgICAgICBmbXEsIHJlc3VsdC5mbXFSZXN1bHRTaXplLAorICAgICAgICAgICAgcmVzdWx0TWV0YWRhdGEsIGdldFJlc3VsdE1ldGFkYXRhKHJlc3VsdC5yZXN1bHQpKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgci5yZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKKworICAgIC8vIFJlYWQgYW5kIHZhbGlkYXRlIHBoeXNpY2FsIGNhbWVyYSBtZXRhZGF0YQorICAgIHNpemVfdCBwaHlzUmVzdWx0Q291bnQgPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhLnNpemUoKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c0NhbUlkcyhwaHlzUmVzdWx0Q291bnQpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICo+IHBoeUNhbU1ldGFkYXRhcyhwaHlzUmVzdWx0Q291bnQpOworICAgIHN0ZDo6dmVjdG9yPE1ldGFkYXRhVHlwZT4gcGh5c1Jlc3VsdE1ldGFkYXRhOworICAgIHBoeXNSZXN1bHRNZXRhZGF0YS5yZXNpemUocGh5c1Jlc3VsdENvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkVDxGbXFUeXBlLCBGbXFQYXlsb2FkVHlwZSwgTWV0YWRhdGFUeXBlPihmbXEsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5mbXFNZXRhZGF0YVNpemUsCisgICAgICAgICAgICAgICAgcGh5c1Jlc3VsdE1ldGFkYXRhW2ldLCBnZXRSZXN1bHRNZXRhZGF0YShwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLm1ldGFkYXRhKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBoeXNDYW1JZHNbaV0gPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgcGh5Q2FtTWV0YWRhdGFzW2ldID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocGh5c1Jlc3VsdE1ldGFkYXRhW2ldLmRhdGEoKSk7CisgICAgfQorICAgIHIubnVtX3BoeXNjYW1fbWV0YWRhdGEgPSBwaHlzUmVzdWx0Q291bnQ7CisgICAgci5waHlzY2FtX2lkcyA9IHBoeXNDYW1JZHMuZGF0YSgpOworICAgIHIucGh5c2NhbV9tZXRhZGF0YSA9IHBoeUNhbU1ldGFkYXRhcy5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfc3RyZWFtX2J1ZmZlcl90PiBvdXRwdXRCdWZmZXJzKHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8YnVmZmVyX2hhbmRsZV90PiBvdXRwdXRCdWZmZXJIYW5kbGVzKHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQub3V0cHV0QnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvJiBiRHN0ID0gb3V0cHV0QnVmZmVyc1tpXTsKKyAgICAgICAgY29uc3QgYXV0byAmYlNyYyA9IHJlc3VsdC5vdXRwdXRCdWZmZXJzW2ldOworCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBJbnZhbGlkIG91dHB1dCBzdHJlYW0gaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYkRzdC5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisKKyAgICAgICAgYm9vbCBub0J1ZmZlclJldHVybmVkID0gZmFsc2U7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHN1c3BpY2lvdXMgbW9zdCBvZiB0aGUgdGltZSBidXQgY2FuIGJlIGNvcnJlY3QgZHVyaW5nIGZsdXNoIHdoZXJlIEhBTAorICAgICAgICAgICAgLy8gaGFzIHRvIHJldHVybiBjYXB0dXJlIHJlc3VsdCBiZWZvcmUgYSBidWZmZXIgaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYlNyYy5idWZmZXJJZCA9PSBCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgaWYgKGJTcmMuc3RhdHVzID09IEJ1ZmZlclN0YXR1c1R5cGU6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGJ1ZmZlcklkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgcHJvY2VlZHMgc28gb3RoZXIgYnVmZmVycyBjYW4gYmUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9CdWZmZXJSZXR1cm5lZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBidWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOworICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEJ1ZmZlclN0YXR1czxCdWZmZXJTdGF0dXNUeXBlPihiU3JjLnN0YXR1cyk7CisgICAgICAgIGJEc3QuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBpZiAoaXNIYW5kbGVOdWxsKGJTcmMucmVsZWFzZUZlbmNlKSkgeworICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobnVtRmRzSW5IYW5kbGUoYlNyYy5yZWxlYXNlRmVuY2UpID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBnb3QgcmVsZWFzZUZlbmNlIHdpdGhvdXQgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gZHVwKGdldEhhbmRsZUZpcnN0RmQoYlNyYy5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgYnVmZmVyICV6dSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIChpbnQpbnVtRmRzSW5IYW5kbGUoYlNyYy5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICByLm51bV9vdXRwdXRfYnVmZmVycyA9IG91dHB1dEJ1ZmZlcnMuc2l6ZSgpOworICAgIHIub3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLmRhdGEoKTsKKworICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CisgICAgaWYgKHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9PSAtMSkgeworICAgICAgICByLmlucHV0X2J1ZmZlciA9IG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0YXRlcy5pbnB1dFN0cmVhbS0+Z2V0SWQoKSAhPSByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgaW5wdXQgc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5wdXRCdWZmZXIuc3RyZWFtID0gc3RhdGVzLmlucHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcjsKKyAgICAgICAgcmVzID0gYnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCwKKyAgICAgICAgICAgICAgICAmYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW5wdXQgYnVmZmVyOiBObyBpbi1mbGlnaHQgYnVmZmVyIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnB1dEJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIGlucHV0QnVmZmVyLnN0YXR1cyA9IG1hcEJ1ZmZlclN0YXR1czxCdWZmZXJTdGF0dXNUeXBlPihyZXN1bHQuaW5wdXRCdWZmZXIuc3RhdHVzKTsKKyAgICAgICAgaW5wdXRCdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBpZiAoaXNIYW5kbGVOdWxsKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UpKSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobnVtRmRzSW5IYW5kbGUocmVzdWx0LmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSkgPT0gMSkgeworICAgICAgICAgICAgaW5wdXRCdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChnZXRIYW5kbGVGaXJzdEZkKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgaW5wdXQgYnVmZmVyLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgKGludCludW1GZHNJbkhhbmRsZShyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgci5pbnB1dF9idWZmZXIgPSAmaW5wdXRCdWZmZXI7CisgICAgfQorCisgICAgci5wYXJ0aWFsX3Jlc3VsdCA9IHJlc3VsdC5wYXJ0aWFsUmVzdWx0OworCisgICAgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoc3RhdGVzLCAmcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBWZWNTdHJlYW1CdWZmZXJUeXBlPgordm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzVChSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3QgVmVjU3RyZWFtQnVmZmVyVHlwZSYgYnVmZmVycykgeworICAgIGlmICghc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZXJtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXRlcy5jYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZiA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1Zi5idWZmZXJJZCA9PSBCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBidWZmZXIgd2l0aG91dCBidWZmZXJJZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgYnVmZmVyICUiIFBSSXU2NCAiIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5idWZmZXJJZCwgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKworICAgICAgICBpZiAoaXNIYW5kbGVOdWxsKGJ1Zi5yZWxlYXNlRmVuY2UpKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKG51bUZkc0luSGFuZGxlKGJ1Zi5yZWxlYXNlRmVuY2UpID09IDEpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKGdldEhhbmRsZUZpcnN0RmQoYnVmLnJlbGVhc2VGZW5jZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKGludCludW1GZHNJbkhhbmRsZShidWYucmVsZWFzZUZlbmNlKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChidWYuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhzdGF0ZXMudXNlSGFsQnVmTWFuYWdlciwgLypsaXN0ZW5lciovbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgIC8qcmVxdWVzdGVkKi9mYWxzZSwgLypyZXF1ZXN0VGltZU5zKi8wLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlcik7CisgICAgfQorfQorCit9IC8vIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAppbmRleCAxNWNmN2Y0Li45MjE1ZjIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKQEAgLTMyLDExICszMiwxNSBAQAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBpbnQ2NF90IGR5bmFtaWNQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgaW50IG1pcnJvck1vZGUpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc011bHRpUmVzb2x1dGlvbiovZmFsc2UsIGR5bmFtaWNQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSksCiAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IHN0ZDo6bWluKHN1cmZhY2VzLnNpemUoKSwga01heE91dHB1dHMpOwogICAgIGlmIChzdXJmYWNlcy5zaXplKCkgPiBjb25zdW1lckNvdW50KSB7CkBAIC02Nyw3ICs3MSw3IEBACiAgICAgfQogCiAgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KGluaXRpYWxTdXJmYWNlcywgdXNhZ2UsIG1Vc2FnZSwgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMsCi0gICAgICAgICAgICBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0Rm9ybWF0KCksICZtQ29uc3VtZXIpOworICAgICAgICAgICAgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIGdldEZvcm1hdCgpLCAmbUNvbnN1bWVyLCBjYW1lcmFfc3RyZWFtOjpkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCB0byBzdHJlYW0gc3BsaXR0ZXI6ICVzKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTI0Nyw3ICsyNTEsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHJlcyA9IGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoKTsKKyAgICByZXMgPSBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKGZhbHNlLyphbGxvd1ByZXZpZXdSZXNwYWNlKi8pOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkOiAlcyglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTM4OCwxMyArMzkyLDE1IEBACiAgICAgICAgIGJvb2wgc2l6ZU1pc21hdGNoID0gKChzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5mb0l0LndpZHRoKSAhPSBnZXRXaWR0aCgpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChpbmZvSXQuaGVpZ2h0KSAhPSBnZXRIZWlnaHQoKSkpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6IGZhbHNlOwotICAgICAgICBpZiAoKGltZ1JlYWRlclVzYWdlICYmIHNpemVNaXNtYXRjaCkgfHwKKyAgICAgICAgYm9vbCBkeW5hbWljUmFuZ2VNaXNtYXRjaCA9IGR5bmFtaWNfcmFuZ2VfcHJvZmlsZSAhPSBpbmZvSXQuZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICAgICAgaWYgKChpbWdSZWFkZXJVc2FnZSAmJiBzaXplTWlzbWF0Y2gpIHx8IGR5bmFtaWNSYW5nZU1pc21hdGNoIHx8CiAgICAgICAgICAgICAgICAgKGluZm9JdC5mb3JtYXQgIT0gZ2V0T3JpZ2luYWxGb3JtYXQoKSAmJiBpbmZvSXQuZm9ybWF0ICE9IGdldEZvcm1hdCgpKSB8fAogICAgICAgICAgICAgICAgIChpbmZvSXQuZGF0YVNwYWNlICE9IGdldERhdGFTcGFjZSgpICYmCiAgICAgICAgICAgICAgICAgIGluZm9JdC5kYXRhU3BhY2UgIT0gZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU2hhcmVkIHN1cmZhY2UgcGFyYW1ldGVycyBmb3JtYXQ6IDB4JXggZGF0YVNwYWNlOiAweCV4ICIKLSAgICAgICAgICAgICAgICAgICAgIiBkb24ndCBtYXRjaCBzb3VyY2Ugc3RyZWFtIGZvcm1hdDogMHgleCAgZGF0YVNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBpbmZvSXQuZm9ybWF0LCBpbmZvSXQuZGF0YVNwYWNlLCBnZXRGb3JtYXQoKSwgZ2V0RGF0YVNwYWNlKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBTaGFyZWQgc3VyZmFjZSBwYXJhbWV0ZXJzIGZvcm1hdDogMHgleCBkYXRhU3BhY2U6IDB4JXggZHluYW1pYyByYW5nZSAweCUiCisgICAgICAgICAgICAgICAgICAgIFBSSXg2NCAiIGRvbid0IG1hdGNoIHNvdXJjZSBzdHJlYW0gZm9ybWF0OiAweCV4ICBkYXRhU3BhY2U6IDB4JXggZHluYW1pYyIKKyAgICAgICAgICAgICAgICAgICAgIiByYW5nZSAweCUiIFBSSXg2NCAsIF9fRlVOQ1RJT05fXywgaW5mb0l0LmZvcm1hdCwgaW5mb0l0LmRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgaW5mb0l0LmR5bmFtaWNSYW5nZVByb2ZpbGUsIGdldEZvcm1hdCgpLCBnZXREYXRhU3BhY2UoKSwgZHluYW1pY19yYW5nZV9wcm9maWxlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCmluZGV4IDRiNjM0MWIuLmFhYzNjMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCkBAIC0zOCw5ICszOCwxNCBAQAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAotICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOworICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSA9IGZhbHNlLAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggMDJiNjU4NS4uN2FkNjY0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgInN5c3RlbS93aW5kb3cuaCIKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1TdHJlYW0iCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKQEAgLTIzLDYgKzI1LDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKICNpbmNsdWRlICJ1dGlscy9UcmFjZUhGUi5oIgorI2luY2x1ZGUgInVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTUxLDcgKzU0LDggQEAKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UpIDoKICAgICBjYW1lcmFfc3RyZWFtKCksCiAgICAgbUlkKGlkKSwKICAgICBtU2V0SWQoc2V0SWQpLApAQCAtNzYsNyArODAsOSBAQAogICAgIG1PcmlnaW5hbERhdGFTcGFjZShkYXRhU3BhY2UpLAogICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLAogICAgIG1MYXN0VGltZXN0YW1wKDApLAotICAgIG1Jc011bHRpUmVzb2x1dGlvbihpc011bHRpUmVzb2x1dGlvbikgeworICAgIG1Jc011bHRpUmVzb2x1dGlvbihpc011bHRpUmVzb2x1dGlvbiksCisgICAgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZShkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUpLAorICAgIG1UaW1lc3RhbXBCYXNlKHRpbWVzdGFtcEJhc2UpIHsKIAogICAgIGNhbWVyYV9zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmFfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtODcsNiArOTMsOCBAQAogICAgIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzID0gMDsKICAgICBjYW1lcmFfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQgPSBtUGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKTsKICAgICBjYW1lcmFfc3RyZWFtOjpzZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCA9IHNlbnNvclBpeGVsTW9kZXNVc2VkOworICAgIGNhbWVyYV9zdHJlYW06OmR5bmFtaWNfcmFuZ2VfcHJvZmlsZSA9IGR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgY2FtZXJhX3N0cmVhbTo6dXNlX2Nhc2UgPSBzdHJlYW1Vc2VDYXNlOwogCiAgICAgaWYgKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CIHx8IGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpICYmCiAgICAgICAgICAgICBtYXhTaXplID09IDApIHsKQEAgLTE0Nyw2ICsxNTUsMTAgQEAKICAgICByZXR1cm4gbU9yaWdpbmFsRm9ybWF0OwogfQogCitpbnQ2NF90IENhbWVyYTNTdHJlYW06OmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06OmR5bmFtaWNfcmFuZ2VfcHJvZmlsZTsKK30KKwogdm9pZCBDYW1lcmEzU3RyZWFtOjpzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRkZW4pIHsKICAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbiA9IGRhdGFTcGFjZU92ZXJyaWRkZW47CiB9CkBAIC0xNjcsNiArMTc5LDE4IEBACiAgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzOwogfQogCitpbnQ2NF90IENhbWVyYTNTdHJlYW06OmdldFN0cmVhbVVzZUNhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06OnVzZV9jYXNlOworfQorCitpbnQgQ2FtZXJhM1N0cmVhbTo6Z2V0VGltZXN0YW1wQmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRpbWVzdGFtcEJhc2U7Cit9CisKK2Jvb2wgQ2FtZXJhM1N0cmVhbTo6aXNEZXZpY2VUaW1lQmFzZVJlYWx0aW1lKCkgY29uc3QgeworICAgIHJldHVybiBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lOworfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChib29sIHN1cHBvcnQpIHsKICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nID0gc3VwcG9ydDsKIH0KQEAgLTU1Nyw3ICs1ODEsOCBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByZXBhcmVkQnVmZmVySWR4OyBpKyspIHsKICAgICAgICAgbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KGkpLnJlbGVhc2VfZmVuY2UgPSAtMTsKICAgICAgICAgbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICByZXR1cm5CdWZmZXJMb2NrZWQobVByZXBhcmVkQnVmZmVyc1tpXSwgMCk7CisgICAgICAgIHJldHVybkJ1ZmZlckxvY2tlZChtUHJlcGFyZWRCdWZmZXJzW2ldLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgIC8qdHJhbnNmb3JtKi8gLTEpOwogICAgIH0KICAgICBtUHJlcGFyZWRCdWZmZXJzLmNsZWFyKCk7CiAgICAgbVByZXBhcmVkQnVmZmVySWR4ID0gMDsKQEAgLTcxMyw4ICs3MzgsOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKLSAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLCB1aW50NjRfdCBmcmFtZU51bWJlcikgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywgdWludDY0X3QgZnJhbWVOdW1iZXIsIGludDMyX3QgdHJhbnNmb3JtKSB7CiAgICAgQVRSQUNFX0hGUl9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC03NDMsNyArNzY4LDcgQEAKICAgICAgKgogICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgogICAgICAqLwotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChiLCB0aW1lc3RhbXAsIHN1cmZhY2VfaWRzKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYiwgdGltZXN0YW1wLCByZWFkb3V0VGltZXN0YW1wLCB0cmFuc2Zvcm0sIHN1cmZhY2VfaWRzKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYiwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlLCB0aW1lc3RhbXAsIGZyYW1lTnVtYmVyKTsKICAgICB9CkBAIC05MzEsNyArOTU2LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190LCBuc2Vjc190LCBpbnQzMl90LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtMTA3Nyw2ICsxMTAyLDUyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzU3RyZWFtOjpxdWV1ZUhEUk1ldGFkYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIsIHNwPEFOYXRpdmVXaW5kb3c+JiBhbncsCisgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgIGF1dG8mIG1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOworICAgIHN3aXRjaCAoZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTA6IHsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWk6OlNtcHRlMjA4Nj4gc21wdGUyMDg2OworICAgICAgICAgICAgYXV0byByZXMgPSBtYXBwZXIuZ2V0U21wdGUyMDg2KGJ1ZmZlciwgJnNtcHRlMjA4Nik7CisgICAgICAgICAgICBpZiAoKHJlcyA9PSBPSykgJiYgc21wdGUyMDg2Lmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgbWV0YVZhbHVlID0gc21wdGUyMDg2LnZhbHVlKCk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5UmVkLnggPSBtZXRhVmFsdWUucHJpbWFyeVJlZC54LAorICAgICAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQueSA9IG1ldGFWYWx1ZS5wcmltYXJ5UmVkLnksCisgICAgICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuLnggPSBtZXRhVmFsdWUucHJpbWFyeUdyZWVuLngsCisgICAgICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuLnkgPSBtZXRhVmFsdWUucHJpbWFyeUdyZWVuLnksCisgICAgICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUueCA9IG1ldGFWYWx1ZS5wcmltYXJ5Qmx1ZS54LAorICAgICAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlCbHVlLnkgPSBtZXRhVmFsdWUucHJpbWFyeUJsdWUueSwKKyAgICAgICAgICAgICAgICAgICAgLndoaXRlUG9pbnQueCA9IG1ldGFWYWx1ZS53aGl0ZVBvaW50LngsCisgICAgICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50LnkgPSBtZXRhVmFsdWUud2hpdGVQb2ludC55LAorICAgICAgICAgICAgICAgICAgICAubWF4THVtaW5hbmNlID0gbWV0YVZhbHVlLm1heEx1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IG1ldGFWYWx1ZS5taW5MdW1pbmFuY2V9OworICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfc21wdGUyMDg2X21ldGFkYXRhKGFudy5nZXQoKSwgJm1ldGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgQ291bGRuJ3QgcmV0cmlldmUgU21wdGUyMDg2IG1ldGFkYXRhICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMF9QTFVTOiB7CisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBzbXB0ZTIwOTRfNDA7CisgICAgICAgICAgICBhdXRvIHJlcyA9IG1hcHBlci5nZXRTbXB0ZTIwOTRfNDAoYnVmZmVyLCAmc21wdGUyMDk0XzQwKTsKKyAgICAgICAgICAgIGlmICgocmVzID09IE9LKSAmJiBzbXB0ZTIwOTRfNDAuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEoYW53LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc21wdGUyMDk0XzQwLnZhbHVlKCkuc2l6ZSgpLCBzbXB0ZTIwOTRfNDAudmFsdWUoKS5kYXRhKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgQ291bGRuJ3QgcmV0cmlldmUgU21wdGUyMDk0XzQwIG1ldGFkYXRhICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOby1vcAorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDVhMzY0YWIuLmQ0MjllNmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC0xMzgsNiArMTM4LDEwIEBACiAgICAgc3RhdGljIENhbWVyYTNTdHJlYW0qICAgICAgIGNhc3QoY2FtZXJhX3N0cmVhbSAqc3RyZWFtKTsKICAgICBzdGF0aWMgY29uc3QgQ2FtZXJhM1N0cmVhbSogY2FzdChjb25zdCBjYW1lcmFfc3RyZWFtICpzdHJlYW0pOwogCisgICAgLy8gUXVldWUgY29ycmVzcG9uZGluZyBIRFIgbWV0YWRhdGEgdG8gZ2l2ZW4gbmF0aXZlIHdpbmRvdy4KKyAgICBzdGF0aWMgdm9pZCBxdWV1ZUhEUk1ldGFkYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIsIHNwPEFOYXRpdmVXaW5kb3c+JiBhbncsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpOworCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBzdHJlYW0ncyBJRAogICAgICAqLwpAQCAtMTY4LDExICsxNzIsMTUgQEAKICAgICB2b2lkICAgICAgICAgICAgICBzZXRGb3JtYXRPdmVycmlkZShib29sIGZvcm1hdE92ZXJyaWRlbik7CiAgICAgYm9vbCAgICAgICAgICAgICAgaXNGb3JtYXRPdmVycmlkZGVuKCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgZ2V0T3JpZ2luYWxGb3JtYXQoKSBjb25zdDsKKyAgICBpbnQ2NF90ICAgICAgICAgICBnZXREeW5hbWljUmFuZ2VQcm9maWxlKCkgY29uc3Q7CiAgICAgdm9pZCAgICAgICAgICAgICAgc2V0RGF0YVNwYWNlT3ZlcnJpZGUoYm9vbCBkYXRhU3BhY2VPdmVycmlkZW4pOwogICAgIGJvb2wgICAgICAgICAgICAgIGlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0OwogICAgIGFuZHJvaWRfZGF0YXNwYWNlIGdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgZ2V0TWF4SGFsQnVmZmVycygpIGNvbnN0OwogICAgIGNvbnN0IFN0cmluZzgmICAgIHBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdDsKKyAgICBpbnQ2NF90ICAgICAgICAgICBnZXRTdHJlYW1Vc2VDYXNlKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgZ2V0VGltZXN0YW1wQmFzZSgpIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICAgIGlzRGV2aWNlVGltZUJhc2VSZWFsdGltZSgpIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgICAgICAgc2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KGJvb2wpIG92ZXJyaWRlOwogICAgIGJvb2wgICAgICAgICAgICAgIGdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOwpAQCAtMzUyLDkgKzM2MCw5IEBACiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCksCi0gICAgICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IDApOworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwLCBpbnQzMl90IHRyYW5zZm9ybSA9IC0xKTsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYV9zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCkBAIC01MDAsNyArNTA4LDggQEAKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSk7CiAKICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbUJ1ZmZlckZyZWVkTGlzdGVuZXI7CiAKQEAgLTUxNyw3ICs1MjYsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYV9zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgaW50MzJfdCB0cmFuc2Zvcm0sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcnNMb2NrZWQoc3RkOjp2ZWN0b3I8T3V0c3RhbmRpbmdCdWZmZXI+Kik7CkBAIC02MjMsNiArNjMyLDkgQEAKIAogICAgIGJvb2wgbUlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2U7CiAgICAgYm9vbCBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nID0gZmFsc2U7CisKKyAgICBib29sIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWU7CisgICAgaW50IG1UaW1lc3RhbXBCYXNlOwogfTsgLy8gY2xhc3MgQ2FtZXJhM1N0cmVhbQogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAppbmRleCAyZDMzOTdjLi42ODEyZTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyLmgiCkBAIC02NCw2ICs2NSw4IEBACiAgICAgY29uc3QgY2hhciogcGh5c2ljYWxfY2FtZXJhX2lkOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+IHNlbnNvcl9waXhlbF9tb2Rlc191c2VkOworICAgIGludDY0X3QgZHluYW1pY19yYW5nZV9wcm9maWxlOworICAgIGludDY0X3QgdXNlX2Nhc2U7CiB9IGNhbWVyYV9zdHJlYW1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgewpAQCAtMTA3LDE0ICsxMTAsNjEgQEAKICAgICAgICAgYm9vbCBmaW5hbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgYm9vbCBzdXBwb3J0c09mZmxpbmUgPSBmYWxzZTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+IHNlbnNvclBpeGVsTW9kZXNVc2VkOworICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZTsKKyAgICAgICAgaW50IHRpbWVzdGFtcEJhc2U7CisgICAgICAgIGludCBtaXJyb3JNb2RlOwogICAgICAgICBPdXRwdXRTdHJlYW1JbmZvKCkgOgogICAgICAgICAgICAgd2lkdGgoLTEpLCBoZWlnaHQoLTEpLCBmb3JtYXQoLTEpLCBkYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKLSAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UoMCkge30KKyAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UoMCksCisgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpLAorICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUKSwKKyAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UoT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCksCisgICAgICAgICAgICBtaXJyb3JNb2RlKE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pIHt9CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IF9jb25zdW1lclVzYWdlLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4mIF9zZW5zb3JQaXhlbE1vZGVzVXNlZCkgOgorICAgICAgICAgICAgICAgIHVpbnQ2NF90IF9jb25zdW1lclVzYWdlLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4mIF9zZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IF9keW5hbWljUmFuZ2VQcm9maWxlLCBpbnQgX3N0cmVhbVVzZUNhc2UsIGludCBfdGltZXN0YW1wQmFzZSwgaW50IF9taXJyb3JNb2RlKSA6CiAgICAgICAgICAgICB3aWR0aChfd2lkdGgpLCBoZWlnaHQoX2hlaWdodCksIGZvcm1hdChfZm9ybWF0KSwKICAgICAgICAgICAgIGRhdGFTcGFjZShfZGF0YVNwYWNlKSwgY29uc3VtZXJVc2FnZShfY29uc3VtZXJVc2FnZSksCi0gICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZChfc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHt9CisgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZChfc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpLCBkeW5hbWljUmFuZ2VQcm9maWxlKF9keW5hbWljUmFuZ2VQcm9maWxlKSwKKyAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UoX3N0cmVhbVVzZUNhc2UpLCB0aW1lc3RhbXBCYXNlKF90aW1lc3RhbXBCYXNlKSwgbWlycm9yTW9kZShfbWlycm9yTW9kZSkge30KK307CisKKy8vIFV0aWxpdHkgY2xhc3MgdG8gbG9jayBhbmQgdW5sb2NrIGEgR3JhcGhpY0J1ZmZlcgorY2xhc3MgR3JhcGhpY0J1ZmZlckxvY2tlciB7CitwdWJsaWM6CisgICAgR3JhcGhpY0J1ZmZlckxvY2tlcihzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIpIDogX2J1ZmZlcihidWZmZXIpIHt9CisKKyAgICBzdGF0dXNfdCBsb2NrQXN5bmModWludDMyX3QgdXNhZ2UsIHZvaWQqKiBkc3RCdWZmZXIsIGludCBmZW5jZUZkKSB7CisgICAgICAgIGlmIChfYnVmZmVyID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmICghX2xvY2tlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gIF9idWZmZXItPmxvY2tBc3luYyh1c2FnZSwgZHN0QnVmZmVyLCBmZW5jZUZkKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBfbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXR1c190IGxvY2tBc3luYyh2b2lkKiogZHN0QnVmZmVyLCBpbnQgZmVuY2VGZCkgeworICAgICAgICByZXR1cm4gbG9ja0FzeW5jKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sIGRzdEJ1ZmZlciwgZmVuY2VGZCk7CisgICAgfQorCisgICAgfkdyYXBoaWNCdWZmZXJMb2NrZXIoKSB7CisgICAgICAgIGlmIChfbG9ja2VkICYmIF9idWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byByZXMgPSBfYnVmZmVyLT51bmxvY2soKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byB1bmxvY2sgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gX2J1ZmZlcjsKKyAgICBib29sIF9sb2NrZWQgPSBmYWxzZTsKIH07CiAKIC8qKgpAQCAtMTU0LDYgKzIwNCw3IEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGludCAgICAgIGdldEZvcm1hdCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludDY0X3QgIGdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGVuKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzRm9ybWF0T3ZlcnJpZGRlbigpIGNvbnN0ID0gMDsKQEAgLTM1Nyw5ICs0MDgsOSBAQAogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCksCi0gICAgICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IDApID0gMDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCwgaW50MzJfdCB0cmFuc2Zvcm0gPSAtMSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCA1YzZjNTE4Li5mZDIzOTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0zNCwxMyArMzQsMTYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KIAorI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW0uaCIKKwogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1TcGxpdHRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Y29ubmVjdChjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzcDxTdXJmYWNlPj4gJnN1cmZhY2VzLAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCB1aW50NjRfdCBwcm9kdWNlclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywgdWludDMyX3Qgd2lkdGgsCi0gICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIpIHsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LCBhbmRyb2lkOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHNwPFN1cmZhY2U+KiBjb25zdW1lciwKKyAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewogICAgICAgICBTUF9MT0dFKCIlczogY29uc3VtZXIgcG9pbnRlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKQEAgLTYxLDYgKzY0LDcgQEAKIAogICAgIG1NYXhIYWxCdWZmZXJzID0gaGFsTWF4QnVmZmVyczsKICAgICBtQ29uc3VtZXJOYW1lID0gZ2V0VW5pcXVlQ29uc3VtZXJOYW1lKCk7CisgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUgPSBkeW5hbWljUmFuZ2VQcm9maWxlOwogICAgIC8vIEFkZCBvdXRwdXQgc3VyZmFjZXMuIFRoaXMgaGFzIHRvIGJlIGJlZm9yZSBjcmVhdGluZyBpbnRlcm5hbCBidWZmZXIgcXVldWUKICAgICAvLyBpbiBvcmRlciB0byBnZXQgbWF4IGNvbnN1bWVyIHNpZGUgYnVmZmVycy4KICAgICBmb3IgKGF1dG8gJml0IDogc3VyZmFjZXMpIHsKQEAgLTEzNiw2ICsxNDAsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1PdXRwdXRzLmNsZWFyKCk7CisgICAgbU91dHB1dFN1cmZhY2VzLmNsZWFyKCk7CiAgICAgbU91dHB1dFNsb3RzLmNsZWFyKCk7CiAgICAgbUNvbnN1bWVyQnVmZmVyQ291bnQuY2xlYXIoKTsKIApAQCAtMjU4LDYgKzI2Myw3IEBACiAKICAgICAvLyBBZGQgbmV3IGVudHJ5IGludG8gbU91dHB1dHMKICAgICBtT3V0cHV0c1tzdXJmYWNlSWRdID0gZ2JwOworICAgIG1PdXRwdXRTdXJmYWNlc1tzdXJmYWNlSWRdID0gb3V0cHV0UXVldWU7CiAgICAgbUNvbnN1bWVyQnVmZmVyQ291bnRbc3VyZmFjZUlkXSA9IG1heENvbnN1bWVyQnVmZmVyczsKICAgICBpZiAobUNvbnN1bWVyQnVmZmVyQ291bnRbc3VyZmFjZUlkXSA+IG1NYXhIYWxCdWZmZXJzKSB7CiAgICAgICAgIFNQX0xPR1coIiVzOiBDb25zdW1lciBidWZmZXIgY291bnQgJXp1IGxhcmdlciB0aGFuIG1heC4gSGFsIGJ1ZmZlcnM6ICV6dSIsIF9fRlVOQ1RJT05fXywKQEAgLTMxNiw2ICszMjIsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1PdXRwdXRzW3N1cmZhY2VJZF0gPSBudWxscHRyOworICAgIG1PdXRwdXRTdXJmYWNlc1tzdXJmYWNlSWRdID0gbnVsbHB0cjsKICAgICBtT3V0cHV0U2xvdHNbZ2JwXSA9IG51bGxwdHI7CiAgICAgZm9yIChjb25zdCBhdXRvICZpZCA6IHBlbmRpbmdCdWZmZXJJZHMpIHsKICAgICAgICAgZGVjcmVtZW50QnVmUmVmQ291bnRMb2NrZWQoaWQsIHN1cmZhY2VJZCk7CkBAIC0zNTYsNiArMzYzLDE0IEBACiAgICAgY29uc3QgQnVmZmVyVHJhY2tlciYgdHJhY2tlciA9ICoobUJ1ZmZlcnNbYnVmZmVySWRdKTsKICAgICBpbnQgc2xvdCA9IGdldFNsb3RGb3JPdXRwdXRMb2NrZWQob3V0cHV0LCB0cmFja2VyLmdldEJ1ZmZlcigpKTsKIAorICAgIGlmIChtT3V0cHV0U3VyZmFjZXNbc3VyZmFjZUlkXSAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyA9IG1PdXRwdXRTdXJmYWNlc1tzdXJmYWNlSWRdOworICAgICAgICBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtOjpxdWV1ZUhEUk1ldGFkYXRhKAorICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpLT5oYW5kbGUsIGFudywgbUR5bmFtaWNSYW5nZVByb2ZpbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBJbnZhbGlkIHN1cmZhY2UgaWQ6ICV6dSEiLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VJZCk7CisgICAgfQorCiAgICAgLy8gSW4gY2FzZSB0aGUgb3V0cHV0IEJ1ZmZlclF1ZXVlIGhhcyBpdHMgb3duIGxvY2ssIGlmIHdlIGhvbGQgc3BsaXR0ZXIgbG9jayB3aGlsZSBjYWxsaW5nCiAgICAgLy8gcXVldWVCdWZmZXIgKHdoaWNoIHdpbGwgdHJ5IHRvIGFjcXVpcmUgdGhlIG91dHB1dCBsb2NrKSwgdGhlIG91dHB1dCBjb3VsZCBiZSBob2xkaW5nIGl0cwogICAgIC8vIG93biBsb2NrIGNhbGxpbmcgcmVsZWFzZUJ1ZmZlciAod2hpY2ggIHdpbGwgdHJ5IHRvIGFjcXVpcmUgdGhlIHNwbGl0dGVyIGxvY2spLCBydW5uaW5nIGludG8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCmluZGV4IDRlYjQ1NWEuLjBmNzI4YTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCiAjaW5jbHVkZSA8Z3VpL0lDb25zdW1lckxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oPgpAQCAtNTUsNyArNTcsOCBAQAogICAgIC8vIHdpdGggb3V0cHV0IHN1cmZhY2VzLgogICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+ICZzdXJmYWNlcywKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHVpbnQ2NF90IHByb2R1Y2VyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCB1aW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIpOworICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LCBhbmRyb2lkOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHNwPFN1cmZhY2U+KiBjb25zdW1lciwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSk7CiAKICAgICAvLyBhZGRPdXRwdXQgYWRkcyBhbiBvdXRwdXQgQnVmZmVyUXVldWUgdG8gdGhlIHNwbGl0dGVyLiBUaGUgc3BsaXR0ZXIKICAgICAvLyBjb25uZWN0cyB0byBvdXRwdXRRdWV1ZSBhcyBhIENQVSBwcm9kdWNlciwgYW5kIGFueSBidWZmZXJzIHF1ZXVlZApAQCAtMjMyLDYgKzIzNSw3IEBACiAgICAgdWludDMyX3QgbUhlaWdodCA9IDA7CiAgICAgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgbUZvcm1hdCA9IGFuZHJvaWQ6OlBJWEVMX0ZPUk1BVF9OT05FOwogICAgIHVpbnQ2NF90IG1Qcm9kdWNlclVzYWdlID0gMDsKKyAgICBpbnQgbUR5bmFtaWNSYW5nZVByb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOwogCiAgICAgLy8gVGhlIGF0dGFjaEJ1ZmZlciBjYWxsIHdpbGwgaGFwcGVuIG9uIGRpZmZlcmVudCB0aHJlYWQgYWNjb3JkaW5nIHRvIG1Vc2VIYWxCdWZNYW5hZ2VyIGFuZCBoYXZlCiAgICAgLy8gZGlmZmVyZW50IHRpbWluZyBjb25zdHJhaW50LgpAQCAtMjUxLDYgKzI1NSw5IEBACiAgICAgLy9NYXAgc3VyZmFjZSBpZHMgLT4gZ2JwIG91dHB1dHMKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+IG1PdXRwdXRzOwogCisgICAgLy9NYXAgc3VyZmFjZSBpZHMgLT4gZ2JwIG91dHB1dHMKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzcDxTdXJmYWNlPj4gbU91dHB1dFN1cmZhY2VzOworCiAgICAgLy9NYXAgc3VyZmFjZSBpZHMgLT4gY29uc3VtZXIgYnVmZmVyIGNvdW50CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc2l6ZV90ID4gbUNvbnN1bWVyQnVmZmVyQ291bnQ7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCmluZGV4IDg5ZGQxMTUuLjE1ODA3YmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGNtYXRoPgogCiAjaW5jbHVkZSAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmgiCi0jaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgKaW5kZXggNTIzYTJjNy4uNDkzYTllMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oCkBAIC0zMCw2ICszMCw2NyBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiB7CisgICAgdWludDMyX3QgbnVtX3N0cmVhbXM7CisgICAgY2FtZXJhX3N0cmVhbV90ICoqc3RyZWFtczsKKyAgICB1aW50MzJfdCBvcGVyYXRpb25fbW9kZTsKKyAgICBib29sIGlucHV0X2lzX211bHRpX3Jlc29sdXRpb247Cit9IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90OworCit0eXBlZGVmIHN0cnVjdCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0IHsKKyAgICB1aW50MzJfdCBmcmFtZV9udW1iZXI7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNldHRpbmdzOworICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKmlucHV0X2J1ZmZlcjsKKyAgICB1aW50MzJfdCBudW1fb3V0cHV0X2J1ZmZlcnM7CisgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0X2J1ZmZlcnM7CisgICAgdWludDMyX3QgbnVtX3BoeXNjYW1fc2V0dGluZ3M7CisgICAgY29uc3QgY2hhciAqKnBoeXNjYW1faWQ7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKipwaHlzY2FtX3NldHRpbmdzOworICAgIGludDMyX3QgaW5wdXRfd2lkdGg7CisgICAgaW50MzJfdCBpbnB1dF9oZWlnaHQ7Cit9IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHsKKyAgICB1aW50MzJfdCBmcmFtZV9udW1iZXI7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJlc3VsdDsKKyAgICB1aW50MzJfdCBudW1fb3V0cHV0X2J1ZmZlcnM7CisgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0X2J1ZmZlcnM7CisgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqaW5wdXRfYnVmZmVyOworICAgIHVpbnQzMl90IHBhcnRpYWxfcmVzdWx0OworICAgIHVpbnQzMl90IG51bV9waHlzY2FtX21ldGFkYXRhOworICAgIGNvbnN0IGNoYXIgKipwaHlzY2FtX2lkczsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fbWV0YWRhdGE7Cit9IGNhbWVyYV9jYXB0dXJlX3Jlc3VsdF90OworCit0eXBlZGVmIHN0cnVjdCBjYW1lcmFfc2h1dHRlcl9tc2cgeworICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXA7CisgICAgdWludDY0X3QgcmVhZG91dF90aW1lc3RhbXA7Cit9IGNhbWVyYV9zaHV0dGVyX21zZ190OworCit0eXBlZGVmIHN0cnVjdCBjYW1lcmFfZXJyb3JfbXNnIHsKKyAgICB1aW50MzJfdCBmcmFtZV9udW1iZXI7CisgICAgY2FtZXJhX3N0cmVhbV90ICplcnJvcl9zdHJlYW07CisgICAgaW50IGVycm9yX2NvZGU7Cit9IGNhbWVyYV9lcnJvcl9tc2dfdDsKKwordHlwZWRlZiBlbnVtIGNhbWVyYV9lcnJvcl9tc2dfY29kZSB7CisgICAgQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0UgPSAxLAorICAgIENBTUVSQV9NU0dfRVJST1JfUkVRVUVTVCA9IDIsCisgICAgQ0FNRVJBX01TR19FUlJPUl9SRVNVTFQgPSAzLAorICAgIENBTUVSQV9NU0dfRVJST1JfQlVGRkVSID0gNCwKKyAgICBDQU1FUkFfTVNHX05VTV9FUlJPUlMKK30gY2FtZXJhX2Vycm9yX21zZ19jb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9ub3RpZnlfbXNnIHsKKyAgICBpbnQgdHlwZTsKKworICAgIHVuaW9uIHsKKyAgICAgICAgY2FtZXJhX2Vycm9yX21zZ190IGVycm9yOworICAgICAgICBjYW1lcmFfc2h1dHRlcl9tc2dfdCBzaHV0dGVyOworICAgIH0gbWVzc2FnZTsKK30gY2FtZXJhX25vdGlmeV9tc2dfdDsKKwogdHlwZWRlZiBlbnVtIHsKICAgICAvLyBDYWNoZSB0aGUgYnVmZmVycyB3aXRoIFNUQVRVU19FUlJPUiB3aXRoaW4gSW5GbGlnaHRSZXF1ZXN0CiAgICAgRVJST1JfQlVGX0NBQ0hFLApAQCAtNDEsOSArMTAyLDEwIEBACiB9IEVSUk9SX0JVRl9TVFJBVEVHWTsKIAogc3RydWN0IEluRmxpZ2h0UmVxdWVzdCB7Ci0KICAgICAvLyBTZXQgYnkgbm90aWZ5KCkgU0hVVFRFUiBjYWxsLgogICAgIG5zZWNzX3Qgc2h1dHRlclRpbWVzdGFtcDsKKyAgICAvLyBTZXQgYnkgbm90aWZ5KCkgU0hVVFRFUiBjYWxsIHdpdGggcmVhZG91dCB0aW1lLgorICAgIG5zZWNzX3Qgc2h1dHRlclJlYWRvdXRUaW1lc3RhbXA7CiAgICAgLy8gU2V0IGJ5IHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQoKS4KICAgICBuc2Vjc190IHNlbnNvclRpbWVzdGFtcDsKICAgICBpbnQgICAgIHJlcXVlc3RTdGF0dXM7CkBAIC04MSw2ICsxNDMsMTEgQEAKICAgICAvLyBpcyBub3QgZm9yIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgcmVjb3JkaW5nLCB0aGlzIGZsYWcgd2lsbCBhbHNvIGJlIHRydWUuCiAgICAgYm9vbCBoYXNDYWxsYmFjazsKIAorICAgIC8vIE1pbmltdW0gZXhwZWN0ZWQgZnJhbWUgZHVyYXRpb24gZm9yIHRoaXMgcmVxdWVzdAorICAgIC8vIEZvciBtYW51YWwgY2FwdHVyZXMsIGVxdWFsIHRvIHRoZSBtYXggb2YgcmVxdWVzdGVkIGV4cG9zdXJlIHRpbWUgYW5kIGZyYW1lIGR1cmF0aW9uCisgICAgLy8gRm9yIGF1dG8tZXhwb3N1cmUgbW9kZXMsIGVxdWFsIHRvIDEvKGhpZ2hlciBlbmQgb2YgdGFyZ2V0IEZQUyByYW5nZSkKKyAgICBuc2Vjc190IG1pbkV4cGVjdGVkRHVyYXRpb247CisKICAgICAvLyBNYXhpbXVtIGV4cGVjdGVkIGZyYW1lIGR1cmF0aW9uIGZvciB0aGlzIHJlcXVlc3QuCiAgICAgLy8gRm9yIG1hbnVhbCBjYXB0dXJlcywgZXF1YWwgdG8gdGhlIG1heCBvZiByZXF1ZXN0ZWQgZXhwb3N1cmUgdGltZSBhbmQgZnJhbWUgZHVyYXRpb24KICAgICAvLyBGb3IgYXV0by1leHBvc3VyZSBtb2RlcywgZXF1YWwgdG8gMS8obG93ZXIgZW5kIG9mIHRhcmdldCBGUFMgcmFuZ2UpCkBAIC0xMjIsOCArMTg5LDExIEBACiAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bwogICAgIFN1cmZhY2VNYXAgb3V0cHV0U3VyZmFjZXM7CiAKLSAgICAvLyBUT0RPOiBkZWR1cGUKLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24gPSAxMDAwMDAwMDA7IC8vIDEwMCBtcworICAgIC8vIEN1cnJlbnQgb3V0cHV0IHRyYW5zZm9ybWF0aW9uCisgICAgaW50MzJfdCB0cmFuc2Zvcm07CisKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdE1pbkV4cGVjdGVkRHVyYXRpb24gPSAzMzMzMzMzMzsgLy8gMzMgbXMKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdE1heEV4cGVjdGVkRHVyYXRpb24gPSAxMDAwMDAwMDA7IC8vIDEwMCBtcwogCiAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgS2V5ZWRWZWN0b3IKICAgICBJbkZsaWdodFJlcXVlc3QoKSA6CkBAIC0xMzQsMTcgKzIwNCwxOSBAQAogICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQoMCksCiAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSksCiAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKLSAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uKSwKKyAgICAgICAgICAgIG1pbkV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRNaW5FeHBlY3RlZER1cmF0aW9uKSwKKyAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRNYXhFeHBlY3RlZER1cmF0aW9uKSwKICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCiAgICAgICAgICAgICBlcnJvckJ1ZlN0cmF0ZWd5KEVSUk9SX0JVRl9DQUNIRSksCiAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAogICAgICAgICAgICAgenNsQ2FwdHVyZShmYWxzZSksCiAgICAgICAgICAgICByb3RhdGVBbmRDcm9wQXV0byhmYWxzZSksCi0gICAgICAgICAgICByZXF1ZXN0VGltZU5zKDApIHsKKyAgICAgICAgICAgIHJlcXVlc3RUaW1lTnMoMCksCisgICAgICAgICAgICB0cmFuc2Zvcm0oLTEpIHsKICAgICB9CiAKICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWluRHVyYXRpb24sIG5zZWNzX3QgbWF4RHVyYXRpb24sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnNldDxTdHJpbmc4Pj4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQsIGJvb2wgaXNTdGlsbENhcHR1cmUsCiAgICAgICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwgYm9vbCByb3RhdGVBbmRDcm9wQXV0bywgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpZHNXaXRoWm9vbSwKICAgICAgICAgICAgIG5zZWNzX3QgcmVxdWVzdE5zLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgpAQCAtMTU2LDYgKzIyOCw3IEBACiAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KSwKICAgICAgICAgICAgIGhhc0NhbGxiYWNrKGhhc0FwcENhbGxiYWNrKSwKKyAgICAgICAgICAgIG1pbkV4cGVjdGVkRHVyYXRpb24obWluRHVyYXRpb24pLAogICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAogICAgICAgICAgICAgZXJyb3JCdWZTdHJhdGVneShFUlJPUl9CVUZfQ0FDSEUpLApAQCAtMTY1LDcgKzIzOCw4IEBACiAgICAgICAgICAgICByb3RhdGVBbmRDcm9wQXV0byhyb3RhdGVBbmRDcm9wQXV0byksCiAgICAgICAgICAgICBjYW1lcmFJZHNXaXRoWm9vbShpZHNXaXRoWm9vbSksCiAgICAgICAgICAgICByZXF1ZXN0VGltZU5zKHJlcXVlc3ROcyksCi0gICAgICAgICAgICBvdXRwdXRTdXJmYWNlcyhvdXRTdXJmYWNlcykgeworICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMob3V0U3VyZmFjZXMpLAorICAgICAgICAgICAgdHJhbnNmb3JtKC0xKSB7CiAgICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Mzk1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtUHJldmlld0ZyYW1lU3BhY2VyIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlByZXZpZXdGcmFtZVNwYWNlci5oIgorI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK1ByZXZpZXdGcmFtZVNwYWNlcjo6UHJldmlld0ZyYW1lU3BhY2VyKHdwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHBhcmVudCwgc3A8U3VyZmFjZT4gY29uc3VtZXIpIDoKKyAgICAgICAgbVBhcmVudChwYXJlbnQpLAorICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpIHsKK30KKworUHJldmlld0ZyYW1lU3BhY2VyOjp+UHJldmlld0ZyYW1lU3BhY2VyKCkgeworfQorCitzdGF0dXNfdCBQcmV2aWV3RnJhbWVTcGFjZXI6OnF1ZXVlUHJldmlld0J1ZmZlcihuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW53QnVmZmVyLCBpbnQgcmVsZWFzZUZlbmNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIG1QZW5kaW5nQnVmZmVycy5lbXBsYWNlKHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwgdHJhbnNmb3JtLCBhbndCdWZmZXIsIHJlbGVhc2VGZW5jZSk7CisgICAgQUxPR1YoIiVzOiBtUGVuZGluZ0J1ZmZlcnMgc2l6ZSAlenUsIHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgcmVhZG91dFRpbWUgJSIgUFJJZDY0LAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUGVuZGluZ0J1ZmZlcnMuc2l6ZSgpLCB0aW1lc3RhbXAsIHJlYWRvdXRUaW1lc3RhbXApOworCisgICAgbUJ1ZmZlckNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIFByZXZpZXdGcmFtZVNwYWNlcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1QZW5kaW5nQnVmZmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICBtQnVmZmVyQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0RHVyYXRpb24pOworICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuc2Vjc190IGN1cnJlbnRUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGF1dG8gYnVmZmVyID0gbVBlbmRpbmdCdWZmZXJzLmZyb250KCk7CisgICAgbnNlY3NfdCByZWFkb3V0SW50ZXJ2YWwgPSBidWZmZXIucmVhZG91dFRpbWVzdGFtcCAtIG1MYXN0Q2FtZXJhUmVhZG91dFRpbWU7CisgICAgLy8gSWYgdGhlIHJlYWRvdXQgaW50ZXJ2YWwgZXhjZWVkcyB0aHJlc2hvbGQsIGRpcmVjdGx5IHF1ZXVlCisgICAgLy8gY2FjaGVkIGJ1ZmZlci4KKyAgICBpZiAocmVhZG91dEludGVydmFsID49IGtGcmFtZUludGVydmFsVGhyZXNob2xkKSB7CisgICAgICAgIG1QZW5kaW5nQnVmZmVycy5wb3AoKTsKKyAgICAgICAgcXVldWVCdWZmZXJUb0NsaWVudExvY2tlZChidWZmZXIsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FjaGUgdGhlIGZyYW1lIHRvIG1hdGNoIHJlYWRvdXQgdGltZSBpbnRlcnZhbCwgZm9yIHVwIHRvIDMzbXMKKyAgICBuc2Vjc190IGV4cGVjdGVkUXVldWVUaW1lID0gbUxhc3RDYW1lcmFQcmVzZW50VGltZSArIHJlYWRvdXRJbnRlcnZhbDsKKyAgICBuc2Vjc190IGZyYW1lV2FpdFRpbWUgPSBzdGQ6Om1pbihrTWF4RnJhbWVXYWl0VGltZSwgZXhwZWN0ZWRRdWV1ZVRpbWUgLSBjdXJyZW50VGltZSk7CisgICAgaWYgKGZyYW1lV2FpdFRpbWUgPiAwICYmIG1QZW5kaW5nQnVmZmVycy5zaXplKCkgPCAyKSB7CisgICAgICAgIG1CdWZmZXJDb25kLndhaXRSZWxhdGl2ZShtTG9jaywgZnJhbWVXYWl0VGltZSk7CisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIEFMT0dWKCIlczogcmVhZG91dEludGVydmFsICUiIFBSSWQ2NCAiLCBxdWV1ZUludGVydmFsICUiIFBSSWQ2NCAiLCB3YWl0ZWQgZm9yICUiIFBSSWQ2NAorICAgICAgICAgICAgIiwgdGltZXN0YW1wICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCByZWFkb3V0SW50ZXJ2YWwsCisgICAgICAgICAgICBjdXJyZW50VGltZSAtIG1MYXN0Q2FtZXJhUHJlc2VudFRpbWUsIGZyYW1lV2FpdFRpbWUsIGJ1ZmZlci50aW1lc3RhbXApOworICAgIG1QZW5kaW5nQnVmZmVycy5wb3AoKTsKKyAgICBxdWV1ZUJ1ZmZlclRvQ2xpZW50TG9ja2VkKGJ1ZmZlciwgY3VycmVudFRpbWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFByZXZpZXdGcmFtZVNwYWNlcjo6cmVxdWVzdEV4aXQoKSB7CisgICAgLy8gQ2FsbCBwYXJlbnQgdG8gc2V0IHVwIHNodXRkb3duCisgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdCgpOworICAgIC8vIEV4aXQgZnJvbSBvdGhlciBwb3NzaWJsZSB3YWl0CisgICAgbUJ1ZmZlckNvbmQuc2lnbmFsKCk7Cit9CisKK3ZvaWQgUHJldmlld0ZyYW1lU3BhY2VyOjpxdWV1ZUJ1ZmZlclRvQ2xpZW50TG9ja2VkKAorICAgICAgICBjb25zdCBCdWZmZXJIb2xkZXImIGJ1ZmZlckhvbGRlciwgbnNlY3NfdCBjdXJyZW50VGltZSkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IFBhcmVudCBjYW1lcmEzIG91dHB1dCBzdHJlYW0gd2FzIGRlc3Ryb3llZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYXJlbnQtPnNldFRyYW5zZm9ybShidWZmZXJIb2xkZXIudHJhbnNmb3JtLCB0cnVlLyptYXlDaGFuZ2VNaXJyb3IqLyk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29uc3VtZXIuZ2V0KCksIGJ1ZmZlckhvbGRlci50aW1lc3RhbXApOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQcmV2aWV3IFN0cmVhbTogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgQ2FtZXJhM1N0cmVhbTo6cXVldWVIRFJNZXRhZGF0YShidWZmZXJIb2xkZXIuYW53QnVmZmVyLmdldCgpLT5oYW5kbGUsIG1Db25zdW1lciwKKyAgICAgICAgICAgIHBhcmVudC0+Z2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpKTsKKworICAgIHJlcyA9IG1Db25zdW1lci0+cXVldWVCdWZmZXIobUNvbnN1bWVyLmdldCgpLCBidWZmZXJIb2xkZXIuYW53QnVmZmVyLmdldCgpLAorICAgICAgICAgICAgYnVmZmVySG9sZGVyLnJlbGVhc2VGZW5jZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBjbG9zZShidWZmZXJIb2xkZXIucmVsZWFzZUZlbmNlKTsKKyAgICAgICAgaWYgKHBhcmVudC0+c2hvdWxkTG9nRXJyb3IocmVzKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVldWUgYnVmZmVyIHRvIGNsaWVudDogJXMoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1MYXN0Q2FtZXJhUHJlc2VudFRpbWUgPSBjdXJyZW50VGltZTsKKyAgICBtTGFzdENhbWVyYVJlYWRvdXRUaW1lID0gYnVmZmVySG9sZGVyLnJlYWRvdXRUaW1lc3RhbXA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTY1NzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfUFJFVklFV0ZSQU1FU1BBQ0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX1BSRVZJRVdGUkFNRVNQQUNFUl9ICisKKyNpbmNsdWRlIDxxdWV1ZT4KKworI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW07CisKKy8qKioKKyAqIFByZXZpZXcgc3RyZWFtIHNwYWNlciBmb3IgYmV0dGVyIGZyYW1lIHNwYWNpbmcKKyAqCisgKiBUaGUgaWRlYWwgdmlld2ZpbmRlciB1c2VyIGV4cGVyaWVuY2UgaXMgdGhhdCBmcmFtZXMgYXJlIHByZXNlbnRlZCB0byB0aGUKKyAqIHVzZXIgaW4gdGhlIHNhbWUgY2FkZW5jZSBhcyBvdXRwdXRlZCBieSB0aGUgY2FtZXJhIHNlbnNvci4gSG93ZXZlciwgdGhlCisgKiBwcm9jZXNzaW5nIGxhdGVuY3kgYmV0d2VlbiBmcmFtZXMgY291bGQgdmFyeSwgZHVlIHRvIGZhY3RvcnMgc3VjaAorICogYXMgQ1BVIGxvYWQsIGRpZmZlcmVuY2VzIGluIHJlcXVlc3Qgc2V0dGluZ3MsIGV0Yy4gVGhpcyBmcmFtZSBwcm9jZXNzaW5nCisgKiBsYXRlbmN5IHJlc3VsdHMgaW4gdmFyaWF0aW9uIGluIHByZXNlbnRhdGlvbiBvZiBmcmFtZXMgdG8gdGhlIHVzZXIuCisgKgorICogVGhlIFByZXZpZXdGcmFtZVNwYWNlciBpbXByb3ZlcyB0aGUgdmlld2ZpbmRlciB1c2VyIGV4cGVyaWVuY2UgYnk6CisgKiAtIENhY2hlIHRoZSBmcmFtZSBidWZmZXJzIGlmIHRoZSBpbnRlcnZhbHMgYmV0d2VlbiBxdWV1ZUJ1ZmZlciBpcyBzaG9ydGVyCisgKiAgIHRoYW4gdGhlIGNhbWVyYSByZWFkb3V0IGludGVydmFscy4KKyAqIC0gUXVldWUgZnJhbWUgYnVmZmVycyBpbiB0aGUgc2FtZSBjYWRlbmNlIGFzIHRoZSBjYW1lcmEgcmVhZG91dCB0aW1lLgorICogLSBNYWludGFpbiBhdCBtb3N0IDEgcXVldWUtYWJsZSBidWZmZXIuIElmIHRoZSAybmQgcHJldmlldyBidWZmZXIgYmVjb21lcworICogICBhdmFpbGFibGUsIHF1ZXVlIHRoZSBvbGRlc3QgY2FjaGVkIGJ1ZmZlciB0byB0aGUgYnVmZmVyIHF1ZXVlLgorICovCitjbGFzcyBQcmV2aWV3RnJhbWVTcGFjZXIgOiBwdWJsaWMgVGhyZWFkIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFByZXZpZXdGcmFtZVNwYWNlcih3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBwYXJlbnQsIHNwPFN1cmZhY2U+IGNvbnN1bWVyKTsKKyAgICB2aXJ0dWFsIH5QcmV2aWV3RnJhbWVTcGFjZXIoKTsKKworICAgIC8vIFF1ZXVlIHByZXZpZXcgYnVmZmVyIGxvY2FsbHkKKyAgICBzdGF0dXNfdCBxdWV1ZVByZXZpZXdCdWZmZXIobnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLCBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndCdWZmZXIsIGludCByZWxlYXNlRmVuY2UpOworCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXF1ZXN0RXhpdCgpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgLy8gc3RydWN0dXJlIGhvbGRpbmcgY2FjaGVkIHByZXZpZXcgYnVmZmVyIGluZm8KKyAgICBzdHJ1Y3QgQnVmZmVySG9sZGVyIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXA7CisgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm07CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3dCdWZmZXI+IGFud0J1ZmZlcjsKKyAgICAgICAgaW50IHJlbGVhc2VGZW5jZTsKKworICAgICAgICBCdWZmZXJIb2xkZXIobnNlY3NfdCB0LCBuc2Vjc190IHJlYWRvdXRULCBpbnQzMl90IHRyLCBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndiLCBpbnQgcmYpIDoKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAodCksIHJlYWRvdXRUaW1lc3RhbXAocmVhZG91dFQpLCB0cmFuc2Zvcm0odHIpLCBhbndCdWZmZXIoYW53YiksCisgICAgICAgICAgICAgICAgcmVsZWFzZUZlbmNlKHJmKSB7fQorICAgIH07CisKKyAgICB2b2lkIHF1ZXVlQnVmZmVyVG9DbGllbnRMb2NrZWQoY29uc3QgQnVmZmVySG9sZGVyJiBidWZmZXJIb2xkZXIsIG5zZWNzX3QgY3VycmVudFRpbWUpOworCisgICAgd3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gbVBhcmVudDsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBtQ29uc3VtZXI7CisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUJ1ZmZlckNvbmQ7CisKKyAgICBzdGQ6OnF1ZXVlPEJ1ZmZlckhvbGRlcj4gbVBlbmRpbmdCdWZmZXJzOworICAgIG5zZWNzX3QgbUxhc3RDYW1lcmFSZWFkb3V0VGltZSA9IDA7CisgICAgbnNlY3NfdCBtTGFzdENhbWVyYVByZXNlbnRUaW1lID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDUwMDAwMDBMTDsgLy8gNTBtcworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRnJhbWVJbnRlcnZhbFRocmVzaG9sZCA9IDgwMDAwMDAwTEw7IC8vIDgwbXMKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga01heEZyYW1lV2FpdFRpbWUgPSAzMzMzMzMzM0xMOyAvLyAzM21zCit9OworCit9OyAvL25hbWVzcGFjZSBjYW1lcmEzCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwCmluZGV4IDdlYzA5NTYuLjI3YjAwYzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIgotI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTUyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQWlkbENhbWVyYTMtRGV2aWNlIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05OREVCVUcgMCAgLy8gUGVyLWZyYW1lIHZlcmJvc2UgbG9nZ2luZworCisjaWZkZWYgTE9HX05OREVCVUcKKyNkZWZpbmUgQUxPR1ZWKC4uLikgQUxPR1YoX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvLyBDb252ZW5pZW5jZSBtYWNybyBmb3IgdHJhbnNpZW50IGVycm9ycworI2RlZmluZSBDTE9HRShmbXQsIC4uLikgQUxPR0UoIkNhbWVyYSAlczogJXM6ICIgZm10LCBtSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKworI2RlZmluZSBDTE9HVyhmbXQsIC4uLikgQUxPR1coIkNhbWVyYSAlczogJXM6ICIgZm10LCBtSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKworLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBlcnJvciBzdGF0ZQorI2RlZmluZSBTRVRfRVJSKGZtdCwgLi4uKSBzZXRFcnJvclN0YXRlKCAgIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU0VUX0VSUl9MKGZtdCwgLi4uKSBzZXRFcnJvclN0YXRlTG9ja2VkKCBcCisgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgICAgICAgXAorICAgICMjX19WQV9BUkdTX18pCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmg+CisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9UcmFjZUhGUi5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKKworI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgIkFpZGxDYW1lcmEzRGV2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNlbnNvclBpeGVsTW9kZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpSZXF1ZXN0QXZhaWxhYmxlRHluYW1pY1JhbmdlUHJvZmlsZXNNYXA7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6U2NhbGVyQXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwCittYXBUb0FpZGxEeW5hbWljUHJvZmlsZShpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwPihkeW5hbWljUmFuZ2VQcm9maWxlKTsKK30KKworYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBpeGVsRm9ybWF0IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxQaXhlbEZvcm1hdCgKKyAgICAgICAgaW50IGZyYW1ld29ya0Zvcm1hdCkgeworICAgIHJldHVybiAoYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBpeGVsRm9ybWF0KSBmcmFtZXdvcmtGb3JtYXQ7Cit9CisKK2FpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UgQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbERhdGFzcGFjZSgKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIChhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6RGF0YXNwYWNlKWRhdGFTcGFjZTsKK30KKworYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlIEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxDb25zdW1lclVzYWdlKAorICAgICAgICB1aW50NjRfdCB1c2FnZSkgeworICAgIHJldHVybiAoYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlKXVzYWdlOworfQorCithaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uCitBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsU3RyZWFtUm90YXRpb24oY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSB7CisgICAgc3dpdGNoIChyb3RhdGlvbikgeworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDoKKyAgICAgICAgICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fOTA7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8xODA6CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMTgwOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgcmV0dXJuIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzI3MDsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSByb3RhdGlvbiAlZCIsIF9fRlVOQ1RJT05fXywgcm90YXRpb24pOworICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSkgeworICAgIHVzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0KKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7CisgICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAob3BlcmF0aW9uTW9kZSA8IENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCkgeworICAgICAgICBzd2l0Y2gob3BlcmF0aW9uTW9kZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgb3BlcmF0aW9uTW9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICptb2RlID0gc3RhdGljX2Nhc3Q8U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU+KG9wZXJhdGlvbk1vZGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtGb3JtYXQoCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGl4ZWxGb3JtYXQpOworfQorCithbmRyb2lkX2RhdGFzcGFjZSBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihkYXRhU3BhY2UpOworfQorCit1aW50NjRfdCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgdXNhZ2UpIHsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXVzYWdlOworfQorCit1aW50NjRfdCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSB1c2FnZSkgeworICAgIHJldHVybiAodWludDY0X3QpdXNhZ2U7Cit9CisKK0FpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5Q2xpZW50KSA6IENhbWVyYTNEZXZpY2UoaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBsZWdhY3lDbGllbnQpIHsKKyAgICAgICAgbUNhbGxiYWNrcyA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPih0aGlzKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBBSURMIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIENMT0dFKCJBbHJlYWR5IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247CisgICAgQVRSQUNFX0JFR0lOKCJDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlbkFpZGxTZXNzaW9uKG1JZC5zdHJpbmcoKSwgbUNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOworICAgIEFUUkFDRV9FTkQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgU0VUX0VSUigiU2Vzc2lvbiBpZmFjZSByZXR1cm5lZCBpcyBudWxsIik7CisgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtSWQuc3RyaW5nKCksIG1PdmVycmlkZUZvclBlcmZDbGFzcywgJm1EZXZpY2VJbmZvKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8gPSBtYW5hZ2VyLT5zdXBwb3J0TmF0aXZlWm9vbVJhdGlvKG1JZC5zdHJpbmcoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgYm9vbCBpc0xvZ2ljYWwgPSBtYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUlkLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBvdmVycmlkZSBjaGFyYWN0ZXJpc3RpY3MgZm9yIHBoeXNpY2FsIGNhbWVyYXMKKyAgICAgICAgICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZCwgLypvdmVycmlkZUZvclBlcmZDbGFzcyovZmFsc2UsICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIHVzZVByZWNvcnJlY3RBcnJheSA9CisgICAgICAgICAgICAgICAgICAgIERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgIGlmICh1c2VQcmVjb3JyZWN0QXJyYXkpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbcGh5c2ljYWxJZF0uc2V0dXBTdGF0aWNJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byByZWFkIGNhbWVyYSAlcydzIGNhbGlicmF0aW9uIGZpZWxkcyBmb3IgZGlzdG9ydGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3Rpb24iLCBwaHlzaWNhbElkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVpvb21SYXRpb01hcHBlcnNbcGh5c2ljYWxJZF0gPSBab29tUmF0aW9NYXBwZXIoCisgICAgICAgICAgICAgICAgICAgICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdLAorICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbywgdXNlUHJlY29ycmVjdEFycmF5KTsKKworICAgICAgICAgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcigKKyAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSkpIHsKKyAgICAgICAgICAgICAgICBtVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyc1twaHlzaWNhbElkXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBVSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIobVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJlY29ycmVjdEFycmF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I8CisgICAgICAgICAgICBpbnQ4X3QsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IGRlc2M7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoJmRlc2MpOworICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgcmVxdWVzdFF1ZXVlUmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QocmVxdWVzdFF1ZXVlUmV0KTsKKyAgICB9CisgICAgcXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzYyk7CisgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICBxdWV1ZSA9IG51bGxwdHI7CisgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjwKKyAgICAgICAgaW50OF90LCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlPiByZXNEZXNjOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlc3VsdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoJnJlc0Rlc2MpOworICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKKyAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJlc3VsdFF1ZXVlUmV0KTsKKyAgICB9CisgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPihyZXNEZXNjKTsKKyAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgLy8gRG9uJ3QgdXNlIHJlc1F1ZXVlIG9ud2FyZHMuCisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQorICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOworICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgeworICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciA9IChidWZNZ3JNb2RlLmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBjYXBhYmlsaXRpZXMgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5jb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19PRkZMSU5FX1BST0NFU1NJTkcpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBBaWRsSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBtVXNlSGFsQnVmTWFuYWdlciwgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisKKyAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CisgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOworICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKKyAgICBpZiAoIW1vbml0b3JUYWdzLmlzRW1wdHkoKSkgeworICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHRzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om5vdGlmeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5ub3RpZnkobXNncyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KKyAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAgIHsKKyAgICAgICAgbUlkLAorICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsICoobUludGVyZmFjZSksIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCByZXN1bHQucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgfQorICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6bm90aWZ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBub3RpZnkgbWVzc2FnZSBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7IG1JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCisgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsCisgICAgICAgICp0aGlzLCAqKG1JbnRlcmZhY2UpLCBtTGVnYWN5Q2xpZW50LCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKKyAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworCit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpzd2l0Y2hUb09mZmxpbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAvKm91dCovIHNwPENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZT4qIHNlc3Npb24pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisKKyAgICBib29sIGhhc0lucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtICE9IG51bGxwdHI7CisgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gaGFzSW5wdXRTdHJlYW0gPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKKyAgICBib29sIGlucHV0U3RyZWFtU3VwcG9ydHNPZmZsaW5lID0gaGFzSW5wdXRTdHJlYW0gPworICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSA6IGZhbHNlOworICAgIGF1dG8gb3V0cHV0U3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CisgICAgYXV0byBzdHJlYW1JZHMgPSBvdXRwdXRTdHJlYW1JZHM7CisgICAgaWYgKGhhc0lucHV0U3RyZWFtKSB7CisgICAgICAgIHN0cmVhbUlkcy5wdXNoX2JhY2sobUlucHV0U3RyZWFtLT5nZXRJZCgpKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBhbGwgc3RyZWFtcyBpbiBzdHJlYW1zVG9LZWVwIHN1cHBvcnRzIG9mZmxpbmUgbW9kZQorICAgIGZvciAoYXV0byBpZCA6IHN0cmVhbXNUb0tlZXApIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIElEICVkIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKGlkID09IGlucHV0U3RyZWFtSWQpIHsKKyAgICAgICAgICAgIGlmICghaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGlucHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICAgICAgICAgIGlmICghc3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogb3V0cHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFRPRE86IGJsb2NrIHN1cmZhY2Ugc2hhcmluZyBhbmQgc3VyZmFjZSBncm91cCBzdHJlYW1zIHVudGlsIHdlIGNhbiBzdXBwb3J0IHRoZW0KKworICAgIC8vIFN0b3AgcmVwZWF0aW5nIHJlcXVlc3QsIHdhaXQgdW50aWwgYWxsIHJlbWFpbmluZyByZXF1ZXN0cyBhcmUgc3VibWl0dGVkLCB0aGVuIGNhbGwgaW50bworICAgIC8vIEhBTCBzd2l0Y2hUb09mZmxpbmUKKyAgICBjYW1lcmE6OmRldmljZTo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvIG9mZmxpbmVTZXNzaW9uSW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb247CisgICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyBidWZmZXJSZWNvcmRzOworICAgIHN0YXR1c190IHJldCA9IHN0YXRpY19jYXN0PEFpZGxSZXF1ZXN0VGhyZWFkICo+KG1SZXF1ZXN0VGhyZWFkLmdldCgpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uLCAmYnVmZmVyUmVjb3Jkcyk7CisKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIlN3aXRjaCB0byBvZmZsaW5lIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgc3VjYyA9IG1SZXF1ZXN0QnVmZmVyU00ub25Td2l0Y2hUb09mZmxpbmVTdWNjZXNzKCk7CisgICAgaWYgKCFzdWNjKSB7CisgICAgICAgIFNFVF9FUlIoIkhBTCBtdXN0IG5vdCBiZSBjYWxsaW5nIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwiKTsKKyAgICAgICAgLy8gVE9ETzogYmxvY2sgQUxMIGNhbGxiYWNrcyBmcm9tIEhBTCB0aWxsIGFwcCBjb25maWd1cmVkIG5ldyBzdHJlYW1zPworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgb2ZmbGluZVNlc3Npb25JbmZvCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gb2ZmbGluZVN0cmVhbUlkczsKKyAgICBvZmZsaW5lU3RyZWFtSWRzLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgLy8gdmVyaWZ5IHN0cmVhbSBJRHMKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG5vdCBmb3VuZCEiLCBpZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gbm90IHVzaW5nIEhBTCBidWYgbWFuYWdlciwgb25seSBhbGxvdyBzdHJlYW1zIHJlcXVlc3RlZCBieSBhcHAgdG8gYmUgcHJlc2VydmVkCisgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtc1RvS2VlcC5iZWdpbigpLCBzdHJlYW1zVG9LZWVwLmVuZCgpLCBpZCkgPT0gc3RyZWFtc1RvS2VlcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoInN0cmVhbSBJRCAlZCBtdXN0IG5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lISIsIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZmxpbmVTdHJlYW1JZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gKGlkID09IGlucHV0U3RyZWFtSWQpID8KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obUlucHV0U3RyZWFtKSA6CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4+KG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICAvLyBWZXJpZnkgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMKKyAgICAgICAgaWYgKHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSAhPSAodWludDMyX3Qpb2ZmbGluZVN0cmVhbS5udW1PdXRzdGFuZGluZ0J1ZmZlcnMpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgc3RyZWFtICVkICMgb2YgcmVtYWluaW5nIGJ1ZmZlciBtaXNtYXRjaDogKCV6dSwlZCkgKHNlcnZpY2UvSEFMKSIsCisgICAgICAgICAgICAgICAgICAgIGlkLCBzdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCksIG9mZmxpbmVTdHJlYW0ubnVtT3V0c3RhbmRpbmdCdWZmZXJzKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmVyaWZ5IGFsbCBzdHJlYW1zIHRvIGJlIGRlbGV0ZWQgZG9uJ3QgaGF2ZSBhbnkgb3V0c3RhbmRpbmcgYnVmZmVycworICAgIGlmIChoYXNJbnB1dFN0cmVhbSAmJiBzdGQ6OmZpbmQob2ZmbGluZVN0cmVhbUlkcy5iZWdpbigpLCBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQpID09IG9mZmxpbmVTdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIklucHV0IHN0cmVhbSAlZCBzdGlsbCBoYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlciEiLAorICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkLCBtSW5wdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG91dFN0cmVhbUlkIDogb3V0cHV0U3RyZWFtSWRzKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQob2ZmbGluZVN0cmVhbUlkcy5iZWdpbigpLCBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgIG91dFN0cmVhbUlkKSA9PSBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBhdXRvIG91dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChvdXRTdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAob3V0U3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoIk91dHB1dCBzdHJlYW0gJWQgc3RpbGwgaGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXIhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbUlkLCBvdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgSW5GbGlnaHRSZXF1ZXN0TWFwIG9mZmxpbmVSZXFzOworICAgIC8vIFZlcmlmeSBpbmZsaWdodCByZXF1ZXN0cyBhbmQgdGhlaXIgcGVuZGluZyBidWZmZXJzCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW5GbGlnaHRMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvIG9mZmxpbmVSZXEgOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVJlcXVlc3RzKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbUluRmxpZ2h0TWFwLmluZGV4T2ZLZXkob2ZmbGluZVJlcS5mcmFtZU51bWJlcik7CisgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSByZXF1ZXN0IGZyYW1lIG51bWJlciAlZCBub3QgZm91bmQhIiwgb2ZmbGluZVJlcS5mcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIGluZmxpZ2h0UmVxID0gbUluRmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHNwZWNpZmljIHN0cmVhbSBJRHMKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzTGVmdCA9IHN0YXRpY19jYXN0PHNpemVfdD4oaW5mbGlnaHRSZXEubnVtQnVmZmVyc0xlZnQpOworICAgICAgICAgICAgaWYgKG51bUJ1ZmZlcnNMZWZ0ICE9IG9mZmxpbmVSZXEucGVuZGluZ1N0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSByZXF1ZXN0ICMgb2YgcmVtYWluaW5nIGJ1ZmZlciBtaXNtYXRjaDogKCVkLCVkKSAoc2VydmljZS9IQUwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmxpZ2h0UmVxLm51bUJ1ZmZlcnNMZWZ0LCBvZmZsaW5lUmVxLnBlbmRpbmdTdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZsaW5lUmVxcy5hZGQob2ZmbGluZVJlcS5mcmFtZU51bWJlciwgaW5mbGlnaHRSZXEpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ3JlYXRlIENhbWVyYTNPZmZsaW5lU2Vzc2lvbiBhbmQgdHJhbnNmZXIgb2JqZWN0IG93bmVyc2hpcAorICAgIC8vICAgKHN0cmVhbXMsIGluZmxpZ2h0IHJlcXVlc3RzLCBidWZmZXIgY2FjaGVzKQorICAgIGNhbWVyYTM6OlN0cmVhbVNldCBvZmZsaW5lU3RyZWFtU2V0OworICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+IGlucHV0U3RyZWFtOworICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zKSB7CisgICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOworICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZmxpbmVTdHJlYW1TZXQuYWRkKGlkLCBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gbG9jayBiZWZvcmUgY29weWluZyBzdGF0ZXMKKyAgICAvLyAgICAgICB0aG91Z2ggdGVjaG5pY2FsbHkgbm8gb3RoZXIgdGhyZWFkIHNob3VsZCBiZSB0YWxraW5nIHRvIENhbWVyYTNEZXZpY2UgYXQgdGhpcyBwb2ludAorICAgIENhbWVyYTNPZmZsaW5lU3RhdGVzIG9mZmxpbmVTdGF0ZXMoCisgICAgICAgICAgICBtVGFnTW9uaXRvciwgbVZlbmRvclRhZ0lkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQsIG1OdW1QYXJ0aWFsUmVzdWx0cywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLCBtRGlzdG9ydGlvbk1hcHBlcnMsCisgICAgICAgICAgICBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzKTsKKworICAgICpzZXNzaW9uID0gbmV3IEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24obUlkLCBpbnB1dFN0cmVhbSwgb2ZmbGluZVN0cmVhbVNldCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMsIG9mZmxpbmVTZXNzaW9uKTsKKworICAgIC8vIERlbGV0ZSBhbGwgc3RyZWFtcyB0aGF0IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIG9mZmxpbmUgc2Vzc2lvbgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgeworICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGlzY29ubmVjdCBhbGwgb3RoZXIgc3RyZWFtcyBhbmQgc3dpdGNoIHRvIFVOQ09ORklHVVJFRCBzdGF0ZQorICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICByZXQgPSBtSW5wdXRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJkaXNjb25uZWN0IGlucHV0IHN0cmVhbSBmYWlsZWQhIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBzdHJlYW1JZCA6IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpKSB7CisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgICAgIHJldCA9IHN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3Qgb3V0cHV0IHN0cmVhbSAlZCBmYWlsZWQhIiwgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKKyAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOworICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKKyAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKKyAgICBtT3BlcmF0aW5nTW9kZSA9IE5PX01PREU7CisgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID0gZmFsc2U7CisgICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyUHJldmlvdXNSZXF1ZXN0KCk7CisKKyAgICByZXR1cm4gT0s7CisgICAgLy8gVE8gYmUgZG9uZSBieSBDYW1lcmFEZXZpY2VDbGllbnQvQ2FtZXJhM09mZmxpbmVTZXNzaW9uCisgICAgLy8gcmVnaXN0ZXIgdGhlIG9mZmxpbmUgY2xpZW50IHRvIGNhbWVyYSBzZXJ2aWNlCisgICAgLy8gU2V0dXAgcmVzdWx0IHBhc3N0aGluZyB0aHJlYWRzIGV0YworICAgIC8vIEluaXRpYWxpemUgb2ZmbGluZSBzZXNzaW9uIHNvIEhBTCBjYW4gc3RhcnQgc2VuZGluZyBjYWxsYmFjayB0byBpdCAocmVzdWx0IEZtcSkKKyAgICAvLyBUT0RPOiBjaGVjayBob3cgbWFueSBvbklkbGUgY2FsbGJhY2sgd2lsbCBiZSBzZW50CisgICAgLy8gSmF2YSBzaWRlIHRvIG1ha2Ugc3VyZSB0aGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gaXMgcHJvcGVybHkgY2xvc2VkCit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKSB7CisKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXF1ZXN0U3RyZWFtQnVmZmVycyhidWZSZXFzLCBvdXRCdWZmZXJzLCBzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+KiBvdXRCdWZmZXJzLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworCisgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLAorICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlciwgKnRoaXMsICoobUludGVyZmFjZSksICp0aGlzfTsKKyAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIG91dEJ1ZmZlcnMsIHN0YXR1cyk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXR1cm5TdHJlYW1CdWZmZXJzKGJ1ZmZlcnMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBSZXR1cm5CdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsICBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgKihtSW50ZXJmYWNlKX07CisgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OkFpZGxIYWxJbnRlcmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpIDoKKyAgICAgICAgSGFsSW50ZXJmYWNlKHVzZUhhbEJ1Zk1hbmFnZXIsIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyksCisgICAgICAgIG1BaWRsU2Vzc2lvbihzZXNzaW9uKSwKKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7IH0KKworQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OkFpZGxIYWxJbnRlcmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgJmRldmljZVNlc3Npb24sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgJmluamVjdGlvblNlc3Npb24sIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgOgorICAgICAgICBIYWxJbnRlcmZhY2UodXNlSGFsQnVmTWFuYWdlciwgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSwKKyAgICAgICAgbUFpZGxTZXNzaW9uKGRldmljZVNlc3Npb24pLAorICAgICAgICBtQWlkbEluamVjdGlvblNlc3Npb24oaW5qZWN0aW9uU2Vzc2lvbiksCisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeyB9CisKK2Jvb2wgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OnZhbGlkKCkgeworICAgIHJldHVybiAobUFpZGxTZXNzaW9uICE9IG51bGxwdHIpOworfQorCit2b2lkIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKKyAgICBtQWlkbFNlc3Npb24ucmVzZXQoKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmZsdXNoKCkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmZsdXNoIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+Zmx1c2goKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXMgPSBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6ZHVtcChpbnQgLypmZCovKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6ZHVtcCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OnJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQWlkbENhbWVyYUhhbDo6cmVwZWF0aW5nUmVxdWVzdEVuZCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPnJlcGVhdGluZ1JlcXVlc3RFbmQoZnJhbWVOdW1iZXIsIHN0cmVhbUlkcyk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNsb3NlKCkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNsb3NlKCkiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5jbG9zZSgpOworICAgIC8vIEludGVyZmFjZSB3aWxsIGJlIGRlYWQgc2hvcnRseSBhbnl3YXksIHNvIGRvbid0IGxvZyBlcnJvcnMKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciAtIDEpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK2Jvb2wgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLCBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgeworICAgIC8vIFdlIGRvIHJlY29uZmlndXJhdGlvbiBieSBkZWZhdWx0OworICAgIGJvb2wgcmVxdWlyZWQgPSB0cnVlOworICAgIGlmIChtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgeworICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhIG9sZFBhcmFtcywgbmV3UGFyYW1zOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogb2xkU2Vzc2lvbk1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICB1aW50OF90ICpvbGRTZXNzaW9uQnl0ZVAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9uTWV0YSk7CisKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb25NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgdWludDhfdCAqbmV3U2Vzc2lvbkJ5dGVQID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obmV3U2Vzc2lvbk1ldGEpOworICAgICAgICAvLyBzdGQ6OnZlY3RvciBoYXMgbm8gc2V0VG9FeHRlcm5hbCwgc28gd2UgaGFjdmUgdG8gY29weQorICAgICAgICBvbGRQYXJhbXMubWV0YWRhdGEuYXNzaWduKG9sZFNlc3Npb25CeXRlUCwKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uQnl0ZVAgKyBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvbk1ldGEpKTsKKyAgICAgICAgbmV3UGFyYW1zLm1ldGFkYXRhLmFzc2lnbihuZXdTZXNzaW9uQnl0ZVAsCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvbkJ5dGVQICsgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG5ld1Nlc3Npb25NZXRhKSk7CisgICAgICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCAmcmVxdWlyZWQpOworICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9uTWV0YSk7CisgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMudW5sb2NrKG5ld1Nlc3Npb25NZXRhKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXF1aXJlZDsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoCisgICAgICAgIGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKKyAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFBaWRsSGFsOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzIik7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpSZXF1ZXN0VGVtcGxhdGU7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7CisgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFNZXRhZGF0YSByZXF1ZXN0OworICAgIHN3aXRjaCAodGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9QUkVWSUVXOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlBSRVZJRVc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19SRUNPUkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fU05BUFNIT1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpNQU5VQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFVua25vd24gdGVtcGxhdGUgSUQsIG9yIHRoaXMgSEFMIGlzIHRvbyBvbGQgdG8gc3VwcG9ydCBpdAorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoaWQsICZyZXF1ZXN0KTsKKworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihyZXF1ZXN0Lm1ldGFkYXRhLmRhdGEoKSk7CisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3QubWV0YWRhdGEuc2l6ZSgpOworICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIsICZleHBlY3RlZFNpemUpOworICAgIGlmIChyZXQgPT0gT0sgfHwgcmV0ID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKKyAgICAgICAgaWYgKCpyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY2xvbmUgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKAorICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgeworICAgIHVzaW5nIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1UeXBlOworICAgIHVzaW5nIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKKworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBBSURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb247CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtICZkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7CisgICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdC51c2FnZSA9IG1hcFRvQWlkbENvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvQWlkbFN0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICBkc3QuZm9ybWF0ID0gbWFwVG9BaWRsUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpIDogc3JjLT5mb3JtYXQpOworICAgICAgICBkc3QuZGF0YVNwYWNlID0gbWFwVG9BaWRsRGF0YXNwYWNlKGNhbTNzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpID8KKyAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKSA6IHNyYy0+ZGF0YV9zcGFjZSk7CisKKyAgICAgICAgZHN0LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KKyAgICAgICAgZHN0Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7CisgICAgICAgIGRzdC5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOworICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7CisgICAgICAgICAgICBkc3Quc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9IHN0YXRpY19jYXN0PFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LmR5bmFtaWNSYW5nZVByb2ZpbGUgPSBtYXBUb0FpZGxEeW5hbWljUHJvZmlsZShzcmMtPmR5bmFtaWNfcmFuZ2VfcHJvZmlsZSk7CisgICAgICAgIGRzdC51c2VDYXNlID0gc3RhdGljX2Nhc3Q8U2NhbGVyQXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXM+KHNyYy0+dXNlX2Nhc2UpOworICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7CisKKyAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOworICAgIHJlcyA9IG1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7CisgICAgdWludDhfdCAqc2Vzc2lvblBhcmFtUCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpOworCisgICAgLy8gc3RkOjp2ZWN0b3IgaGFzIG5vIHNldFRvRXh0ZXJuYWwsIHNvIHdlIGhhdmUgdG8gY29weQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc2Vzc2lvblBhcmFtcy5tZXRhZGF0YS5hc3NpZ24oCisgICAgICAgICAgICAgICAgc2Vzc2lvblBhcmFtUCwgc2Vzc2lvblBhcmFtUCArIHNlc3Npb25QYXJhbVNpemUpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisKKyAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpIYWxTdHJlYW0+IGZpbmFsQ29uZmlndXJhdGlvbjsKKworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9IGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+Y29uZmlndXJlU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGVycik7CisgICAgfQorCisgICAgLy8gQW5kIGNvbnZlcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIGZyb20gQUlETAorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07CisgICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKKworICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKKyAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHNpemVfdCBoYWxTdHJlYW1Db3VudCA9IGZpbmFsQ29uZmlndXJhdGlvbi5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGhhbFN0cmVhbUNvdW50OyBpZHgrKykgeworICAgICAgICAgICAgaWYgKGZpbmFsQ29uZmlndXJhdGlvbltyZWFsSWR4XS5pZCA9PSBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWxJZHggPSAocmVhbElkeCA+PSBoYWxTdHJlYW1Db3VudCAtIDEpID8gMCA6IHJlYWxJZHggKyAxOworICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIG5vdCBmb3VuZCBpbiBzdHJlYW0gY29uZmlndXJhdGlvbiByZXNwb25zZSBmcm9tIEhBTCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTo6ZGV2aWNlOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbltyZWFsSWR4XTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBkc3RTdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCk7CisgICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy5vdmVycmlkZUZvcm1hdCk7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKKworICAgICAgICBkc3RTdHJlYW0tPnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChzcmMuc3VwcG9ydE9mZmxpbmUpOworCisgICAgICAgIGlmIChkc3RTdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKGZhbHNlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOworICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IG92ZXJyaWRlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZvcm1hdCBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRzdC0+ZGF0YV9zcGFjZSAhPSBvdmVycmlkZURhdGFTcGFjZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEYXRhU3BhY2Ugb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZEZvcm1hdE92ZXJyaWRlID0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLmZvcm1hdCAhPSBzcmMub3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBib29sIG5lZWREYXRhc3BhY2VPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5kYXRhU3BhY2UgIT0gc3JjLm92ZXJyaWRlRGF0YVNwYWNlOworICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUobmVlZEZvcm1hdE92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUobmVlZERhdGFzcGFjZU92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdC0+Zm9ybWF0ID0gb3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBkc3QtPmRhdGFfc3BhY2UgPSBvdmVycmlkZURhdGFTcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQV9TVFJFQU1fSU5QVVQpIHsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ2NF90PihzcmMucHJvZHVjZXJVc2FnZSkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAorICAgICAgICAgICAgICAgICAgICBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLmNvbnN1bWVyVXNhZ2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9VVFBVVAorICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDY0X3Q+KHNyYy5jb25zdW1lclVzYWdlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IE9VVFBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBjb25zdW1lciB1c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAorICAgICAgICAgICAgICAgICAgICBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnByb2R1Y2VyVXNhZ2UpKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLm1heEJ1ZmZlcnM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogY29uZmlnLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSB7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbVR5cGU7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOworCisgICAgQVRSQUNFX05BTUUoIkluamVjdGlvbkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbikgeworICAgICAgICBBTE9HRSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0ICIKKyAgICAgICAgICAgICAgICAic3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gQUlETAorICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKKyAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbSYgZHN0ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QqIHNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdC51c2FnZSA9IG1hcFRvQWlkbENvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvQWlkbFN0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qpc3JjLT5yb3RhdGlvbik7CisgICAgICAgIGRzdC5mb3JtYXQgPQorICAgICAgICAgICAgbWFwVG9BaWRsUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPyBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgIDogc3JjLT5mb3JtYXQpOworICAgICAgICBkc3QuZGF0YVNwYWNlID0KKyAgICAgICAgICAgIG1hcFRvQWlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgOiBzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICBkc3QuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOworICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKKyAgICAgICAgfQorICAgICAgICBkc3QuZ3JvdXBJZCA9IGNhbTNzdHJlYW0tPmdldEhhbFN0cmVhbUdyb3VwSWQoKTsKKyAgICAgICAgZHN0LnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChpbnQgbW9kZSA6IHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQpIHsKKyAgICAgICAgICAgIGRzdC5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqKytdID0gc3RhdGljX2Nhc3Q8U2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7CisKKyAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOworICAgIHJlcyA9IG1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICBzaXplX3Qgc2Vzc2lvblBhcmFtU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKTsKKyAgICB1aW50OF90ICpzZXNzaW9uUGFyYW1QID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnNlc3Npb25QYXJhbXMubWV0YWRhdGEuYXNzaWduKAorICAgICAgICAgICAgc2Vzc2lvblBhcmFtUCwgc2Vzc2lvblBhcmFtUCArIHNlc3Npb25QYXJhbVNpemUpOworCisgICAgLy8gU2VlIHdoaWNoIHZlcnNpb24gb2YgSEFMIHdlIGhhdmUKKyAgICBpZiAobUFpZGxJbmplY3Rpb25TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9IGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKKworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogcmF3TWV0YWRhdGEgPSBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZ2V0QW5kTG9jaygpOworICAgICAgICB1aW50OF90ICphaWRsQ2hhcnNQID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmF3TWV0YWRhdGEpKTsKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFNZXRhZGF0YSBhaWRsQ2hhcnM7CisgICAgICAgIGFpZGxDaGFycy5tZXRhZGF0YS5hc3NpZ24oYWlkbENoYXJzUCwgYWlkbENoYXJzUCArIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSkpOworICAgICAgICBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MudW5sb2NrKHJhd01ldGFkYXRhKTsKKworICAgICAgICBhdXRvIGVyciA9IG1BaWRsSW5qZWN0aW9uU2Vzc2lvbi0+Y29uZmlndXJlSW5qZWN0aW9uU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGFpZGxDaGFycyk7CisgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtQWlkbEluamVjdGlvblNlc3Npb24gPT0gbnVsbHB0ciwgdGhlIGluamVjdGlvbiBub3Qgc3VwcG9ydGVkICIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzOworICAgIHNpemVfdCBiYXRjaFNpemUgPSByZXF1ZXN0cy5zaXplKCk7CisgICAgaWYgKGJhdGNoU2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzIGJhdGNoU2l6ZSAlenUgPiBJTlRfTUFYLCBhaWRsIGludGVyZmFjZSBjYW5ub3QgaGFuZGxlIGJhdGNoIHNpemUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBiYXRjaFNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEJ1ZmZlcnM7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CisgICAgICAgcmVzID0gd3JhcEFzQWlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJDYWNoZT4gY2FjaGVzVG9SZW1vdmU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJlZWRCdWZmZXJzTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1GcmVlZEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2Ugb25CdWZmZXJGcmVlZAorICAgICAgICAgICAgaWYgKG1CdWZmZXJSZWNvcmRzLmlzU3RyZWFtQ2FjaGVkKHBhaXIuZmlyc3QpKSB7CisgICAgICAgICAgICAgICAgY2FjaGVzVG9SZW1vdmUucHVzaF9iYWNrKHtwYWlyLmZpcnN0LCBzdGF0aWNfY2FzdDxpbnQ2NF90PihwYWlyLnNlY29uZCl9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJlZWRCdWZmZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOworCisgICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKKyAgICAgICAgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0ID0gcmVxdWVzdHNbaV07CisgICAgICAgIGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3Q7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c1tpXTsKKworICAgICAgICBpZiAocmVxdWVzdC0+c2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncyk7CisgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihyZXF1ZXN0LT5zZXR0aW5ncyksIHNldHRpbmdzU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MubWV0YWRhdGEucmVzaXplKDApOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNldHRpbmdzUCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9ICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5tZXRhZGF0YS5hc3NpZ24oc2V0dGluZ3NQLCBzZXR0aW5nc1AgKyBzZXR0aW5nc1NpemUpOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEEgbnVsbCByZXF1ZXN0IHNldHRpbmdzIG1hcHMgdG8gYSBzaXplLTAgQ2FtZXJhTWV0YWRhdGEKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5tZXRhZGF0YS5yZXNpemUoMCk7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgIH0KKworICAgICAgICBjYXB0dXJlUmVxdWVzdCAtPmlucHV0V2lkdGggPSByZXF1ZXN0LT5pbnB1dF93aWR0aDsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0SGVpZ2h0ID0gcmVxdWVzdC0+aW5wdXRfaGVpZ2h0OworCisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpQaHlzaWNhbENhbWVyYVNldHRpbmc+JiBwaHlzaWNhbENhbWVyYVNldHRpbmdzID0KKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+cGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOworICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJiBtUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NTaXplKSkgeworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLm1ldGFkYXRhLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGh5c2ljYWxTZXR0aW5nc1AgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5tZXRhZGF0YS5hc3NpZ24ocGh5c2ljYWxTZXR0aW5nc1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc1AgKyBzZXR0aW5nc1NpemUpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLm1ldGFkYXRhLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0ucGh5c2ljYWxDYW1lcmFJZCA9IHJlcXVlc3QtPnBoeXNjYW1faWRbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG51bVJlcXVlc3RzID0gMDsKKyAgICBhdXRvIHJldFMgPSBtQWlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgJm51bVJlcXVlc3RzKTsKKyAgICBpZiAoIXJldFMuaXNPaygpKSB7CisgICAgICAgIHJlcyA9IEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXRTKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBpZiAobnVtUmVxdWVzdHMgPCAwKSB7CisgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVJlcXVlc3RzKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmIChyZXMgPT0gT0sgJiYgKm51bVJlcXVlc3RQcm9jZXNzZWQgPT0gYmF0Y2hTaXplKSB7CisgICAgICAgIGlmIChtQWlkbFNlc3Npb24tPmlzUmVtb3RlKCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgYWNxdWlyZSBmZW5jZSBGRHMgd2hlbiB0aGUgQUlETCB0cmFuc2FjdGlvbiBzdWNjZWVkcyAoc28gdGhlIEZEcyBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIHNlbnQgdG8gY2FtZXJhIEhBTCBwcm9jZXNzZXMpCisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQsIC8qY2xvc2VGZCovdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlIHRoZSBGRHMgYXJlIG5vdyBvd25lZCBieSBIQUwKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgRXJyb3Igd2l0aCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgJXMgIiwgX19GVU5DVElPTl9fLCByZXRTLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6d3JhcEFzQWlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorICAgICAgICAvKm91dCovY2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgeworICAgIHVzaW5nIGNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJTdGF0dXM7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcjsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIgfHwgaW5mbGlnaHRCdWZmZXJzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApLCBoYW5kbGVzQ3JlYXRlZCAoJXApLCBhbmQgaW5mbGlnaHRCdWZmZXJzKCVwKSAiCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCwgaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMDsKKworICAgIHsKKyAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKGlzTmV3QnVmZmVyKSA/IGNhbWVyYTM6OmR1cFRvQWlkbElmTm90TnVsbChidWYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGR1cGluZyBoZXJlIGlzIG9rYXksIGluIGFpZGwgb3duZXJzaGlwIGlzIG5vdCBnaXZlbiB0byBhaWRsX2hhbmRsZQorICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmFjcXVpcmVGZW5jZSA9IGNhbWVyYTM6OmR1cFRvQWlkbElmTm90TnVsbChhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworCisgICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wdXNoSW5mbGlnaHRCdWZmZXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5idWZmZXIpOworICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gLTE7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICB9CisKKyAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnMucmVzaXplKHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPworICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKGJ1ZikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGNhbWVyYTM6OmR1cFRvQWlkbElmTm90TnVsbChhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIEhBTCBidWZmZXIgbWFuYWdlbWVudCBwYXRoCisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisKKyAgICAgICAgICAgIC8vIE91dHB1dCBidWZmZXJzIGFyZSBlbXB0eSB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsIHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2FpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKgorICAgICAgICAgICAgICAgIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgLypvdXQqL3N0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qCisgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb24sCisgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c3dpdGNoVG9PZmZsaW5lIik7CisgICAgaWYgKCF2YWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChvZmZsaW5lU2Vzc2lvbkluZm8gPT0gbnVsbHB0ciB8fCBvZmZsaW5lU2Vzc2lvbiA9PSBudWxscHRyIHx8IGJ1ZmZlclJlY29yZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBhcmd1bWVudHMgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPnN3aXRjaFRvT2ZmbGluZShzdHJlYW1zVG9LZWVwLCBvZmZsaW5lU2Vzc2lvbkluZm8sIG9mZmxpbmVTZXNzaW9uKTsKKworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmVyaWZ5QnVmZmVyQ2FjaGVzKG9mZmxpbmVTZXNzaW9uSW5mbywgYnVmZmVyUmVjb3Jkcyk7Cit9CisKK0FpZGxDYW1lcmEzRGV2aWNlOjpBaWRsUmVxdWVzdFRocmVhZDo6QWlkbFJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAorICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRDYW1lcmFNdXRlKSA6CisgICAgICAgICAgUmVxdWVzdFRocmVhZChwYXJlbnQsIHN0YXR1c1RyYWNrZXIsIGludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cywgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgIHN1cHBvcnRDYW1lcmFNdXRlKSB7fQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbFJlcXVlc3RUaHJlYWQ6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9jYW1lcmE6OmRldmljZTo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKmxhc3RGcmFtZU51bWJlciovbnVsbHB0cik7CisKKyAgICAvLyBXYWl0IHVudGlsIHJlcXVlc3QgdGhyZWFkIGlzIGZ1bGx5IHN0b3BwZWQKKyAgICAvLyBUQkQ6IGNoZWNrIGlmIHJlcXVlc3QgdGhyZWFkIGlzIGJlaW5nIHBhdXNlZCBieSBvdGhlciBBUElzIChzaG91bGRuJ3QgYmUpCisKKyAgICAvLyBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSwgYnV0IHRoZSBBUEkgaW50ZXJmYWNlCisgICAgLy8gaXMgc2VyaWFsaXplZCBieSBDYW1lcmEzRGV2aWNlOjptSW50ZXJmYWNlTG9jayBzbyBubyBvbmUgc2hvdWxkIGJlIGFibGUgdG8gc3VibWl0IGFueQorICAgIC8vIG5ldyByZXF1ZXN0cyBkdXJpbmcgdGhlIGNhbGw7IGhlbmNlIHNraXAgdGhhdCBjaGVjay4KKyAgICBib29sIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOworICAgIHdoaWxlICghcXVldWVFbXB0eSkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFN1Ym1pdFRpbWVvdXQpOworICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IG9uZSByZXF1ZXN0IHdpdGhpbiB0aW1lb3V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IGEgcmVxdWVzdDogJXMgKCVkKSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBxdWV1ZUVtcHR5ID0gbU5leHRSZXF1ZXN0cy5lbXB0eSgpICYmIG1SZXF1ZXN0UXVldWUuZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxBaWRsSGFsSW50ZXJmYWNlICo+KG1JbnRlcmZhY2UuZ2V0KCkpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgb2ZmbGluZVNlc3Npb25JbmZvLCBvZmZsaW5lU2Vzc2lvbiwgYnVmZmVyUmVjb3Jkcyk7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JmNhbGxiYWNrKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisKKyAgICBpZiAobWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbWFuYWdlciBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGFyZW50LT5nZXRUcmFuc3BvcnRUeXBlKCkgIT0gSVBDVHJhbnNwb3J0OjpBSURMKSB7CisgICAgICAgIEFMT0dFKCIlcyBQYXJlbnQgdHJhbnNwb3J0IG5vdCBBSURMIGZvciBpbmplY3RlZCBjYW1lcmEgaWQgJXMsIGFib3J0aW5nIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtSW5qZWN0ZWRDYW1JZCA9IGluamVjdGVkQ2FtSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4gaW5qZWN0aW9uU2Vzc2lvbjsKKyAgICBBVFJBQ0VfQkVHSU4oIkluamVjdGlvbiBDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlbkFpZGxJbmplY3Rpb25TZXNzaW9uKGluamVjdGVkQ2FtSWQuc3RyaW5nKCksIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyAmaW5qZWN0aW9uU2Vzc2lvbik7CisgICAgQVRSQUNFX0VORCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgY291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBkZXZpY2VTZXNzaW9uID0gbnVsbHB0cjsKKyAgICBhdXRvIHJldCA9IGluamVjdGlvblNlc3Npb24tPmdldENhbWVyYURldmljZVNlc3Npb24oJmRldmljZVNlc3Npb24pOworICAgIGlmICghcmV0LmlzT2soKSB8fCBkZXZpY2VTZXNzaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIENhbWVyYSBpbmplY3Rpb24gc2Vzc2lvbiBjb3VsZG4ndCByZXR1cm4gSUNhbWVyYURldmljZVNlc3Npb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJldCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjwKKyAgICAgICAgICAgIGludDhfdCwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZT4gZGVzYzsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RRdWV1ZVJldCA9IGRldmljZVNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgmZGVzYyk7CisgICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIHRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEiCisgICAgICAgICAgICAgICAgIiBzZXNzaW9uOiAlcyIsIHJlcXVlc3RRdWV1ZVJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJlcXVlc3RRdWV1ZVJldCk7CisgICAgfQorICAgIHF1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2MpOworICAgIGlmICghcXVldWUtPmlzVmFsaWQoKSB8fCBxdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgcXVldWUgPSBudWxscHRyOworICAgICAgICAvLyBEb24ndCB1c2UgcmVzUXVldWUgb253YXJkcy4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I8CisgICAgICAgIGludDhfdCwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZT4gcmVzRGVzYzsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXN1bHRRdWV1ZVJldCA9IGRldmljZVNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCZyZXNEZXNjKTsKKyAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXN1bHRRdWV1ZVJldCk7CisgICAgfQorICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4ocmVzRGVzYyk7CisgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgIH0KKworICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSBpbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKCkiLCBfX0ZVTkNUSU9OX18pOworCisgICAgbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID0KKyAgICAgICAgICAgIG5ldyBBaWRsSGFsSW50ZXJmYWNlKGRldmljZVNlc3Npb24sIGluamVjdGlvblNlc3Npb24sIHF1ZXVlLCBwYXJlbnQtPm1Vc2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpyZXBsYWNlSGFsSW50ZXJmYWNlKAorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwgYm9vbCBrZWVwQmFja3VwKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvbkxvY2spOworICAgIGlmIChuZXdIYWxJbnRlcmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IFRoZSBuZXdIYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QsIHRvIHN0b3AgcmVwbGFjaW5nLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChwYXJlbnQtPmdldFRyYW5zcG9ydFR5cGUoKSAhPSBJUENUcmFuc3BvcnQ6OkFJREwgfHwKKyAgICAgICAgICAgIG5ld0hhbEludGVyZmFjZS0+Z2V0VHJhbnNwb3J0VHlwZSgpICE9IElQQ1RyYW5zcG9ydDo6QUlETCkgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IHRyYW5zcG9ydCBub3QgQUlETCBmb3IgcmVwbGFjaW5nIGhhbCBpbnRlcmZhY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQWlkbENhbWVyYTNEZXZpY2UgKmFpZGxQYXJlbnQgPSBzdGF0aWNfY2FzdDxBaWRsQ2FtZXJhM0RldmljZSAqPihwYXJlbnQuZ2V0KCkpOworICAgIGlmIChrZWVwQmFja3VwKSB7CisgICAgICAgIGlmIChtQmFja3VwSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBwYXJlbnQtPm1JbnRlcmZhY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKGFpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgICAgIGFpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBudWxscHRyOworICAgICAgICBhaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgIG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICB9CisgICAgcGFyZW50LT5tSW50ZXJmYWNlID0gbmV3SGFsSW50ZXJmYWNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OmluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgeworICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PEFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyAqPgorICAgICAgICAgICAgICAgICAgICAobUluamVjdGlvbk1ldGhvZHMuZ2V0KCkpKS0+aW5qZWN0aW9uSW5pdGlhbGl6ZShpbmplY3RlZENhbUlkLCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+KG1DYWxsYmFja3MpKTsKK307CisKK3NwPENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ+IEFpZGxDYW1lcmEzRGV2aWNlOjpjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKAorICAgICAgICAgICAgICAgIHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpIHsKKyAgICByZXR1cm4gbmV3IEFpZGxSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgdXNlSGFsQnVmTWFuYWdlciwgc3VwcG9ydENhbWVyYU11dGUpOworfTsKKworc3A8Q2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+CitBaWRsQ2FtZXJhM0RldmljZTo6Y3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50KSB7CisgICAgcmV0dXJuIG5ldyBBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMocGFyZW50KTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwYTdlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQUlETENBTUVSQTNERVZJQ0VfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQUlETENBTUVSQTNERVZJQ0VfSAorCisjaW5jbHVkZSAiLi4vQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgIkFpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlIDxmbXEvQWlkbE1lc3NhZ2VRdWV1ZS5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQm5DYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbi5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphbmRyb2lkOjpBaWRsTWVzc2FnZVF1ZXVlOworCisvKioKKyAqIENhbWVyYURldmljZSBmb3IgQUlETCBIQUwgZGV2aWNlcy4KKyAqLworY2xhc3MgQWlkbENhbWVyYTNEZXZpY2UgOgorICAgICAgICAgICAgcHVibGljIENhbWVyYTNEZXZpY2UgeworICBwdWJsaWM6CisKKyAgICB1c2luZyBBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBBaWRsTWVzc2FnZVF1ZXVlPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKyAgICBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOworICAgIGZyaWVuZCBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOworICAgIGV4cGxpY2l0IEFpZGxDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQgPSBmYWxzZSk7CisKKyAgICB2aXJ0dWFsIH5BaWRsQ2FtZXJhM0RldmljZSgpIHsgfQorCisgICAgc3RhdGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQaXhlbEZvcm1hdCBtYXBUb0FpZGxQaXhlbEZvcm1hdCgKKyAgICAgICAgICAgIGludCBmcmFtZXdvcmtGb3JtYXQpOworICAgIHN0YXRpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6RGF0YXNwYWNlIG1hcFRvQWlkbERhdGFzcGFjZSgKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7CisgICAgc3RhdGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSBtYXBUb0FpZGxDb25zdW1lclVzYWdlKAorICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UpOworICAgIHN0YXRpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uCisgICAgICAgICAgICBtYXBUb0FpZGxTdHJlYW1Sb3RhdGlvbihjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOworCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisKKyAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOworICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgdXNhZ2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgdXNhZ2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIC8qc3RyZWFtc1RvS2VlcCovLAorICAgICAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiAvKnNlc3Npb24qLykgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIG92ZXJyaWRlOworICAgIGNsYXNzIEFpZGxIYWxJbnRlcmZhY2UgOiBwdWJsaWMgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlIHsKKyAgICAgcHVibGljOgorICAgICAgICBBaWRsSGFsSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKKyAgICAgICAgQWlkbEhhbEludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgJmRldmljZVNlc3Npb24sCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+ICZpbmplY3Rpb25TZXNzaW9uLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworCisgICAgICAgIHZpcnR1YWwgSVBDVHJhbnNwb3J0IGdldFRyYW5zcG9ydFR5cGUoKSBjb25zdCBvdmVycmlkZSB7cmV0dXJuIElQQ1RyYW5zcG9ydDo6QUlETDsgfQorCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGNvbnN0cnVjdGVkIHdpdGggYSB2YWxpZCBkZXZpY2Ugb3Igc2Vzc2lvbiwgYW5kIG5vdCB5ZXQgY2xlYXJlZAorICAgICAgICB2aXJ0dWFsIGJvb2wgdmFsaWQoKSBvdmVycmlkZTsKKworICAgICAgICAvLyBSZXNldCB0aGlzIEhhbEludGVyZmFjZSBvYmplY3QgKGRvZXMgbm90IGNhbGwgY2xvc2UoKSkKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIG92ZXJyaWRlOworICAgICAgICAvLyBUaGUgaW5qZWN0aW9uIGNhbWVyYSBjb25maWd1cmVzIHRoZSBzdHJlYW1zIHRvIGhhbC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90KiBjb25maWcsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcywKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSBvdmVycmlkZTsKKworICAgICAgICAvLyBXaGVuIHRoZSBjYWxsIHN1Y2NlZWRzLCB0aGUgb3duZXJzaGlwIG9mIGFjcXVpcmUgZmVuY2VzIGluIHJlcXVlc3RzIGlzIHRyYW5zZmVycmVkIHRvCisgICAgICAgIC8vIEhhbEludGVyZmFjZS4gTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgc2VuZCB0aGUgZmVuY2UgdG8KKyAgICAgICAgLy8gSEFMIHByb2Nlc3MgYW5kIGNsb3NlIHRoZSBGRCBpbiBjYW1lcmFzZXJ2ZXIgcHJvY2Vzcy4gV2hlbiB0aGUgY2FsbCBmYWlscywgdGhlIG93bmVyc2hpcAorICAgICAgICAvLyBvZiB0aGUgYWNxdWlyZSBmZW5jZSBzdGlsbCBiZWxvbmdzIHRvIHRoZSBjYWxsZXIuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIG92ZXJyaWRlOworCisgICAgICAgIC8vIENhbGxzIGludG8gdGhlIEhBTCBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90ICwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmKSBvdmVycmlkZTsKKworICAgICAgICBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qCisgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPioKKyAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpOworCisgICAgIHByaXZhdGU6CisKKyAgICAgICAgLy8gQWx3YXlzIHZhbGlkCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPgorICAgICAgICAgICAgICAgIG1BaWRsU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIC8vVmFsaWQgZm9yIGluamVjdGlvbiBzZXNzaW9ucworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICBtQWlkbEluamVjdGlvblNlc3Npb24gPSBudWxscHRyOworCisgICAgICAgIHN0YXR1c190IHdyYXBBc0FpZGxSZXF1ZXN0KGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCisgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiogaW5mbGlnaHRCdWZmZXJzKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CisgICAgfTsgLy8gY2xhc3MgQWlkbEhhbEludGVyZmFjZQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKKyAgICAgKi8KKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG5vdGlmeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKKworICAgIGNsYXNzIEFpZGxSZXF1ZXN0VGhyZWFkIDogcHVibGljIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQgeworICAgICAgcHVibGljOgorICAgICAgICBBaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb24sCisgICAgICAgICAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpOworICAgIH07IC8vIGNsYXNzIEFpZGxSZXF1ZXN0VGhyZWFkCisKKyAgICBjbGFzcyBBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgOiBwdWJsaWMgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgeworICAgICBwdWJsaWM6CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIGdlbmVyYXRlIGFuIGhhbCBpbnRlcmZhY2UuCisgICAgICAgIHN0YXR1c190IGluamVjdGlvbkluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JgorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgIEFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQpIDoKKyAgICAgICAgICAgICAgICBDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyhwYXJlbnQpIHsgfTsKKyAgICAgICAgfkFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcygpIHt9CisgICAgIHByaXZhdGU6CisgICAgICAgIC8vIEJhY2t1cCBvZiB0aGUgb3JpZ2luYWwgY2FtZXJhIGhhbCByZXN1bHQgRk1RLgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIEZNUSB3cml0ZXMgdGhlIHJlc3VsdCBmb3IgdGhlIGluamVjdGlvbiBjYW1lcmEuIE11c3QgYmUgZ3VhcmRlZCBieQorICAgICAgICAvLyBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIFVzZSBpbmplY3Rpb24gY2FtZXJhIGhhbCBpbnRlcmZhY2UgdG8gcmVwbGFjZSBhbmQgYmFja3VwIG9yaWdpbmFsCisgICAgICAgIC8vIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgYm9vbCBrZWVwQmFja3VwKSBvdmVycmlkZTsKKyAgICB9OworCisgICAgLy8gV2UgbmVlZCBhIHNlcGFyYXRlIGNsYXNzIHdoaWNoIGluaGVyaXRzIGZyb20gQUlETCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzCisgICAgLy8gc2luY2Ugd2UgdXNlIHRoZSBuZGsgYmFja2VuZCBmb3IgQUlETCBIQUwgaW50ZXJmYWNlcy4gVGhlIG5kayBiYWNrZW5kIG9mCisgICAgLy8gSUNhbWVyYURldmljZUNhbGxiYWNrcyBkb2Vzbid0IHN1cHBvcnQgc3A8PiAoc2luY2UgaXQgZG9lc24ndCBpbmhlcml0CisgICAgLy8gZnJvbSBSZWZCYXNlKS4KKyAgICAvLyBBcyBhIHJlc3VsdCB3ZSBjYW4ndCB3cml0ZSBzcDxDYW1lcmEzRGV2aWNlPiA9IG5ldyBBaWRsQ2FtZXJhM0RldmljZSguLi4pLgorICAgIC8vIEl0IHN1cHBvcnRzIHN0ZDo6c2hhcmVkX3B0ciBpbnN0ZWFkLiBPdGhlciByZWZlcmVuY2VzIHRvCisgICAgLy8gQ2FtZXJhM0RldmljZSBpbiBjYW1lcmFzZXJ2ZXIgdXNlIHNwPD4gd2lkZWx5LCBzbyB0byBrZWVwIHN1cHBvcnRpbmcKKyAgICAvLyB0aGF0LCB3ZSBjcmVhdGUgYSBuZXcgY2xhc3Mgd2hpY2ggd2lsbCBiZSBtYW5hZ2VkIHRocm91Z2ggc3RkOjpzaGFyZWRfcHRyCisgICAgLy8gaW50ZXJuYWxseSBieSBBaWRsQ2FtZXJhM0RldmljZS4KKyAgICBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICAgICAgICAgIHB1YmxpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgeworICAgICAgcHVibGljOgorCisgICAgICAgIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3Mod3A8QWlkbENhbWVyYTNEZXZpY2U+IHBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgIHsgfQorICAgICAgICB+QWlkbENhbWVyYURldmljZUNhbGxiYWNrcygpIHsgfQorICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBub3RpZnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzKiBzdGF0dXMpIG92ZXJyaWRlOworCisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8QWlkbENhbWVyYTNEZXZpY2U+IG1QYXJlbnQgPSBudWxscHRyOworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0Q2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzcDxSZXF1ZXN0VGhyZWFkPiBjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHNwPENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorICAgICAgICAgICAgY3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4pIG92ZXJyaWRlOworCisgICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgc3RkOjp1bmlxdWVfcHRyPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbENhbWVyYURldmljZUNhbGxiYWNrcz4gbUNhbGxiYWNrcyA9IG51bGxwdHI7CisKKworfTsgLy8gY2xhc3MgQWlkbENhbWVyYTNEZXZpY2UKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2NzE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQWlkbENhbWVyYTMtT2ZmTG5Tc24iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTk5ERUJVRyAwICAvLyBQZXItZnJhbWUgdmVyYm9zZSBsb2dnaW5nCisKKyNpZmRlZiBMT0dfTk5ERUJVRworI2RlZmluZSBBTE9HVlYoLi4uKSBBTE9HVihfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBuYW1lc3BhY2UgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCitBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjp+QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogVGVhcmluZyBkb3duIGFpZGwgb2ZmbGluZSBzZXNzaW9uIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6ZGlzY29ubmVjdFNlc3Npb24oKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6aW5pdGlhbGl6ZSh3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKG1TZXNzaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBSURMIHNlc3Npb24gaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisKKyAgICAgICAgLy8gc2V0dXAgcmVzdWx0IEZNUQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yPAorICAgICAgICAgICAgaW50OF90LCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlPiBkZXNjOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXN1bHRRdWV1ZVJldCA9IG1TZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgmZGVzYyk7CisgICAgICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPihkZXNjKTsKKyAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgICAgICB9CisKKyAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19BQ1RJVkU7CisgICAgfQorCisgICAgbVNlc3Npb24tPnNldENhbGxiYWNrKG1DYWxsYmFja3MpOworCisgICAgcmV0dXJuIE9LOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgc3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHRzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om5vdGlmeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPm5vdGlmeShtc2dzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6bm90aWZ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKKyAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0PiogYnVmZmVycywKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworICAgIHNwPEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24+IHAgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBQYXJlbnQgQWlkbENhbWVyYURldmljZSBub3QgYWxpdmUsIGNhbid0IHByb2Nlc3MgY2FsbGJhY2tzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcC0+cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoYnVmUmVxcywgYnVmZmVycywgc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIGJ1ZmZlcnMsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzKiBzdGF0dXMpIHsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJlcXVlc3RCdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2ssIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgICp0aGlzLCBtQnVmZmVyUmVjb3JkcywgKnRoaXN9OworICAgIGNhbWVyYTM6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmUmVxcywgYnVmZmVycywgc3RhdHVzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgc3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXR1cm5TdHJlYW1CdWZmZXJzKGJ1ZmZlcnMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzfTsKKworICAgIGNhbWVyYTM6OnJldHVyblN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZmZXJzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6ZGlzY29ubmVjdFNlc3Npb24oKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgIG1TZXNzaW9uLT5jbG9zZSgpOworICB9CisgIG1TZXNzaW9uLnJlc2V0KCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2RlMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0FJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0FJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSAiQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhT2ZmbGluZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPGZtcS9BaWRsTWVzc2FnZVF1ZXVlLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgiCisKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ2FtZXJhM1N0cmVhbTsKK2NsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U7CitjbGFzcyBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKKy8qKgorICogQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbiBmb3Igb2ZmbGluZSBzZXNzaW9uIGRlZmluZWQgaW4gQUlETCBJQ2FtZXJhT2ZmbGluZVNlc3Npb24KKyAqLworY2xhc3MgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbiA6CisgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIHsKKyAgcHVibGljOgorCisgICAgdmlydHVhbCB+QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbigpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cyk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbm90aWZ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKKworICAgIC8vIFNlZSBleHBsYW5hdGlvbiBmb3Igd2h5IHdlIG5lZWQgYSBzZXBhcmF0ZSBjbGFzcyBmb3IgdGhpcyBpbgorICAgIC8vIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIGluIEFpZGxDYW1lcmEzRGV2aWNlLmgKKyAgICBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICAgICAgICAgIHB1YmxpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgeworICAgICAgcHVibGljOgorCisgICAgICAgIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3Mod3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcGFyZW50KSA6IG1QYXJlbnQocGFyZW50KSAgeyB9CisgICAgICAgIH5BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkge30KKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbm90aWZ5KAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKSBvdmVycmlkZTsKKworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+KiBvdXRfYnVmZmVycywKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIF9haWRsX3JldHVybgorICAgICAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBtUGFyZW50ID0gbnVsbHB0cjsKKyAgICB9OworCisgICAgLy8gaW5pdGlhbGl6ZSBieSBDYW1lcmEzRGV2aWNlLgorICAgIGV4cGxpY2l0IEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24oY29uc3QgU3RyaW5nOCYgaWQsCisgICAgICAgICAgICBjb25zdCBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiYgaW5wdXRTdHJlYW0sCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpTdHJlYW1TZXQmIG9mZmxpbmVTdHJlYW1TZXQsCisgICAgICAgICAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzJiYgYnVmZmVyUmVjb3JkcywKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OkluRmxpZ2h0UmVxdWVzdE1hcCYgb2ZmbGluZVJlcXMsCisgICAgICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb24pIDoKKyAgICAgIENhbWVyYTNPZmZsaW5lU2Vzc2lvbihpZCwgaW5wdXRTdHJlYW0sIG9mZmxpbmVTdHJlYW1TZXQsIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwKKyAgICAgICAgICAgICAgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMpLAorICAgICAgbVNlc3Npb24ob2ZmbGluZVNlc3Npb24pIHsKKyAgICAgICAgbUNhbGxiYWNrcyA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPih0aGlzKTsKKyAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbmQgb2YgQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlIGludGVyZmFjZQorICAgICAqLworCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBtU2Vzc2lvbjsKKyAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1DYWxsYmFja3M7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdFNlc3Npb24oKSBvdmVycmlkZTsKKworfTsgLy8gY2xhc3MgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmVlYmQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBaWRsQ2FtZXJhMy1PdXRwdXRVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OTkRFQlVHIDAgIC8vIFBlci1mcmFtZSB2ZXJib3NlIGxvZ2dpbmcKKworI2lmZGVmIExPR19OTkRFQlVHCisjZGVmaW5lIEFMT0dWViguLi4pIEFMT0dWKF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBlcnJvciBzdGF0ZQorI2RlZmluZSBTRVRfRVJSKGZtdCwgLi4uKSBzdGF0ZXMuc2V0RXJySW50Zi5zZXRFcnJvclN0YXRlKCAgIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oIgorCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK3ZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCisgICAgICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKKyAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZFQ8QWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMsCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4sIEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclN0YXR1cywgaW50OF90PihzdGF0ZXMsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKK30KKwordm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZyYgbXNnKSB7CisKKyAgICB1c2luZyBFcnJvckNvZGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkVycm9yQ29kZTsKKyAgICB1c2luZyBUYWcgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZzo6VGFnOworCisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBjYW1lcmFfbm90aWZ5X21zZyBtOworCisgICAgc3dpdGNoIChtc2cuZ2V0VGFnKCkpIHsKKyAgICAgICAgY2FzZSBUYWc6OmVycm9yOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19FUlJPUjsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cuZ2V0PFRhZzo6ZXJyb3I+KCkuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBpZiAobXNnLmdldDxUYWc6OmVycm9yPigpLmVycm9yU3RyZWFtSWQgPj0gMCkgeworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQobXNnLmdldDxUYWc6OmVycm9yPigpLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cuZ2V0PFRhZzo6ZXJyb3I+KCkuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy5nZXQ8VGFnOjplcnJvcj4oKS5lcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfREVWSUNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVNVTFQ6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9SRVNVTFQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9CVUZGRVI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVGFnOjpzaHV0dGVyOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19TSFVUVEVSOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gbXNnLmdldDxUYWc6OnNodXR0ZXI+KCkuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXAgPSBtc2cuZ2V0PFRhZzo6c2h1dHRlcj4oKS50aW1lc3RhbXA7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci5yZWFkb3V0X3RpbWVzdGFtcCA9IG1zZy5nZXQ8VGFnOjpzaHV0dGVyPigpLnJlYWRvdXRUaW1lc3RhbXA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgbm90aWZ5KHN0YXRlcywgJm0pOworfQorCisKKy8vIFRoZSBidWZmZXJzIHJlcXVlc3RlZCB0aHJvdWdoIHRoaXMgY2FsbCBhcmUgbm90IHRpZWQgdG8gYW55IENhcHR1cmVSZXF1ZXN0IGluCisvLyBwYXJ0aWN1bGFyLiBUaGV5IG1heSB1c2VkIGJ5IHRoZSBoYWwgZm9yIGEgcGFydGljdWxhciBmcmFtZSdzIG91dHB1dCBidWZmZXIKKy8vIG9yIGZvciBpdHMgaW50ZXJuYWwgdXNlIGFzIHdlbGwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGhhbCBkb2VzIHVzZSBhbnkgYnVmZmVyCisvLyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGlzdCBoZXJlLCBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lJ3Mgb3V0cHV0IGJ1ZmZlciwgdGhlCisvLyBidWZmZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxsIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBmcmFtZS4gVGhlIG90aGVyIGJ1ZmZlcnMgd2lsbCBiZSByZXR1cm5lZCB0aHJvdWdoIHJldHVyblN0cmVhbUJ1ZmZlcnMuCisvLyBUaGUgYnVmZmVycyByZXR1cm5lZCB2aWEgcmV0dXJuU3RyZWFtQnVmZmVycyB3aWxsIG5vdCBoYXZlIGEgdmFsaWQKKy8vIHRpbWVzdGFtcCgwKSBhbmQgd2lsbCBiZSBkcm9wcGVkIGJ5IHRoZSBidWZmZXJxdWV1ZS4KK3ZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0QnVmZmVycywKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldDsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKyAgICB1c2luZyBUYWcgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcnNWYWw6OlRhZzsKKyAgICBpZiAob3V0QnVmZmVycyA9PSBudWxscHRyIHx8IHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBvdXRCdWZmZXJzIC8gYnVmZmVyIHN0YXR1cyBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzdGF0ZXMucmVxQnVmZmVyTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQnVmZmVyUmV0PiBidWZSZXRzOworICAgIG91dEJ1ZmZlcnMtPmNsZWFyKCk7CisgICAgaWYgKCFzdGF0ZXMudXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlbWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0ZXMuY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkczsKKyAgICBzc2l6ZV90IHN6ID0gc3RyZWFtSWRzLnNldENhcGFjaXR5KGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICBpZiAoc3ogPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4oc3opICE9IGJ1ZlJlcXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJXp1IGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSk7CisgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVmUmVxcy5zaXplKCkgPiBzdGF0ZXMub3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b28gbWFueSBidWZmZXIgcmVxdWVzdHMgKCV6dSA+ICMgb2Ygb3V0cHV0IHN0cmVhbXMgJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSwgc3RhdGVzLm91dHB1dFN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgKnN0YXR1cyA9IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBzdHJlYW1JZAorICAgIGZvciAoY29uc3QgYXV0byYgYnVmUmVxIDogYnVmUmVxcykgeworICAgICAgICBpZiAoc3RyZWFtSWRzLmluZGV4T2YoYnVmUmVxLnN0cmVhbUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtSWRzLmFkZChidWZSZXEuc3RyZWFtSWQpOworICAgIH0KKworICAgIGlmICghc3RhdGVzLnJlcUJ1ZmZlckludGYuc3RhcnRSZXF1ZXN0QnVmZmVyKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IGJ1ZmZlciBkaXNhbGxvd2VkIHdoaWxlIGNhbWVyYSBzZXJ2aWNlIGlzIGNvbmZpZ3VyaW5nIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmUmV0cy5yZXNpemUoYnVmUmVxcy5zaXplKCkpOworCisgICAgYm9vbCBhbGxSZXFzU3VjY2VlZHMgPSB0cnVlOworICAgIGJvb2wgb25lUmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZlJlcXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgYnVmUmVxID0gYnVmUmVxc1tpXTsKKyAgICAgICAgYXV0byYgYnVmUmV0ID0gYnVmUmV0c1tpXTsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQnVmZmVyUmV0PiBlbXB0eUJ1ZlJldHM7CisgICAgICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HOworICAgICAgICAgICAgc3RhdGVzLnJlcUJ1ZmZlckludGYuZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYnVmUmV0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7CisgICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQorICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKKyAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOworICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YnVmZmVyX2hhbmRsZV90PiBuZXdCdWZmZXJzOworICAgICAgICBzaXplX3QgbnVtQWxsb2NhdGVkQnVmZmVycyA9IDA7CisgICAgICAgIHNpemVfdCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7IGIrKykgeworICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgY2FuIHJ1biBjb25jdXJyZW50bHkgd2l0aCByZXF1ZXN0IHRocmVhZAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHdhaXQgZHVyYXRpb24gZXZlcnl0aW1lIHdlIGNhbGwgZ2V0YnVmZmVyCisgICAgICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9ICBzdGF0ZXMucmVxQnVmZmVySW50Zi5nZXRXYWl0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZzYiwgd2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCB8fCByZXMgPT0gTk9fTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmVycm9yPihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1BbGxvY2F0ZWRCdWZmZXJzKys7CisKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gc2IuYnVmZmVyOworICAgICAgICAgICAgYXV0byBwYWlyID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLmdldEJ1ZmZlcklkKCpidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisKKyAgICAgICAgICAgIGhCdWYuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVySWQgPSBidWZmZXJJZDsKKworICAgICAgICAgICAgaEJ1Zi5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKCpidWZmZXIpIDoKKyAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICBoQnVmLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9ICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgIGlmIChpc05ld0J1ZmZlcikgeworICAgICAgICAgICAgICAgIG5ld0J1ZmZlcnMucHVzaF9iYWNrKCpidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc2IuYWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc2IuYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vbWFrZVRvQWlkbCBwYXNzZXMgb3duZXJzaGlwIHRvIGFpZGwgTmF0aXZlSGFuZGxlIG1hZGUuIE93bmVyc2hpcAorICAgICAgICAgICAgLy9pcyBwYXNzZWQgOiBzZWUgc3lzdGVtL3dpbmRvdy5oIDogZGVxdWV1ZUJ1ZmZlcgorICAgICAgICAgICAgaEJ1Zi5hY3F1aXJlRmVuY2UgPSBtYWtlVG9BaWRsSWZOb3ROdWxsKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICBpZiAoYWNxdWlyZUZlbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisKKyAgICAgICAgICAgIHJlcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5wdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCByZWdpc3RlciByZXF1ZXN0IGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmVycm9yPihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRSZXFTdWNjZWVkcykgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjpidWZmZXJzPihzdGQ6Om1vdmUodG1wUmV0QnVmZmVycykpOworICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCIlczogcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyIGZhaWxlZCBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIDAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBidWYgOiBuZXdCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnJlbW92ZU9uZUJ1ZmZlckNhY2hlKHN0cmVhbUlkLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnN0YXR1cyA9IGFsbFJlcXNTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6Ok9LIDoKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1BBUlRJQUwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfVU5LTk9XTiwKKyAgICAvLyBUcmFuc2ZlciBvd25lcnNoaXAgb2YgYnVmZmVyIGZkcyB0byBvdXRCdWZmZXJzCisgICAgKm91dEJ1ZmZlcnMgPSBzdGQ6Om1vdmUoYnVmUmV0cyk7CisKKyAgICBzdGF0ZXMucmVxQnVmZmVySW50Zi5lbmRSZXF1ZXN0QnVmZmVyKCk7Cit9CisKK3ZvaWQgcmV0dXJuU3RyZWFtQnVmZmVycyhSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgcmV0dXJuU3RyZWFtQnVmZmVyc1Qoc3RhdGVzLCBidWZmZXJzKTsKK30KKworfSAvLyBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzk1NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0FJRExfQ0FNRVJBM19PVVRQVVRfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQUlETF9DQU1FUkEzX09VVFBVVF9VVElMU19ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL0FpZGxNZXNzYWdlUXVldWUuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSAiZGV2aWNlMy9CdWZmZXJVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgiCisjaW5jbHVkZSAidXRpbHMvVGFnTW9uaXRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFuZHJvaWQ6OkFpZGxNZXNzYWdlUXVldWU7CisKK3VzaW5nIEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlID0gQWlkbE1lc3NhZ2VRdWV1ZTxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CituYW1lc3BhY2UgY2FtZXJhMyB7CisgICAgaW5saW5lIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSBkdXBUb0FpZGxJZk5vdE51bGwoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oKSB7CisgICAgICAgIGlmIChuaCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGR1cFRvQWlkbChuaCk7CisgICAgfQorCisgICAgaW5saW5lIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSBtYWtlVG9BaWRsSWZOb3ROdWxsKAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaCkgeworICAgICAgICBpZiAobmggPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYWtlVG9BaWRsKG5oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBBaWRsQ2FtZXJhM0RldmljZS9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCisgICAgICovCisKKyAgICAvLyBDYW1lcmEzRGV2aWNlL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbiBpbnRlcm5hbCBzdGF0ZXMgdXNlZCBpbiBub3RpZnkvcHJvY2Vzc0NhcHR1cmVSZXN1bHQKKyAgICAvLyBjYWxsYmFja3MKKyAgICBzdHJ1Y3QgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgOiBwdWJsaWMgQ2FwdHVyZU91dHB1dFN0YXRlcyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcTsKKyAgICB9OworCisgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIGNhbGxlcnMgaG9sZCB0aGUgbG9jayB0byBzZXJpYWxpemUgYWxsCisgICAgLy8gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbHMKKyAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAorICAgICAgICAgICAgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPgorICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisKKyAgICB2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnJiBtc2csCisgICAgICAgIGJvb2wgaGFzUmVhZG91dFRpbWUsIHVpbnQ2NF90IHJlYWRvdXRUaW1lKTsKKworICAgIHZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2cmIG1zZyk7CisKKyAgICB2b2lkIHJlcXVlc3RTdHJlYW1CdWZmZXJzKFJlcXVlc3RCdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dF9idWZmZXJzLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogX2FpZGxfcmV0dXJuKTsKKworICAgIHZvaWQgcmV0dXJuU3RyZWFtQnVmZmVycyhSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiNDI2YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5jcHAKQEAgLTAsMCArMSwxODU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIaWRsQ2FtZXJhMy1EZXZpY2UiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTk5ERUJVRyAwICAvLyBQZXItZnJhbWUgdmVyYm9zZSBsb2dnaW5nCisKKyNpZmRlZiBMT0dfTk5ERUJVRworI2RlZmluZSBBTE9HVlYoLi4uKSBBTE9HVihfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8vIENvbnZlbmllbmNlIG1hY3JvIGZvciB0cmFuc2llbnQgZXJyb3JzCisjZGVmaW5lIENMT0dFKGZtdCwgLi4uKSBBTE9HRSgiQ2FtZXJhICVzOiAlczogIiBmbXQsIG1JZC5zdHJpbmcoKSwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorCisvLyBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIHRyYW5zaXRpb25pbmcgdG8gdGhlIGVycm9yIHN0YXRlCisjZGVmaW5lIFNFVF9FUlIoZm10LCAuLi4pIHNldEVycm9yU3RhdGUoICAgXAorICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBTRVRfRVJSX0woZm10LCAuLi4pIHNldEVycm9yU3RhdGVMb2NrZWQoIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaCIKKyNpbmNsdWRlICJ1dGlscy9UcmFjZUhGUi5oIgorCisjaW5jbHVkZSAiLi4vLi4vY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5oIgorI2luY2x1ZGUgIkhpZGxDYW1lcmEzRGV2aWNlLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dHVwbGU+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlYzXzY6OkNhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KAorICAgICAgICBpbnQgZnJhbWV3b3JrRm9ybWF0KSB7CisgICAgcmV0dXJuIChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQpIGZyYW1ld29ya0Zvcm1hdDsKK30KKworRGF0YXNwYWNlRmxhZ3MgSGlkbENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZSgKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIGRhdGFTcGFjZTsKK30KKworQnVmZmVyVXNhZ2VGbGFncyBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKAorICAgICAgICB1aW50NjRfdCB1c2FnZSkgeworICAgIHJldHVybiB1c2FnZTsKK30KKworU3RyZWFtUm90YXRpb24gSGlkbENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24oY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSB7CisgICAgc3dpdGNoIChyb3RhdGlvbikgeworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDoKKyAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMDsKKyAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzkwOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl85MDsKKyAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMTgwOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8yNzA7CisgICAgfQorICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gcm90YXRpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHJvdGF0aW9uKTsKKyAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKSB7CisgICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAob3BlcmF0aW9uTW9kZSA8IENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCkgeworICAgICAgICBzd2l0Y2gob3BlcmF0aW9uTW9kZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgb3BlcmF0aW9uTW9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICptb2RlID0gc3RhdGljX2Nhc3Q8U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU+KG9wZXJhdGlvbk1vZGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtGb3JtYXQoCisgICAgICAgIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGl4ZWxGb3JtYXQpOworfQorCithbmRyb2lkX2RhdGFzcGFjZSBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgIERhdGFzcGFjZUZsYWdzIGRhdGFTcGFjZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oZGF0YVNwYWNlKTsKK30KKwordWludDY0X3QgSGlkbENhbWVyYTNEZXZpY2U6Om1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgeworICAgIHJldHVybiB1c2FnZTsKK30KKwordWludDY0X3QgSGlkbENhbWVyYTNEZXZpY2U6Om1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgeworICAgIHJldHVybiB1c2FnZTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBISURMIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIENMT0dFKCJBbHJlYWR5IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiBzZXNzaW9uOworICAgIEFUUkFDRV9CRUdJTigiQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOworICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5IaWRsU2Vzc2lvbihtSWQuc3RyaW5nKCksIHRoaXMsCisgICAgICAgICAgICAvKm91dCovICZzZXNzaW9uKTsKKyAgICBBVFJBQ0VfRU5EKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYSBzZXNzaW9uOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1JZC5zdHJpbmcoKSwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmbURldmljZUluZm8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyA9IG1hbmFnZXItPnN1cHBvcnROYXRpdmVab29tUmF0aW8obUlkLnN0cmluZygpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICAgICAgLy8gRG8gbm90IG92ZXJyaWRlIGNoYXJhY3RlcmlzdGljcyBmb3IgcGh5c2ljYWwgY2FtZXJhcworICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLCAvKm92ZXJyaWRlRm9yUGVyZkNsYXNzKi9mYWxzZSwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZC5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgdXNlUHJlY29ycmVjdEFycmF5ID0KKyAgICAgICAgICAgICAgICAgICAgRGlzdG9ydGlvbk1hcHBlcjo6aXNEaXN0b3J0aW9uU3VwcG9ydGVkKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgaWYgKHVzZVByZWNvcnJlY3RBcnJheSkgeworICAgICAgICAgICAgICAgIHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyc1twaHlzaWNhbElkXS5zZXR1cFN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHJlYWQgY2FtZXJhICVzJ3MgY2FsaWJyYXRpb24gZmllbGRzIGZvciBkaXN0b3J0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGlvbiIsIHBoeXNpY2FsSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtWm9vbVJhdGlvTWFwcGVyc1twaHlzaWNhbElkXSA9IFpvb21SYXRpb01hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvLCB1c2VQcmVjb3JyZWN0QXJyYXkpOworCisgICAgICAgICAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKAorICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKSkgeworICAgICAgICAgICAgICAgIG1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzW3BoeXNpY2FsSWRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcihtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmVjb3JyZWN0QXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZTsKKyAgICBhdXRvIHJlcXVlc3RRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZxdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGlmICghcXVldWUtPmlzVmFsaWQoKSB8fCBxdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVxdWVzdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHRoZSBxdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlcXVlc3RRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXF1ZXN0IG1ldGFkYXRhIGZtcTogJXMsIG5vdCB1c2UgaXQiLAorICAgICAgICAgICAgICAgIHJlcXVlc3RRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcmVzUXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAorICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgSUZfQUxPR1YoKSB7CisgICAgICAgIHNlc3Npb24tPmludGVyZmFjZUNoYWluKFtdKAorICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlNlc3Npb24gaW50ZXJmYWNlIGNoYWluOiIpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWZhY2UgOiBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBidWZNZ3JNb2RlID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OKTsKKyAgICBpZiAoYnVmTWdyTW9kZS5jb3VudCA+IDApIHsKKyAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OX0hJRExfREVWSUNFXzNfNSk7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgY2FwYWJpbGl0aWVzID0gbURldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfT0ZGTElORV9QUk9DRVNTSU5HKSB7CisgICAgICAgICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1JbnRlcmZhY2UgPSBuZXcgSGlkbEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworCisgICAgc3RkOjpzdHJpbmcgcHJvdmlkZXJUeXBlOworICAgIG1WZW5kb3JUYWdJZCA9IG1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQobUlkLnN0cmluZygpKTsKKyAgICBtVGFnTW9uaXRvci5pbml0aWFsaXplKG1WZW5kb3JUYWdJZCk7CisgICAgaWYgKCFtb25pdG9yVGFncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKKyAgICB9CisKKyAgICAvLyBNZXRhZGF0YSB0YWdzIG5lZWRzIGZpeHVwIGZvciBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBsZXNzCisgICAgLy8gdGhhbiAzLjUuCisgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SElETDsKKyAgICByZXMgPSBtYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihtSWQuc3RyaW5nKCksICZtYXhWZXJzaW9uLCAmdHJhbnNwb3J0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgZGV2aWNlIHZlcnNpb24gaWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgbWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7CisKKyAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgIGlzTW9ub2Nocm9tZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gKGlzTW9ub2Nocm9tZSAmJiBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpOworCisgICAgcmV0dXJuIGluaXRpYWxpemVDb21tb25Mb2NrZWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgeworICAgIFJlcXVlc3RCdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2ssIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgICp0aGlzLCAqbUludGVyZmFjZSwgKnRoaXN9OworICAgIGNhbWVyYTM6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmUmVxcywgX2hpZGxfY2IpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgKm1JbnRlcmZhY2V9OworICAgIGNhbWVyYTM6OnJldHVyblN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZmZXJzKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KKyAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICAgeworICAgICAgICBtSWQsCisgICAgICAgIG1JbkZsaWdodExvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtSW5GbGlnaHRNYXAsIG1PdXRwdXRMb2NrLCAgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgICptSW50ZXJmYWNlLCBtTGVnYWN5Q2xpZW50LCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIC8vSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgaGlkbFN0YXRlcyB7CisgICAgLy99CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgIH0KKyAgICBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnVubG9jaygpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCisvLyBPbmx5IG9uZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBzaG91bGQgYmUgY2FsbGVkIGF0IGEgdGltZSwgc28KKy8vIHRoZSBsb2NrcyB3b24ndCBibG9jay4gVGhlIGxvY2tzIGFyZSBwcmVzZW50IGhlcmUgc2ltcGx5IHRvIGVuZm9yY2UgdGhpcy4KK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOworCisgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAorICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCisgICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQorICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgeworICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCisgICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCisgICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgorICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOworICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgorICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgorICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAge21JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCBub1BoeXNNZXRhZGF0YSk7CisgICAgfQorICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNEZXZpY2U6Om5vdGlmeSgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHJldHVybiBub3RpZnlIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+KG1zZ3MpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb3RpZnlNc2dUeXBlPgoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6bm90aWZ5SGVscGVyKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Tm90aWZ5TXNnVHlwZT4mIG1zZ3MpIHsKKyAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBncmFiIG1Mb2NrLCBidXQgdGhhdCBjYW4gbGVhZCB0byBkZWFkbG9jaywgYW5kCisgICAgLy8gaXQncyBub3Qgc3VwZXIgaW1wb3J0YW50IHRvIGdldCB1cCB0byBkYXRlIHZhbHVlIG9mIG1TdGF0dXMgZm9yIHRoaXMKKyAgICAvLyB3YXJuaW5nIHByaW50LCBoZW5jZSBza2lwcGluZyB0aGUgbG9jayBoZXJlCisgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIC8vIFBlciBBUEkgY29udHJhY3QsIEhBTCBzaG91bGQgYWN0IGFzIGNsb3NlZCBhZnRlciBkZXZpY2UgZXJyb3IKKyAgICAgICAgLy8gQnV0IG1TdGF0dXMgY2FuIGJlIHNldCB0byBlcnJvciBieSBmcmFtZXdvcmsgYXMgd2VsbCwgc28ganVzdCBsb2cKKyAgICAgICAgLy8gYSB3YXJuaW5nIGhlcmUuCisgICAgICAgIEFMT0dXKCIlczogcmVjZWl2ZWQgbm90aWZ5IG1lc3NhZ2UgaW4gZXJyb3Igc3RhdGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtT3V0cHV0TG9jayk7CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAge21JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgeworICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKworICAgIGJvb2wgaGFzSW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cjsKKyAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSBoYXNJbnB1dFN0cmVhbSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIGJvb2wgaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUgPSBoYXNJbnB1dFN0cmVhbSA/CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0tPmdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpIDogZmFsc2U7CisgICAgYXV0byBvdXRwdXRTdHJlYW1JZHMgPSBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKTsKKyAgICBhdXRvIHN0cmVhbUlkcyA9IG91dHB1dFN0cmVhbUlkczsKKyAgICBpZiAoaGFzSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgc3RyZWFtSWRzLnB1c2hfYmFjayhtSW5wdXRTdHJlYW0tPmdldElkKCkpOworICAgIH0KKworICAgIC8vIENoZWNrIGFsbCBzdHJlYW1zIGluIHN0cmVhbXNUb0tlZXAgc3VwcG9ydHMgb2ZmbGluZSBtb2RlCisgICAgZm9yIChhdXRvIGlkIDogc3RyZWFtc1RvS2VlcCkgeworICAgICAgICBpZiAoc3RkOjpmaW5kKHN0cmVhbUlkcy5iZWdpbigpLCBzdHJlYW1JZHMuZW5kKCksIGlkKSA9PSBzdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgeworICAgICAgICAgICAgaWYgKCFpbnB1dFN0cmVhbVN1cHBvcnRzT2ZmbGluZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW5wdXQgc3RyZWFtICVkIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgICAgICAgICAgaWYgKCFzdHJlYW0tPmdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBvdXRwdXQgc3RyZWFtICVkIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVE9ETzogYmxvY2sgc3VyZmFjZSBzaGFyaW5nIGFuZCBzdXJmYWNlIGdyb3VwIHN0cmVhbXMgdW50aWwgd2UgY2FuIHN1cHBvcnQgdGhlbQorCisgICAgLy8gU3RvcCByZXBlYXRpbmcgcmVxdWVzdCwgd2FpdCB1bnRpbCBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQsIHRoZW4gY2FsbCBpbnRvCisgICAgLy8gSEFMIHN3aXRjaFRvT2ZmbGluZQorICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvIG9mZmxpbmVTZXNzaW9uSW5mbzsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb247CisgICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyBidWZmZXJSZWNvcmRzOworICAgIHN0YXR1c190IHJldCA9IHN0YXRpY19jYXN0PEhpZGxSZXF1ZXN0VGhyZWFkICo+KG1SZXF1ZXN0VGhyZWFkLmdldCgpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uLCAmYnVmZmVyUmVjb3Jkcyk7CisKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIlN3aXRjaCB0byBvZmZsaW5lIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgc3VjYyA9IG1SZXF1ZXN0QnVmZmVyU00ub25Td2l0Y2hUb09mZmxpbmVTdWNjZXNzKCk7CisgICAgaWYgKCFzdWNjKSB7CisgICAgICAgIFNFVF9FUlIoIkhBTCBtdXN0IG5vdCBiZSBjYWxsaW5nIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwiKTsKKyAgICAgICAgLy8gVE9ETzogYmxvY2sgQUxMIGNhbGxiYWNrcyBmcm9tIEhBTCB0aWxsIGFwcCBjb25maWd1cmVkIG5ldyBzdHJlYW1zPworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgb2ZmbGluZVNlc3Npb25JbmZvCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gb2ZmbGluZVN0cmVhbUlkczsKKyAgICBvZmZsaW5lU3RyZWFtSWRzLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgLy8gdmVyaWZ5IHN0cmVhbSBJRHMKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG5vdCBmb3VuZCEiLCBpZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gbm90IHVzaW5nIEhBTCBidWYgbWFuYWdlciwgb25seSBhbGxvdyBzdHJlYW1zIHJlcXVlc3RlZCBieSBhcHAgdG8gYmUgcHJlc2VydmVkCisgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtc1RvS2VlcC5iZWdpbigpLCBzdHJlYW1zVG9LZWVwLmVuZCgpLCBpZCkgPT0gc3RyZWFtc1RvS2VlcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoInN0cmVhbSBJRCAlZCBtdXN0IG5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lISIsIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZmxpbmVTdHJlYW1JZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gKGlkID09IGlucHV0U3RyZWFtSWQpID8KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obUlucHV0U3RyZWFtKSA6CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4+KG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICAvLyBWZXJpZnkgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMKKyAgICAgICAgaWYgKHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSAhPSBvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycykgeworICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSBzdHJlYW0gJWQgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJXp1LCVkKSAoc2VydmljZS9IQUwpIiwKKyAgICAgICAgICAgICAgICAgICAgaWQsIHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSwgb2ZmbGluZVN0cmVhbS5udW1PdXRzdGFuZGluZ0J1ZmZlcnMpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWZXJpZnkgYWxsIHN0cmVhbXMgdG8gYmUgZGVsZXRlZCBkb24ndCBoYXZlIGFueSBvdXRzdGFuZGluZyBidWZmZXJzCisgICAgaWYgKGhhc0lucHV0U3RyZWFtICYmIHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSkgeworICAgICAgICAgICAgU0VUX0VSUigiSW5wdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQsIG1JbnB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgb3V0U3RyZWFtSWQgOiBvdXRwdXRTdHJlYW1JZHMpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQpID09IG9mZmxpbmVTdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGF1dG8gb3V0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG91dFN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChvdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT3V0cHV0IHN0cmVhbSAlZCBzdGlsbCBoYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlciEiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQsIG91dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbkZsaWdodFJlcXVlc3RNYXAgb2ZmbGluZVJlcXM7CisgICAgLy8gVmVyaWZ5IGluZmxpZ2h0IHJlcXVlc3RzIGFuZCB0aGVpciBwZW5kaW5nIGJ1ZmZlcnMKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1JbkZsaWdodExvY2spOworICAgICAgICBmb3IgKGF1dG8gb2ZmbGluZVJlcSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lUmVxdWVzdHMpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgZnJhbWUgbnVtYmVyICVkIG5vdCBmb3VuZCEiLCBvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgYXV0byYgaW5mbGlnaHRSZXEgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOworICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgc3BlY2lmaWMgc3RyZWFtIElEcworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnNMZWZ0ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCk7CisgICAgICAgICAgICBpZiAobnVtQnVmZmVyc0xlZnQgIT0gb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJWQsJWQpIChzZXJ2aWNlL0hBTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGlnaHRSZXEubnVtQnVmZmVyc0xlZnQsIG9mZmxpbmVSZXEucGVuZGluZ1N0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZmxpbmVSZXFzLmFkZChvZmZsaW5lUmVxLmZyYW1lTnVtYmVyLCBpbmZsaWdodFJlcSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGFuZCB0cmFuc2ZlciBvYmplY3Qgb3duZXJzaGlwCisgICAgLy8gICAoc3RyZWFtcywgaW5mbGlnaHQgcmVxdWVzdHMsIGJ1ZmZlciBjYWNoZXMpCisgICAgY2FtZXJhMzo6U3RyZWFtU2V0IG9mZmxpbmVTdHJlYW1TZXQ7CisgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gaW5wdXRTdHJlYW07CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0ciAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2ZmbGluZVN0cmVhbVNldC5hZGQoaWQsIG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBsb2NrIGJlZm9yZSBjb3B5aW5nIHN0YXRlcworICAgIC8vICAgICAgIHRob3VnaCB0ZWNobmljYWxseSBubyBvdGhlciB0aHJlYWQgc2hvdWxkIGJlIHRhbGtpbmcgdG8gQ2FtZXJhM0RldmljZSBhdCB0aGlzIHBvaW50CisgICAgQ2FtZXJhM09mZmxpbmVTdGF0ZXMgb2ZmbGluZVN0YXRlcygKKyAgICAgICAgICAgIG1UYWdNb25pdG9yLCBtVmVuZG9yVGFnSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCwgbU51bVBhcnRpYWxSZXN1bHRzLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsIG1EaXN0b3J0aW9uTWFwcGVycywKKyAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMpOworCisgICAgKnNlc3Npb24gPSBuZXcgSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbihtSWQsIGlucHV0U3RyZWFtLCBvZmZsaW5lU3RyZWFtU2V0LAorICAgICAgICAgICAgc3RkOjptb3ZlKGJ1ZmZlclJlY29yZHMpLCBvZmZsaW5lUmVxcywgb2ZmbGluZVN0YXRlcywgb2ZmbGluZVNlc3Npb24pOworCisgICAgLy8gRGVsZXRlIGFsbCBzdHJlYW1zIHRoYXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gb2ZmbGluZSBzZXNzaW9uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zKSB7CisgICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOworICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkaXNjb25uZWN0IGFsbCBvdGhlciBzdHJlYW1zIGFuZCBzd2l0Y2ggdG8gVU5DT05GSUdVUkVEIHN0YXRlCisgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IG1JbnB1dFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3QgaW5wdXQgc3RyZWFtIGZhaWxlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCkpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgcmV0ID0gc3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiZGlzY29ubmVjdCBvdXRwdXQgc3RyZWFtICVkIGZhaWxlZCEiLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOworICAgIG1PdXRwdXRTdHJlYW1zLmNsZWFyKCk7CisgICAgbU5lZWRDb25maWcgPSB0cnVlOworICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTkNPTkZJR1VSRUQpOworICAgIG1PcGVyYXRpbmdNb2RlID0gTk9fTU9ERTsKKyAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPSBmYWxzZTsKKyAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXJQcmV2aW91c1JlcXVlc3QoKTsKKworICAgIHJldHVybiBPSzsKKyAgICAvLyBUTyBiZSBkb25lIGJ5IENhbWVyYURldmljZUNsaWVudC9DYW1lcmEzT2ZmbGluZVNlc3Npb24KKyAgICAvLyByZWdpc3RlciB0aGUgb2ZmbGluZSBjbGllbnQgdG8gY2FtZXJhIHNlcnZpY2UKKyAgICAvLyBTZXR1cCByZXN1bHQgcGFzc3RoaW5nIHRocmVhZHMgZXRjCisgICAgLy8gSW5pdGlhbGl6ZSBvZmZsaW5lIHNlc3Npb24gc28gSEFMIGNhbiBzdGFydCBzZW5kaW5nIGNhbGxiYWNrIHRvIGl0IChyZXN1bHQgRm1xKQorICAgIC8vIFRPRE86IGNoZWNrIGhvdyBtYW55IG9uSWRsZSBjYWxsYmFjayB3aWxsIGJlIHNlbnQKKyAgICAvLyBKYXZhIHNpZGUgdG8gbWFrZSBzdXJlIHRoZSBDYW1lcmFDYXB0dXJlU2Vzc2lvbiBpcyBwcm9wZXJseSBjbG9zZWQKK30KKworc3A8Q2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZD4gSGlkbENhbWVyYTNEZXZpY2U6OmNyZWF0ZU5ld1JlcXVlc3RUaHJlYWQoCisgICAgICAgICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LCBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgeworICAgICAgICByZXR1cm4gbmV3IEhpZGxSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIHVzZUhhbEJ1Zk1hbmFnZXIsIHN1cHBvcnRDYW1lcmFNdXRlKTsKK307CisKK3NwPENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorSGlkbENhbWVyYTNEZXZpY2U6OmNyZWF0ZUNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCkgeworICAgIHJldHVybiBuZXcgSGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHBhcmVudCk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjppbmplY3Rpb25DYW1lcmFJbml0aWFsaXplKGNvbnN0IFN0cmluZzggJmluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKKyAgICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgKj4oCisgICAgICAgICAgICAgICAgbUluamVjdGlvbk1ldGhvZHMuZ2V0KCkpKS0+aW5qZWN0aW9uSW5pdGlhbGl6ZShpbmplY3RlZENhbUlkLCBtYW5hZ2VyLCB0aGlzKTsKK307CisKKworSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OkhpZGxIYWxJbnRlcmZhY2UoCisgICAgICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSA6CisgICAgICAgIEhhbEludGVyZmFjZSh1c2VIYWxCdWZNYW5hZ2VyLCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpLAorICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCisgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM183LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzYgPSBkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNi5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNiA9IGNhc3RSZXN1bHRfM182OworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzMgPSBkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfMy5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfMyA9IGNhc3RSZXN1bHRfM18zOworICAgIH0KK30KKworYm9vbCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6dmFsaWQoKSB7CisgICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzcuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM182LmNsZWFyKCk7CisgICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOworICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CisgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKAorICAgICAgICBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90IHRlbXBsYXRlSWQsCisgICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGlkbEhhbDo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworCisgICAgYXV0byByZXF1ZXN0Q2FsbGJhY2sgPSBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGVycjsKKyAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7CisgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1BSRVZJRVc6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fUkVDT1JEOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1JFQ09SRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6Ok1BTlVBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRCwgb3IgdGhpcyBIQUwgaXMgdG9vIG9sZCB0byBzdXBwb3J0IGl0CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBlcnIgPSBtSGlkbFNlc3Npb24tPmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoaWQsIHJlcXVlc3RDYWxsYmFjayk7CisKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitib29sIEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjppc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpIHsKKyAgICAvLyBXZSBkbyByZWNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdDsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgaWYgKChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpICYmIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKSB7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBvbGRQYXJhbXMsIG5ld1BhcmFtczsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG9sZFNlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbmV3U2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIG9sZFBhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9sZFNlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShvbGRTZXNzaW9NZXRhKSk7CisgICAgICAgIG5ld1BhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG5ld1Nlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShuZXdTZXNzaW9NZXRhKSk7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIGNhbGxTdGF0dXM7CisgICAgICAgIGJvb2wgcmVxdWlyZWQ7CisgICAgICAgIGF1dG8gaGlkbENiID0gWyZjYWxsU3RhdHVzLCAmcmVxdWlyZWRdIChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBzLAorICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZWRGbGFnKSB7CisgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgIHJlcXVpcmVkID0gcmVxdWlyZWRGbGFnOworICAgICAgICB9OworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQob2xkUGFyYW1zLCBuZXdQYXJhbXMsIGhpZGxDYik7CisgICAgICAgIG9sZFNlc3Npb25QYXJhbXMudW5sb2NrKG9sZFNlc3Npb01ldGEpOworICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLnVubG9jayhuZXdTZXNzaW9NZXRhKTsKKyAgICAgICAgaWYgKGVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uICYmIG1IaWRsU2Vzc2lvbl8zXzcgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAorICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKKyAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKKyAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSAmZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSAmZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbSAmZHN0M183ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKnNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZHN0M18yLmlkID0gc3RyZWFtSWQ7CisgICAgICAgIGRzdDNfMi5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICAgICAgZHN0M18yLndpZHRoID0gc3JjLT53aWR0aDsKKyAgICAgICAgZHN0M18yLmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QzXzIudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7CisgICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKKyAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZGVuIG9uZXMuCisgICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpID8KKyAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSA6IHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpIDogc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKKyAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KKyAgICAgICAgZHN0M183LnYzXzQgPSBkc3QzXzQ7CisgICAgICAgIGRzdDNfNy5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgeworICAgICAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLT5keW5hbWljX3JhbmdlX3Byb2ZpbGUgIT0KKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBub24tc3RhbmRhcmQgZHluYW1pYyByYW5nZSBwcm9maWxlczogJSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNyYy0+ZHluYW1pY19yYW5nZV9wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyYy0+dXNlX2Nhc2UgIT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBub24tZGVmYXVsdCBzdHJlYW0gdXNlIGNhc2UgJSIgUFJJZDY0ICIhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzcmMtPnVzZV9jYXNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYWN0aXZlU3RyZWFtcy5pbnNlcnQoc3RyZWFtSWQpOworICAgICAgICAvLyBDcmVhdGUgQnVmZmVyIElEIG1hcCBpZiBuZWNlc3NhcnkKKyAgICAgICAgbUJ1ZmZlclJlY29yZHMudHJ5Q3JlYXRlQnVmZmVyQ2FjaGUoc3RyZWFtSWQpOworICAgIH0KKyAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcworICAgIG1CdWZmZXJSZWNvcmRzLnJlbW92ZUluYWN0aXZlQnVmZmVyQ2FjaGVzKGFjdGl2ZVN0cmVhbXMpOworCisgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKKyAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHNpemVfdCBzZXNzaW9uUGFyYW1TaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOworCisgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKKyAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOworICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CisgICAgZGV2aWNlOjpWM182OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNjsKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisKKyAgICBhdXRvIGNvbmZpZ1N0cmVhbTM0Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzQgPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9OworCisgICAgYXV0byBjb25maWdTdHJlYW0zNkNiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzZdCisgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM182OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM182ID0gaGFsQ29uZmlndXJhdGlvbjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgfTsKKworICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNCA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNl0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtc1tpXS52M180LnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0gY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZVN0cmVhbXNfM183KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcsIGNvbmZpZ1N0cmVhbTM2Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzYgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IHYzLjYgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzYtPmNvbmZpZ3VyZVN0cmVhbXNfM182KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM2Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IHYzLjUgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmNvbmZpZ3VyZVN0cmVhbXNfM181KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjMgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuMyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCisgICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBkb24ndDsgdXNlIHYzLjIgY2FsbCBhbmQgY29uc3RydWN0IGEgdjMuMyBIYWxTdHJlYW1Db25maWd1cmF0aW9uCisgICAgICAgIEFMT0dWKCIlczogdjMuMiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbl8zXzI7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25fM18yXQorICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbl8zXzIgPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS52M18yID0gZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zW2ldOworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0ub3ZlcnJpZGVEYXRhU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgKSB7CisgICAgICAgIHJldHVybiBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBISURMCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpLT5nZXRJZCgpOworCisgICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcworICAgICAgICBzaXplX3QgcmVhbElkeCA9IGk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IGhhbFN0cmVhbUNvdW50ID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBoYWxTdHJlYW1Db3VudDsgaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGhhbFN0cmVhbUNvdW50IC0gMSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOworICAgICAgICBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbSAmc3JjXzM2ID0gZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXNbcmVhbElkeF07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogZHN0U3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpOworICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMudjNfMi5vdmVycmlkZUZvcm1hdCk7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKKworICAgICAgICBpZiAobUhpZGxTZXNzaW9uXzNfNiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChzcmNfMzYuc3VwcG9ydE9mZmxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzdFN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUoZmFsc2UpOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7CisgICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IERhdGFTcGFjZSBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbCBuZWVkRm9ybWF0T3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZm9ybWF0ICE9IHNyYy52M18yLm92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgYm9vbCBuZWVkRGF0YXNwYWNlT3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlICE9IHNyYy5vdmVycmlkZURhdGFTcGFjZTsKKyAgICAgICAgICAgIC8vIE92ZXJyaWRlIGFsbG93ZWQgd2l0aCBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKG5lZWRGb3JtYXRPdmVycmlkZSk7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKG5lZWREYXRhc3BhY2VPdmVycmlkZSk7CisgICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgZHN0LT5kYXRhX3NwYWNlID0gb3ZlcnJpZGVEYXRhU3BhY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkFfU1RSRUFNX0lOUFVUKSB7CisgICAgICAgICAgICBpZiAoc3JjLnYzXzIucHJvZHVjZXJVc2FnZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IElOUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIHByb2R1Y2VyIHVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZShzcmMudjNfMi5jb25zdW1lclVzYWdlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPVVRQVVQKKyAgICAgICAgICAgIGlmIChzcmMudjNfMi5jb25zdW1lclVzYWdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogT1VUUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIGNvbnN1bWVyIHVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZShzcmMudjNfMi5wcm9kdWNlclVzYWdlKSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5tYXhfYnVmZmVycyA9IHNyYy52M18yLm1heEJ1ZmZlcnM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogY29uZmlnLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSB7CisgICAgQVRSQUNFX05BTUUoIkluamVjdGlvbkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbikgeworICAgICAgICBBTE9HRSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0ICIKKyAgICAgICAgICAgICAgICAic3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAorICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKKyAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKKyAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSYgZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSYgZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbSYgZHN0M183ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QqIHNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdDNfMi51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0M18yLnJvdGF0aW9uID0KKyAgICAgICAgICAgICAgICBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qpc3JjLT5yb3RhdGlvbik7CisgICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKKyAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZGVuIG9uZXMuCisgICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9CisgICAgICAgIGRzdDNfNC52M18yID0gZHN0M18yOworICAgICAgICBkc3QzXzQuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOworICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzcudjNfNCA9IGRzdDNfNDsKKyAgICAgICAgZHN0M183Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7CisgICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOworICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7CisgICAgICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICB9CisgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKKyAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnRyeUNyZWF0ZUJ1ZmZlckNhY2hlKHN0cmVhbUlkKTsKKyAgICB9CisgICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKKyAgICBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVJbmFjdGl2ZUJ1ZmZlckNhY2hlcyhhY3RpdmVTdHJlYW1zKTsKKworICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGlvbk1vZGU7CisgICAgcmVzID0gbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKKyAgICAgICAgICAgIChjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KWNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnNlc3Npb25QYXJhbXMuc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSksCisgICAgICAgICAgICBzZXNzaW9uUGFyYW1TaXplKTsKKworICAgIC8vIFNlZSB3aGljaCB2ZXJzaW9uIG9mIEhBTCB3ZSBoYXZlCisgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0KKyAgICAgICAgICAgICAgICBjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb247CisKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHJhd01ldGFkYXRhID0gY2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmdldEFuZExvY2soKTsKKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIGhpZGxDaGFycyA9IHt9OworICAgICAgICBoaWRsQ2hhcnMuc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmF3TWV0YWRhdGEpKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpKTsKKyAgICAgICAgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzLnVubG9jayhyYXdNZXRhZGF0YSk7CisKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzc7CisgICAgICAgIGF1dG8gY2FzdEluamVjdGlvblJlc3VsdF8zXzcgPQorICAgICAgICAgICAgICAgIGRldmljZTo6VjNfNzo6SUNhbWVyYUluamVjdGlvblNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbl8zXzcpOworICAgICAgICBpZiAoY2FzdEluamVjdGlvblJlc3VsdF8zXzcuaXNPaygpKSB7CisgICAgICAgICAgICBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzcgPSBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBlcnIgPSBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZUluamVjdGlvblN0cmVhbXMoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNywgaGlkbENoYXJzKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG1IaWRsU2Vzc2lvbl8zXzcgZG9lcyBub3QgZXhpc3QsIHRoZSBsb3dlc3QgdmVyc2lvbiBvZiBpbmplY3Rpb24gIgorICAgICAgICAgICAgICAgICJzZXNzaW9uIGlzIDMuNyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIgfHwgaW5mbGlnaHRCdWZmZXJzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApLCBoYW5kbGVzQ3JlYXRlZCAoJXApLCBhbmQgaW5mbGlnaHRCdWZmZXJzKCVwKSAiCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCwgaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMDsKKworICAgIHsKKyAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSAtMTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgIH0KKworICAgICAgICBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVycy5yZXNpemUocmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOworICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgLy8gT3V0cHV0IGJ1ZmZlcnMgYXJlIGVtcHR5IHdoZW4gdXNpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucHVzaEluZmxpZ2h0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpmbHVzaCgpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpmbHVzaCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmZsdXNoKCk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGVycik7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmR1bXAoaW50IC8qZmQqLykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmR1bXAiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIC8vIEhhbmRsZWQgYnkgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpkdW1wCisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpyZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJi8qc3RyZWFtSWRzKi8pIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpyZXBlYXRpbmdSZXF1ZXN0RW5kIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6Y2xvc2UoKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y2xvc2UoKSIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmNsb3NlKCk7CisgICAgLy8gSW50ZXJmYWNlIHdpbGwgYmUgZGVhZCBzaG9ydGx5IGFueXdheSwgc28gZG9uJ3QgbG9nIGVycm9ycworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnNpZ25hbFBpcGVsaW5lRHJhaW4iKTsKKyAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+c2lnbmFsU3RyZWFtRmx1c2goc3RyZWFtSWRzLCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgLSAxKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAorICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqPiYgcmVxdWVzdHMsLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBzcDxkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzQ7CisgICAgc3A8ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gaGlkbFNlc3Npb25fM183OworICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNy5pc09rKCkpIHsKKyAgICAgICAgaGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKKyAgICAgICAgaGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CisgICAgfQorCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0czsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzXzNfNDsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM183OjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzXzNfNzsKKyAgICBzaXplX3QgYmF0Y2hTaXplID0gcmVxdWVzdHMuc2l6ZSgpOworICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183LnJlc2l6ZShiYXRjaFNpemUpOworICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNC5yZXNpemUoYmF0Y2hTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXNDcmVhdGVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gaW5mbGlnaHRCdWZmZXJzOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgeworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC52M18yLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGRldmljZTo6VjNfMjo6QnVmZmVyQ2FjaGU+IGNhY2hlc1RvUmVtb3ZlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUZyZWVkQnVmZmVyc0xvY2spOworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtRnJlZWRCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBUaGUgc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIG9uQnVmZmVyRnJlZWQKKyAgICAgICAgICAgIGlmIChtQnVmZmVyUmVjb3Jkcy5pc1N0cmVhbUNhY2hlZChwYWlyLmZpcnN0KSkgeworICAgICAgICAgICAgICAgIGNhY2hlc1RvUmVtb3ZlLnB1c2hfYmFjayh7cGFpci5maXJzdCwgcGFpci5zZWNvbmR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJlZWRCdWZmZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKKworICAgIC8vIFdyaXRlIG1ldGFkYXRhIHRvIEZNUS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CisgICAgICAgIGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCA9IHJlcXVlc3RzW2ldOworICAgICAgICBkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdDsKKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQudjNfMjsKKyAgICAgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3QtPnNldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemVfdCBzZXR0aW5nc1NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpOworICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSwgc2V0dGluZ3NTaXplKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IHNldHRpbmdzU2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY291bGRuJ3QgdXRpbGl6ZSBmbXEsIGZhbGxiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnNldHRpbmdzKSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBIG51bGwgcmVxdWVzdCBzZXR0aW5ncyBtYXBzIHRvIGEgc2l6ZS0wIENhbWVyYU1ldGFkYXRhCisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MucmVzaXplKDApOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGlkbCBzZXNzaW9uIDMuNyBzcGVjaWZpYyBoYW5kbGluZy4KKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLmlucHV0V2lkdGggPSByZXF1ZXN0LT5pbnB1dF93aWR0aDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0uaW5wdXRIZWlnaHQgPSByZXF1ZXN0LT5pbnB1dF9oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBoaWRsIHNlc3Npb24gMy43IGFuZCAzLjQgc3BlY2lmaWMgaGFuZGxpbmcuCisgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0ciB8fCBoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nPiYgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9CisgICAgICAgICAgICAgICAgICAgIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgPworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA6CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKHJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3M7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gc2V0dGluZ3NTaXplOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjb3VsZG4ndCB1dGlsaXplIGZtcSwgZmFsbGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MucmVzaXplKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnBoeXNpY2FsQ2FtZXJhSWQgPSByZXF1ZXN0LT5waHlzY2FtX2lkW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaGFyZHdhcmU6OmRldGFpbHM6OnJldHVybl9zdGF0dXMgZXJyOworICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQorICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKKyAgICAgICAgfTsKKyAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM183LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM183KGNhcHR1cmVSZXF1ZXN0c18zXzcsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOworICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKKyAgICB9CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgJiYgKm51bVJlcXVlc3RQcm9jZXNzZWQgIT0gYmF0Y2hTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IHJldHVybnMgT0sgYnV0IHByb2Nlc3NlZCAlZC8lenUgcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKm51bVJlcXVlc3RQcm9jZXNzZWQsIGJhdGNoU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICB9CisKKyAgICByZXMgPSBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIGlmIChtSGlkbFNlc3Npb24tPmlzUmVtb3RlKCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgYWNxdWlyZSBmZW5jZSBGRHMgd2hlbiB0aGUgSElETCB0cmFuc2FjdGlvbiBzdWNjZWVkcyAoc28gdGhlIEZEcyBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIHNlbnQgdG8gY2FtZXJhIEhBTCBwcm9jZXNzZXMpCisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQsIC8qY2xvc2VGZCovdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlIHRoZSBGRHMgYXJlIG5vdyBvd25lZCBieSBIQUwKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzd2l0Y2hUb09mZmxpbmUiKTsKKyAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChvZmZsaW5lU2Vzc2lvbkluZm8gPT0gbnVsbHB0ciB8fCBvZmZsaW5lU2Vzc2lvbiA9PSBudWxscHRyIHx8IGJ1ZmZlclJlY29yZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBhcmd1bWVudHMgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQorICAgICAgICBbJnN0YXR1cywgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uXSAoYXV0byBzLCBhdXRvIGluZm8sIGF1dG8gc2Vzc2lvbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm9mZmxpbmVTZXNzaW9uSW5mbyA9IGluZm87CisgICAgICAgICAgICAgICAgKm9mZmxpbmVTZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgfTsKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzYtPnN3aXRjaFRvT2ZmbGluZShzdHJlYW1zVG9LZWVwLCByZXN1bHRDYWxsYmFjayk7CisKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiB2ZXJpZnlCdWZmZXJDYWNoZXMob2ZmbGluZVNlc3Npb25JbmZvLCBidWZmZXJSZWNvcmRzKTsKK30KKworSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxSZXF1ZXN0VGhyZWFkOjpIaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpIDoKKyAgICAgICAgICBSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgc3VwcG9ydENhbWVyYU11dGUpIHt9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsUmVxdWVzdFRocmVhZDo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKmxhc3RGcmFtZU51bWJlciovbnVsbHB0cik7CisKKyAgICAvLyBXYWl0IHVudGlsIHJlcXVlc3QgdGhyZWFkIGlzIGZ1bGx5IHN0b3BwZWQKKyAgICAvLyBUQkQ6IGNoZWNrIGlmIHJlcXVlc3QgdGhyZWFkIGlzIGJlaW5nIHBhdXNlZCBieSBvdGhlciBBUElzIChzaG91bGRuJ3QgYmUpCisKKyAgICAvLyBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSwgYnV0IHRoZSBBUEkgaW50ZXJmYWNlCisgICAgLy8gaXMgc2VyaWFsaXplZCBieSBDYW1lcmEzRGV2aWNlOjptSW50ZXJmYWNlTG9jayBzbyBubyBvbmUgc2hvdWxkIGJlIGFibGUgdG8gc3VibWl0IGFueQorICAgIC8vIG5ldyByZXF1ZXN0cyBkdXJpbmcgdGhlIGNhbGw7IGhlbmNlIHNraXAgdGhhdCBjaGVjay4KKyAgICBib29sIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOworICAgIHdoaWxlICghcXVldWVFbXB0eSkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFN1Ym1pdFRpbWVvdXQpOworICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IG9uZSByZXF1ZXN0IHdpdGhpbiB0aW1lb3V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IGEgcmVxdWVzdDogJXMgKCVkKSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBxdWV1ZUVtcHR5ID0gbU5leHRSZXF1ZXN0cy5lbXB0eSgpICYmIG1SZXF1ZXN0UXVldWUuZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxIaWRsSGFsSW50ZXJmYWNlICo+KG1JbnRlcmZhY2UuZ2V0KCkpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgb2ZmbGluZVNlc3Npb25JbmZvLCBvZmZsaW5lU2Vzc2lvbiwgYnVmZmVyUmVjb3Jkcyk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisKKyAgICBpZiAobWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbWFuYWdlciBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtSW5qZWN0ZWRDYW1JZCA9IGluamVjdGVkQ2FtSWQ7CisgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247CisgICAgQVRSQUNFX0JFR0lOKCJJbmplY3Rpb24gQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOworICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5IaWRsU2Vzc2lvbihpbmplY3RlZENhbUlkLnN0cmluZygpLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOworICAgIEFUUkFDRV9FTkQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIGNvdWxkIG5vdCBvcGVuIGNhbWVyYSBzZXNzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOworICAgIGF1dG8gcmVxdWVzdFF1ZXVlUmV0ID0KKyAgICAgICAgc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKFsmcXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIHF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpZiAoIXF1ZXVlLT5pc1ZhbGlkKCkgfHwgcXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgSEFMIHJldHVybnMgZW1wdHkgcmVxdWVzdCBtZXRhZGF0YSBmbXEsIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlIGl0Iik7CisgICAgICAgICAgICAgICAgcXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSB0aGUgcXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIHRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXF1ZXN0IG1ldGFkYXRhIGZtcTogIgorICAgICAgICAgICAgICAgICIlcywgbm90IHVzZSBpdCIsIHJlcXVlc3RRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIEhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIml0Iik7CisgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcmVzUXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSAiCisgICAgICAgICAgICAgICAgImZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBJRl9BTE9HVigpIHsKKyAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oCisgICAgICAgICAgICAgICAgW10oOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlmYWNlIDogaW50ZXJmYWNlQ2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSBpbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKCkiLCBfX0ZVTkNUSU9OX18pOworCisgICAgbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID0KKyAgICAgICAgICAgIG5ldyBIaWRsSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBwYXJlbnQtPm1Vc2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpyZXBsYWNlSGFsSW50ZXJmYWNlKAorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwgYm9vbCBrZWVwQmFja3VwKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvbkxvY2spOworICAgIGlmIChuZXdIYWxJbnRlcmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IFRoZSBuZXdIYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QsIHRvIHN0b3AgcmVwbGFjaW5nLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChuZXdIYWxJbnRlcmZhY2UtPmdldFRyYW5zcG9ydFR5cGUoKSAhPSBJUENUcmFuc3BvcnQ6OkhJREwpIHsKKyAgICAgICAgQUxPR0UoIiVzIFJlcGxhY2luZyBISURMIEhhbEludGVyZmFjZSB3aXRoIGFub3RoZXIgdHJhbnNwb3J0IHVuc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEhpZGxDYW1lcmEzRGV2aWNlICpoaWRsUGFyZW50ID0gc3RhdGljX2Nhc3Q8SGlkbENhbWVyYTNEZXZpY2UgKj4ocGFyZW50LmdldCgpKTsKKyAgICBpZiAoa2VlcEJhY2t1cCkgeworICAgICAgICBpZiAobUJhY2t1cEhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gcGFyZW50LT5tSW50ZXJmYWNlOworICAgICAgICB9CisgICAgICAgIGlmIChtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShoaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgICAgICBoaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShtSW5qZWN0aW9uUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgaGlkbFBhcmVudC0+bVJlc3VsdE1ldGFkYXRhUXVldWUgPSBzdGQ6Om1vdmUobUJhY2t1cFJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgICAgICBtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgfQorICAgIHBhcmVudC0+bUludGVyZmFjZSA9IG5ld0hhbEludGVyZmFjZTsKKworICAgIHJldHVybiBPSzsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5OGZlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfSElETENBTUVSQTNERVZJQ0VfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfSElETENBTUVSQTNERVZJQ0VfSAorCisjaW5jbHVkZSAiLi4vQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgIkhpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8qKgorICogQ2FtZXJhRGV2aWNlIGZvciBISURMIEhBTCBkZXZpY2VzIHdpdGggdmVyc2lvbiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCBvciBoaWdoZXIuCisgKi8KK2NsYXNzIEhpZGxDYW1lcmEzRGV2aWNlIDoKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrLAorICAgICAgICAgICAgcHVibGljIENhbWVyYTNEZXZpY2UgeworICBwdWJsaWM6CisKKyAgIGV4cGxpY2l0IEhpZGxDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgIGJvb2wgbGVnYWN5Q2xpZW50ID0gZmFsc2UpIDogQ2FtZXJhM0RldmljZShpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGxlZ2FjeUNsaWVudCkgeyB9CisKKyAgICB2aXJ0dWFsIH5IaWRsQ2FtZXJhM0RldmljZSgpIHt9CisKKyAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcworICAgICAqLworICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKKyAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKworICAgIC8vIEhhbmRsZSBvbmUgbm90aWZ5IG1lc3NhZ2UKKyAgICB2b2lkIG5vdGlmeShjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKTsKKworICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgb3ZlcnJpZGU7CisKKyAgICB1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCisgICAgY2xhc3MgSGlkbEhhbEludGVyZmFjZSA6IHB1YmxpYyBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2UgeworICAgICBwdWJsaWM6CisgICAgICAgIEhpZGxIYWxJbnRlcmZhY2Uoc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisKKyAgICAgICAgdmlydHVhbCBJUENUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIElQQ1RyYW5zcG9ydDo6SElETDsgfQorICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgY29uc3RydWN0ZWQgd2l0aCBhIHZhbGlkIGRldmljZSBvciBzZXNzaW9uLCBhbmQgbm90IHlldCBjbGVhcmVkCisgICAgICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFJlc2V0IHRoaXMgSGFsSW50ZXJmYWNlIG9iamVjdCAoZG9lcyBub3QgY2FsbCBjbG9zZSgpKQorICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSBvdmVycmlkZTsKKworICAgICAgICAvLyBDYWxscyBpbnRvIHRoZSBIQUwgaW50ZXJmYWNlCisKKyAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gY2FtZXJhIGNvbmZpZ3VyZXMgdGhlIHN0cmVhbXMgdG8gaGFsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3QqIGNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgc3VjY2VlZHMsIHRoZSBvd25lcnNoaXAgb2YgYWNxdWlyZSBmZW5jZXMgaW4gcmVxdWVzdHMgaXMgdHJhbnNmZXJyZWQgdG8KKyAgICAgICAgLy8gSGFsSW50ZXJmYWNlLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIHRoZSBmZW5jZSB0bworICAgICAgICAvLyBIQUwgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIEZEIGluIGNhbWVyYXNlcnZlciBwcm9jZXNzLiBXaGVuIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3duZXJzaGlwCisgICAgICAgIC8vIG9mIHRoZSBhY3F1aXJlIGZlbmNlIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzdHJlYW1JZHMpIG92ZXJyaWRlOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpOworCisgICAgIHByaXZhdGU6CisKKyAgICAgICAgLy8gQWx3YXlzIHZhbGlkCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuMyBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjUgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNTsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNiBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM182OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy43IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzc7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CisKKyAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QKKyAgICAgICAgLy8gRG8gbm90IGZyZWUgaW5wdXQgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0CisgICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogaW4sCisgICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpOworICAgIH07IC8vIGNsYXNzIEhpZGxIYWxJbnRlcmZhY2UKKworICAgIGNsYXNzIEhpZGxSZXF1ZXN0VGhyZWFkIDogcHVibGljIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQgeworICAgICAgcHVibGljOgorICAgICAgICBIaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7CisgICAgfTsgLy8gY2xhc3MgSGlkbFJlcXVlc3RUaHJlYWQKKworICAgIGNsYXNzIEhpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyA6IHB1YmxpYyBDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyB7CisgICAgIHB1YmxpYzoKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgZ2VuZXJhdGUgYW4gaGFsIGludGVyZmFjZS4KKyAgICAgICAgc3RhdHVzX3QgaW5qZWN0aW9uSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMiA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKKyAgICAgICAgSGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCkgOgorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHBhcmVudCkgeyB9OworICAgICAgICB+SGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKCkge30KKyAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQmFja3VwIG9mIHRoZSBvcmlnaW5hbCBjYW1lcmEgaGFsIHJlc3VsdCBGTVEuCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKworICAgICAgICAvLyBGTVEgd3JpdGVzIHRoZSByZXN1bHQgZm9yIHRoZSBpbmplY3Rpb24gY2FtZXJhLiBNdXN0IGJlIGd1YXJkZWQgYnkKKyAgICAgICAgLy8gbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIFVzZSBpbmplY3Rpb24gY2FtZXJhIGhhbCBpbnRlcmZhY2UgdG8gcmVwbGFjZSBhbmQgYmFja3VwIG9yaWdpbmFsCisgICAgICAgIC8vIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgYm9vbCBrZWVwQmFja3VwKSBvdmVycmlkZTsKKyAgICB9OworCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm90aWZ5TXNnVHlwZT4KKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG5vdGlmeUhlbHBlcigKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxOb3RpZnlNc2dUeXBlPiYgbXNncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0Q2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzcDxSZXF1ZXN0VGhyZWFkPiBjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHNwPENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorICAgICAgICAgICAgY3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4pIG92ZXJyaWRlOworCisgICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworCit9OyAvLyBjbGFzcyBIaWRsQ2FtZXJhM0RldmljZQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzk3ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIaWRsLUNhbWVyYTMtT2ZmTG5Tc24iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246On5IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBUZWFyaW5nIGRvd24gaGlkbCBvZmZsaW5lIHNlc3Npb24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkaXNjb25uZWN0U2Vzc2lvbigpOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjppbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBpZiAobVNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEhJREwgc2Vzc2lvbiBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKworICAgICAgICAvLyBzZXR1cCByZXN1bHQgRk1RCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICAgICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IG1TZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQUNUSVZFOworICAgIH0KKworICAgIG1TZXNzaW9uLT5zZXRDYWxsYmFjayh0aGlzKTsKKworICAgIHJldHVybiBPSzsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAge21JZCwKKyAgICAgICAgbU9mZmxpbmVSZXFzTG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1PZmZsaW5lUmVxcywgbU91dHB1dExvY2ssIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCisgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcywgLypsZWdhY3lDbGllbnQqLyBmYWxzZSwgbU1pbkV4cGVjdGVkRHVyYXRpb259LCBtUmVzdWx0TWV0YWRhdGFRdWV1ZQorICAgIH07CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICAvLyBUT0RPOiBjaGFuZ2VkIGltcGwgdG8gY2FsbCBpbnRvIHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCBpbnN0ZWFkPworICAgIC8vICAgICAgIG1pZ2h0IG5lZWQgdG8gZmlndXJlIGhvdyB0byByZWR1Y2UgY29weSB0aG91Z2guCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBub1BoeXNNZXRhZGF0YTsKKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgbm9QaHlzTWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpub3RpZnkoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKKyAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpc307CisgICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbUJ1ZmZlclJlY29yZHN9OworCisgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCit2b2lkIEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OmRpc2Nvbm5lY3RTZXNzaW9uKCkgeworICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBsb2NraW5nIGlzIGNvcnJlY3QuCisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgIG1TZXNzaW9uLT5jbG9zZSgpOworICB9CisgIG1TZXNzaW9uLmNsZWFyKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTdjYzVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0hJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0hJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNi9JQ2FtZXJhT2ZmbGluZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKworI2luY2x1ZGUgIkhpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgiCisKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ2FtZXJhM1N0cmVhbTsKK2NsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U7CitjbGFzcyBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKKy8qKgorICogSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbiBmb3Igb2ZmbGluZSBzZXNzaW9uIGRlZmluZWQgaW4gSElETCBJQ2FtZXJhT2ZmbGluZVNlc3Npb25AMy42IG9yIGhpZ2hlcgorICovCitjbGFzcyBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIDoKKyAgICAgICAgICAgIHB1YmxpYyBDYW1lcmEzT2ZmbGluZVNlc3Npb24sCisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgIHB1YmxpYzoKKworICAgIC8vIGluaXRpYWxpemUgYnkgQ2FtZXJhM0RldmljZS4KKyAgICBleHBsaWNpdCBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKGNvbnN0IFN0cmluZzgmIGlkLAorICAgICAgICAgICAgY29uc3Qgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4mIGlucHV0U3RyZWFtLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6U3RyZWFtU2V0JiBvZmZsaW5lU3RyZWFtU2V0LAorICAgICAgICAgICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyYmIGJ1ZmZlclJlY29yZHMsCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpJbkZsaWdodFJlcXVlc3RNYXAmIG9mZmxpbmVSZXFzLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhM09mZmxpbmVTdGF0ZXMmIG9mZmxpbmVTdGF0ZXMsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb24pIDoKKyAgICAgIENhbWVyYTNPZmZsaW5lU2Vzc2lvbihpZCwgaW5wdXRTdHJlYW0sIG9mZmxpbmVTdHJlYW1TZXQsIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwKKyAgICAgICAgICAgICAgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMpLAorICAgICAgbVNlc3Npb24ob2ZmbGluZVNlc3Npb24pIHt9OworCisgICAgdmlydHVhbCB+SGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbigpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBISURMIElDYW1lcmFEZXZpY2VDYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEVuZCBvZiBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UgaW50ZXJmYWNlCisgICAgICovCisKKyAgcHJpdmF0ZToKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gbVNlc3Npb247CisgICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3RTZXNzaW9uKCkgb3ZlcnJpZGU7Cit9OyAvLyBjbGFzcyBDYW1lcmEzT2ZmbGluZVNlc3Npb24KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwY2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSGlkbENhbWVyYTMtT3V0cHV0VXRpbHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgdHJhbnNpdGlvbmluZyB0byB0aGUgZXJyb3Igc3RhdGUKKyNkZWZpbmUgU0VUX0VSUihmbXQsIC4uLikgc3RhdGVzLnNldEVyckludGYuc2V0RXJyb3JTdGF0ZSggICBcCisgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHNUZW1wbGF0ZWQuaCIKKworI2luY2x1ZGUgInN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCit2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAorICAgICAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKKyAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZFQ8SGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4sCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiwgUmVzdWx0TWV0YWRhdGFRdWV1ZSwKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM+KHN0YXRlcywgcmVzdWx0LCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKK30KKwordm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKSB7CisKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok1zZ1R5cGU7CisgICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpFcnJvckNvZGU7CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGNhbWVyYV9ub3RpZnlfbXNnIG07CisgICAgc3dpdGNoIChtc2cudHlwZSkgeworICAgICAgICBjYXNlIE1zZ1R5cGU6OkVSUk9SOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19FUlJPUjsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLmVycm9yLmZyYW1lTnVtYmVyOworICAgICAgICAgICAgaWYgKG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChtc2cubXNnLmVycm9yLmVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVRVUVTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFU1VMVDoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0JVRkZFUjoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNc2dUeXBlOjpTSFVUVEVSOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19TSFVUVEVSOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gbXNnLm1zZy5zaHV0dGVyLmZyYW1lTnVtYmVyOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wID0gbXNnLm1zZy5zaHV0dGVyLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5zaHV0dGVyLnJlYWRvdXRfdGltZXN0YW1wID0gMExMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG5vdGlmeShzdGF0ZXMsICZtKTsKK30KKworc3RhdGljIHZvaWQgY29udmVydFRvQWlkbCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGhpZGxCdWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+ICZhaWRsQnVmUmVxcykgeworICAgIHNpemVfdCBpID0gMDsKKyAgICBhaWRsQnVmUmVxcy5yZXNpemUoaGlkbEJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmhpZGxCdWZSZXEgOiBoaWRsQnVmUmVxcykgeworICAgICAgICBhaWRsQnVmUmVxc1tpXS5zdHJlYW1JZCA9IGhpZGxCdWZSZXEuc3RyZWFtSWQ7CisgICAgICAgIGFpZGxCdWZSZXFzW2ldLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQgPSBoaWRsQnVmUmVxLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIGkrKzsKKyAgICB9Cit9CisKK3N0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcgorY29udmVydFRvSGlkbChhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvciBhRXJyb3IpIHsKKyAgICB1c2luZyBBRXJyb3IgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKyAgICB1c2luZyBIRXJyb3IgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKworICAgIHN3aXRjaChhRXJyb3IpIHsKKyAgICAgICAgY2FzZSBBRXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yOjpOT19CVUZGRVJfQVZBSUxBQkxFOworICAgICAgICBjYXNlIEFFcnJvcjo6TUFYX0JVRkZFUl9FWENFRURFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQ7CisgICAgICAgIGNhc2UgQUVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3I6OlVOS05PV05fRVJST1I7CisgICAgfQorfQorCitzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzCitjb252ZXJ0VG9IaWRsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyAmYUJ1ZlN0YXR1cykgeworICAgIHVzaW5nIEFTdGF0dXMgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7CisgICAgdXNpbmcgSFN0YXR1cyA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICBzd2l0Y2ggKGFCdWZTdGF0dXMpIHsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpPSzsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpGQUlMRURfUEFSVElBTDoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfUEFSVElBTDsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkc6CisgICAgICAgICAgICByZXR1cm4gSFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HOworICAgICAgICBjYXNlIEFTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgIGNhc2UgQVN0YXR1czo6RkFJTEVEX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gSFN0YXR1czo6RkFJTEVEX1VOS05PV047CisgICAgfQorICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfVU5LTk9XTjsKK30KKworc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzCitjb252ZXJ0VG9IaWRsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzICZhQnVmU3RhdHVzKSB7CisgICAgdXNpbmcgQVN0YXR1cyA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzOworICAgIHVzaW5nIEhTdGF0dXMgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKKyAgICBzd2l0Y2ggKGFCdWZTdGF0dXMpIHsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpPSzsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpFUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpFUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEhTdGF0dXM6OkVSUk9SOworfQorCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0VG9IaWRsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSAmYWgsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICBpZiAoaXNIYW5kbGVOdWxsKGFoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG1ha2VGcm9tQWlkbChhaCk7CisgICAgaGFuZGxlc0NyZWF0ZWQuZW1wbGFjZV9iYWNrKG5oKTsKKyAgICByZXR1cm4gbmg7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRUb0hpZGwoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiAmYUJ1ZmZlcnMsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyc1ZhbCAmaEJ1ZmZlcnNWYWwsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICB1c2luZyBIU3RyZWFtQnVmZmVyID0gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI7CisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPEhTdHJlYW1CdWZmZXI+IHRtcEJ1ZmZlcnMoYUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZhQnVmIDogYUJ1ZmZlcnMpIHsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5zdGF0dXMgPSBjb252ZXJ0VG9IaWRsKGFCdWYuc3RhdHVzKTsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5zdHJlYW1JZCA9IGFCdWYuc3RyZWFtSWQ7CisgICAgICAgIHRtcEJ1ZmZlcnNbaV0uYnVmZmVySWQgPSBhQnVmLmJ1ZmZlcklkOworICAgICAgICB0bXBCdWZmZXJzW2ldLmJ1ZmZlciA9IGNvbnZlcnRUb0hpZGwoYUJ1Zi5idWZmZXIsIGhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5hY3F1aXJlRmVuY2UgPSBjb252ZXJ0VG9IaWRsKGFCdWYuYWNxdWlyZUZlbmNlLCBoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIHRtcEJ1ZmZlcnNbaV0ucmVsZWFzZUZlbmNlID0gY29udmVydFRvSGlkbChhQnVmLnJlbGVhc2VGZW5jZSwgaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICBpKys7CisgICAgfQorICAgIGhCdWZmZXJzVmFsLmJ1ZmZlcnMoc3RkOjptb3ZlKHRtcEJ1ZmZlcnMpKTsKK30KKworc3RhdGljIHZvaWQgY29udmVydFRvSGlkbCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+ICZhaWRsQnVmUmV0cywKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0PiAmaGlkbEJ1ZlJldHMsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgdXNpbmcgVGFnID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJzVmFsOjpUYWc7CisgICAgaGlkbEJ1ZlJldHMucmVzaXplKGFpZGxCdWZSZXRzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZhaWRsQnVmUmV0IDogYWlkbEJ1ZlJldHMpIHsKKyAgICAgICAgYXV0byAmaGlkbEJ1ZlJldCA9IGhpZGxCdWZSZXRzW2ldOworICAgICAgICBoaWRsQnVmUmV0LnN0cmVhbUlkID0gYWlkbEJ1ZlJldC5zdHJlYW1JZDsKKyAgICAgICAgc3dpdGNoKGFpZGxCdWZSZXQudmFsLmdldFRhZygpKSB7CisgICAgICAgICAgY2FzZSBUYWc6OmVycm9yOgorICAgICAgICAgICAgICBoaWRsQnVmUmV0LnZhbC5lcnJvcihjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXQudmFsLmdldDxUYWc6OmVycm9yPigpKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVGFnOjpidWZmZXJzOgorICAgICAgICAgICAgICBjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXQudmFsLmdldDxUYWc6OmJ1ZmZlcnM+KCksIGhpZGxCdWZSZXQudmFsLCBoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9Cit9CisKKy8vIFRoZSBidWZmZXJzIHJlcXVlc3RlZCB0aHJvdWdoIHRoaXMgY2FsbCBhcmUgbm90IHRpZWQgdG8gYW55IENhcHR1cmVSZXF1ZXN0IGluCisvLyBwYXJ0aWN1bGFyLiBUaGV5IG1heSB1c2VkIGJ5IHRoZSBoYWwgZm9yIGEgcGFydGljdWxhciBmcmFtZSdzIG91dHB1dCBidWZmZXIKKy8vIG9yIGZvciBpdHMgaW50ZXJuYWwgdXNlIGFzIHdlbGwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGhhbCBkb2VzIHVzZSBhbnkgYnVmZmVyCisvLyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGlzdCBoZXJlLCBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lJ3Mgb3V0cHV0IGJ1ZmZlciwgdGhlCisvLyBidWZmZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxsIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBmcmFtZS4gVGhlIG90aGVyIGJ1ZmZlcnMgd2lsbCBiZSByZXR1cm5lZCB0aHJvdWdoIHJldHVyblN0cmVhbUJ1ZmZlcnMuCisvLyBUaGUgYnVmZmVycyByZXR1cm5lZCB2aWEgcmV0dXJuU3RyZWFtQnVmZmVycyB3aWxsIG5vdCBoYXZlIGEgdmFsaWQKKy8vIHRpbWVzdGFtcCgwKSBhbmQgd2lsbCBiZSBkcm9wcGVkIGJ5IHRoZSBidWZmZXJxdWV1ZS4KK3ZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s6OnJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcjsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7CisgICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ7CisgICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I7CisgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiBhaWRsQnVmUmVxczsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ+IGhpZGxCdWZSZXRzOworICAgIGNvbnZlcnRUb0FpZGwoYnVmUmVxcywgYWlkbEJ1ZlJlcXMpOworICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+IGFpZGxCdWZSZXRzOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzIGFpZGxCdWZSZXRTdGF0dXM7CisKKyAgICByZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGFpZGxCdWZSZXFzLCAmYWlkbEJ1ZlJldHMsICZhaWRsQnVmUmV0U3RhdHVzKTsKKyAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gaGFuZGxlc0NyZWF0ZWQ7CisgICAgY29udmVydFRvSGlkbChhaWRsQnVmUmV0cywgaGlkbEJ1ZlJldHMsIGhhbmRsZXNDcmVhdGVkKTsKKyAgICBfaGlkbF9jYihjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXRTdGF0dXMpLCBoaWRsQnVmUmV0cyk7CisgICAgQ2FtZXJhM0RldmljZTo6Y2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKK30KKwordm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgcmV0dXJuU3RyZWFtQnVmZmVyc1Qoc3RhdGVzLCBidWZmZXJzKTsKK30KKworfSAvLyBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZjYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfSElETF9DQU1FUkEzX09VVFBVVF9VVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19ISURMX0NBTUVSQTNfT1VUUFVUX1VUSUxTX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKworI2luY2x1ZGUgImRldmljZTMvQnVmZmVyVXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBIaWRsQ2FtZXJhM0RldmljZS9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCisgICAgICovCisgICAgLy8gQ2FtZXJhM0RldmljZS9DYW1lcmEzT2ZmbGluZVNlc3Npb24gaW50ZXJuYWwgc3RhdGVzIHVzZWQgaW4gbm90aWZ5L3Byb2Nlc3NDYXB0dXJlUmVzdWx0CisgICAgLy8gY2FsbGJhY2tzCisgICAgc3RydWN0IEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIDogcHVibGljIENhcHR1cmVPdXRwdXRTdGF0ZXMgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcTsKKyAgICB9OworCisgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIGNhbGxlcnMgaG9sZCB0aGUgbG9jayB0byBzZXJpYWxpemUgYWxsCisgICAgLy8gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbHMKKyAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAorICAgICAgICAgICAgSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworCisgICAgLy8gSGFuZGxlIG9uZSBub3RpZnkgbWVzc2FnZQorICAgIHZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpOworICAgIHZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjazo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IKKyAgICAgICAgICAgICAgICAgICAgX2hpZGxfY2IpOworICAgIHZvaWQgcmV0dXJuU3RyZWFtQnVmZmVycyhSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcAppbmRleCBmMDYzNTA2Li4zMzkyZGIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KIAogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGZyYW1ld29ya3MgewpAQCAtMzQsNyArMzQsNyBAQAogCiBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQogCi1ib29sIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6aW5pdGlhbGl6ZUxvb3BlcigpIHsKK2Jvb2wgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjppbml0aWFsaXplTG9vcGVyKGludCB2bmRrVmVyc2lvbikgewogICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiY3MtbG9vcGVyIik7CiAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgvKnJ1bk9uQ2FsbGluZ1RocmVhZCovIGZhbHNlLCAvKmNhbkNhbGxKYXZhKi8gZmFsc2UsCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKHRoaXMsIHZuZGtWZXJzaW9uKTsKICAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xNDQsNiArMTQ0LDEyIEBACiAKICAgICAvLyBDb252ZXJ0IE1ldGFkYXRhIGludG8gSENhbWVyYU1ldGFkYXRhOwogICAgIEZtcVNpemVPck1ldGFkYXRhIGhSZXN1bHQ7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpmaWx0ZXJWbmRrS2V5czsKKyAgICBpZiAoZmlsdGVyVm5ka0tleXMobVZuZGtWZXJzaW9uLCByZXN1bHQsIC8qaXNTdGF0aWMqL2ZhbHNlKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IGZpbHRlcmluZyB2bmRrIGtleXMgZnJvbSByZXN1bHQgZmFpbGVkLCBub3Qgc2VuZGluZyBvblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IHJlc3VsdC5nZXRBbmRMb2NrKCk7CiAgICAgY29udmVydGVyLT5jb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwocmF3TWV0YWRhdGEsICZoUmVzdWx0KTsKICAgICByZXN1bHQudW5sb2NrKHJhd01ldGFkYXRhKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKaW5kZXggZGJmNTIwYS4uMTUyMDAyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIH5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKTsKIAotICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcigpOworICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcihpbnQgdm5ka1ZlcnNpb24pOwogCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOwpAQCAtMTAzLDEwICsxMDMsMTIgQEAKICAgICBzdHJ1Y3QgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7Ci0gICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzICpjb252ZXJ0ZXIpIDogbUNvbnZlcnRlcihjb252ZXJ0ZXIpIHsgfQorICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyAqY29udmVydGVyLCBpbnQgdm5ka1ZlcnNpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnRlcihjb252ZXJ0ZXIpLCBtVm5ka1ZlcnNpb24odm5ka1ZlcnNpb24pIHsgfQogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCBwcm9jZXNzUmVzdWx0TWVzc2FnZShzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcik7CiAgICAgICAgICAgICB3cDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1Db252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgaW50IG1WbmRrVmVyc2lvbiA9IC0xOwogICAgICAgICAgICAgTXV0ZXggbU1ldGFkYXRhUXVldWVMb2NrOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCmluZGV4IDhlNjE5ZTEuLmFkZDkxMjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBmcmFtZXdvcmtzIHsKQEAgLTcwLDYgKzcwLDExIEBACiAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAorOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uVG9yY2hTdHJlbmd0aExldmVsQ2hhbmdlZCgKKyAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiwgaW50MzJfdCkgeworICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIH0gLy8gaW1wbGVtZW50YXRpb24KIH0gLy8gVjJfMAogfSAvLyBjb21tb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKaW5kZXggNzE0ODAzNS4uN2VmNDEzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKQEAgLTU0LDYgKzU0LDggQEAKIAogICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdHJlbmd0aExldmVsQ2hhbmdlZCgKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IG5ld1N0cmVuZ3RoTGV2ZWwpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKICAgICAgICAgLy8gVE9ETzogbm8gaW1wbGVtZW50YXRpb24geWV0LgogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCmluZGV4IDI1MDllNmMuLjI2ZTgxM2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL1V0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDdkMWIzY2YuLjY1YTAzMDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCkBAIC0xNCwxMyArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogCi0jaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oPgotCi0jaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8aGlkbC9VdGlscy5oPgogCiAjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogCkBAIC0zNCw2ICszNCw3IEBACiB1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmZpbHRlclZuZGtLZXlzOwogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7CiB1c2luZyBoYXJkd2FyZTo6Vm9pZDsKIApAQCAtNTMsNiArNTQsMTAgQEAKICAgICByZXR1cm4gZ0hpZGxDYW1lcmFTZXJ2aWNlOwogfQogCitIaWRsQ2FtZXJhU2VydmljZTo6SGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeworICAgIG1WbmRrVmVyc2lvbiA9IGJhc2U6OkdldEludFByb3BlcnR5KCJyby52bmRrLnZlcnNpb24iLCBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKTsKK307CisKIFJldHVybjx2b2lkPgogSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgewpAQCAtNzcsNiArODIsMTEgQEAKICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KKyAgICBpZiAoZmlsdGVyVm5ka0tleXMobVZuZGtWZXJzaW9uLCBjYW1lcmFNZXRhZGF0YSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZmlsdGVyIHZuZGsgbWV0YWRhdGEga2V5cyBmb3IgdmVyc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgbVZuZGtWZXJzaW9uKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgaGlkbE1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CiAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gY2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOwogICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZoaWRsTWV0YWRhdGEpOwogICAgIF9oaWRsX2NiKHN0YXR1cywgaGlkbE1ldGFkYXRhKTsKQEAgLTk3LDcgKzEwNyw3IEBACiAgICAgLy8gQ3JlYXRlIGEgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFjayBvYmplY3Qgd2hpY2ggaW50ZXJuYWxseQogICAgIC8vIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9ucyBwYXNzZWQgdGhyb3VnaCBoQ2FsbGJhY2suCiAgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBoeWJyaWRDYWxsYmFja3MgPSBuZXcgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGhDYWxsYmFjayk7Ci0gICAgaWYgKCFoeWJyaWRDYWxsYmFja3MtPmluaXRpYWxpemVMb29wZXIoKSkgeworICAgIGlmICghaHlicmlkQ2FsbGJhY2tzLT5pbml0aWFsaXplTG9vcGVyKG1WbmRrVmVyc2lvbikpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBoYW5kbGUgY2FsbGJhY2tzIG9uIGRldmljZSwgY2Fubm90IGNvbm5lY3QiKTsKICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CkBAIC0yNzksNiArMjg5LDkgQEAKICAgICAgICAgc2l6ZV90IG51bVNlY3Rpb25zID0gc2VjdGlvbk5hbWVzLT5zaXplKCk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhWZW5kb3JUYWc+PiB0YWdzQnlTZWN0aW9uKG51bVNlY3Rpb25zKTsKICAgICAgICAgaW50IHRhZ0NvdW50ID0gZGVzYy0+Z2V0VGFnQ291bnQoKTsKKyAgICAgICAgaWYgKHRhZ0NvdW50IDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzKHRhZ0NvdW50KTsKICAgICAgICAgZGVzYy0+Z2V0VGFnQXJyYXkodGFncy5kYXRhKCkpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaAppbmRleCA4NmE3Y2VjLi4xYzgxNDVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCkBAIC03NSw3ICs3NSw3IEBACiAgICAgc3RhdGljIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcyk7CiAKIHByaXZhdGU6Ci0gICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeyB9OworICAgIEhpZGxDYW1lcmFTZXJ2aWNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKAogICAgICAgICBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi8gYm9vbCBzaG91bGRSZW1vdmUgPSBmYWxzZSk7CkBAIC05NSw2ICs5NSw3IEBACiAgICAgdXNpbmcgSElMaXN0ZW5lcnMgPQogICAgICAgICBzdGQ6OnBhaXI8c3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4sIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PjsKICAgICBzdGQ6Omxpc3Q8SElMaXN0ZW5lcnM+IG1MaXN0ZW5lcnM7CisgICAgaW50IG1WbmRrVmVyc2lvbiA9IC0xOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5jcHAKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApyZW5hbWUgdG8gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5jcHAKaW5kZXggNTk3MTQ3Yi4uMDU3YTZlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1V0aWxzLmNwcApAQCAtMTQsNyArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvVXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL1ZuZGtWZXJzaW9uTWV0YWRhdGFUYWdzLmg+CiAjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KQEAgLTI5Nyw2ICsyOTgsMzEgQEAKICAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOwogfQogCitzdGF0dXNfdCBmaWx0ZXJWbmRrS2V5cyhpbnQgdm5ka1ZlcnNpb24sIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgYm9vbCBpc1N0YXRpYykgeworICAgIGlmICh2bmRrVmVyc2lvbiA9PSBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKSB7CisgICAgICAgIC8vIFZOREsgdmVyc2lvbiBpbiByby52bmRrLnZlcnNpb24gaXMgYSB2ZXJzaW9uIGNvZGUtbmFtZSB0aGF0CisgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYXV0byAmYXBpTGV2ZWxUb0tleXMgPQorICAgICAgICAgICAgaXNTdGF0aWMgPyBzdGF0aWNfYXBpX2xldmVsX3RvX2tleXMgOiBkeW5hbWljX2FwaV9sZXZlbF90b19rZXlzOworICAgIC8vIEZpbmQgdGhlIHZuZGsgdmVyc2lvbnMgYWJvdmUgdGhlIGdpdmVuIHZuZGsgdmVyc2lvbi4gQWxsIHRoZSB2bmRrCisgICAgLy8gdmVyc2lvbnMgYWJvdmUgdGhlIGdpdmVuIG9uZSwgbmVlZCB0byBoYXZlIHRoZWlyIGtleXMgZmlsdGVyZWQgZnJvbSB0aGUKKyAgICAvLyBtZXRhZGF0YSBpbiBvcmRlciB0byBhdm9pZCBtZXRhZGF0YSBpbnZhbGlkYXRpb24uCisgICAgYXV0byBpdCA9IGFwaUxldmVsVG9LZXlzLnVwcGVyX2JvdW5kKHZuZGtWZXJzaW9uKTsKKyAgICB3aGlsZSAoaXQgIT0gYXBpTGV2ZWxUb0tleXMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZrZXkgOiBpdC0+c2Vjb25kKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtZXRhZGF0YS5lcmFzZShrZXkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBtZXRhZGF0YSBrZXkgJWQgY291bGQgbm90IGJlIGVyYXNlZCIsIF9fRlVOQ1RJT05fXywga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogfSAvL2NvbnZlcnNpb24KIH0gLy8gdXRpbHMKIH0gLy9jYW1lcmFzZXJ2aWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApyZW5hbWUgdG8gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5oCmluZGV4IDgyZmZjNDguLmU2ZDQzOTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVXRpbHMuaApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgogI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CkBAIC05Niw2ICs5Nyw4IEBACiAKIEhTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKTsKIAorc3RhdHVzX3QgZmlsdGVyVm5ka0tleXMoaW50IHZuZGtfdmVyc2lvbiwgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBib29sIGlzU3RhdGljID0gdHJ1ZSk7CisKIH0gLy8gY29udmVyc2lvbgogfSAvLyB1dGlscwogfSAvLyBjYW1lcmFzZXJ2aWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1ZuZGtWZXJzaW9uTWV0YWRhdGFUYWdzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1ZuZGtWZXJzaW9uTWV0YWRhdGFUYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNzdmNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVm5ka1ZlcnNpb25NZXRhZGF0YVRhZ3MuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjcHJhZ21hIG9uY2UKKy8qKgorICogISBEbyBub3QgZWRpdCB0aGlzIGZpbGUgZGlyZWN0bHkgIQorICoKKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdm5ka19jYW1lcmFfbWV0YWRhdGFfdGFncy5tYWtvLiBUbyBiZSBpbmNsdWRlZCBpbiBsaWJjYW1lcmFzZXJ2aWNlCisgKiBvbmx5IGJ5IGhpZGwvVXRpbHMuY3BwLgorICovCisKKy8qKgorICogQVBJIGxldmVsIHRvIHN0YXRpYyBrZXlzIG1hcHBpbmcuIFRvIGJlIHVzZWQgZm9yIGZpbHRlcmluZyBvdXQga2V5cyBkZXBlbmRpbmcgb24gdm5kayB2ZXJzaW9uCisgKiB1c2VkIGJ5IHZlbmRvciBjbGllbnRzLgorICovCitzdGQ6Om1hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYV9tZXRhZGF0YV90YWc+PiBzdGF0aWNfYXBpX2xldmVsX3RvX2tleXN7CisgICAgICB7MzAsIHsKKyAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0VYVEVOREVEX1NDRU5FX01PREVfTUFYX1NJWkVTLAorICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9aT09NX1JBVElPX1JBTkdFLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9ST1RBVEVfQU5EX0NST1BfTU9ERVMsCisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9FWFRFTkRFRF9TQ0VORV9NT0RFX1pPT01fUkFUSU9fUkFOR0VTLAorICAgICAgICB9IH0sCisgICAgICB7MzEsIHsKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSU5QVVRfT1VUUFVUX0ZPUk1BVFNfTUFQX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9ISUdIX1NQRUVEX1ZJREVPX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT05fTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9QSFlTSUNBTF9DQU1FUkFfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9TVVBQT1JURUQsCisgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0xFTlNfRElTVE9SVElPTl9NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfREVGQVVMVF9TRUNVUkVfSU1BR0VfU0laRSwKKyAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfT1BBUVVFX1JBV19TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0JJTk5JTkdfRkFDVE9SLAorICAgICAgICB9IH0sCisgICAgICB7MzIsIHsKKyAgICAgICAgICBBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUywKKyAgICAgICAgfSB9LAorICAgICAgezMzLCB7CisgICAgICAgICAgQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwsCisgICAgICAgICAgQU5EUk9JRF9BVVRPTU9USVZFX0xFTlNfRkFDSU5HLAorICAgICAgICAgIEFORFJPSURfQVVUT01PVElWRV9MT0NBVElPTiwKKyAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfUkVDT01NRU5ERURfVEVOX0JJVF9EWU5BTUlDX1JBTkdFX1BST0ZJTEUsCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMsCisgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUCwKKyAgICAgICAgICBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCwKKyAgICAgICAgfSB9LAorfTsKKworLyoqCisgKiBBUEkgbGV2ZWwgdG8gZHluYW1pYyBrZXlzIG1hcHBpbmcuIFRvIGJlIHVzZWQgZm9yIGZpbHRlcmluZyBvdXQga2V5cyBkZXBlbmRpbmcgb24gdm5kayB2ZXJzaW9uCisgKiB1c2VkIGJ5IHZlbmRvciBjbGllbnRzLgorICovCitzdGQ6Om1hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYV9tZXRhZGF0YV90YWc+PiBkeW5hbWljX2FwaV9sZXZlbF90b19rZXlzeworICAgICAgezMwLCB7CisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8sCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QLAorICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9FWFRFTkRFRF9TQ0VORV9NT0RFLAorICAgICAgICB9ICB9LAorICAgICAgezMxLCB7CisgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERSwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9SQVdfQklOTklOR19GQUNUT1JfVVNFRCwKKyAgICAgICAgfSAgfSwKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCAzZDc0ZjBiLi5lNDNiOTFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL0FuZHJvaWQuYnAKQEAgLTUyLDYgKzUyLDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCkBAIC02NSw1ICs2NiwxMCBAQAogICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAogICAgICAgICBdLAogICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgICAgICBsaWJmdXp6ZXJfb3B0aW9uczogWworICAgICAgICAgICAgLy9iYXNlZCBvbiBiLzE4NzM2MDg2NgorICAgICAgICAgICAgInRpbWVvdXQ9NzcwIiwKKyAgICAgICAgXSwKKwogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvY2FtZXJhX3NlcnZpY2VfZnV6emVyLmNwcAppbmRleCBlNDZiZjc0Li45N2Q3YmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL2NhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTQ2Niw2ICs0NjYsMTIgQEAKICAgICAgICAgLy8gTm8gb3AKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKGNvbnN0IFN0cmluZzE2JiAvKmNhbWVyYUlkKi8sCisgICAgICAgICAgICBpbnQzMl90IC8qdG9yY2hTdHJlbmd0aCovKSB7CisgICAgICAgIC8vIE5vIG9wCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CiB9OwogCiBjbGFzcyBUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDogcHVibGljIGhhcmR3YXJlOjpjYW1lcmEyOjpCbkNhbWVyYURldmljZUNhbGxiYWNrcyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE2NTcyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2NhbWVyYV9saWJjYW1lcmFzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy43IiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyVGVzdC5jcHAiLAorICAgICAgICAiRGVwdGhQcm9jZXNzb3JUZXN0LmNwcCIsCisgICAgICAgICJEaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAiLAorICAgICAgICAiRXhpZlV0aWxzVGVzdC5jcHAiLAorICAgICAgICAiTlYxMkNvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgIlJvdGF0ZUFuZENyb3BNYXBwZXJUZXN0LmNwcCIsCisgICAgICAgICJab29tUmF0aW9UZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmljZV90ZXN0X2hvc3QiLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUvY2FtZXJhIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2xpYnMvYmluZGVyL2luY2x1ZGVfYWN0aXZpdHltYW5hZ2VyIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWN0aXZpdHlfbWFuYWdlcl9wcm9jc3RhdGVfYWlkbC1jcHAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50X2hvc3QiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZV9kZXZpY2VfaW5kZXBlbmRlbnQiLAorICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDbGllbnRNYW5hZ2VyVGVzdC5jcHAiLAorICAgICAgICAiRGVwdGhQcm9jZXNzb3JUZXN0LmNwcCIsCisgICAgICAgICJEaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAiLAorICAgICAgICAiRXhpZlV0aWxzVGVzdC5jcHAiLAorICAgICAgICAiTlYxMkNvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgIlJvdGF0ZUFuZENyb3BNYXBwZXJUZXN0LmNwcCIsCisgICAgICAgICJab29tUmF0aW9UZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVhZDc5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICQoY2FsbCBhbGwtY3BwLWZpbGVzLXVuZGVyLCAuKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmNhbWVyYXNlcnZpY2UgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGlidWkgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJleGlmIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi42IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjcgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjcgXAotICAgIGFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliZ21vY2sKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMgXAotICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX1NBTklUSVpFIDo9IGFkZHJlc3MKLQotTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvLi4vTk9USUNFCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCBhNzRmZDlkLi5lOWY2OTc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMjEyLDcgKzIxMiw3IEBACiAgKiBTaW1wbGUgdGVzdCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmFjdGlvbiBwcm94eSwgdG8gdXNlIHRvIGluamVjdCBvblJlZ2lzdGVyZWQgY2FsbHMgdG8gdGhlCiAgKiBDYW1lcmFQcm92aWRlck1hbmFnZXIKICAqLwotc3RydWN0IFRlc3RJbnRlcmFjdGlvblByb3h5IDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U2VydmljZUludGVyYWN0aW9uUHJveHkgeworc3RydWN0IFRlc3RJbnRlcmFjdGlvblByb3h5IDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5IHsKICAgICBzcDxoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU5vdGlmaWNhdGlvbj4gbU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2U7CiAgICAgc3A8VGVzdElDYW1lcmFQcm92aWRlcj4gbVRlc3RDYW1lcmFQcm92aWRlcjsKIApAQCAtMjY5LDExICsyNjksMTMgQEAKICAgICB+VGVzdFN0YXR1c0xpc3RlbmVyKCkge30KIAogICAgIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzKSBvdmVycmlkZSB7fQorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzKSBvdmVycmlkZSB7fQogICAgIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwgY29uc3QgU3RyaW5nOCAmLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CiAgICAgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICYsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cykgb3ZlcnJpZGUge30KKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cykgb3ZlcnJpZGUge30KKyAgICB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCkgb3ZlcnJpZGUge30KICAgICB2b2lkIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgb3ZlcnJpZGUge30KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0V4aWZVdGlsc1Rlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRXhpZlV0aWxzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNGJmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0V4aWZVdGlsc1Rlc3QuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkV4aWZVdGlsc1Rlc3QiCisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlICIuLi91dGlscy9FeGlmVXRpbHMuaCIKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb247Cit1c2luZyBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YTsKKwordWludDMyX3Qga0ltYWdlV2lkdGggPSAxOTIwOwordWludDMyX3Qga0ltYWdlSGVpZ2h0ID0gMTQ0MDsKK0V4aWZPcmllbnRhdGlvbiBrRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisKKy8vIFRlc3QgdGhhdCBzZXRGcm9tTWV0YWRhdGEgd29ya3MgY29ycmVjdGx5LCB3aXRob3V0IGVycm9ycy4KK1RFU1QoRXhpZlV0aWxzVGVzdCwgU2V0RnJvbU1ldGFkYXRhVGVzdCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IHV0aWxzKEV4aWZVdGlsczo6Y3JlYXRlKCkpOworICAgIHVpbnQ4X3QgaW52YWxpZFNlbnNvclBpeGVsTW9kZSA9IDI7CisgICAgdWludDhfdCB2YWxpZFNlbnNvclBpeGVsTW9kZSA9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVDsKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAvLyBFbXB0eSBzdGF0aWNJbmZvCisgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbzsKKyAgICBBU1NFUlRfVFJVRSh1dGlscy0+aW5pdGlhbGl6ZUVtcHR5KCkpOworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1BJWEVMX01PREUsICZpbnZhbGlkU2Vuc29yUGl4ZWxNb2RlLCAxKSA9PSBhbmRyb2lkOjpPSyk7CisgICAgQVNTRVJUX0ZBTFNFKHV0aWxzLT5zZXRGcm9tTWV0YWRhdGEobWV0YWRhdGEsIHN0YXRpY0luZm8sIGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpKTsKKyAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFLCAmdmFsaWRTZW5zb3JQaXhlbE1vZGUsIDEpID09IGFuZHJvaWQ6Ok9LKTsKKyAgICBBU1NFUlRfVFJVRSh1dGlscy0+c2V0RnJvbU1ldGFkYXRhKG1ldGFkYXRhLCBzdGF0aWNJbmZvLCBrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0KSk7CisgICAgQVNTRVJUX1RSVUUodXRpbHMtPnNldEltYWdlV2lkdGgoa0ltYWdlV2lkdGgpKTsKKyAgICBBU1NFUlRfVFJVRSh1dGlscy0+c2V0SW1hZ2VIZWlnaHQoa0ltYWdlSGVpZ2h0KSk7CisgICAgQVNTRVJUX1RSVUUodXRpbHMtPnNldE9yaWVudGF0aW9uVmFsdWUoa0V4aWZPcmllbnRhdGlvbikpOworICAgIEFTU0VSVF9UUlVFKHV0aWxzLT5nZW5lcmF0ZUFwcDEoKSk7CisgICAgY29uc3QgdWludDhfdCogZXhpZkJ1ZmZlciA9IHV0aWxzLT5nZXRBcHAxQnVmZmVyKCk7CisgICAgQVNTRVJUX05FKGV4aWZCdWZmZXIsIG51bGxwdHIpOworICAgIHNpemVfdCBleGlmQnVmZmVyU2l6ZSA9IHV0aWxzLT5nZXRBcHAxTGVuZ3RoKCk7CisgICAgQVNTRVJUX1RSVUUoZXhpZkJ1ZmZlclNpemUgIT0gMCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaAppbmRleCBlZTIyZDVlLi5hOTU5ODcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHNldGptcC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiBleHRlcm4gIkMiIHsKICNpbmNsdWRlIDxqcGVnbGliLmg+CiAjaW5jbHVkZSA8amVycm9yLmg+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9ob3dfdG9fcnVuLnR4dCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL2hvd190b19ydW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjM5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9ob3dfdG9fcnVuLnR4dApAQCAtMCwwICsxLDUgQEAKK2FkYiByb290ICYmCittIGNhbWVyYXNlcnZpY2VfdGVzdCAmJgorYWRiIHB1c2ggJEFORFJPSURfUFJPRFVDVF9PVVQvZGF0YS9uYXRpdmV0ZXN0L2NhbWVyYXNlcnZpY2VfdGVzdC9jYW1lcmFzZXJ2aWNlX3Rlc3QgXAorICAgIC9kYXRhL25hdGl2ZXRlc3QvY2FtZXJhc2VydmljZV90ZXN0L2FybTY0L2NhbWVyYXNlcnZpY2VfdGVzdCAmJgorYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvY2FtZXJhc2VydmljZV90ZXN0L2FybTY0L2NhbWVyYXNlcnZpY2VfdGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAKaW5kZXggNzY5MjdjMC4uNjkxNzVjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAKQEAgLTY2LDEwICs2NiwxMSBAQAogICAgIH0KIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbkFjdGl2ZSgpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcjo6b25BY3RpdmUoZmxvYXQgbWF4UHJldmlld0ZwcykgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAogICAgIG1TZXNzaW9uU3RhdHMubU5ld0NhbWVyYVN0YXRlID0gQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfQUNUSVZFOworICAgIG1TZXNzaW9uU3RhdHMubU1heFByZXZpZXdGcHMgPSBtYXhQcmV2aWV3RnBzOwogICAgIHVwZGF0ZVByb3h5RGV2aWNlU3RhdGUobVNlc3Npb25TdGF0cyk7CiAKICAgICAvLyBSZXNldCBtQ3JlYXRpb25EdXJhdGlvbiB0byAtMSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDFzdCBzZXNzaW9uCkBAIC03OSw2ICs4MCw3IEBACiAKIHZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcjo6b25JZGxlKAogICAgICAgICBpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtODYsNiArODgsOCBAQAogICAgIG1TZXNzaW9uU3RhdHMubVJlcXVlc3RDb3VudCA9IHJlcXVlc3RDb3VudDsKICAgICBtU2Vzc2lvblN0YXRzLm1SZXN1bHRFcnJvckNvdW50ID0gcmVzdWx0RXJyb3JDb3VudDsKICAgICBtU2Vzc2lvblN0YXRzLm1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOworICAgIG1TZXNzaW9uU3RhdHMubVVzZXJUYWcgPSBTdHJpbmcxNih1c2VyVGFnLmNfc3RyKCkpOworICAgIG1TZXNzaW9uU3RhdHMubVZpZGVvU3RhYmlsaXphdGlvbk1vZGUgPSB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlOwogICAgIG1TZXNzaW9uU3RhdHMubVN0cmVhbVN0YXRzID0gc3RyZWFtU3RhdHM7CiAgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKIApAQCAtMTIwLDEzICsxMjQsMTIgQEAKICAgICBwcm94eUJpbmRlci0+cGluZ0ZvclVzZXJVcGRhdGUoKTsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjppc1JvdGF0ZUFuZENyb3BPdmVycmlkZU5lZWRlZCgKLSAgICAgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCBzZW5zb3JPcmllbnRhdGlvbiwgaW50IGxlbnNGYWNpbmcpIHsKK2ludCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpnZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCBsZW5zRmFjaW5nLAorICAgICAgICBpbnQgdXNlcklkKSB7CiAgICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKTsKICAgICBpZiAocHJveHlCaW5kZXIgPT0gbnVsbHB0cikgcmV0dXJuIHRydWU7Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIGF1dG8gc3RhdHVzID0gcHJveHlCaW5kZXItPmlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKHBhY2thZ2VOYW1lLCBzZW5zb3JPcmllbnRhdGlvbiwKLSAgICAgICAgICAgIGxlbnNGYWNpbmcsICZyZXQpOworICAgIGludCByZXQgPSAwOworICAgIGF1dG8gc3RhdHVzID0gcHJveHlCaW5kZXItPmdldFJvdGF0ZUFuZENyb3BPdmVycmlkZShwYWNrYWdlTmFtZSwgbGVuc0ZhY2luZywgdXNlcklkLCAmcmV0KTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgZHVyaW5nIHRvcCBhY3Rpdml0eSBvcmllbnRhdGlvbiBxdWVyeTogJXMiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpKTsKQEAgLTE1OSw3ICsxNjIsNyBAQAogICAgIHNlc3Npb25TdGF0cy0+b25TdHJlYW1Db25maWd1cmVkKG9wZXJhdGluZ01vZGUsIGludGVybmFsQ29uZmlnLCBsYXRlbmN5TXMpOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0FjdGl2ZShjb25zdCBTdHJpbmc4JiBpZCkgewordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dBY3RpdmUoY29uc3QgU3RyaW5nOCYgaWQsIGZsb2F0IG1heFByZXZpZXdGcHMpIHsKICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4gc2Vzc2lvblN0YXRzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTcyLDExICsxNzUsMTIgQEAKICAgICB9CiAKICAgICBBTE9HVigiJXM6IGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpKTsKLSAgICBzZXNzaW9uU3RhdHMtPm9uQWN0aXZlKCk7CisgICAgc2Vzc2lvblN0YXRzLT5vbkFjdGl2ZShtYXhQcmV2aWV3RnBzKTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dJZGxlKGNvbnN0IFN0cmluZzgmIGlkLAogICAgICAgICBpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgewogICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPiBzZXNzaW9uU3RhdHM7CiAgICAgewpAQCAtMTkwLDggKzE5NCw5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6IGlkICVzLCByZXF1ZXN0Q291bnQgJSIgUFJJZDY0ICIsIHJlc3VsdEVycm9yQ291bnQgJSIgUFJJZDY0ICIsIGRldmljZUVycm9yICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvcik7CisgICAgQUxPR1YoIiVzOiBpZCAlcywgcmVxdWVzdENvdW50ICUiIFBSSWQ2NCAiLCByZXN1bHRFcnJvckNvdW50ICUiIFBSSWQ2NCAiLCBkZXZpY2VFcnJvciAlZCIKKyAgICAgICAgICAgICIsIHVzZXJUYWcgJXMsIHZpZGVvU3RhYmlsaXphdGlvbk1vZGUgJWQiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJlcXVlc3RDb3VudCwKKyAgICAgICAgICAgIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCB1c2VyVGFnLmNfc3RyKCksIHZpZGVvU3RhYmlsaXphdGlvbk1vZGUpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtU3RhdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1TdGF0c1slenVdOiB3ICVkIGggJWQsIHJlcXVlc3RlZENvdW50ICUiIFBSSWQ2NCAiLCBkcm9wQ291bnQgJSIKICAgICAgICAgICAgICAgICBQUklkNjQgIiwgc3RhcnRUaW1lTXMgJWQiICwKQEAgLTIwMCw3ICsyMDUsOCBAQAogICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRzW2ldLm1TdGFydExhdGVuY3lNcyk7CiAgICAgfQogCi0gICAgc2Vzc2lvblN0YXRzLT5vbklkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgc3RyZWFtU3RhdHMpOworICAgIHNlc3Npb25TdGF0cy0+b25JZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHVzZXJUYWcsCisgICAgICAgICAgICB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlLCBzdHJlYW1TdGF0cyk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nT3Blbihjb25zdCBTdHJpbmc4JiBpZCwgaW50IGZhY2luZywKQEAgLTI1Niw0ICsyNjIsMTYgQEAKICAgICBzZXNzaW9uU3RhdHMtPm9uQ2xvc2UobGF0ZW5jeU1zKTsKIH0KIAorYm9vbCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjppc0NhbWVyYURpc2FibGVkKCkgeworICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7CisgICAgaWYgKHByb3h5QmluZGVyID09IG51bGxwdHIpIHJldHVybiB0cnVlOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBzdGF0dXMgPSBwcm94eUJpbmRlci0+aXNDYW1lcmFEaXNhYmxlZCgmcmV0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgZHVyaW5nIGNhbWVyYSBkaXNhYmxlZCBxdWVyeTogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaAppbmRleCBhZDlkYjY4Li5lMzRhOGYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oCkBAIC00OCw4ICs0OCw5IEBACiAgICAgICAgIHZvaWQgb25PcGVuKCk7CiAgICAgICAgIHZvaWQgb25DbG9zZShpbnQzMl90IGxhdGVuY3lNcyk7CiAgICAgICAgIHZvaWQgb25TdHJlYW1Db25maWd1cmVkKGludCBvcGVyYXRpbmdNb2RlLCBib29sIGludGVybmFsUmVjb25maWcsIGludDMyX3QgbGF0ZW5jeU1zKTsKLSAgICAgICAgdm9pZCBvbkFjdGl2ZSgpOworICAgICAgICB2b2lkIG9uQWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMpOwogICAgICAgICB2b2lkIG9uSWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyVGFnLCBpbnQzMl90IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpOwogICAgIH07CiAKQEAgLTgxLDE5ICs4MiwyMiBAQAogICAgICAgICAgICAgaW50MzJfdCBsYXRlbmN5TXMpOwogCiAgICAgLy8gU2Vzc2lvbiBzdGF0ZSBiZWNvbWVzIGFjdGl2ZQotICAgIHN0YXRpYyB2b2lkIGxvZ0FjdGl2ZShjb25zdCBTdHJpbmc4JiBpZCk7CisgICAgc3RhdGljIHZvaWQgbG9nQWN0aXZlKGNvbnN0IFN0cmluZzgmIGlkLCBmbG9hdCBtYXhQcmV2aWV3RnBzKTsKIAogICAgIC8vIFNlc3Npb24gc3RhdGUgYmVjb21lcyBpZGxlCiAgICAgc3RhdGljIHZvaWQgbG9nSWRsZShjb25zdCBTdHJpbmc4JiBpZCwKICAgICAgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpOwogCiAgICAgLy8gUGluZyBjYW1lcmEgc2VydmljZSBwcm94eSBmb3IgdXNlciB1cGRhdGUKICAgICBzdGF0aWMgdm9pZCBwaW5nQ2FtZXJhU2VydmljZVByb3h5KCk7CiAKLSAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHRvcCBhY3Rpdml0eSBuZWVkcyBhIHJvdGF0ZSBhbmQgY3JvcCBvdmVycmlkZS4KLSAgICBzdGF0aWMgYm9vbCBpc1JvdGF0ZUFuZENyb3BPdmVycmlkZU5lZWRlZChTdHJpbmcxNiBwYWNrYWdlTmFtZSwgaW50IHNlbnNvck9yaWVudGF0aW9uLAotICAgICAgICAgICAgaW50IGxlbnNGYWNpbmcpOworICAgIC8vIFJldHVybiB0aGUgY3VycmVudCB0b3AgYWN0aXZpdHkgcm90YXRlIGFuZCBjcm9wIG92ZXJyaWRlLgorICAgIHN0YXRpYyBpbnQgZ2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKFN0cmluZzE2IHBhY2thZ2VOYW1lLCBpbnQgbGVuc0ZhY2luZywgaW50IHVzZXJJZCk7CisKKyAgICAvLyBEZXRlY3QgaWYgdGhlIGNhbWVyYSBpcyBkaXNhYmxlZCBieSBkZXZpY2UgcG9saWN5LgorICAgIHN0YXRpYyBib29sIGlzQ2FtZXJhRGlzYWJsZWQoKTsKIH07CiAKIH0gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKaW5kZXggMDE5ODY5MC4uMGNkNGY1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCkBAIC02NCw3ICs2NCw3IEBACiAgICAgQVRSQUNFX0VORCgpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFUcmFjZXM6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKSB7CitzdGF0dXNfdCBDYW1lcmFUcmFjZXM6OmR1bXAoaW50IGZkKSB7CiAgICAgQUxPR1YoIiVzOiBmZCA9ICVkIiwgX19GVU5DVElPTl9fLCBmZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNJbXBsLnRyYWNlc0xvY2spOwogICAgIExpc3Q8UHJvY2Vzc0NhbGxTdGFjaz4mIHBjc0xpc3QgPSBzSW1wbC5wY3NMaXN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuaAppbmRleCAxM2NhMTZkLi43MWZhMzM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuaApAQCAtNDIsNyArNDIsNyBAQAogICAgICAqCiAgICAgICogPHA+RWFjaCBsaW5lIGlzIGluZGVudGVkIGJ5IERVTVBfSU5ERU5UIHNwYWNlcy48L3A+CiAgICAgICovCi0gICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogCiBwcml2YXRlOgogICAgIGVudW0gewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCmluZGV4IGQxNjQ4ODUuLjA3NGM4NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKQEAgLTUyNywxMiArNTI3LDcgQEAKICAgICAgICAgaWYgKCFyZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzKSB7CiAgICAgICAgICAgICAvLyBGaW5kIGV2aWN0ZWQgY2xpZW50cwogCi0gICAgICAgICAgICBpZiAoY29uZmxpY3RpbmcgJiYgY3VyUHJpb3JpdHkgPCBwcmlvcml0eSkgewotICAgICAgICAgICAgICAgIC8vIFByZS1leGlzdGluZyBjb25mbGljdGluZyBjbGllbnQgd2l0aCBoaWdoZXIgcHJpb3JpdHkgZXhpc3RzCi0gICAgICAgICAgICAgICAgZXZpY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhjbGllbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBldmljdExpc3Q7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZsaWN0aW5nICYmIG93bmVyID09IGN1ck93bmVyKSB7CisgICAgICAgICAgICBpZiAoY29uZmxpY3RpbmcgJiYgb3duZXIgPT0gY3VyT3duZXIpIHsKICAgICAgICAgICAgICAgICAvLyBQcmUtZXhpc3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IHdpdGggdGhlIHNhbWUgY2xpZW50IG93bmVyIGV4aXN0cwogICAgICAgICAgICAgICAgIC8vIE9wZW4gdGhlIHNhbWUgZGV2aWNlIHR3aWNlIC0+IG1vc3QgcmVjZW50IG9wZW4gd2lucwogICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsZXQgdGhlIGV4aXN0aW5nIGNsaWVudCB3aW5zIHRvIGF2b2lkIGJlaGF2aW9ycyBkaWZmZXJlbmNlCkBAIC01NDYsNiArNTQxLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soY2xpZW50KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZsaWN0aW5nICYmIGN1clByaW9yaXR5IDwgcHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmUtZXhpc3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IHdpdGggaGlnaGVyIHByaW9yaXR5IGV4aXN0cworICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5jbGVhcigpOworICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZpY3RMaXN0OwogICAgICAgICAgICAgfSBlbHNlIGlmIChjb25mbGljdGluZyB8fCAoKHRvdGFsQ29zdCA+IG1NYXhDb3N0ICYmIGN1ckNvc3QgPiAwKSAmJgogICAgICAgICAgICAgICAgICAgICAoY3VyUHJpb3JpdHkgPj0gcHJpb3JpdHkpICYmCiAgICAgICAgICAgICAgICAgICAgICEoaGlnaGVzdFByaW9yaXR5T3duZXIgPT0gb3duZXIgJiYgb3duZXIgPT0gY3VyT3duZXIpKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKaW5kZXggNDg1NzA1Yy4uMjFmMDJkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwCkBAIC05MjAsNyArOTIwLDcgQEAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc2Vuc29yUGl4ZWxNb2RlRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREUpOwogICAgIGlmIChzZW5zb3JQaXhlbE1vZGVFbnRyeS5jb3VudCAhPSAwKSB7CiAgICAgICAgIHNlbnNvclBpeGVsTW9kZSA9IHNlbnNvclBpeGVsTW9kZUVudHJ5LmRhdGEudThbMF07Ci0gICAgICAgIGlmIChzZW5zb3JQaXhlbE1vZGUgIT0gQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUIHx8CisgICAgICAgIGlmIChzZW5zb3JQaXhlbE1vZGUgIT0gQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUICYmCiAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGUgIT0gQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04pIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdCBzZW5zb3IgcGl4ZWwgbW9kZSBpcyBub3Qgb25lIG9mIHRoZSB2YWxpZCB2YWx1ZXMgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vuc29yUGl4ZWxNb2RlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9JUENUcmFuc3BvcnQuaApzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dC5haWRsCnJlbmFtZSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9JUENUcmFuc3BvcnQuaAppbmRleCBhMmNiZjYyLi5iOGU4MGFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dC5haWRsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0lQQ1RyYW5zcG9ydC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTEgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19JUENfSF8KKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0lQQ19IXwogCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0IHsKLSAgICBpbnQgc2Vzc2lvbjsKLX0KK2VudW0gY2xhc3MgSVBDVHJhbnNwb3J0IDogdWludDMyX3QgeworICBISURMID0gMCwKKyAgQUlETCA9IDEsCisgIElOVkFMSUQgPSAyCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKaW5kZXggYTIzOWM4MS4uMmViMmQ1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKQEAgLTEzLDcxICsxMywyNyBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlICJTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCiAjaW5jbHVkZSAiLi4vYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgogI2luY2x1ZGUgIi4uL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiY29tbW9uL0hhbENvbnZlcnNpb25zVGVtcGxhdGVkLmgiCiAjaW5jbHVkZSAiLi4vQ2FtZXJhU2VydmljZS5oIgotI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgInN5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjEuaCIKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6VjNfNjo6Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewogCi1pbnQzMl90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OlBFUkZfQ0xBU1NfTEVWRUwgPQotICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIoInJvLm9kbS5idWlsZC5tZWRpYV9wZXJmb3JtYW5jZV9jbGFzcyIsIDApOwotCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OklTX1BFUkZfQ0xBU1MgPSAoUEVSRl9DTEFTU19MRVZFTCA9PSBTREtfVkVSU0lPTl9TKTsKLQotY2FtZXJhMzo6U2l6ZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsCi0gICAgICAgIGJvb2wgdWx0cmFIaWdoUmVzb2x1dGlvbikgewotICAgIGludDMyX3QgbWF4SnBlZ1dpZHRoID0gMCwgbWF4SnBlZ0hlaWdodCA9IDA7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OwotICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOwotICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOwotCi0gICAgaW50MzJfdCBzY2FsZXJTaXplc1RhZyA9IHVsdHJhSGlnaFJlc29sdXRpb24gPwotICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gOgotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQotICAgICAgICAgICAgbWV0YWRhdGEuZmluZChzY2FsZXJTaXplc1RhZyk7Ci0gICAgaWYgKGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCB8fAotICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCAlIFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgIT0gMCkgewotICAgICAgICByZXR1cm4gY2FtZXJhMzo6U2l6ZSgwLCAwKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KLSAgICBmb3IgKHNpemVfdCBpPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKLSAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07Ci0gICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKLSAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07Ci0gICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOwotICAgICAgICBpZiAoaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVAotICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKLSAgICAgICAgICAgICAgICAod2lkdGggKiBoZWlnaHQgPiBtYXhKcGVnV2lkdGggKiBtYXhKcGVnSGVpZ2h0KSkgewotICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICBtYXhKcGVnSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGNhbWVyYTM6OlNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKLX0KLQotc2l6ZV90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCi0gICAgICAgIGNhbWVyYTM6OlNpemUgZGVmYXVsdE1heEpwZWdTaXplLCBzaXplX3QgZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplKSB7Ci0gICAgcmV0dXJuICh1aHJNYXhKcGVnU2l6ZS53aWR0aCAqIHVock1heEpwZWdTaXplLmhlaWdodCkgLwotICAgICAgICAgICAgKGRlZmF1bHRNYXhKcGVnU2l6ZS53aWR0aCAqIGRlZmF1bHRNYXhKcGVnU2l6ZS5oZWlnaHQpICogZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplOwotfQotCiB2b2lkIFN0cmVhbUNvbmZpZ3VyYXRpb246OmdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgaW50IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+PiAqc2NtKSB7CkBAIC0xMjYsNjUgKzgyLDU3IEBACiAgICAgZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoc3RhdGljSW5mbywgaGVpY0tleSwgc2NtKTsKIH0KIAotaW50MzJfdCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoaW50MzJfdCBkZWZhdWx0VGFnLCBib29sIG1heFJlc29sdXRpb24pIHsKLSAgICBpZiAoIW1heFJlc29sdXRpb24pIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUYWc7CituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKK2ludDMyX3QgUEVSRl9DTEFTU19MRVZFTCA9CisgICAgICAgIHByb3BlcnR5X2dldF9pbnQzMigicm8ub2RtLmJ1aWxkLm1lZGlhX3BlcmZvcm1hbmNlX2NsYXNzIiwgMCk7CisKK2Jvb2wgSVNfUEVSRl9DTEFTUyA9IChQRVJGX0NMQVNTX0xFVkVMID49IFNES19WRVJTSU9OX1MpOworCitjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKKyAgICAgICAgYm9vbCB1bHRyYUhpZ2hSZXNvbHV0aW9uKSB7CisgICAgaW50MzJfdCBtYXhKcGVnV2lkdGggPSAwLCBtYXhKcGVnSGVpZ2h0ID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisKKyAgICBpbnQzMl90IHNjYWxlclNpemVzVGFnID0gdWx0cmFIaWdoUmVzb2x1dGlvbiA/CisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA6CisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlM7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICBtZXRhZGF0YS5maW5kKHNjYWxlclNpemVzVGFnKTsKKyAgICBpZiAoYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50ICUgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSAhPSAwKSB7CisgICAgICAgIHJldHVybiBjYW1lcmEzOjpTaXplKDAsIDApOwogICAgIH0KLSAgICBzd2l0Y2ggKGRlZmF1bHRUYWcpIHsKLSAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRToKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTl9NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9MRU5TX0RJU1RPUlRJT046Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0RJU1RPUlRJT05fTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBUYWcgJWQgZG9lc24ndCBoYXZlIGEgbWF4aW11bSByZXNvbHV0aW9uIGNvdW50ZXJwYXJ0IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGFnKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgIGZvciAoc2l6ZV90IGk9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgIGlmIChpc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgorICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7CisgICAgICAgICAgICBtYXhKcGVnV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGNhbWVyYTM6OlNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKIH0KIAotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGNvbnN0IENhbWVyYU1ldGFkYXRhICpkZXZpY2VJbmZvLAotICAgICAgICBpbnQzMl90IGFycmF5VGFnLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7Ci0gICAgaWYgKHdpZHRoID09IG51bGxwdHIgfHwgaGVpZ2h0ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiB3aWR0aCAvIGhlaWdodCBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGRldmljZUluZm8tPmZpbmQoYXJyYXlUYWcpOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSA0KSByZXR1cm4gZmFsc2U7Ci0gICAgKndpZHRoID0gZW50cnkuZGF0YS5pMzJbMl07Ci0gICAgKmhlaWdodCA9IGVudHJ5LmRhdGEuaTMyWzNdOwotICAgIHJldHVybiB0cnVlOworc2l6ZV90IGdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCisgICAgICAgIGNhbWVyYTM6OlNpemUgZGVmYXVsdE1heEpwZWdTaXplLCBzaXplX3QgZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplKSB7CisgICAgcmV0dXJuICh1aHJNYXhKcGVnU2l6ZS53aWR0aCAqIHVock1heEpwZWdTaXplLmhlaWdodCkgLworICAgICAgICAgICAgKGRlZmF1bHRNYXhKcGVnU2l6ZS53aWR0aCAqIGRlZmF1bHRNYXhKcGVnU2l6ZS5oZWlnaHQpICogZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplOwogfQogCiBTdHJlYW1Db25maWd1cmF0aW9uUGFpcgotU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvblBhaXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8pIHsKK2dldFN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyKGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvKSB7CiAgICAgY2FtZXJhMzo6U3RyZWFtQ29uZmlndXJhdGlvblBhaXIgc3RyZWFtQ29uZmlndXJhdGlvblBhaXI7CiAgICAgY2FtZXJhMzo6U3RyZWFtQ29uZmlndXJhdGlvbjo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoc3RhdGljSW5mbywgZmFsc2UsCiAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvblBhaXIubURlZmF1bHRTdHJlYW1Db25maWd1cmF0aW9uTWFwKTsKQEAgLTE5MywxMyArMTQxLDEzIEBACiAgICAgcmV0dXJuIHN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyOwogfQogCi1pbnQ2NF90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSkgeworaW50NjRfdCBldWNsaWREaXN0U3F1YXJlKGludDMyX3QgeDAsIGludDMyX3QgeTAsIGludDMyX3QgeDEsIGludDMyX3QgeTEpIHsKICAgICBpbnQ2NF90IGQwID0geDAgLSB4MTsKICAgICBpbnQ2NF90IGQxID0geTAgLSB5MTsKICAgICByZXR1cm4gZDAgKiBkMCArIGQxICogZDE7CiB9CiAKLWJvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6cm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorYm9vbCByb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgIGludDMyX3QgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCBib29sIG1heFJlc29sdXRpb24sIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwKICAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCkgewpAQCAtMjYwLDcgKzIwOCw4MSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KQorLy9jaGVjayBpZiBmb3JtYXQgaXMgMTAtYml0IGNvbXBhdGlibGUKK2Jvb2wgaXMxMGJpdENvbXBhdGlibGVGb3JtYXQoaW50MzJfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2goZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBpc0R5bmFtaWNSYW5nZVByb2ZpbGVTdXBwb3J0ZWQoaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbykgeworICAgIGlmIChkeW5hbWljUmFuZ2VQcm9maWxlID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpIHsKKyAgICAgICAgLy8gU3VwcG9ydGVkIGJ5IGRlZmF1bHQKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGJvb2wgaXMxMGJpdER5bmFtaWNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19EWU5BTUlDX1JBTkdFX1RFTl9CSVQpIHsKKyAgICAgICAgICAgIGlzMTBiaXREeW5hbWljUmFuZ2VTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWlzMTBiaXREeW5hbWljUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaCAoZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTBfUExVUzoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSExHMTA6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU06CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU1fUE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUY6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUZfUE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX09FTToKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfT0VNX1BPOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzhCX0hEUl9SRUY6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX1JFRl9QTzoKKyAgICAgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVApOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNSYW5nZVByb2ZpbGUgPT0gZW50cnkuZGF0YS5pNjRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvL2NoZWNrIGlmIGZvcm1hdCBpcyAxMC1iaXQgY29tcGF0aWJsZQorYm9vbCBpczEwYml0RHluYW1pY1JhbmdlUHJvZmlsZShpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICBzd2l0Y2ggKGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwX1BMVVM6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMDoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hMRzEwOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNX1BPOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfUkVGOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfUkVGX1BPOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIGlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KQogewogICAgIHN3aXRjaChmb3JtYXQpIHsKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKQEAgLTI4NywxMSArMzA5LDM0IEBACiAgICAgfQogfQogCi1iaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicCgKK2Jvb2wgaXNTdHJlYW1Vc2VDYXNlU3VwcG9ydGVkKGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Vc2VDYXNlcyA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMpOworCisgICAgaWYgKGF2YWlsYWJsZVN0cmVhbVVzZUNhc2VzLmNvdW50ID09IDAgJiYKKyAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gQWxsb3cgdmVuZG9yIHN0cmVhbSB1c2UgY2FzZSB1bmNvbmRpdGlvbmFsbHkuCisgICAgaWYgKHN0cmVhbVVzZUNhc2UgPj0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfVkVORE9SX1NUQVJUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXMuY291bnQ7IGkrKykgeworICAgICAgICBpZiAoYXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXMuZGF0YS5pNjRbaV0gPT0gc3RyZWFtVXNlQ2FzZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicCgKICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKICAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCl7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGludCB0aW1lc3RhbXBCYXNlLCBpbnQgbWlycm9yTW9kZSkgewogICAgIC8vIGJ1ZmZlclByb2R1Y2VyIG11c3QgYmUgbm9uLW51bGwKICAgICBpZiAoZ2JwID09IG51bGxwdHIpIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogU3VyZmFjZSBpcyBOVUxMIiwgbG9naWNhbENhbWVyYUlkLnN0cmluZygpKTsKQEAgLTM4OSw2ICs0MzQsNDMgQEAKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgIH0KKyAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzRHluYW1pY1JhbmdlUHJvZmlsZVN1cHBvcnRlZChkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IER5bmFtaWMgcmFuZ2UgcHJvZmlsZSAweCUiIFBSSXg2NAorICAgICAgICAgICAgICAgICIgbm90IHN1cHBvcnRlZCxmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLCBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzMTBiaXREeW5hbWljUmFuZ2VQcm9maWxlKGR5bmFtaWNSYW5nZVByb2ZpbGUpICYmCisgICAgICAgICAgICAhU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXMxMGJpdENvbXBhdGlibGVGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBObyAxMC1iaXQgc3VwcG9ydGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoICIKKyAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCBkZWZpbmVkIGFuZCBwcm9maWxlICUiIFBSSXg2NCAiLCBmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0LCBkeW5hbWljUmFuZ2VQcm9maWxlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzU3RyZWFtVXNlQ2FzZVN1cHBvcnRlZChzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogc3RyZWFtIHVzZSBjYXNlICUiIFBSSWQ2NCAiIG5vdCBzdXBwb3J0ZWQsIgorICAgICAgICAgICAgICAgICIgZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgc3RyZWFtIiwgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBzdHJlYW1Vc2VDYXNlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wQmFzZSA8IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQgfHwKKyAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UgPiBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9DSE9SRU9HUkFQSEVSX1NZTkNFRCkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBpbnZhbGlkIHRpbWVzdGFtcCBiYXNlICVkIiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHRpbWVzdGFtcEJhc2UpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChtaXJyb3JNb2RlIDwgT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyB8fAorICAgICAgICAgICAgbWlycm9yTW9kZSA+IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX1YpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogaW52YWxpZCBtaXJyb3JpbmcgbW9kZSAlZCIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBtaXJyb3JNb2RlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KIAogICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IHdpZHRoOwpAQCAtMzk3LDYgKzQ3OSwxMCBAQAogICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGRhdGFTcGFjZTsKICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gY29uc3VtZXJVc2FnZTsKICAgICAgICAgc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCA9IG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzOworICAgICAgICBzdHJlYW1JbmZvLmR5bmFtaWNSYW5nZVByb2ZpbGUgPSBkeW5hbWljUmFuZ2VQcm9maWxlOworICAgICAgICBzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UgPSBzdHJlYW1Vc2VDYXNlOworICAgICAgICBzdHJlYW1JbmZvLnRpbWVzdGFtcEJhc2UgPSB0aW1lc3RhbXBCYXNlOworICAgICAgICBzdHJlYW1JbmZvLm1pcnJvck1vZGUgPSBtaXJyb3JNb2RlOwogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQogICAgIGlmICh3aWR0aCAhPSBzdHJlYW1JbmZvLndpZHRoKSB7CkBAIC00MzcsMTE0ICs1MjMsNDkgQEAKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6bWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAordm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCiAgICAgICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKLSAgICAgICAgICAgIGludDMyX3QgZ3JvdXBJZCwgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKSB7CisgICAgICAgICAgICBpbnQzMl90IGdyb3VwSWQsIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgewogICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RyZWFtLT52M180LnYzXzIuc3RyZWFtVHlwZSA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6T1VUUFVUOwotICAgIHN0cmVhbS0+djNfNC52M18yLndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5mb3JtYXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKKyAgICBzdHJlYW0tPnN0cmVhbVR5cGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKKyAgICBzdHJlYW0tPmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgIHN0cmVhbS0+Zm9ybWF0ID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbFBpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKICAgICBhdXRvIHUgPSBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2U7CiAgICAgY2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKHN0cmVhbUluZm8uZm9ybWF0LCAmdSk7Ci0gICAgc3RyZWFtLT52M180LnYzXzIudXNhZ2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UodSk7Ci0gICAgc3RyZWFtLT52M180LnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5yb3RhdGlvbiA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24ocm90YXRpb24pOwotICAgIHN0cmVhbS0+djNfNC52M18yLmlkID0gLTE7IC8vIEludmFsaWQgc3RyZWFtIGlkCi0gICAgc3RyZWFtLT52M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKLSAgICBzdHJlYW0tPnYzXzQuYnVmZmVyU2l6ZSA9IDA7CisgICAgc3RyZWFtLT51c2FnZSA9IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxDb25zdW1lclVzYWdlKHUpOworICAgIHN0cmVhbS0+ZGF0YVNwYWNlID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbERhdGFzcGFjZShzdHJlYW1JbmZvLmRhdGFTcGFjZSk7CisgICAgc3RyZWFtLT5yb3RhdGlvbiA9IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxTdHJlYW1Sb3RhdGlvbihyb3RhdGlvbik7CisgICAgc3RyZWFtLT5pZCA9IC0xOyAvLyBJbnZhbGlkIHN0cmVhbSBpZAorICAgIHN0cmVhbS0+cGh5c2ljYWxDYW1lcmFJZCA9IHN0ZDo6c3RyaW5nKHBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7CiAgICAgc3RyZWFtLT5ncm91cElkID0gZ3JvdXBJZDsKICAgICBzdHJlYW0tPnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkLnNpemUoKSk7CiAgICAgc2l6ZV90IGlkeCA9IDA7CisgICAgdXNpbmcgU2Vuc29yUGl4ZWxNb2RlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNlbnNvclBpeGVsTW9kZTsKICAgICBmb3IgKGF1dG8gbW9kZSA6IHN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHsKICAgICAgICAgc3RyZWFtLT5zZW5zb3JQaXhlbE1vZGVzVXNlZFtpZHgrK10gPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CiAgICAgfQotfQotCi1iaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgewotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKLSAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKLSAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpICB7Ci0gICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKLSAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgewotICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOwotICAgIH0KLQotICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKLSAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7Ci0KLSAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgewotICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7Ci0gICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAotICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOwotICAgIH0KLQotICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOwotICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKLSAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7Ci0gICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOwotICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgewotICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKLSAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgdXNpbmcgRHluYW1pY1JhbmdlUHJvZmlsZSA9CisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6UmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwOworICAgIHN0cmVhbS0+ZHluYW1pY1JhbmdlUHJvZmlsZSA9IHN0YXRpY19jYXN0PER5bmFtaWNSYW5nZVByb2ZpbGU+KHN0cmVhbUluZm8uZHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgdXNpbmcgU3RyZWFtVXNlQ2FzZXMgPQorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNjYWxlckF2YWlsYWJsZVN0cmVhbVVzZUNhc2VzOworICAgIHN0cmVhbS0+dXNlQ2FzZSA9IHN0YXRpY19jYXN0PFN0cmVhbVVzZUNhc2VzPihzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UpOwogfQogCiBiaW5kZXI6OlN0YXR1cwotU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCitjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAogICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGJvb2wgKmVhcmx5RXhpdCkgewotCisgICAgdXNpbmcgU2Vuc29yUGl4ZWxNb2RlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNlbnNvclBpeGVsTW9kZTsKICAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIGRldmljZUluZm8sIGxvZ2ljYWxDYW1lcmFJZCk7CiAgICAgaWYgKCFyZXMuaXNPaygpKSB7CkBAIC01NTcsNyArNTc4LDcgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgIH0KICAgICAqZWFybHlFeGl0ID0gZmFsc2U7Ci0gICAgYXV0byByZXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgIGF1dG8gcmV0ID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAogICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKICAgICBpZiAocmV0ICE9IE9LKSB7CkBAIC01NzgsMTkgKzU5OSwzMSBAQAogICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOwogICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOwogICAgIGlmIChpc0lucHV0VmFsaWQpIHsKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+IGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzOworICAgICAgICBzdGQ6OnZlY3RvcjxTZW5zb3JQaXhlbE1vZGU+IGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzOwogICAgICAgICBkZWZhdWx0U2Vuc29yUGl4ZWxNb2Rlcy5yZXNpemUoMSk7CiAgICAgICAgIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzWzBdID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7Ci0gICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10gPSB7e3svKnN0cmVhbUlkKi8wLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKLSAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAotICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH0sIC8qZ3JvdXBJZCovLTEsIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzfTsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZW5zb3JQaXhlbE1vZGU+KEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7CisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtIHN0cmVhbTsKKyAgICAgICAgc3RyZWFtLmlkID0gMDsKKyAgICAgICAgc3RyZWFtLnN0cmVhbVR5cGUgPSAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgc3RyZWFtLndpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpOworICAgICAgICBzdHJlYW0uaGVpZ2h0ID0gIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSk7CisgICAgICAgIHN0cmVhbS5mb3JtYXQgPQorICAgICAgICAgICAgICAgIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsUGl4ZWxGb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKTsKKyAgICAgICAgc3RyZWFtLnVzYWdlID0gc3RhdGljX2Nhc3Q8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlPigwKTsKKyAgICAgICAgc3RyZWFtLmRhdGFTcGFjZSA9CisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2U+KAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTik7CisgICAgICAgIHN0cmVhbS5yb3RhdGlvbiA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7CisgICAgICAgIHN0cmVhbS5idWZmZXJTaXplID0gMDsKKyAgICAgICAgc3RyZWFtLmdyb3VwSWQgPSAtMTsKKyAgICAgICAgc3RyZWFtLnNlbnNvclBpeGVsTW9kZXNVc2VkID0gZGVmYXVsdFNlbnNvclBpeGVsTW9kZXM7CisgICAgICAgIHVzaW5nIER5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlJlcXVlc3RBdmFpbGFibGVEeW5hbWljUmFuZ2VQcm9maWxlc01hcDsKKyAgICAgICAgc3RyZWFtLmR5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgRHluYW1pY1JhbmdlUHJvZmlsZTo6QU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRDsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHN0cmVhbTsKICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0KICAgICAgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5pbnB1dElzTXVsdGlSZXNvbHV0aW9uKCk7CiAgICAgfQpAQCAtNjAxLDYgKzYzNCw3IEBACiAgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IGl0LmlzRGVmZXJyZWQoKTsKICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChpdC5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogCisgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSA9IGl0LmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPSBpdC5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOwogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcGh5c2ljYWxEZXZpY2VJbmZvID0gZ2V0TWV0YWRhdGEocGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcyk7CkBAIC02MjIsNiArNjU2LDkgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBpdC5nZXRTdHJlYW1Vc2VDYXNlKCk7CisgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gaXQuZ2V0VGltZXN0YW1wQmFzZSgpOworICAgICAgICBpbnQgbWlycm9yTW9kZSA9IGl0LmdldE1pcnJvck1vZGUoKTsKICAgICAgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGggPSBpdC5nZXRXaWR0aCgpOwogICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgPSBpdC5nZXRIZWlnaHQoKTsKQEAgLTYzMiw2ICs2NjksNyBAQAogICAgICAgICAgICAgaWYgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHsKICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1JbmZvLmR5bmFtaWNSYW5nZVByb2ZpbGUgPSBpdC5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CiAgICAgICAgICAgICBpZiAoY2hlY2tBbmRPdmVycmlkZVNlbnNvclBpeGVsTW9kZXNVc2VkKHNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIG1ldGFkYXRhQ2hvc2VuLCBmYWxzZSAvKmZsZXhpYmxlQ29uc3VtZXIqLywKQEAgLTY0MSw2ICs2NzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVmZXJyZWQgc3VyZmFjZSBzZW5zb3IgcGl4ZWwgbW9kZXMgbm90IHZhbGlkIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UgPSBzdHJlYW1Vc2VDYXNlOwogICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBjYW1lcmEzOjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsIHBoeXNpY2FsQ2FtZXJhSWQsIGdyb3VwSWQsCiAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKQEAgLTY1Myw3ICs2OTIsOCBAQAogICAgICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CiAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQsIG1ldGFkYXRhQ2hvc2VuLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZCwgbWV0YWRhdGFDaG9zZW4sIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIAogICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC03MTEsNiArNzUxLDc4IEBACiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCitiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgeworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpICB7CisgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKKyAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgeworICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOworICAgIH0KKworICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKKyAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CisKKyAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgeworICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7CisgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOworICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgeworICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKKyAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIHN0YXRpYyBib29sIGluU3RyZWFtQ29uZmlndXJhdGlvbk1hcChpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYTM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+PiAmc20pIHsKICAgICBhdXRvIHNjcyA9IHNtLmZpbmQoZm9ybWF0KTsKQEAgLTcyOSw3ICs4NDEsNyBAQAogICAgIHJldHVybiBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4oc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuYmVnaW4oKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuZW5kKCkpOwogfQogCi1zdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoCitzdGF0dXNfdCBjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgYm9vbCBmbGV4aWJsZUNvbnN1bWVyLAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gKm92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCkgewpAQCAtNzk1LDQ0ICs5MDcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUNhcDsKLSAgICBlbnRyeUNhcCA9IGRldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7Ci0gICAgLy8gR28gdGhyb3VnaCB0aGUgY2FwYWJpbGl0aWVzIGFuZCBjaGVjayBpZiBpdCBoYXMKLSAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07Ci0gICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCi0gICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNykgewotICAgIGlmIChzdHJlYW1Db25maWdWMzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSkgewotICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IGltYWdlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXMucmVzaXplKHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdWMzcuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXNbaV0uZ3JvdXBJZCAhPSAtMSkgewotICAgICAgICAgICAgLy8gSUNhbWVyYURldmljZSBvbGRlciB0aGFuIDMuNyBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQKLSAgICAgICAgICAgIC8vIGltYWdlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXNbaV0gPSBzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS52M180OwotICAgIH0KLSAgICBzdHJlYW1Db25maWdWMzQub3BlcmF0aW9uTW9kZSA9IHN0cmVhbUNvbmZpZ1YzNy5vcGVyYXRpb25Nb2RlOwotICAgIHN0cmVhbUNvbmZpZ1YzNC5zZXNzaW9uUGFyYW1zID0gc3RyZWFtQ29uZmlnVjM3LnNlc3Npb25QYXJhbXM7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorYm9vbCB0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAogICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwKICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24pIHsKICAgICBib29sIGlzUGVyZkNsYXNzUHJpbWFyeUNhbWVyYSA9CkBAIC04NDAsNSArOTE1LDYgQEAKICAgICByZXR1cm4gdGFyZ2V0U2RrVmVyc2lvbiA+PSBTREtfVkVSU0lPTl9TICYmIGlzUGVyZkNsYXNzUHJpbWFyeUNhbWVyYTsKIH0KIAorfSAvLyBuYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscwogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oCmluZGV4IDE5MmUyNDEuLmExMjdjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgKQEAgLTIxLDE1ICsyMSwxOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L3R5cGVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYURldmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAKICNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9JUENUcmFuc3BvcnQuaD4KIAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmgiCisKIC8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCiAKICNkZWZpbmUgU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcpIFwKQEAgLTQ0LDcgKzQ3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAotdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPENhbWVyYU1ldGFkYXRhIChjb25zdCBTdHJpbmc4ICYsIGludCB0YXJnZXRTZGtWZXJzaW9uKT4gbWV0YWRhdGFHZXR0ZXI7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Q2FtZXJhTWV0YWRhdGEgKGNvbnN0IFN0cmluZzggJiwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk+IG1ldGFkYXRhR2V0dGVyOwogCiBjbGFzcyBTdHJlYW1Db25maWd1cmF0aW9uIHsKIHB1YmxpYzoKQEAgLTY5LDk2ICs3Miw5MiBAQAogICAgICAgICAgICAgbU1heGltdW1SZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcDsKIH07CiAKLWNsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgewotcHVibGljOgotICAgIHN0YXRpYyBjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKLSAgICAgICAgICAgIGJvb2wgdWx0cmFIaWdoUmVzb2x1dGlvbik7CituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CiAKLSAgICBzdGF0aWMgc2l6ZV90IGdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCi0gICAgICAgICAgICBjYW1lcmEzOjpTaXplIGRlZmF1bHRNYXhKcGVnU2l6ZSwgc2l6ZV90IGRlZmF1bHRNYXhKcGVnQnVmZmVyU2l6ZSk7CitjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKKyAgICAgICAgYm9vbCB1bHRyYUhpZ2hSZXNvbHV0aW9uKTsKIAotICAgIHN0YXRpYyBpbnQ2NF90IGV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSk7CitzaXplX3QgZ2V0VUhSTWF4SnBlZ0J1ZmZlclNpemUoY2FtZXJhMzo6U2l6ZSB1aHJNYXhKcGVnU2l6ZSwKKyAgICAgICAgY2FtZXJhMzo6U2l6ZSBkZWZhdWx0TWF4SnBlZ1NpemUsIHNpemVfdCBkZWZhdWx0TWF4SnBlZ0J1ZmZlclNpemUpOwogCi0gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKLSAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAotICAgIHN0YXRpYyBib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCBib29sIG1heFJlc29sdXRpb24sCi0gICAgICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOworaW50NjRfdCBldWNsaWREaXN0U3F1YXJlKGludDMyX3QgeDAsIGludDMyX3QgeTAsIGludDMyX3QgeDEsIGludDMyX3QgeTEpOwogCi0gICAgc3RhdGljIGJvb2wgZ2V0QXJyYXlXaWR0aEFuZEhlaWdodChjb25zdCBDYW1lcmFNZXRhZGF0YSAqZGV2aWNlSW5mbywgaW50MzJfdCBhcnJheVRhZywKLSAgICAgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOworLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKy8vIGEgd2lkdGggPD0gUk9VTkRJTkdfV0lEVEhfQ0FQCitib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sIGJvb2wgbWF4UmVzb2x1dGlvbiwKKyAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLCAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KTsKIAotICAgIC8vY2hlY2sgaWYgZm9ybWF0IGlzIG5vdCBjdXN0b20gZm9ybWF0Ci0gICAgc3RhdGljIGJvb2wgaXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpOworLy8gY2hlY2sgaWYgZm9ybWF0IGlzIG5vdCBjdXN0b20gZm9ybWF0Citib29sIGlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KTsKIAotICAgIC8vIENyZWF0ZSBhIFN1cmZhY2UgZnJvbSBhbiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLiBSZXR1cm5zIGVycm9yIGlmCi0gICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcidzIHByb3BlcnR5IGRvZXNuJ3QgbWF0Y2ggd2l0aCBzdHJlYW1JbmZvCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZVN1cmZhY2VGcm9tR2JwKAorLy8gQ3JlYXRlIGEgU3VyZmFjZSBmcm9tIGFuIElHcmFwaGljQnVmZmVyUHJvZHVjZXIuIFJldHVybnMgZXJyb3IgaWYKKy8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIncyBwcm9wZXJ0eSBkb2Vzbid0IG1hdGNoIHdpdGggc3RyZWFtSW5mbworYmluZGVyOjpTdGF0dXMgY3JlYXRlU3VyZmFjZUZyb21HYnAoCiAgICAgICAgIGNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCiAgICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAogICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZwaHlzaWNhbENhbWVyYU1ldGFkYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgaW50IHRpbWVzdGFtcEJhc2UsIGludCBtaXJyb3JNb2RlKTsKIAotICAgIHN0YXRpYyB2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgY2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKLSAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLCBpbnQzMl90IGdyb3VwSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOworLy9jaGVjayBpZiBmb3JtYXQgaXMgMTAtYml0IG91dHB1dCBjb21wYXRpYmxlCitib29sIGlzMTBiaXRDb21wYXRpYmxlRm9ybWF0KGludDMyX3QgZm9ybWF0KTsKIAotICAgIC8vIENoZWNrIHRoYXQgdGhlIHBoeXNpY2FsQ2FtZXJhSWQgcGFzc2VkIGluIGlzIHNwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKLSAgICAvLyBkZXZpY2UuCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKTsKKy8vIGNoZWNrIGlmIHRoZSBkeW5hbWljIHJhbmdlIHJlcXVpcmVzIDEwLWJpdCBvdXRwdXQKK2Jvb2wgaXMxMGJpdER5bmFtaWNSYW5nZVByb2ZpbGUoaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlKTsKIAotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCi0gICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciwgaW50IHN1cmZhY2VUeXBlKTsKKy8vIENoZWNrIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgYSBnaXZlbiBkeW5hbWljUmFuZ2VQcm9maWxlCitib29sIGlzRHluYW1pY1JhbmdlUHJvZmlsZVN1cHBvcnRlZChpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNNZXRhKTsKIAotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja09wZXJhdGluZ01vZGUoaW50IG9wZXJhdGluZ01vZGUsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7Citib29sIGlzU3RyZWFtVXNlQ2FzZVN1cHBvcnRlZChpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvKTsKIAotICAgIC8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBBSURMIFNlc3Npb25Db25maWd1cmF0aW9uIHRvIEhJREwKLSAgICAvLyBzdHJlYW1Db25maWd1cmF0aW9uLiBBbHNvIGNoZWNrcyBmb3IgdmFsaWRpdHkgb2YgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gYW5kCi0gICAgLy8gcmV0dXJucyBhIG5vbi1vayBiaW5kZXI6OlN0YXR1cyBpZiB0aGUgcGFzc2VkIGluIHNlc3Npb24gY29uZmlndXJhdGlvbgotICAgIC8vIGlzbid0IHZhbGlkLgotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cwotICAgIGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKLSAgICAgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCAqZWFybHlFeGl0KTsKK3ZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgaW50MzJfdCBncm91cElkLCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOwogCi0gICAgLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgVjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiB0bwotICAgIC8vIFYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24uIFJldHVybiBmYWxzZSBpZiB0aGUgb3JpZ2luYWwgVjNfNyBjb25maWd1cmF0aW9uIGNhbm5vdAotICAgIC8vIGJlIHVzZWQgYnkgb2xkZXIgdmVyc2lvbiBIQUwuCi0gICAgc3RhdGljIGJvb2wgY29udmVydEhBTFN0cmVhbUNvbWJpbmF0aW9uRnJvbVYzN1RvVjM0KAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWdWMzQsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNyk7CisvLyBDaGVjayB0aGF0IHRoZSBwaHlzaWNhbENhbWVyYUlkIHBhc3NlZCBpbiBpcyBzcHBvcnRlZCBieSB0aGUgY2FtZXJhCisvLyBkZXZpY2UuCitiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLCBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAorY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKTsKIAotICAgIHN0YXRpYyBTdHJlYW1Db25maWd1cmF0aW9uUGFpciBnZXRTdHJlYW1Db25maWd1cmF0aW9uUGFpcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEpOworYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZShzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAorYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGJvb2wgZmxleGlibGVDb25zdW1lciwKLSAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAqb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKTsKK2JpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKK2NvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7CiAKLSAgICBzdGF0aWMgYm9vbCBpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pOworYmluZGVyOjpTdGF0dXMKK2NvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAorICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAorICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAorICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sICplYXJseUV4aXQpOwogCi0gICAgc3RhdGljIGludDMyX3QgZ2V0QXBwcm9wcmlhdGVNb2RlVGFnKGludDMyX3QgZGVmYXVsdFRhZywgYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpOworU3RyZWFtQ29uZmlndXJhdGlvblBhaXIgZ2V0U3RyZWFtQ29uZmlndXJhdGlvblBhaXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhKTsKIAotICAgIHN0YXRpYyBib29sIHRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0U2RrVmVyc2lvbik7CitzdGF0dXNfdCBjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgYm9vbCBmbGV4aWJsZUNvbnN1bWVyLAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gKm92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCk7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDQ7Citib29sIHRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICBpbnQzMl90IHRhcmdldFNka1ZlcnNpb24pOwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgUk9VTkRJTkdfV0lEVEhfQ0FQID0gMTkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gNDsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNES19WRVJTSU9OX1MgPSAzMTsKLSAgICBzdGF0aWMgaW50MzJfdCBQRVJGX0NMQVNTX0xFVkVMOwotICAgIHN0YXRpYyBib29sIElTX1BFUkZfQ0xBU1M7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgUEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XID0gMTkyMDsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX0ggPSAxMDgwOwotfTsKK2NvbnN0ZXhwciBpbnQzMl90IFJPVU5ESU5HX1dJRFRIX0NBUCA9IDE5MjA7CiAKK2NvbnN0ZXhwciBpbnQzMl90IFNES19WRVJTSU9OX1MgPSAzMTsKK2V4dGVybiBpbnQzMl90IFBFUkZfQ0xBU1NfTEVWRUw7CitleHRlcm4gYm9vbCBJU19QRVJGX0NMQVNTOworY29uc3RleHByIGludDMyX3QgUEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XID0gMTkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IFBFUkZfQ0xBU1NfSlBFR19USFJFU0hfSCA9IDEwODA7CisKK30gLy8gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscwogfSAvLyBjYW1lcmEzCiB9IC8vIGFuZHJvaWQKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2ZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgorI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmgiCisKKyNpbmNsdWRlICIuLi9DYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6VjNfNjo6Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKK3N0YXR1c190Citjb252ZXJ0QWlkbFRvSGlkbDM3U3RyZWFtQ29tYmluYXRpb24oCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiAmYWlkbCwKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZoaWRsKSB7CisgICAgaGlkbC5vcGVyYXRpb25Nb2RlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZT4oYWlkbC5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAoYWlkbC5zdHJlYW1Db25maWdDb3VudGVyIDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBoaWRsLnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWlkbC5zdHJlYW1Db25maWdDb3VudGVyKTsKKyAgICBoaWRsLm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPSBhaWRsLm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2U7CisgICAgaGlkbC5zZXNzaW9uUGFyYW1zID0gYWlkbC5zZXNzaW9uUGFyYW1zLm1ldGFkYXRhOworICAgIGhpZGwuc3RyZWFtcy5yZXNpemUoYWlkbC5zdHJlYW1zLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogYWlkbC5zdHJlYW1zKSB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cmVhbS5keW5hbWljUmFuZ2VQcm9maWxlKSAhPQorICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyAgRHluYW1pYyByYW5nZSBwcm9maWxlICUiIFBSSWQ2NCAiIG5vdCBzdXBwb3J0ZWQgYnkgSElETCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmR5bmFtaWNSYW5nZVByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cmVhbS51c2VDYXNlKSAhPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgU3RyZWFtIHVzZSBjYXNlICUiIFBSSWQ2NCAibm90IHN1cHBvcnRlZCBieSBISURMIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0udXNlQ2FzZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGlkbCB2M183CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS5ncm91cElkID0gc3RyZWFtLmdyb3VwSWQ7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3RyZWFtLnNlbnNvclBpeGVsTW9kZXNVc2VkLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZtb2RlIDogc3RyZWFtLnNlbnNvclBpeGVsTW9kZXNVc2VkKSB7CisgICAgICAgICAgICBoaWRsLnN0cmVhbXNbaV0uc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbal0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vaGlkbCB2M180CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzdHJlYW0ucGh5c2ljYWxDYW1lcmFJZDsKKworICAgICAgICBpZiAoc3RyZWFtLmJ1ZmZlclNpemUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LmJ1ZmZlclNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyZWFtLmJ1ZmZlclNpemUpOworCisgICAgICAgIC8vIGhpbGQgdjNfMgorICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLmlkID0gc3RyZWFtLmlkOworICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLmZvcm1hdCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0PihzdHJlYW0uZm9ybWF0KTsKKworICAgICAgICBpZiAoc3RyZWFtLndpZHRoIDwgMCB8fCBzdHJlYW0uaGVpZ2h0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLndpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmVhbS53aWR0aCk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmVhbS5oZWlnaHQpOworICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLnVzYWdlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3M+KHN0cmVhbS51c2FnZSk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuc3RyZWFtVHlwZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlPihzdHJlYW0uc3RyZWFtVHlwZSk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuZGF0YVNwYWNlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzPihzdHJlYW0uZGF0YVNwYWNlKTsKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQudjNfMi5yb3RhdGlvbiA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbj4oc3RyZWFtLnJvdGF0aW9uKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2JpbmRlcjo6U3RhdHVzCitjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAorICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sICplYXJseUV4aXQpIHsKKyAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb24gYWlkbFN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgYXV0byByZXQgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihzZXNzaW9uQ29uZmlndXJhdGlvbiwgbG9naWNhbENhbWVyYUlkLCBkZXZpY2VJbmZvLAorICAgICAgICAgICAgZ2V0TWV0YWRhdGEsIHBoeXNpY2FsQ2FtZXJhSWRzLCBhaWRsU3RyZWFtQ29uZmlndXJhdGlvbiwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICBlYXJseUV4aXQpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZWFybHlFeGl0ICE9IG51bGxwdHIgJiYgKmVhcmx5RXhpdCkgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgaWYgKGNvbnZlcnRBaWRsVG9IaWRsMzdTdHJlYW1Db21iaW5hdGlvbihhaWRsU3RyZWFtQ29uZmlndXJhdGlvbiwgc3RyZWFtQ29uZmlndXJhdGlvbikgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJJbnZhbGlkIEFJREwtPkhJREwzLjcgY29udmVyc2lvbiIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYm9vbCBjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNykgeworICAgIGlmIChzdHJlYW1Db25maWdWMzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSkgeworICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IGltYWdlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXMucmVzaXplKHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdWMzcuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXNbaV0uZ3JvdXBJZCAhPSAtMSkgeworICAgICAgICAgICAgLy8gSUNhbWVyYURldmljZSBvbGRlciB0aGFuIDMuNyBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQKKyAgICAgICAgICAgIC8vIGltYWdlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXNbaV0gPSBzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS52M180OworICAgIH0KKyAgICBzdHJlYW1Db25maWdWMzQub3BlcmF0aW9uTW9kZSA9IHN0cmVhbUNvbmZpZ1YzNy5vcGVyYXRpb25Nb2RlOworICAgIHN0cmVhbUNvbmZpZ1YzNC5zZXNzaW9uUGFyYW1zID0gc3RyZWFtQ29uZmlnVjM3LnNlc3Npb25QYXJhbXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3YWJlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfU0VTU0lPTl9DT05GSUdVUkFUSU9OX1VUSUxTX0hJRExfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFU1NJT05fQ09ORklHVVJBVElPTl9VVElMU19ISURMX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmg+CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgeworCisvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgQUlETCBTZXNzaW9uQ29uZmlndXJhdGlvbiB0byBISURMCisvLyBzdHJlYW1Db25maWd1cmF0aW9uLiBBbHNvIGNoZWNrcyBmb3IgdmFsaWRpdHkgb2YgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gYW5kCisvLyByZXR1cm5zIGEgbm9uLW9rIGJpbmRlcjo6U3RhdHVzIGlmIHRoZSBwYXNzZWQgaW4gc2Vzc2lvbiBjb25maWd1cmF0aW9uCisvLyBpc24ndCB2YWxpZC4KK2JpbmRlcjo6U3RhdHVzCitjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKKyAgICAgICAgbWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCAqZWFybHlFeGl0KTsKKworLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgVjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiB0bworLy8gVjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbi4gUmV0dXJuIGZhbHNlIGlmIHRoZSBvcmlnaW5hbCBWM183IGNvbmZpZ3VyYXRpb24gY2Fubm90CisvLyBiZSB1c2VkIGJ5IG9sZGVyIHZlcnNpb24gSEFMLgorYm9vbCBjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNyk7Cit9IC8vIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMKK30gLy8gY2FtZXJhMworfSAvLyBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmRjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKK2ludDMyX3QgZ2V0QXBwcm9wcmlhdGVNb2RlVGFnKGludDMyX3QgZGVmYXVsdFRhZywgYm9vbCBtYXhSZXNvbHV0aW9uKSB7CisgICAgaWYgKCFtYXhSZXNvbHV0aW9uKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VGFnOworICAgIH0KKyAgICBzd2l0Y2ggKGRlZmF1bHRUYWcpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRToKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT046CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTl9NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9MRU5TX0RJU1RPUlRJT046CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0RJU1RPUlRJT05fTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBUYWcgJWQgZG9lc24ndCBoYXZlIGEgbWF4aW11bSByZXNvbHV0aW9uIGNvdW50ZXJwYXJ0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGFnKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitib29sIGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbykgeworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5Q2FwOworICAgIGVudHJ5Q2FwID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBjYXBhYmlsaXRpZXMgYW5kIGNoZWNrIGlmIGl0IGhhcworICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q2FwLmNvdW50OyArK2kpIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnlDYXAuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGdldEFycmF5V2lkdGhBbmRIZWlnaHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmRldmljZUluZm8sCisgICAgICAgIGludDMyX3QgYXJyYXlUYWcsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBpZiAod2lkdGggPT0gbnVsbHB0ciB8fCBoZWlnaHQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHdpZHRoIC8gaGVpZ2h0IG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OworICAgIGVudHJ5ID0gZGV2aWNlSW5mby0+ZmluZChhcnJheVRhZyk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDQpIHJldHVybiBmYWxzZTsKKyAgICAqd2lkdGggPSBlbnRyeS5kYXRhLmkzMlsyXTsKKyAgICAqaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbM107CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWIxZTkxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9TRVNTSU9OX0NPTkZJR1VSQVRJT05fVVRJTFNfSE9TVF9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfU0VTU0lPTl9DT05GSUdVUkFUSU9OX1VUSUxTX0hPU1RfSAorCisjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKK25hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzIHsKKworYm9vbCBpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pOworCitpbnQzMl90IGdldEFwcHJvcHJpYXRlTW9kZVRhZyhpbnQzMl90IGRlZmF1bHRUYWcsIGJvb2wgbWF4UmVzb2x1dGlvbiA9IGZhbHNlKTsKKworYm9vbCBnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGNvbnN0IENhbWVyYU1ldGFkYXRhICpkZXZpY2VJbmZvLCBpbnQzMl90IGFycmF5VGFnLAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKKworfSAvLyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzCit9IC8vIGNhbWVyYTMKK30gLy8gYW5kcm9pZAorCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCmluZGV4IDdhNzcwN2MuLmMzYWFjNzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCkBAIC02MCw2ICs2MCw3IEBACiAgICAgbUVycm9yUmVzdWx0Q291bnQgPSAwOwogICAgIG1Db3VudGVyU3RvcHBlZCA9IGZhbHNlOwogICAgIG1EZXZpY2VFcnJvciA9IGZhbHNlOworICAgIG1Vc2VyVGFnLmNsZWFyKCk7CiAgICAgZm9yIChhdXRvJiBzdHJlYW1TdGF0cyA6IG1TdGF0c01hcCkgewogICAgICAgICBTdHJlYW1TdGF0cyYgc3RyZWFtU3RhdCA9IHN0cmVhbVN0YXRzLnNlY29uZDsKICAgICAgICAgc3RyZWFtU3RhdC5tUmVxdWVzdGVkRnJhbWVDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgKaW5kZXggYzIzYWJiNi4uMjkzNjUzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaApAQCAtODQsNiArODQsNyBAQAogICAgIGludDY0X3QgbUVycm9yUmVzdWx0Q291bnQ7CiAgICAgYm9vbCBtQ291bnRlclN0b3BwZWQ7CiAgICAgYm9vbCBtRGV2aWNlRXJyb3I7CisgICAgc3RkOjpzdHJpbmcgbVVzZXJUYWc7CiAgICAgLy8gTWFwIGZyb20gc3RyZWFtIGlkIHRvIHN0cmVhbSBzdGF0aXN0aWNzCiAgICAgc3RkOjptYXA8aW50LCBTdHJlYW1TdGF0cz4gbVN0YXRzTWFwOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKaW5kZXggMjYyZjk2Mi4uNDYxZjVlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKyNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMTIsMTEgKzExMywxNSBAQAogICAgIG1MYXN0TW9uaXRvcmVkUmVzdWx0VmFsdWVzLmNsZWFyKCk7CiAgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmNsZWFyKCk7CiAgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXMuY2xlYXIoKTsKKyAgICBtTGFzdFN0cmVhbUlkcy5jbGVhcigpOworICAgIG1MYXN0SW5wdXRTdHJlYW1JZCA9IC0xOwogfQogCiB2b2lkIFRhZ01vbml0b3I6Om1vbml0b3JNZXRhZGF0YShldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhLAorICAgICAgICBjb25zdCBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCB1aW50MzJfdCBudW1PdXRwdXRCdWZmZXJzLAorICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpIHsKICAgICBpZiAoIW1Nb25pdG9yaW5nRW5hYmxlZCkgcmV0dXJuOwogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CkBAIC0xMjQsMTkgKzEyOSwyNyBAQAogICAgIGlmICh0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICB0aW1lc3RhbXAgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICB9Ci0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT3V0cHV0QnVmZmVyczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IG91dHB1dEJ1ZmZlcnMgKyBpOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy5lbXBsYWNlKHN0cmVhbUlkKTsKKyAgICB9CiAgICAgc3RkOjpzdHJpbmcgZW1wdHlJZDsKICAgICBmb3IgKGF1dG8gdGFnIDogbU1vbml0b3JlZFRhZ0xpc3QpIHsKLSAgICAgICAgbW9uaXRvclNpbmdsZU1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW1wdHlJZCwgdGFnLCBtZXRhZGF0YSk7CisgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVtcHR5SWQsIHRhZywgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLCBpbnB1dFN0cmVhbUlkKTsKIAogICAgICAgICBmb3IgKGF1dG8mIG0gOiBwaHlzaWNhbE1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtb25pdG9yU2luZ2xlTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBtLmZpcnN0LCB0YWcsIG0uc2Vjb25kKTsKKyAgICAgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIG0uZmlyc3QsIHRhZywgbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcywgaW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgVGFnTW9uaXRvcjo6bW9uaXRvclNpbmdsZU1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwgdWludDMyX3QgdGFnLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgaW5wdXRTdHJlYW1JZCkgewogCiAgICAgQ2FtZXJhTWV0YWRhdGEgJmxhc3RWYWx1ZXMgPSAoc291cmNlID09IFJFUVVFU1QpID8KICAgICAgICAgICAgIChjYW1lcmFJZC5lbXB0eSgpID8gbUxhc3RNb25pdG9yZWRSZXF1ZXN0VmFsdWVzIDoKQEAgLTE3NywxMyArMTkwLDIyIEBACiAgICAgICAgICAgICAvLyBObyBsYXN0IGVudHJ5LCBzbyBhbHdheXMgY29uc2lkZXIgdG8gYmUgZGlmZmVyZW50CiAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CiAgICAgICAgIH0KLQorICAgICAgICAvLyBBbHNvIG1vbml0b3Igd2hlbiB0aGUgc3RyZWFtIGlkcyBjaGFuZ2UsIHRoaXMgaGVscHMgdmlzdWFsbHkgc2VlIHdoYXQKKyAgICAgICAgLy8gbW9uaXRvcmVkIG1ldGFkYXRhIHZhbHVlcyBhcmUgZm9yIGNhcHR1cmUgcmVxdWVzdHMgd2l0aCBkaWZmZXJlbnQKKyAgICAgICAgLy8gc3RyZWFtIGlkcy4KKyAgICAgICAgaWYgKHNvdXJjZSA9PSBSRVFVRVNUICYmCisgICAgICAgICAgICAgICAgKGlucHV0U3RyZWFtSWQgIT0gbUxhc3RJbnB1dFN0cmVhbUlkIHx8IG91dHB1dFN0cmVhbUlkcyAhPSBtTGFzdFN0cmVhbUlkcykpIHsKKyAgICAgICAgICAgIG1MYXN0SW5wdXRTdHJlYW1JZCA9IGlucHV0U3RyZWFtSWQ7CisgICAgICAgICAgICBtTGFzdFN0cmVhbUlkcyA9IG91dHB1dFN0cmVhbUlkczsKKyAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoaXNEaWZmZXJlbnQpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogVGFnICVzIGNoYW5nZWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBtVmVuZG9yVGFnSWQpKTsKICAgICAgICAgICAgIGxhc3RWYWx1ZXMudXBkYXRlKGVudHJ5KTsKLSAgICAgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQpOworICAgICAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLCBpbnB1dFN0cmVhbUlkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCkBAIC0xOTUsNyArMjE3LDEwIEBACiAgICAgICAgIGVudHJ5LnR5cGUgPSBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ190eXBlX3ZlbmRvcl9pZCh0YWcsCiAgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKTsKICAgICAgICAgZW50cnkuY291bnQgPSAwOwotICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnksIGNhbWVyYUlkKTsKKyAgICAgICAgbUxhc3RJbnB1dFN0cmVhbUlkID0gaW5wdXRTdHJlYW1JZDsKKyAgICAgICAgbUxhc3RTdHJlYW1JZHMgPSBvdXRwdXRTdHJlYW1JZHM7CisgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQsIG91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkKTsKICAgICB9CiB9CiAKQEAgLTIxNCwzNyArMjM5LDU5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICAgVGFnIG1vbml0b3JpbmcgZGlzYWJsZWQgKGVuYWJsZSB3aXRoIC1tIDxuYW1lMSwuLixuYW1lTj4pXG4iKTsKICAgICB9Ci0gICAgaWYgKG1Nb25pdG9yaW5nRXZlbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgICAgTW9uaXRvcmVkIHRhZyBldmVudCBsb2c6XG4iKTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBldmVudCA6IG1Nb25pdG9yaW5nRXZlbnRzKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZW50YXRpb24gPSAoZXZlbnQuc291cmNlID09IFJFUVVFU1QpID8gMTUgOiAzMDsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgICAgIGYlZDolIiBQUklkNjQgIm5zOiUqcyUqcyVzLiVzOiAiLAotICAgICAgICAgICAgICAgICAgICBldmVudC5mcmFtZU51bWJlciwgZXZlbnQudGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAyLCBldmVudC5jYW1lcmFJZC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlID09IFJFUVVFU1QgPyAiUkVROiIgOiAiUkVTOiIsCi0gICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfc2VjdGlvbl9uYW1lX3ZlbmRvcl9pZChldmVudC50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfbmFtZV92ZW5kb3JfaWQoZXZlbnQudGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZW5kb3JUYWdJZCkpOwotICAgICAgICAgICAgaWYgKGV2ZW50Lm5ld0RhdGEuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiIChSZW1vdmVkKVxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50RGF0YShmZCwgZXZlbnQubmV3RGF0YS5kYXRhKCksIGV2ZW50LnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUsIGV2ZW50Lm5ld0RhdGEuc2l6ZSgpIC8gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtldmVudC50eXBlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uICsgMTgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCisgICAgaWYgKG1Nb25pdG9yaW5nRXZlbnRzLnNpemUoKSA9PSAwKSB7IHJldHVybjsgfQorCisgICAgZHByaW50ZihmZCwgIiAgICAgTW9uaXRvcmVkIHRhZyBldmVudCBsb2c6XG4iKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBldmVudFN0cnM7CisgICAgZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKGV2ZW50U3Rycyk7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmZXZlbnRTdHIgOiBldmVudFN0cnMpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICAgICAgJXMiLCBldmVudFN0ci5jX3N0cigpKTsKKyAgICB9CiB9CiAKLS8vIFRPRE86IENvbnNvbGlkYXRlIHdpdGggcHJpbnREYXRhIGZyb20gY2FtZXJhX21ldGFkYXRhLmgKK3ZvaWQgVGFnTW9uaXRvcjo6Z2V0TGF0ZXN0TW9uaXRvcmVkVGFnRXZlbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CisgICAgZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKG91dCk7Cit9CisKK3ZvaWQgVGFnTW9uaXRvcjo6ZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmdmVjKSB7CisgICAgaWYgKG1Nb25pdG9yaW5nRXZlbnRzLnNpemUoKSA9PSAwKSB7IHJldHVybjsgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBldmVudCA6IG1Nb25pdG9yaW5nRXZlbnRzKSB7CisgICAgICAgIGludCBpbmRlbnRhdGlvbiA9IChldmVudC5zb3VyY2UgPT0gUkVRVUVTVCkgPyAxNSA6IDMwOworICAgICAgICBTdHJpbmc4IGV2ZW50U3RyaW5nID0gU3RyaW5nODo6Zm9ybWF0KCJmJWQ6JSIgUFJJZDY0ICJuczolKnMlKnMlcy4lczogIiwKKyAgICAgICAgICAgICAgICBldmVudC5mcmFtZU51bWJlciwgZXZlbnQudGltZXN0YW1wLAorICAgICAgICAgICAgICAgIDIsIGV2ZW50LmNhbWVyYUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlID09IFJFUVVFU1QgPyAiUkVROiIgOiAiUkVTOiIsCisgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX25hbWVfdmVuZG9yX2lkKGV2ZW50LnRhZywgbVZlbmRvclRhZ0lkKSwKKyAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZChldmVudC50YWcsIG1WZW5kb3JUYWdJZCkpOworICAgICAgICBpZiAoZXZlbnQubmV3RGF0YS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZXZlbnRTdHJpbmcgKz0gIiAoUmVtb3ZlZCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXZlbnRTdHJpbmcgKz0gZ2V0RXZlbnREYXRhU3RyaW5nKGV2ZW50Lm5ld0RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm5ld0RhdGEuc2l6ZSgpIC8gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtldmVudC50eXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uICsgMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5pbnB1dFN0cmVhbUlkKTsKKyAgICAgICAgfQorICAgICAgICB2ZWMuZW1wbGFjZV9iYWNrKGV2ZW50U3RyaW5nLnN0cmluZygpKTsKKyAgICB9Cit9CiAKICNkZWZpbmUgQ0FNRVJBX01FVEFEQVRBX0VOVU1fU1RSSU5HX01BWF9TSVpFIDI5CiAKLXZvaWQgVGFnTW9uaXRvcjo6cHJpbnREYXRhKGludCBmZCwgY29uc3QgdWludDhfdCAqZGF0YV9wdHIsIHVpbnQzMl90IHRhZywKLSAgICAgICAgaW50IHR5cGUsIGludCBjb3VudCwgaW50IGluZGVudGF0aW9uKSB7CitTdHJpbmc4IFRhZ01vbml0b3I6OmdldEV2ZW50RGF0YVN0cmluZyhjb25zdCB1aW50OF90KiBkYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+JiBvdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpIHsKICAgICBzdGF0aWMgaW50IHZhbHVlc19wZXJfbGluZVtOVU1fVFlQRVNdID0gewogICAgICAgICBbVFlQRV9CWVRFXSAgICAgPSAxNiwKICAgICAgICAgW1RZUEVfSU5UMzJdICAgID0gOCwKQEAgLTI1Myw2ICszMDAsNyBAQAogICAgICAgICBbVFlQRV9ET1VCTEVdICAgPSA0LAogICAgICAgICBbVFlQRV9SQVRJT05BTF0gPSA0LAogICAgIH07CisKICAgICBzaXplX3QgdHlwZV9zaXplID0gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVt0eXBlXTsKICAgICBjaGFyIHZhbHVlX3N0cmluZ190bXBbQ0FNRVJBX01FVEFEQVRBX0VOVU1fU1RSSU5HX01BWF9TSVpFXTsKICAgICB1aW50MzJfdCB2YWx1ZTsKQEAgLTI2MCwxMCArMzA4LDExIEBACiAgICAgaW50IGxpbmVzID0gY291bnQgLyB2YWx1ZXNfcGVyX2xpbmVbdHlwZV07CiAgICAgaWYgKGNvdW50ICUgdmFsdWVzX3Blcl9saW5lW3R5cGVdICE9IDApIGxpbmVzKys7CiAKKyAgICBTdHJpbmc4IHJldHVyblN0ciA9IFN0cmluZzgoKTsKICAgICBpbnQgaW5kZXggPSAwOwogICAgIGludCBqLCBrOwogICAgIGZvciAoaiA9IDA7IGogPCBsaW5lczsgaisrKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIlKnNbIiwgKGogIT0gMCkgPyBpbmRlbnRhdGlvbiArIDQgOiAwLCAiIik7CisgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiUqc1siLCAoaiAhPSAwKSA/IGluZGVudGF0aW9uICsgNCA6IDAsICIiKTsKICAgICAgICAgZm9yIChrID0gMDsKICAgICAgICAgICAgICBrIDwgdmFsdWVzX3Blcl9saW5lW3R5cGVdICYmIGNvdW50ID4gMDsKICAgICAgICAgICAgICBrKyssIGNvdW50LS0sIGluZGV4ICs9IHR5cGVfc2l6ZSkgewpAQCAtMjc2LDEwICszMjUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHJpbmdfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWVfc3RyaW5nX3RtcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiVzICIsIHZhbHVlX3N0cmluZ190bXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9IHZhbHVlX3N0cmluZ190bXA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJWhodSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiVoaHUiLCAqKGRhdGFfcHRyICsgaW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UMzI6CkBAIC0yOTAsNDkgKzMzOCw1NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHJpbmdfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWVfc3RyaW5nX3RtcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiVzICIsIHZhbHVlX3N0cmluZ190bXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9IHZhbHVlX3N0cmluZ190bXA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJSIgUFJJZDMyICIgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJSIgUFJJZDMyICIgIiwgKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiUwLjhmICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKihmbG9hdCopKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJTAuOGYiLCAqKGZsb2F0KikoZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIlIiBQUklkNjQgIiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50NjRfdCopKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJSIgUFJJZDY0ICIgIiwgKihpbnQ2NF90KikoZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJTAuOGYgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGRvdWJsZSopKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJTAuOGYgIiwgKihkb3VibGUqKShkYXRhX3B0ciArIGluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9SQVRJT05BTDogewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bWVyYXRvciA9ICooaW50MzJfdCopKGRhdGFfcHRyICsgaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yID0gKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCArIDQpOwotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiKCVkIC8gJWQpICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiglZCAvICVkKSAiLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICI/Pz8gIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0ciArPSAiPz8/ICI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIl1cbiIpOworICAgICAgICByZXR1cm5TdHIgKz0gIl0gIjsKKyAgICAgICAgaWYgKCFvdXRwdXRTdHJlYW1JZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuU3RyICs9ICJvdXRwdXQgc3RyZWFtIGlkczogIjsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaWQgOiBvdXRwdXRTdHJlYW1JZHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCIgJWQgIiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFN0cmVhbUlkICE9IC0xKSB7CisgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCJpbnB1dCBzdHJlYW0gaWQ6ICVkIiwgaW5wdXRTdHJlYW1JZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuU3RyICs9ICJcbiI7CiAgICAgfQorICAgIHJldHVybiByZXR1cm5TdHI7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBUYWdNb25pdG9yOjpNb25pdG9yRXZlbnQ6Ok1vbml0b3JFdmVudChldmVudFNvdXJjZSBzcmMsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgY29uc3QgVCAmdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgOgorICAgICAgICBjb25zdCBUICZ2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkKSA6CiAgICAgICAgIHNvdXJjZShzcmMpLAogICAgICAgICBmcmFtZU51bWJlcihmcmFtZU51bWJlciksCiAgICAgICAgIHRpbWVzdGFtcCh0aW1lc3RhbXApLAogICAgICAgICB0YWcodmFsdWUudGFnKSwKICAgICAgICAgdHlwZSh2YWx1ZS50eXBlKSwKICAgICAgICAgbmV3RGF0YSh2YWx1ZS5kYXRhLnU4LCB2YWx1ZS5kYXRhLnU4ICsgY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVt2YWx1ZS50eXBlXSAqIHZhbHVlLmNvdW50KSwKLSAgICAgICAgY2FtZXJhSWQoY2FtZXJhSWQpIHsKKyAgICAgICAgY2FtZXJhSWQoY2FtZXJhSWQpLCBvdXRwdXRTdHJlYW1JZHMob3V0cHV0U3RyZWFtSWRzKSwgaW5wdXRTdHJlYW1JZChpbnB1dFN0cmVhbUlkKSB7CiB9CiAKIFRhZ01vbml0b3I6Ok1vbml0b3JFdmVudDo6fk1vbml0b3JFdmVudCgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaAppbmRleCA0MTNmNTAyLi4wODhkNmZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oPgogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY2LDE5ICs2NywzNSBAQAogICAgIC8vIFNjYW4gdGhyb3VnaCB0aGUgbWV0YWRhdGEgYW5kIHVwZGF0ZSB0aGUgbW9uaXRvcmluZyBpbmZvcm1hdGlvbgogICAgIHZvaWQgbW9uaXRvck1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgbnVtT3V0cHV0QnVmZmVycyA9IDAsIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IC0xKTsKIAogICAgIC8vIER1bXAgY3VycmVudCBldmVudCBsb2cgdG8gdGhlIHByb3ZpZGVkIGZkCiAgICAgdm9pZCBkdW1wTW9uaXRvcmVkTWV0YWRhdGEoaW50IGZkKTsKIAotICBwcml2YXRlOgorICAgIC8vIER1bXBzIHRoZSBsYXRlc3QgbW9uaXRvcmVkIFRhZyBldmVudHMgdG8gdGhlIHBhc3NlZCB2ZWN0b3IuCisgICAgLy8gTk9URTogVGhlIGV2ZW50cyBhcmUgYXBwZW5kZWQgdG8gdGhlIHZlY3RvciBpbiByZXZlcnNlciBjaHJvbm9sb2dpY2FsIG9yZGVyCisgICAgLy8gKGkuZS4gbW9zdCByZWNlbnQgZmlyc3QpCisgICAgdm9pZCBnZXRMYXRlc3RNb25pdG9yZWRUYWdFdmVudHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpOwogCi0gICAgc3RhdGljIHZvaWQgcHJpbnREYXRhKGludCBmZCwgY29uc3QgdWludDhfdCAqZGF0YV9wdHIsIHVpbnQzMl90IHRhZywKLSAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY291bnQsIGludCBpbmRlbnRhdGlvbik7CisgIHByaXZhdGU6CisgICAgLy8gRHVtcHMgbW9uaXRvcmVkIHRhZyBldmVudHMgdG8gdGhlIHBhc3NlZCB2ZWN0b3Igd2l0aG91dCBhY3F1aXJpbmcKKyAgICAvLyBtTW9uaXRvck11dGV4LiBtTW9uaXRvck11dGV4IG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICAgIC8vIGZ1bmN0aW9uLgorICAgIHZvaWQgZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KTsKKworICAgIHN0YXRpYyBTdHJpbmc4IGdldEV2ZW50RGF0YVN0cmluZyhjb25zdCB1aW50OF90ICpkYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZywgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCk7CiAKICAgICB2b2lkIG1vbml0b3JTaW5nbGVNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOworICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCk7CiAKICAgICBzdGQ6OmF0b21pYzxib29sPiBtTW9uaXRvcmluZ0VuYWJsZWQ7CiAgICAgc3RkOjptdXRleCBtTW9uaXRvck11dGV4OwpAQCAtOTMsNiArMTEwLDkgQEAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVxdWVzdEtleXM7CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXM7CiAKKyAgICBpbnQzMl90IG1MYXN0SW5wdXRTdHJlYW1JZCA9IC0xOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBtTGFzdFN0cmVhbUlkczsKKwogICAgIC8qKgogICAgICAqIEEgbW9uaXRvcmluZyBldmVudAogICAgICAqIFN0b3JlcyBhIG5ldyBtZXRhZGF0YSBmaWVsZCB2YWx1ZSBhbmQgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCBpdCBjaGFuZ2VkLgpAQCAtMTAxLDcgKzEyMSw4IEBACiAgICAgc3RydWN0IE1vbml0b3JFdmVudCB7CiAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgIE1vbml0b3JFdmVudChldmVudFNvdXJjZSBzcmMsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICBjb25zdCBUICZuZXdWYWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICZuZXdWYWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90IGlucHV0U3RyZWFtSWQpOwogICAgICAgICB+TW9uaXRvckV2ZW50KCk7CiAKICAgICAgICAgZXZlbnRTb3VyY2Ugc291cmNlOwpAQCAtMTExLDYgKzEzMiw4IEBACiAgICAgICAgIHVpbnQ4X3QgdHlwZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmV3RGF0YTsKICAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CisgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IDE7CiAgICAgfTsKIAogICAgIC8vIEEgcmluZyBidWZmZXIgZm9yIHRyYWNraW5nIHRoZSBsYXN0IGtNYXhNb25pdG9yRXZlbnRzIG1ldGFkYXRhIGNoYW5nZXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAppbmRleCBiZjRkNTI0Li40NDg4ZWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw3IEBACiAgICAgbmFtZTogIm1lZGlhc3djb2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAibWFpbl9zd2NvZGVjc2VydmljZS5jcHAiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUwppbmRleCBjNzE2Y2NlLi4zNDUzYTc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUwpAQCAtMSwyICsxLDMgQEAKIGplZmZ2QGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYwppbmRleCAzZWY5YTg1Li44NDVlNWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMKQEAgLTMsNCArMyw0IEBACiAgICAgdXNlciBtZWRpYWNvZGVjCiAgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icAppbmRleCA2OTZiOTY3Li4xMmNjMzJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApAQCAtNyw5ICs3LDE1IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIl0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiAgICAgc3JjczogWwogICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhZmJmMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhY29kZWNfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyLWhpZGwtZGVmYXVsdHMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZhMDYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGxpYnJhcnkgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBDMlN0cmluZyAocGFyYW1ldGVyIG5hbWU6IGBjMlN0cmluZ2ApCisyLiBXaWR0aCAocGFyYW1ldGVyIG5hbWU6IGB3aWR0aGApCiszLiBIZWlnaHQgKHBhcmFtZXRlciBuYW1lOiBgaGVpZ2h0YCkKKzQuIFNhbXBsaW5nUmF0ZSAocGFyYW1ldGVyIG5hbWU6IGBzYW1wbGluZ1JhdGVgKQorNS4gQ2hhbm5lbHMgKHBhcmFtZXRlciBuYW1lOiBgY2hhbm5lbHNgKQorNi4gU3RyZWFtIChwYXJhbWV0ZXIgbmFtZTogYHN0cmVhbWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgYzJTdHJpbmdgIHxgU3RyaW5nYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgd2lkdGhgIHxgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBoZWlnaHRgIHxgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBzYW1wbGluZ1JhdGVgIHxgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBjaGFubmVsc2AgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHN0cmVhbWAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGNvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyCitgYGAKKyMjIyMgU3RlcHMgdG8gcnVuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei8ke1RBUkdFVF9BUkNIfS9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplci9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplcgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk4M2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplci5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIi4uL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwIgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY29uc3RleHByIGNoYXIga1NlcnZpY2VOYW1lW10gPSAic29mdHdhcmUiOworCitjbGFzcyBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyIHsKK3B1YmxpYzoKKyAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgfkNvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXIoKSB7CisgICAgZGVsZXRlIG1IMkMyOworICAgIGlmIChtSW5wdXRTaXplKSB7CisgICAgICBkZWxldGUgbUlucHV0U2l6ZTsKKyAgICB9CisgICAgaWYgKG1TYW1wbGVSYXRlSW5mbykgeworICAgICAgZGVsZXRlIG1TYW1wbGVSYXRlSW5mbzsKKyAgICB9CisgICAgaWYgKG1DaGFubmVsQ291bnRJbmZvKSB7CisgICAgICBkZWxldGUgbUNoYW5uZWxDb3VudEluZm87CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdEgyQzJDb21wb25lbnRTdG9yZSgpOworICB2b2lkIGludm9rZUgyQzJDb21wb25lbnRTdG9yZSgpOworICB2b2lkIGludm9rZUNvbmZpZ1NNKCk7CisgIHZvaWQgaW52b2tlUXVlcnlTTSgpOworICBIMkMyQ29tcG9uZW50U3RvcmUgKm1IMkMyID0gbnVsbHB0cjsKKyAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0ICptSW5wdXRTaXplID0gbnVsbHB0cjsKKyAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0ICptU2FtcGxlUmF0ZUluZm8gPSBudWxscHRyOworICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCAqbUNoYW5uZWxDb3VudEluZm8gPSBudWxscHRyOworICBDMlBhcmFtOjpJbmRleCBtSW5kZXggPSBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQgbUZyYW1lUmF0ZTsKKyAgRnV6emVkRGF0YVByb3ZpZGVyICptRkRQID0gbnVsbHB0cjsKK307CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6aW5pdEgyQzJDb21wb25lbnRTdG9yZSgpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjsKKyAgc2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9CisgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgIGlmICghc3RvcmUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYW5kcm9pZDo6c3A8VjFfMTo6SUNvbXBvbmVudFN0b3JlPiBzdG9yZVYxXzEgPQorICAgICAgbmV3IFYxXzE6OnV0aWxzOjpDb21wb25lbnRTdG9yZShzdG9yZSk7CisgIGlmIChzdG9yZVYxXzEtPnJlZ2lzdGVyQXNTZXJ2aWNlKHN0cmluZyhrU2VydmljZU5hbWUpKSAhPSBhbmRyb2lkOjpPSykgeworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgY29uc3QgcHJlZmVycmVkU3RvcmVOYW1lID0gc3RyaW5nKGtTZXJ2aWNlTmFtZSk7CisgIHNwPElDb21wb25lbnRTdG9yZT4gcHJlZmVycmVkU3RvcmUgPQorICAgICAgSUNvbXBvbmVudFN0b3JlOjpnZXRTZXJ2aWNlKHByZWZlcnJlZFN0b3JlTmFtZS5jX3N0cigpKTsKKyAgbUgyQzIgPSBuZXcgSDJDMkNvbXBvbmVudFN0b3JlKHByZWZlcnJlZFN0b3JlKTsKK30KKwordm9pZCBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOjppbnZva2VDb25maWdTTSgpIHsKKyAgdmVjdG9yPEMyUGFyYW0gKj4gY29uZmlnUGFyYW1zOworICB1aW50MzJfdCB3aWR0aCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgdWludDMyX3QgaGVpZ2h0ID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIHVpbnQzMl90IGNoYW5uZWxzID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIG1JbnB1dFNpemUgPSBuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKG1JbnB1dFNpemUpOworICB9IGVsc2UgeworICAgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgICBtU2FtcGxlUmF0ZUluZm8gPSBuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjayhtU2FtcGxlUmF0ZUluZm8pOworICAgIH0KKyAgICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgICAgbUNoYW5uZWxDb3VudEluZm8gPSBuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIGNoYW5uZWxzKTsKKyAgICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2sobUNoYW5uZWxDb3VudEluZm8pOworICAgIH0KKyAgfQorICB2ZWN0b3I8dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgbUgyQzItPmNvbmZpZ19zbShjb25maWdQYXJhbXMsICZmYWlsdXJlcyk7Cit9CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6aW52b2tlUXVlcnlTTSgpIHsKKyAgdmVjdG9yPEMyUGFyYW0gKj4gc3RhY2tQYXJhbXM7CisgIHZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaGVhcFBhcmFtSW5kaWNlczsKKyAgaWYgKG1GRFAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICBzdGFja1BhcmFtcyA9IHt9OworICAgIGhlYXBQYXJhbUluZGljZXMgPSB7fTsKKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCBzdHJlYW0gPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgbUZyYW1lUmF0ZS5zZXRTdHJlYW0oc3RyZWFtKTsKKyAgICBzdGFja1BhcmFtcy5wdXNoX2JhY2soJm1GcmFtZVJhdGUpOworICAgIGhlYXBQYXJhbUluZGljZXMucHVzaF9iYWNrKG1JbmRleCk7CisgIH0KKyAgdmVjdG9yPHVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgIG1IMkMyLT5xdWVyeV9zbShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgJmhlYXBQYXJhbXMpOworfQorCit2b2lkIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI6Omludm9rZUgyQzJDb21wb25lbnRTdG9yZSgpIHsKKyAgaW5pdEgyQzJDb21wb25lbnRTdG9yZSgpOworICBzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQ7CisgIHNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgc3RyaW5nIGMyU3RyaW5nID0gbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOworICBtSDJDMi0+Y3JlYXRlQ29tcG9uZW50KGMyU3RyaW5nLCAmY29tcG9uZW50KTsKKyAgbUgyQzItPmNyZWF0ZUludGVyZmFjZShjMlN0cmluZywgJmludGVyZmFjZSk7CisgIGludm9rZUNvbmZpZ1NNKCk7CisgIGludm9rZVF1ZXJ5U00oKTsKKworICB2ZWN0b3I8c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtczsKKyAgbUgyQzItPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKCZwYXJhbXMpOworCisgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvOworICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZSgKKyAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8udXNhZ2UpKSwKKyAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoCisgICAgICAgICAgQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLmNhcGFjaXR5KSksCisgIH07CisgIG1IMkMyLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19zbShxdWVyeSk7CisKKyAgbUgyQzItPmdldE5hbWUoKTsKKyAgc2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBwYXJhbVJlZmxlY3RvciA9IG1IMkMyLT5nZXRQYXJhbVJlZmxlY3RvcigpOworICBpZiAocGFyYW1SZWZsZWN0b3IpIHsKKyAgICBwYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5TZXR0aW5nOjpDT1JFX0lOREVYKTsKKyAgfQorICBtSDJDMi0+bGlzdENvbXBvbmVudHMoKTsKKyAgc2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYzsKKyAgc2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdDsKKyAgbUgyQzItPmNvcHlCdWZmZXIoc3JjLCBkc3QpOworfQorCit2b2lkIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgbUZEUCA9IG5ldyBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgIGludm9rZUgyQzJDb21wb25lbnRTdG9yZSgpOworICAvKiogUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIGlzIGNhbGxlZCBoZXJlIHRvIGltcHJvdmUgY29kZSBjb3ZlcmFnZSAqLworICAvKiogYXMgY3VycmVudGx5IGl0IGlzIG5vdCBjYWxsZWQgYnkgY29kZWNTZXJ2aWNlUmVnaXN0cmFudCAgICAgICAqLworICBSZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgZGVsZXRlIG1GRFA7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplciBjb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOworICBjb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKaW5kZXggOTA1OGYxMC4uNDFlZmNlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CkBAIC04NCw1ICs4NCw2IEBACiBnZXRnaWQzMjogMQogZ2V0ZWdpZDMyOiAxCiBnZXRncm91cHMzMjogMQorc3lzaW5mbzogMQogCiBAaW5jbHVkZSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlX2NvdmVyYWdlLmFybS5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQppbmRleCA3ZmY4NThiLi40MzE3Y2NjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5CkBAIC03OCw2ICs3OCw3IEBACiBnZXRnaWQ6IDEKIGdldGVnaWQ6IDEKIGdldGdyb3VwczogMQorc3lzaW5mbzogMQogCiAjIEFuZHJvaWQgcHJvZmlsZXIgKGhlYXBwcm9mZCwgdHJhY2VkX3BlcmYpIGFkZGl0aW9ucywgd2hlcmUgbm90IGFscmVhZHkKICMgY292ZXJlZCBieSB0aGUgcmVzdCBvZiB0aGUgZmlsZSwgb3IgYnkgYnVpbHRpbiBtaW5pamFpbCBhbGxvdy1saXN0aW5nIG9mCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMKaW5kZXggYzcxNmNjZS4uMmE3NzljMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvT1dORVJTCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwpAQCAtMSwyICsxLDMgQEAKIGplZmZ2QGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KK2FxdWlsZXNjYW50YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2NmVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICAicHJlc3VibWl0IjogWworICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRyYW5zY29kaW5nVGVzdENhc2VzIgorICAgICAgICB9CisgICAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWVkaWFleHRyYWN0b3IucmMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYwppbmRleCA1ZmMyOTQxLi40ZmI1MGQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYwpAQCAtMyw0ICszLDQgQEAKICAgICB1c2VyIG1lZGlhZXgKICAgICBncm91cCBkcm1ycGMgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IGNmYzRjNDAuLjgwODhlZjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtMjYsNiArMjYsNyBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCA1OTg5MTgxLi4xMTUzNGJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtMTE0LDYgKzExNCw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHNfaGVhZGVycyIsCkBAIC0xNDgsNyArMTQ5LDggQEAKICAgICAgICAgInN0YXRzZF9tZWRpYXBhcnNlci5jcHAiLAogICAgICAgICAic3RhdHNkX251cGxheWVyLmNwcCIsCiAgICAgICAgICJzdGF0c2RfcmVjb3JkZXIuY3BwIiwKLSAgICAgICAgIlN0cmluZ1V0aWxzLmNwcCIKKyAgICAgICAgIlN0cmluZ1V0aWxzLmNwcCIsCisgICAgICAgICJWYWxpZGF0ZUlkLmNwcCIsCiAgICAgXSwKIAogICAgIHByb3RvOiB7CkBAIC0xNzEsNiArMTczLDcgQEAKICAgICAgICAgImxpYnN0YXRzcHVsbCIsCiAgICAgICAgICJsaWJzdGF0c3NvY2tldCIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKQEAgLTE3OCwxMSArMTgxLDIyIEBACiAgICAgICAgICJsaWJzdGF0c3NvY2tldCIsCiAgICAgXSwKIAorICAgIC8vIHdpdGhpbiB0aGUgbGlicmFyeSwgd2UgdXNlICJ4eHguaCIKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZSIsCisgICAgXSwKKworICAgIC8vIGV4dGVybmFsIHBhcnRpZXMgdXNlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL3h4eC5oPgorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlicGxhdGZvcm1wcm90b3MiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYWF1ZGlvX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5jcHAKaW5kZXggNDVjOWY1Ni4uOTllMzY5MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlICJBdWRpb0FuYWx5dGljcy5oIgogCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPiAgICAgICAgLy8gZXJyb3IgY29kZXMKICNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPiAgICAvLyBjbG9jayBjb252ZXJzaW9ucwogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4gICAgICAgICAgICAgLy8gc3RhdHNkCkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSAiQXVkaW9UeXBlcy5oIiAgICAgICAgICAgLy8gc3RyaW5nIHRvIGludCBjb252ZXJzaW9ucwogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIgIC8vIHBhY2thZ2UgaW5mbwogI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiVmFsaWRhdGVJZC5oIgogCiAjZGVmaW5lIFBST1BfQVVESU9fQU5BTFlUSUNTX0NMT1VEX0VOQUJMRUQgInBlcnNpc3QuYXVkaW8uYW5hbHl0aWNzLmNsb3VkLmVuYWJsZWQiCiAKQEAgLTYzLDYgKzY1LDUwIEBACiAgICAgfQogfQogCisvLyBUaGUgc3RhdHVzIHZhcmlhYmxlIGNvbnRhaW5zIHN0YXR1c190IGNvZGVzIHdoaWNoIGFyZSB1c2VkIGJ5CisvLyB0aGUgY29yZSBhdWRpbyBmcmFtZXdvcmsuIFdlIGFsc28gY29uc2lkZXIgQUF1ZGlvIHN0YXR1cyBjb2Rlcy4KKy8vCisvLyBDb21wYXJlIHdpdGggbWVkaWFtZXRyaWNzOjpzdGF0dXNUb1N0YXR1c1N0cmluZworLy8KK2lubGluZSBjb25zdGV4cHIgY29uc3QgY2hhciogZXh0ZW5kZWRTdGF0dXNUb1N0YXR1c1N0cmluZyhzdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgQkFEX1ZBTFVFOiAgICAgICAgICAgLy8gc3RhdHVzX3QKKyAgICBjYXNlIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURToKKyAgICBjYXNlIEFBVURJT19FUlJPUl9OVUxMOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRToKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfQVJHVU1FTlQ7CisgICAgY2FzZSBERUFEX09CSkVDVDogICAgICAgICAvLyBzdGF0dXNfdAorICAgIGNhc2UgRkFJTEVEX1RSQU5TQUNUSU9OOiAgLy8gc3RhdHVzX3QKKyAgICBjYXNlIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ6CisgICAgY2FzZSBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU6CisgICAgY2FzZSBBQVVESU9fRVJST1JfTk9fU0VSVklDRToKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfSU87CisgICAgY2FzZSBOT19NRU1PUlk6ICAgICAgICAgICAvLyBzdGF0dXNfdAorICAgIGNhc2UgQUFVRElPX0VSUk9SX05PX0ZSRUVfSEFORExFUzoKKyAgICBjYXNlIEFBVURJT19FUlJPUl9OT19NRU1PUlk6CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX01FTU9SWTsKKyAgICBjYXNlIFBFUk1JU1NJT05fREVOSUVEOiAgIC8vIHN0YXR1c190CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NFQ1VSSVRZOworICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046ICAgLy8gc3RhdHVzX3QKKyAgICBjYXNlIE5PX0lOSVQ6ICAgICAgICAgICAgIC8vIHN0YXR1c190CisgICAgY2FzZSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURToKKyAgICBjYXNlIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRToKKyAgICBjYXNlIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9TVEFURTsKKyAgICBjYXNlIFdPVUxEX0JMT0NLOiAgICAgICAgIC8vIHN0YXR1c190CisgICAgY2FzZSBBQVVESU9fRVJST1JfVElNRU9VVDoKKyAgICBjYXNlIEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSzoKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfVElNRU9VVDsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoc3RhdHVzID49IDApIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LOyAvLyBub24tbmVnYXRpdmUgdmFsdWVzICJPSyIKKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOyAgICAgICAgICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3IuCisgICAgY2FzZSBVTktOT1dOX0VSUk9SOiAgICAgICAvLyBzdGF0dXNfdAorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9VTktOT1dOOworICAgIH0KK30KKwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBhdXRvIExPR19MRVZFTCA9IGFuZHJvaWQ6OmJhc2U6OlZFUkJPU0U7CiAKIHN0YXRpYyBjb25zdGV4cHIgaW50IFBSRVZJT1VTX1NUQVRFX0VYUElSRV9TRUMgPSA2MCAqIDYwOyAvLyAxIGhvdXIuCkBAIC0xMjksNiArMTc1LDM5IEBACiAgICAgImxvZ19zZXNzaW9uX2lkIiwKIH07CiAKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUmVjb3JkU3RhdHVzRmllbGRzW10geworICAgICJtZWRpYW1ldHJpY3NfYXVkaW9yZWNvcmRzdGF0dXNfcmVwb3J0ZWQiLAorICAgICJzdGF0dXMiLAorICAgICJkZWJ1Z19tZXNzYWdlIiwKKyAgICAic3RhdHVzX3N1YmNvZGUiLAorICAgICJ1aWQiLAorICAgICJldmVudCIsCisgICAgImlucHV0X2ZsYWdzIiwKKyAgICAic291cmNlIiwKKyAgICAiZW5jb2RpbmciLAorICAgICJjaGFubmVsX21hc2siLAorICAgICJidWZmZXJfZnJhbWVfY291bnQiLAorICAgICJzYW1wbGVfcmF0ZSIsCit9OworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1RyYWNrU3RhdHVzRmllbGRzW10geworICAgICJtZWRpYW1ldHJpY3NfYXVkaW90cmFja3N0YXR1c19yZXBvcnRlZCIsCisgICAgInN0YXR1cyIsCisgICAgImRlYnVnX21lc3NhZ2UiLAorICAgICJzdGF0dXNfc3ViY29kZSIsCisgICAgInVpZCIsCisgICAgImV2ZW50IiwKKyAgICAib3V0cHV0X2ZsYWdzIiwKKyAgICAiY29udGVudF90eXBlIiwKKyAgICAidXNhZ2UiLAorICAgICJlbmNvZGluZyIsCisgICAgImNoYW5uZWxfbWFzayIsCisgICAgImJ1ZmZlcl9mcmFtZV9jb3VudCIsCisgICAgInNhbXBsZV9yYXRlIiwKKyAgICAic3BlZWQiLAorICAgICJwaXRjaCIsCit9OworCiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb0RldmljZUNvbm5lY3Rpb25GaWVsZHNbXSA9IHsKICAgICAibWVkaWFtZXRyaWNzX2F1ZGlvZGV2aWNlY29ubmVjdGlvbl9yZXBvcnRlZCIsCiAgICAgImlucHV0X2RldmljZXMiLApAQCAtMjE4LDMzICsyOTcsMzUgQEAKICAgICBBTE9HRCgiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICAvLyBBZGQgYWN0aW9uIHRvIHNhdmUgQW5hbHl0aWNzU3RhdGUgaWYgYXVkaW9zZXJ2ZXIgaXMgcmVzdGFydGVkLgotICAgIC8vIFRoaXMgdHJpZ2dlcnMgb24gYW4gaXRlbSBvZiAiYXVkaW8uZmxpbmdlciIKLSAgICAvLyB3aXRoIGEgcHJvcGVydHkgImV2ZW50IiBzZXQgdG8gIkF1ZGlvRmxpbmdlciIgKHRoZSBjb25zdHJ1Y3RvcikuCisgICAgLy8gVGhpcyB0cmlnZ2VycyBvbiBBdWRpb0ZsaW5nZXIgb3IgQXVkaW9Qb2xpY3kgY3RvcnMgYW5kIG9uRmlyc3RSZWYsCisgICAgLy8gYXMgd2VsbCBhcyBUaW1lQ2hlY2sgZXZlbnRzLgogICAgIG1BY3Rpb25zLmFkZEFjdGlvbigKICAgICAgICAgQU1FRElBTUVUUklDU19LRVlfQVVESU9fRkxJTkdFUiAiLiIgQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULAogICAgICAgICBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1RPUiksCiAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzQWN0aW9uczo6RnVuY3Rpb24+KAogICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKXsKLSAgICAgICAgICAgICAgICBBTE9HVygiKGtleT0lcykgQXVkaW9mbGluZ2VyIGNvbnN0cnVjdG9yIGV2ZW50IGRldGVjdGVkIiwgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUuc2V0KHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzU3RhdGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgKm1BbmFseXRpY3NTdGF0ZS5nZXQoKSkpOwotICAgICAgICAgICAgICAgIC8vIE5vdGU6IGdldCByZXR1cm5zIHNoYXJlZF9wdHIgdGVtcCwgd2hvc2UgbGlmZXRpbWUgaXMgZXh0ZW5kZWQKLSAgICAgICAgICAgICAgICAvLyB0byBlbmQgb2YgZnVsbCBleHByZXNzaW9uLgotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NTdGF0ZS0+Y2xlYXIoKTsgIC8vIFRPRE86IGZpbHRlciB0aGUgYW5hbHl0aWNzIHN0YXRlLgotICAgICAgICAgICAgICAgIC8vIFBlcmhhcHMgcmVwb3J0IHRoaXMuCi0KLSAgICAgICAgICAgICAgICAvLyBTZXQgdXAgYSB0aW1lciB0byBleHBpcmUgdGhlIHByZXZpb3VzIGF1ZGlvIHN0YXRlIHRvIHNhdmUgc3BhY2UuCi0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSB0cmFuc2FjdGlvbiBsb2cgc2l6ZSBhcyBhIGNvb2tpZSB0byBzZWUgaWYgaXQgaXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gc2FtZSBhcyBiZWZvcmUuICBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIHdoZXJlIGEgc3RhdGUgaXMgY2xlYXJlZCBlYXJseS4KLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT50cmFuc2FjdGlvbkxvZygpLnNpemUoKTsKLSAgICAgICAgICAgICAgICBtVGltZWRBY3Rpb24ucG9zdEluKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHMoUFJFVklPVVNfU1RBVEVfRVhQSVJFX1NFQyksIFt0aGlzLCBzaXplXSgpewotICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPnRyYW5zYWN0aW9uTG9nKCkuc2l6ZSgpID09IHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJleHBpcmluZyBwcmV2aW91cyBhdWRpbyBzdGF0ZSBhZnRlciAlZCBzZWNvbmRzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZJT1VTX1NUQVRFX0VYUElSRV9TRUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7ICAvLyByZW1vdmVzIGRhdGEgZnJvbSB0aGUgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBtSGVhbHRoLm9uQXVkaW9TZXJ2ZXJTdGFydChIZWFsdGg6Ok1vZHVsZTo6QVVESU9GTElOR0VSLCBpdGVtKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICBtQWN0aW9ucy5hZGRBY3Rpb24oCisgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX1BPTElDWSAiLiIgQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULAorICAgICAgICBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1RPUiksCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzQWN0aW9uczo6RnVuY3Rpb24+KAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKXsKKyAgICAgICAgICAgICAgICBtSGVhbHRoLm9uQXVkaW9TZXJ2ZXJTdGFydChIZWFsdGg6Ok1vZHVsZTo6QVVESU9QT0xJQ1ksIGl0ZW0pOworICAgICAgICAgICAgfSkpOworICAgIG1BY3Rpb25zLmFkZEFjdGlvbigKKyAgICAgICAgQU1FRElBTUVUUklDU19LRVlfQVVESU9fRkxJTkdFUiAiLiIgQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULAorICAgICAgICBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVElNRU9VVCksCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzQWN0aW9uczo6RnVuY3Rpb24+KAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKXsKKyAgICAgICAgICAgICAgICBtSGVhbHRoLm9uQXVkaW9TZXJ2ZXJUaW1lb3V0KEhlYWx0aDo6TW9kdWxlOjpBVURJT0ZMSU5HRVIsIGl0ZW0pOworICAgICAgICAgICAgfSkpOworICAgIG1BY3Rpb25zLmFkZEFjdGlvbigKKyAgICAgICAgQU1FRElBTUVUUklDU19LRVlfQVVESU9fUE9MSUNZICIuIiBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsCisgICAgICAgIHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9USU1FT1VUKSwKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBbmFseXRpY3NBY3Rpb25zOjpGdW5jdGlvbj4oCisgICAgICAgICAgICBbdGhpc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0peworICAgICAgICAgICAgICAgIG1IZWFsdGgub25BdWRpb1NlcnZlclRpbWVvdXQoSGVhbHRoOjpNb2R1bGU6OkFVRElPUE9MSUNZLCBpdGVtKTsKICAgICAgICAgICAgIH0pKTsKIAogICAgIC8vIEhhbmRsZSBsZWdhY3kgYWF1ZGlvIHBsYXliYWNrIHN0cmVhbSBzdGF0aXN0aWNzCkBAIC0zOTEsMTEgKzQ3MiwxNSBAQAogewogICAgIGlmICghc3RhcnRzV2l0aChpdGVtLT5nZXRLZXkoKSwgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPKSkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQW5hbHl0aWNzU3RhdGUtPnN1Ym1pdChpdGVtLCBpc1RydXN0ZWQpOworCisgICAgLy8gU3RhdHVzIGlzIHNlbGVjdGl2ZWx5IGF1dGhlbnRpY2F0ZWQuCisgICAgcHJvY2Vzc1N0YXR1cyhpdGVtKTsKKwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7ICAvLyBtYXkgbm90IGJlIHBlcm1pdHRlZC4KIAogICAgIC8vIE9ubHkgaWYgdGhlIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgKHBlcm1pc3Npb24pCiAgICAgLy8gZG8gd2UgY2hlY2sgdHJpZ2dlcmVkIGFjdGlvbnMuCi0gICAgY2hlY2tBY3Rpb25zKGl0ZW0pOworICAgIHByb2Nlc3NBY3Rpb25zKGl0ZW0pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNDI5LDcgKzUxNCw3IEBACiAgICAgcmV0dXJuIHsgc3Muc3RyKCksIGxpbmVzIC0gbGwgfTsKIH0KIAotdm9pZCBBdWRpb0FuYWx5dGljczo6Y2hlY2tBY3Rpb25zKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKQordm9pZCBBdWRpb0FuYWx5dGljczo6cHJvY2Vzc0FjdGlvbnMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pCiB7CiAgICAgYXV0byBhY3Rpb25zID0gbUFjdGlvbnMuZ2V0QWN0aW9uc0Zvckl0ZW0oaXRlbSk7IC8vIGludGVybmFsbHkgbG9ja2VkLgogICAgIC8vIEV4ZWN1dGUgYWN0aW9ucyB3aXRoIG5vIGxvY2sgaGVsZC4KQEAgLTQzOCw2ICs1MjMsMjAyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvQW5hbHl0aWNzOjpwcm9jZXNzU3RhdHVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKQoreworICAgIGludDMyX3Qgc3RhdHVzOworICAgIGlmICghaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsICZzdGF0dXMpKSByZXR1cm47CisKKyAgICAvLyBBbnkgcmVjb3JkIHdpdGggYSBzdGF0dXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGEgaGVhdCBtYXAuCisgICAgLy8gU3RhbmRhcmQgaW5mb3JtYXRpb24uCisgICAgY29uc3QgYXV0byBrZXkgPSBpdGVtLT5nZXRLZXkoKTsKKyAgICBjb25zdCBhdXRvIHVpZCA9IGl0ZW0tPmdldFVpZCgpOworCisgICAgLy8gZnJvbSBhdWRpby50cmFjay4xMCAtPiAgcHJlZml4ID0gYXVkaW8udHJhY2ssIHN1ZmZpeCA9IDEwCisgICAgLy8gZnJvbSBhdWRpby50cmFjay5lcnJvciAtPiBwcmVmaXggPSBhdWRpby50cmFjaywgc3VmZml4ID0gZXJyb3IKKyAgICBjb25zdCBhdXRvIFtwcmVmaXhLZXksIHN1ZmZpeEtleV0gPSBzdHJpbmd1dGlsczo6c3BsaXRQcmVmaXhLZXkoa2V5KTsKKworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNNRVNTQUdFLCAmbWVzc2FnZSk7IC8vIG9wdGlvbmFsCisKKyAgICBpbnQzMl90IHN1YkNvZGUgPSAwOyAvLyBub3QgdXNlZAorICAgICh2b2lkKWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTU1VCQ09ERSwgJnN1YkNvZGUpOyAvLyBvcHRpb25hbAorCisgICAgc3RkOjpzdHJpbmcgZXZlbnRTdHI7IC8vIG9wdGlvbmFsCisgICAgaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgJmV2ZW50U3RyKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXR1c1N0cmluZyA9IGV4dGVuZGVkU3RhdHVzVG9TdGF0dXNTdHJpbmcoc3RhdHVzKTsKKworICAgIC8vIEFkZCB0byB0aGUgaGVhdCBtYXAgLSB3ZSBhdXRvbWF0aWNhbGx5IHRyYWNrIGV2ZXJ5IGl0ZW0ncyBzdGF0dXMgdG8gc2VlCisgICAgLy8gdGhlIHR5cGVzIG9mIGVycm9ycyBhbmQgdGhlIGZyZXF1ZW5jeSBvZiBlcnJvcnMuCisgICAgbUhlYXRNYXAuYWRkKHByZWZpeEtleSwgc3VmZml4S2V5LCBldmVudFN0ciwgc3RhdHVzU3RyaW5nLCB1aWQsIG1lc3NhZ2UsIHN1YkNvZGUpOworCisgICAgLy8gQ2VydGFpbiBrZXlzL2V2ZW50IHBhaXJzIGFyZSBzZW50IHRvIHN0YXRzZC4gIElmIHdlIGdldCBhIG1hdGNoICh0cnVlKSB3ZSByZXR1cm4gZWFybHkuCisgICAgaWYgKHJlcG9ydEF1ZGlvUmVjb3JkU3RhdHVzKGl0ZW0sIGtleSwgZXZlbnRTdHIsIHN0YXR1c1N0cmluZywgdWlkLCBtZXNzYWdlLCBzdWJDb2RlKSkgcmV0dXJuOworICAgIGlmIChyZXBvcnRBdWRpb1RyYWNrU3RhdHVzKGl0ZW0sIGtleSwgZXZlbnRTdHIsIHN0YXR1c1N0cmluZywgdWlkLCBtZXNzYWdlLCBzdWJDb2RlKSkgcmV0dXJuOworfQorCitib29sIEF1ZGlvQW5hbHl0aWNzOjpyZXBvcnRBdWRpb1JlY29yZFN0YXR1cygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFN0ciwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXR1c1N0cmluZywgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgaW50MzJfdCBzdWJDb2RlKSBjb25zdAoreworICAgIC8vIE5vdGUgdGhhdCB0aGUgcHJlZml4ZXMgb2Z0ZW4gZW5kIHdpdGggYSAnLicgc28gd2UgdXNlIHN0YXJ0c1dpdGguCisgICAgaWYgKCFzdGFydHNXaXRoKGtleSwgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZXZlbnRTdHIgPT0gQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NSRUFURSkgeworICAgICAgICBjb25zdCBpbnQgYXRvbV9zdGF0dXMgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpTVEFUVVMsIGludDMyX3Q+KHN0YXR1c1N0cmluZyk7CisKKyAgICAgICAgLy8gY3VycmVudGx5IHdlIG9ubHkgc2VuZCBjcmVhdGUgc3RhdHVzIGV2ZW50cy4KKyAgICAgICAgY29uc3QgaW50MzJfdCBldmVudCA9IGFuZHJvaWQ6OnV0aWw6OgorICAgICAgICAgICAgICAgIE1FRElBTUVUUklDU19BVURJT19SRUNPUkRfU1RBVFVTX1JFUE9SVEVEX19FVkVOVF9fQVVESU9fUkVDT1JEX0VWRU5UX0NSRUFURTsKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBzaG91bGQgYWxsIGJlIHByZXNlbnQgaW4gYSBjcmVhdGUgZXZlbnQuCisgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWdzU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9PUklHSU5BTEZMQUdTLCAmZmxhZ3NTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQsIEFNRURJQU1FVFJJQ1NfUFJPUF9PUklHSU5BTEZMQUdTKTsKKyAgICAgICAgY29uc3QgYXV0byBmbGFncyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OklOUFVUX0ZMQUcsIGludDMyX3Q+KGZsYWdzU3RyKTsKKworICAgICAgICAvLyBBTUVESUFNRVRSSUNTX1BST1BfU0VTU0lPTklEIG9taXR0ZWQgZnJvbSBhdG9tCisKKyAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TT1VSQ0UsICZzb3VyY2VTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQsIEFNRURJQU1FVFJJQ1NfUFJPUF9TT1VSQ0UpOworICAgICAgICBjb25zdCBpbnQzMl90IHNvdXJjZSA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OlNPVVJDRV9UWVBFLCBpbnQzMl90Pihzb3VyY2VTdHIpOworCisgICAgICAgIC8vIEFNRURJQU1FVFJJQ1NfUFJPUF9TRUxFQ1RFRERFVklDRUlEIG9taXR0ZWQgZnJvbSBhdG9tCisKKyAgICAgICAgc3RkOjpzdHJpbmcgZW5jb2RpbmdTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HLCAmZW5jb2RpbmdTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORyk7CisgICAgICAgIGNvbnN0IGF1dG8gZW5jb2RpbmcgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpFTkNPRElORywgaW50MzJfdD4oZW5jb2RpbmdTdHIpOworCisgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2sgPSAwOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSywgJmNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JELCBBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0spOworICAgICAgICBpbnQzMl90IGZyYW1lQ291bnQgPSAwOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5ULCAmZnJhbWVDb3VudCksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCwgQU1FRElBTUVUUklDU19QUk9QX0ZSQU1FQ09VTlQpOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFLCAmc2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCwgQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUpOworCisgICAgICAgIGNvbnN0IGF1dG8gWyByZXN1bHQsIHN0ciBdID0gc2VuZFRvU3RhdHNkKEF1ZGlvUmVjb3JkU3RhdHVzRmllbGRzLAorICAgICAgICAgICAgICAgIENPTkRJVElPTihhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9SRUNPUkRTVEFUVVNfUkVQT1JURUQpCisgICAgICAgICAgICAgICAgLCBhdG9tX3N0YXR1cworICAgICAgICAgICAgICAgICwgbWVzc2FnZS5jX3N0cigpCisgICAgICAgICAgICAgICAgLCBzdWJDb2RlCisgICAgICAgICAgICAgICAgLCB1aWQKKyAgICAgICAgICAgICAgICAsIGV2ZW50CisgICAgICAgICAgICAgICAgLCBmbGFncworICAgICAgICAgICAgICAgICwgc291cmNlCisgICAgICAgICAgICAgICAgLCBlbmNvZGluZworICAgICAgICAgICAgICAgICwgKGludDY0X3QpY2hhbm5lbE1hc2sKKyAgICAgICAgICAgICAgICAsIGZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAsIHNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICApOworICAgICAgICBBTE9HVigiJXM6IHN0YXRzZCAlcyIsIF9fZnVuY19fLCBzdHIuY19zdHIoKSk7CisgICAgICAgIG1TdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9SRUNPUkRTVEFUVVNfUkVQT1JURUQsIHN0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9BbmFseXRpY3M6OnJlcG9ydEF1ZGlvVHJhY2tTdGF0dXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRTdHIsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGF0dXNTdHJpbmcsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgIGludDMyX3Qgc3ViQ29kZSkgY29uc3QKK3sKKyAgICAvLyBOb3RlIHRoYXQgdGhlIHByZWZpeGVzIG9mdGVuIGVuZCB3aXRoIGEgJy4nIHNvIHdlIHVzZSBzdGFydHNXaXRoLgorICAgIGlmICghc3RhcnRzV2l0aChrZXksIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSykpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZXZlbnRTdHIgPT0gQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NSRUFURSkgeworICAgICAgICBjb25zdCBpbnQgYXRvbV9zdGF0dXMgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpTVEFUVVMsIGludDMyX3Q+KHN0YXR1c1N0cmluZyk7CisKKyAgICAgICAgLy8gY3VycmVudGx5IHdlIG9ubHkgc2VuZCBjcmVhdGUgc3RhdHVzIGV2ZW50cy4KKyAgICAgICAgY29uc3QgaW50MzJfdCBldmVudCA9IGFuZHJvaWQ6OnV0aWw6OgorICAgICAgICAgICAgICAgIE1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX0VWRU5UX19BVURJT19UUkFDS19FVkVOVF9DUkVBVEU7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgc2hvdWxkIGFsbCBiZSBwcmVzZW50IGluIGEgY3JlYXRlIGV2ZW50LgorICAgICAgICBzdGQ6OnN0cmluZyBmbGFnc1N0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUywgJmZsYWdzU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9PUklHSU5BTEZMQUdTKTsKKyAgICAgICAgY29uc3QgYXV0byBmbGFncyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6Ok9VVFBVVF9GTEFHLCBpbnQzMl90PihmbGFnc1N0cik7CisKKyAgICAgICAgLy8gQU1FRElBTUVUUklDU19QUk9QX1NFU1NJT05JRCBvbWl0dGVkIGZyb20gYXRvbQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DT05URU5UVFlQRSwgJmNvbnRlbnRUeXBlU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9DT05URU5UVFlQRSk7CisgICAgICAgIGNvbnN0IGF1dG8gY29udGVudFR5cGUgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpDT05URU5UX1RZUEUsIGludDMyX3Q+KGNvbnRlbnRUeXBlU3RyKTsKKworICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZVN0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfVVNBR0UsICZ1c2FnZVN0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfVVNBR0UpOworICAgICAgICBjb25zdCBhdXRvIHVzYWdlID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6VVNBR0UsIGludDMyX3Q+KHVzYWdlU3RyKTsKKworICAgICAgICAvLyBBTUVESUFNRVRSSUNTX1BST1BfU0VMRUNURURERVZJQ0VJRCBvbWl0dGVkIGZyb20gYXRvbQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGVuY29kaW5nU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORywgJmVuY29kaW5nU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORyk7CisgICAgICAgIGNvbnN0IGF1dG8gZW5jb2RpbmcgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpFTkNPRElORywgaW50MzJfdD4oZW5jb2RpbmdTdHIpOworCisgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2sgPSAwOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSywgJmNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSyk7CisgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0ZSQU1FQ09VTlQsICZmcmFtZUNvdW50KSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5UKTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSwgJnNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUpOworICAgICAgICBkb3VibGUgc3BlZWQgPSAwLmY7ICAvLyBkZWZhdWx0IGlzIDEuZgorICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZQkFDS19TUEVFRCwgJnNwZWVkKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1NQRUVEKTsKKyAgICAgICAgZG91YmxlIHBpdGNoID0gMC5mOyAgLy8gZGVmYXVsdCBpcyAxLmYKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfUElUQ0gsICZwaXRjaCksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZQkFDS19QSVRDSCk7CisgICAgICAgIGNvbnN0IGF1dG8gWyByZXN1bHQsIHN0ciBdID0gc2VuZFRvU3RhdHNkKEF1ZGlvVHJhY2tTdGF0dXNGaWVsZHMsCisgICAgICAgICAgICAgICAgQ09ORElUSU9OKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RSQUNLU1RBVFVTX1JFUE9SVEVEKQorICAgICAgICAgICAgICAgICwgYXRvbV9zdGF0dXMKKyAgICAgICAgICAgICAgICAsIG1lc3NhZ2UuY19zdHIoKQorICAgICAgICAgICAgICAgICwgc3ViQ29kZQorICAgICAgICAgICAgICAgICwgdWlkCisgICAgICAgICAgICAgICAgLCBldmVudAorICAgICAgICAgICAgICAgICwgZmxhZ3MKKyAgICAgICAgICAgICAgICAsIGNvbnRlbnRUeXBlCisgICAgICAgICAgICAgICAgLCB1c2FnZQorICAgICAgICAgICAgICAgICwgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAsIChpbnQ2NF90KWNoYW5uZWxNYXNrCisgICAgICAgICAgICAgICAgLCBmcmFtZUNvdW50CisgICAgICAgICAgICAgICAgLCBzYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgLCAoZmxvYXQpc3BlZWQKKyAgICAgICAgICAgICAgICAsIChmbG9hdClwaXRjaAorICAgICAgICAgICAgICAgICk7CisgICAgICAgIEFMT0dWKCIlczogc3RhdHNkICVzIiwgX19mdW5jX18sIHN0ci5jX3N0cigpKTsKKyAgICAgICAgbVN0YXRzZExvZy0+bG9nKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RSQUNLU1RBVFVTX1JFUE9SVEVELCBzdHIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBIRUxQRVIgTUVUSE9EUwogCiBzdGQ6OnN0cmluZyBBdWRpb0FuYWx5dGljczo6Z2V0VGhyZWFkRnJvbVRyYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFjaykgY29uc3QKQEAgLTU2Myw3ICs4NDQsNyBAQAogICAgICAgICBjb25zdCBhdXRvIGZsYWdzRm9yU3RhdHMgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpJTlBVVF9GTEFHLCBzaG9ydF9lbnVtX3R5cGVfdD4oZmxhZ3MpOwogICAgICAgICBjb25zdCBhdXRvIHNvdXJjZUZvclN0YXRzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6U09VUkNFX1RZUEUsIHNob3J0X2VudW1fdHlwZV90Pihzb3VyY2UpOwogICAgICAgICAvLyBBbmRyb2lkIFMKLSAgICAgICAgY29uc3QgYXV0byBsb2dTZXNzaW9uSWRGb3JTdGF0cyA9IHN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOworICAgICAgICBjb25zdCBhdXRvIGxvZ1Nlc3Npb25JZEZvclN0YXRzID0gVmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nU2Vzc2lvbklkKTsKIAogICAgICAgICBMT0coTE9HX0xFVkVMKSA8PCAia2V5OiIgPDwga2V5CiAgICAgICAgICAgICAgIDw8ICIgaWQ6IiA8PCBpZApAQCAtNzE4LDcgKzk5OSw3IEBACiAgICAgICAgICAgICAgICAgIHR5cGVzOjpsb29rdXA8dHlwZXM6OlRSQUNLX1RSQUlUUywgc2hvcnRfZW51bV90eXBlX3Q+KHRyYWl0cyk7CiAgICAgICAgIGNvbnN0IGF1dG8gdXNhZ2VGb3JTdGF0cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OlVTQUdFLCBzaG9ydF9lbnVtX3R5cGVfdD4odXNhZ2UpOwogICAgICAgICAvLyBBbmRyb2lkIFMKLSAgICAgICAgY29uc3QgYXV0byBsb2dTZXNzaW9uSWRGb3JTdGF0cyA9IHN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOworICAgICAgICBjb25zdCBhdXRvIGxvZ1Nlc3Npb25JZEZvclN0YXRzID0gVmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nU2Vzc2lvbklkKTsKIAogICAgICAgICBMT0coTE9HX0xFVkVMKSA8PCAia2V5OiIgPDwga2V5CiAgICAgICAgICAgICAgIDw8ICIgaWQ6IiA8PCBpZApAQCAtOTY3LDEwICsxMjQ4LDEwIEBACiAgICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gT3V0cHV0LCBrZWVwIHN5bmMgd2l0aCBBdWRpb1R5cGVzI2dldEFBdWRpb0RpcmVjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IChpbnQzMl90KWF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gSW5wdXQsIGtlZXAgc3luYyB3aXRoIEF1ZGlvVHlwZXMjZ2V0QUF1ZGlvRGlyZWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSAoaW50MzJfdClhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJbnZhbGlkIGRpcmVjdGlvbiAlZCIsIGRpcmVjdGlvbik7CkBAIC0xMTExLDQgKzEzOTIsMTM4IEBACiAgICAgfQogfQogCisvLyBDcmVhdGUgbmV3IHN0YXRlLCB0eXBpY2FsbHkgb2NjdXJzIGFmdGVyIGFuIEF1ZGlvRmxpbmdlciBjdG9yIGV2ZW50Lgordm9pZCBBdWRpb0FuYWx5dGljczo6bmV3U3RhdGUoKQoreworICAgIG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLnNldChzdGQ6Om1ha2Vfc2hhcmVkPEFuYWx5dGljc1N0YXRlPigKKyAgICAgICAgICAgICptQW5hbHl0aWNzU3RhdGUuZ2V0KCkpKTsKKyAgICAvLyBOb3RlOiBnZXQgcmV0dXJucyBzaGFyZWRfcHRyIHRlbXAsIHdob3NlIGxpZmV0aW1lIGlzIGV4dGVuZGVkCisgICAgLy8gdG8gZW5kIG9mIGZ1bGwgZXhwcmVzc2lvbi4KKyAgICBtQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7ICAvLyBUT0RPOiBmaWx0ZXIgdGhlIGFuYWx5dGljcyBzdGF0ZS4KKyAgICAvLyBQZXJoYXBzIHJlcG9ydCB0aGlzLgorCisgICAgLy8gU2V0IHVwIGEgdGltZXIgdG8gZXhwaXJlIHRoZSBwcmV2aW91cyBhdWRpbyBzdGF0ZSB0byBzYXZlIHNwYWNlLgorICAgIC8vIFVzZSB0aGUgdHJhbnNhY3Rpb24gbG9nIHNpemUgYXMgYSBjb29raWUgdG8gc2VlIGlmIGl0IGlzIHRoZQorICAgIC8vIHNhbWUgYXMgYmVmb3JlLiAgQSBiZW5pZ24gcmFjZSBpcyBwb3NzaWJsZSB3aGVyZSBhIHN0YXRlIGlzIGNsZWFyZWQgZWFybHkuCisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtUHJldmlvdXNBbmFseXRpY3NTdGF0ZS0+dHJhbnNhY3Rpb25Mb2coKS5zaXplKCk7CisgICAgbVRpbWVkQWN0aW9uLnBvc3RJbigKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKFBSRVZJT1VTX1NUQVRFX0VYUElSRV9TRUMpLCBbdGhpcywgc2l6ZV0oKXsKKyAgICAgICAgaWYgKG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT50cmFuc2FjdGlvbkxvZygpLnNpemUoKSA9PSBzaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiZXhwaXJpbmcgcHJldmlvdXMgYXVkaW8gc3RhdGUgYWZ0ZXIgJWQgc2Vjb25kcy4iLAorICAgICAgICAgICAgICAgICAgICBQUkVWSU9VU19TVEFURV9FWFBJUkVfU0VDKTsKKyAgICAgICAgICAgIG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT5jbGVhcigpOyAgLy8gcmVtb3ZlcyBkYXRhIGZyb20gdGhlIHN0YXRlLgorICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgQXVkaW9BbmFseXRpY3M6OkhlYWx0aDo6b25BdWRpb1NlcnZlclN0YXJ0KE1vZHVsZSBtb2R1bGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKQoreworICAgIGNvbnN0IGF1dG8gbm93VGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIGlmIChtb2R1bGUgPT0gTW9kdWxlOjpBVURJT0ZMSU5HRVIpIHsKKyAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgICAgICAgICAgLy8gcmVzZXQgc3RhdGUgb24gQXVkaW9GbGluZ2VyIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgICAgIC8vIEF1ZGlvUG9saWN5IGlzIGNyZWF0ZWQgYWZ0ZXIgQXVkaW9GbGluZ2VyLgorICAgICAgICAgICAgbUF1ZGlvRmxpbmdlckN0b3JUaW1lID0gbm93VGltZTsKKyAgICAgICAgICAgIG1TaW1wbGVMb2cubG9nKCJBdWRpb0ZsaW5nZXIgY3RvciIpOworICAgICAgICB9CisgICAgICAgIG1BdWRpb0FuYWx5dGljcy5uZXdTdGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtb2R1bGUgPT0gTW9kdWxlOjpBVURJT1BPTElDWSkgeworICAgICAgICAvLyBBIHN0YXJ0IGV2ZW50IG9jY3VycyB3aGVuIGF1ZGlvc2VydmVyCisgICAgICAgIC8vCisgICAgICAgIC8vICgxKSBTdGFydHMgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgLy8gKDIpIFJlc3RhcnRzIGJlY2F1c2Ugb2YgdGhlIFRpbWVDaGVjayB3YXRjaGRvZworICAgICAgICAvLyAoMykgUmVzdGFydHMgbm90IGJlY2F1c2Ugb2YgdGhlIFRpbWVDaGVjayB3YXRjaGRvZy4KKyAgICAgICAgaW50NjRfdCBleGVjdXRpb25UaW1lTnMgPSAwOworICAgICAgICAodm9pZClpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0VYRUNVVElPTlRJTUVOUywgJmV4ZWN1dGlvblRpbWVOcyk7CisgICAgICAgIGNvbnN0IGZsb2F0IGxvYWRUaW1lTXMgPSBleGVjdXRpb25UaW1lTnMgKiAxZS02ZjsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgaW50NjRfdCByZXN0YXJ0cyA9IG1TdGFydENvdW50OworICAgICAgICBpZiAobVN0b3BDb3VudCA9PSBtU3RhcnRDb3VudCkgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5Q3RvclRpbWUgPSBub3dUaW1lOworICAgICAgICAgICAgKyttU3RhcnRDb3VudDsKKyAgICAgICAgICAgIGlmIChtU3RvcENvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyAoMSkgRmlyc3QgdGltZSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IChrZXk9JXMpIEF1ZGlvUG9saWN5IGN0b3IsIGxvYWRUaW1lTXM6JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGl0ZW0tPmdldEtleSgpLmNfc3RyKCksIGxvYWRUaW1lTXMpOworICAgICAgICAgICAgICAgIG1TaW1wbGVMb2cubG9nKCJBdWRpb1BvbGljeSBjdG9yLCBsb2FkVGltZU1zOiVmIiwgbG9hZFRpbWVNcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vICgyKSBQcmV2aW91cyBmYWlsdXJlIGNhdWdodCBkdWUgdG8gVGltZUNoZWNrLiAgV2Uga25vdyBob3cgbG9uZyByZXN0YXJ0IHRha2VzLgorICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3RhcnRNcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZmxvYXQsIHN0ZDo6bWlsbGk+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlckN0b3JUaW1lIC0gbVN0b3BUaW1lKS5jb3VudCgpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogKGtleT0lcykgQXVkaW9Qb2xpY3kgY3RvciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInJlc3RhcnRzOiVsbGQgcmVzdGFydE1zOiVmIGxvYWRUaW1lTXM6JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGl0ZW0tPmdldEtleSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCByZXN0YXJ0TXMsIGxvYWRUaW1lTXMpOworICAgICAgICAgICAgICAgIG1TaW1wbGVMb2cubG9nKCJBdWRpb1BvbGljeSBjdG9yIHJlc3RhcnRzOiVsbGQgcmVzdGFydE1zOiVmIGxvYWRUaW1lTXM6JWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylyZXN0YXJ0cywgcmVzdGFydE1zLCBsb2FkVGltZU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vICgzKSBQcmV2aW91cyBmYWlsdXJlIGlzIE5PVCBkdWUgdG8gVGltZUNoZWNrLCBzbyB3ZSBkb24ndCBrbm93IHRoZSByZXN0YXJ0IHRpbWUuCisgICAgICAgICAgICAvLyBIb3dldmVyIHdlIGNhbiBlc3RpbWF0ZSB0aGUgdXB0aW1lIGZyb20gdGhlIGRlbHRhIHRpbWUgZnJvbSBwcmV2aW91cyBjdG9yLgorICAgICAgICAgICAgY29uc3QgZmxvYXQgdXB0aW1lTXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZmxvYXQsIHN0ZDo6bWlsbGk+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dUaW1lIC0gbUF1ZGlvRmxpbmdlckN0b3JUaW1lKS5jb3VudCgpOworICAgICAgICAgICAgbVN0b3BDb3VudCA9IG1TdGFydENvdW50OworICAgICAgICAgICAgbUF1ZGlvUG9saWN5Q3RvclRpbWUgPSBub3dUaW1lOworICAgICAgICAgICAgKyttU3RhcnRDb3VudDsKKworICAgICAgICAgICAgQUxPR1coIiVzOiAoa2V5PSVzKSBBdWRpb1BvbGljeSBjdG9yIGFmdGVyIHVuY2F1Z2h0IGZhaWx1cmUsICIKKyAgICAgICAgICAgICAgICAgICAgIm1TdGFydENvdW50OiVsbGQgbVN0b3BDb3VudDolbGxkIHVwdGltZU1zOiVmIGxvYWRUaW1lTXM6JWYiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRDb3VudCwgKGxvbmcgbG9uZyltU3RvcENvdW50LCB1cHRpbWVNcywgbG9hZFRpbWVNcyk7CisgICAgICAgICAgICBtU2ltcGxlTG9nLmxvZygiQXVkaW9Qb2xpY3kgY3RvciBhZnRlciB1bmNhdWdodCBmYWlsdXJlLCAiCisgICAgICAgICAgICAgICAgICAgICJyZXN0YXJ0czolbGxkIHVwdGltZU1zOiVmIGxvYWRUaW1lTXM6JWYiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCB1cHRpbWVNcywgbG9hZFRpbWVNcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9BbmFseXRpY3M6OkhlYWx0aDo6b25BdWRpb1NlcnZlclRpbWVvdXQoTW9kdWxlIG1vZHVsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pCit7CisgICAgc3RkOjpzdHJpbmcgbW9kdWxlTmFtZSA9IGdldE1vZHVsZU5hbWUobW9kdWxlKTsKKyAgICBpbnQ2NF90IG1ldGhvZENvZGV7fTsKKyAgICBzdGQ6OnN0cmluZyBtZXRob2ROYW1lOworICAgICh2b2lkKWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9EQ09ERSwgJm1ldGhvZENvZGUpOworICAgICh2b2lkKWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9ETkFNRSwgJm1ldGhvZE5hbWUpOworCisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICBpZiAobVN0b3BDb3VudCA+PSBtU3RhcnRDb3VudCkgeworICAgICAgICBBTE9HRCgiJXM6IChrZXk9JXMpICVzIHRpbWVvdXQgJXMoJWxsZCkgIgorICAgICAgICAgICAgInVubWF0Y2hlZCBtU3RvcENvdW50KCVsbGQpID49IG1TdGFydENvdW50KCVsbGQpLCBpZ25vcmluZyIsCisgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwgbW9kdWxlTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbWV0aG9kTmFtZS5jX3N0cigpLCAobG9uZyBsb25nKW1ldGhvZENvZGUsCisgICAgICAgICAgICAobG9uZyBsb25nKW1TdG9wQ291bnQsIChsb25nIGxvbmcpbVN0YXJ0Q291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgaW50NjRfdCByZXN0YXJ0cyA9IG1TdGFydENvdW50IC0gMTsKKyAgICArK21TdG9wQ291bnQ7CisgICAgbVN0b3BUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgY29uc3QgZmxvYXQgdXB0aW1lTXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZmxvYXQsIHN0ZDo6bWlsbGk+PigKKyAgICAgICAgICAgIG1TdG9wVGltZSAtIG1BdWRpb0ZsaW5nZXJDdG9yVGltZSkuY291bnQoKTsKKyAgICBBTE9HVygiJXM6IChrZXk9JXMpICVzIHRpbWVvdXQgJXMoJWxsZCkgcmVzdGFydHM6JWxsZCB1cHRpbWVNczolZiIsCisgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwgbW9kdWxlTmFtZS5jX3N0cigpLAorICAgICAgICAgbWV0aG9kTmFtZS5jX3N0cigpLCAobG9uZyBsb25nKW1ldGhvZENvZGUsCisgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCB1cHRpbWVNcyk7CisgICAgbVNpbXBsZUxvZy5sb2coIiVzIHRpbWVvdXQgJXMoJWxsZCkgcmVzdGFydHM6JWxsZCB1cHRpbWVNczolZiIsCisgICAgICAgICAgICBtb2R1bGVOYW1lLmNfc3RyKCksIG1ldGhvZE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyltZXRob2RDb2RlLAorICAgICAgICAgICAgKGxvbmcgbG9uZylyZXN0YXJ0cywgdXB0aW1lTXMpOworfQorCitzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDMyX3Q+IEF1ZGlvQW5hbHl0aWNzOjpIZWFsdGg6OmR1bXAoCisgICAgICAgIGludDMyX3QgbGluZXMsIGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKK3sKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIHN0ZDo6c3RyaW5nIHMgPSBtU2ltcGxlTG9nLmR1bXBUb1N0cmluZyhwcmVmaXggPT0gbnVsbHB0ciA/ICIiIDogcHJlZml4LCBsaW5lcyk7CisgICAgc2l6ZV90IG4gPSBzdGQ6OmNvdW50KHMuYmVnaW4oKSwgcy5lbmQoKSwgJ1xuJyk7CisgICAgcmV0dXJuIHsgcywgbiB9OworfQorCisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcAppbmRleCBhYjc0YzhlLi41Nzg3ZTllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcApAQCAtNDUsNiArNDUsMTAgQEAKICNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9EVVJBVElPTl9OUyAgICAiZHVyYXRpb25OcyIgLy8gaW50NjQKICNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9UWVBFICAgICAgICAgICAidHlwZSIgICAgICAgLy8gaW50MzIKICNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUgICAgICAgICAidm9sdW1lIiAgICAgLy8gZG91YmxlCisjZGVmaW5lIEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUlOX1ZPTFVNRV9EVVJBVElPTl9OUyAibWluVm9sdW1lRHVyYXRpb25OcyIgLy8gaW50NjQKKyNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FICAgICAgICAgICAgICJtaW5Wb2x1bWUiICAgICAgICAgICAvLyBkb3VibGUKKyNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TICJtYXhWb2x1bWVEdXJhdGlvbk5zIiAvLyBpbnQ2NAorI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUUgICAgICAgICAgICAgIm1heFZvbHVtZSIgICAgICAgICAgIC8vIGRvdWJsZQogCiBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzIHsKIApAQCAtMTQxLDEzICsxNDUsMzQgQEAKICAgICBkb3VibGUgdm9sdW1lOwogICAgIGlmICghaXRlbS0+Z2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfVk9MVU1FLCAmdm9sdW1lKSkgcmV0dXJuOwogCisgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uX25zOworICAgIGlmICghaXRlbS0+Z2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TLCAmbWluX3ZvbHVtZV9kdXJhdGlvbl9ucykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvdWJsZSBtaW5fdm9sdW1lOworICAgIGlmICghaXRlbS0+Z2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUlOX1ZPTFVNRSwgJm1pbl92b2x1bWUpKSByZXR1cm47CisKKyAgICBpbnQ2NF90IG1heF92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgaWYgKCFpdGVtLT5nZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUVfRFVSQVRJT05fTlMsICZtYXhfdm9sdW1lX2R1cmF0aW9uX25zKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIG1heF92b2x1bWU7CisgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FLCAmbWF4X3ZvbHVtZSkpIHJldHVybjsKKwogICAgIGNvbnN0IGludDMyX3QgZHVyYXRpb25fc2VjcyA9IChpbnQzMl90KShkdXJhdGlvbl9ucyAvIE5BTk9TX1BFUl9TRUNPTkQpOwotICAgIGNvbnN0IGZsb2F0IGF2ZXJhZ2Vfdm9sdW1lID0gKGZsb2F0KXZvbHVtZTsKKyAgICBjb25zdCBpbnQzMl90IG1pbl92b2x1bWVfZHVyYXRpb25fc2VjcyA9IChpbnQzMl90KShtaW5fdm9sdW1lX2R1cmF0aW9uX25zIC8gTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgY29uc3QgaW50MzJfdCBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3MgPSAoaW50MzJfdCkobWF4X3ZvbHVtZV9kdXJhdGlvbl9ucyAvIE5BTk9TX1BFUl9TRUNPTkQpOwogICAgIGNvbnN0IGludCByZXN1bHQgPSBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpBVURJT19QT1dFUl9VU0FHRV9EQVRBX1JFUE9SVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX3NlY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Vfdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbWluX3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZvbHVtZV9kdXJhdGlvbl9zZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbWF4X3ZvbHVtZSk7CiAKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBsb2c7CiAgICAgbG9nIDw8ICJyZXN1bHQ6IiA8PCByZXN1bHQgPDwgIiB7IgpAQCAtMTU1LDE3ICsxODAsNDMgQEAKICAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6OkFVRElPX1BPV0VSX1VTQUdFX0RBVEFfUkVQT1JURUQKICAgICAgICAgICAgIDw8ICIgYXVkaW9fZGV2aWNlOiIgPDwgYXVkaW9fZGV2aWNlCiAgICAgICAgICAgICA8PCAiIGR1cmF0aW9uX3NlY3M6IiA8PCBkdXJhdGlvbl9zZWNzCi0gICAgICAgICAgICA8PCAiIGF2ZXJhZ2Vfdm9sdW1lOiIgPDwgYXZlcmFnZV92b2x1bWUKKyAgICAgICAgICAgIDw8ICIgYXZlcmFnZV92b2x1bWU6IiA8PCAoZmxvYXQpdm9sdW1lCiAgICAgICAgICAgICA8PCAiIHR5cGU6IiA8PCB0eXBlCisgICAgICAgICAgICA8PCAiIG1pbl92b2x1bWVfZHVyYXRpb25fc2VjczoiIDw8IG1pbl92b2x1bWVfZHVyYXRpb25fc2VjcworICAgICAgICAgICAgPDwgIiBtaW5fdm9sdW1lOiIgPDwgKGZsb2F0KW1pbl92b2x1bWUKKyAgICAgICAgICAgIDw8ICIgbWF4X3ZvbHVtZV9kdXJhdGlvbl9zZWNzOiIgPDwgbWF4X3ZvbHVtZV9kdXJhdGlvbl9zZWNzCisgICAgICAgICAgICA8PCAiIG1heF92b2x1bWU6IiA8PCAoZmxvYXQpbWF4X3ZvbHVtZQogICAgICAgICAgICAgPDwgIiB9IjsKICAgICBtU3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6QVVESU9fUE9XRVJfVVNBR0VfREFUQV9SRVBPUlRFRCwgbG9nLnN0cigpKTsKIH0KIAordm9pZCBBdWRpb1Bvd2VyVXNhZ2U6OnVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKAorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgY29uc3QgZG91YmxlIGN1cl9tYXhfdm9sdW1lLAorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgY29uc3QgZG91YmxlIGN1cl9taW5fdm9sdW1lLAorICAgICAgICAgICAgaW50NjRfdCYgZl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUmIGZfbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgIGludDY0X3QmIGZfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZG91YmxlJiBmX21pbl92b2x1bWUpCit7CisgICAgaWYgKGZfbWluX3ZvbHVtZSA+IGN1cl9taW5fdm9sdW1lKSB7CisgICAgICAgIGZfbWluX3ZvbHVtZSA9IGN1cl9taW5fdm9sdW1lOworICAgICAgICBmX21pbl92b2x1bWVfZHVyYXRpb25fbnMgPSBjdXJfbWluX3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICB9IGVsc2UgaWYgKGZfbWluX3ZvbHVtZSA9PSBjdXJfbWluX3ZvbHVtZSkgeworICAgICAgICBmX21pbl92b2x1bWVfZHVyYXRpb25fbnMgKz0gY3VyX21pbl92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgfQorICAgIGlmIChmX21heF92b2x1bWUgPCBjdXJfbWF4X3ZvbHVtZSkgeworICAgICAgICBmX21heF92b2x1bWUgPSBjdXJfbWF4X3ZvbHVtZTsKKyAgICAgICAgZl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zID0gY3VyX21heF92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgfSBlbHNlIGlmIChmX21heF92b2x1bWUgPT0gY3VyX21heF92b2x1bWUpIHsKKyAgICAgICAgZl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zICs9IGN1cl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zOworICAgIH0KK30KKwogYm9vbCBBdWRpb1Bvd2VyVXNhZ2U6OnNhdmVBc0l0ZW1fbCgKLSAgICAgICAgaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb25fbnMsIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQorICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wsCisgICAgICAgIGludDY0X3QgbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgZG91YmxlIG1heF92b2x1bWUsCisgICAgICAgIGludDY0X3QgbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZG91YmxlIG1pbl92b2x1bWUpCiB7CiAgICAgQUxPR1YoIiVzOiAoJSN4LCAlZCwgJWxsZCwgJWYpIiwgX19mdW5jX18sIGRldmljZSwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkdXJhdGlvbl9ucywgYXZlcmFnZV92b2wgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkdXJhdGlvbl9ucywgYXZlcmFnZV92b2wpOwogICAgIGlmIChkdXJhdGlvbl9ucyA9PSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOyAvLyBza2lwIGR1cmF0aW9uIDAgdXNhZ2UKICAgICB9CkBAIC0xOTMsMTAgKzI0NCwzNiBAQAogICAgICAgICAgICAgaXRlbS0+c2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfVk9MVU1FLCBmaW5hbF92b2x1bWUpOwogICAgICAgICAgICAgaXRlbS0+c2V0VGltZXN0YW1wKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpKTsKIAotICAgICAgICAgICAgQUxPR1YoIiVzOiB1cGRhdGUgKCUjeCwgJWQsICVsbGQsICVmKSAtLT4gKCVsbGQsICVmKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXgvbWluIHZvbHVtZSBhbmQgZHVyYXRpb24KKyAgICAgICAgICAgIGludDY0X3QgZmluYWxfbWluX3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICAgICAgICAgIGludDY0X3QgZmluYWxfbWF4X3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICAgICAgICAgIGRvdWJsZSBmaW5hbF9taW5fdm9sdW1lOworICAgICAgICAgICAgZG91YmxlIGZpbmFsX21heF92b2x1bWU7CisKKyAgICAgICAgICAgIGl0ZW0tPmdldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUlOX1ZPTFVNRV9EVVJBVElPTl9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaW5hbF9taW5fdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICAgICAgICAgIGl0ZW0tPmdldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUUsICZmaW5hbF9taW5fdm9sdW1lKTsKKyAgICAgICAgICAgIGl0ZW0tPmdldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRV9EVVJBVElPTl9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaW5hbF9tYXhfdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICAgICAgICAgIGl0ZW0tPmdldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUUsICZmaW5hbF9tYXhfdm9sdW1lKTsKKyAgICAgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKG1heF92b2x1bWVfZHVyYXRpb25fbnMsIG1heF92b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdm9sdW1lX2R1cmF0aW9uX25zLCBtaW5fdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX21pbl92b2x1bWVfZHVyYXRpb25fbnMsIGZpbmFsX21pbl92b2x1bWUpOworICAgICAgICAgICAgaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucyk7CisgICAgICAgICAgICBpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FLCBmaW5hbF9taW5fdm9sdW1lKTsKKyAgICAgICAgICAgIGl0ZW0tPnNldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRV9EVVJBVElPTl9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX21heF92b2x1bWVfZHVyYXRpb25fbnMpOworICAgICAgICAgICAgaXRlbS0+c2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSwgZmluYWxfbWF4X3ZvbHVtZSk7CisKKyAgICAgICAgICAgIEFMT0dWKCIlczogdXBkYXRlICglI3gsICVkLCAlbGxkLCAlZikgLS0+ICglbGxkLCAlZikgbWluKCVsbGQsICVmKSBtYXgoJWxsZCwgJWYpIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgZGV2aWNlLCB0eXBlLAogICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdGVtX2R1cmF0aW9uX25zLCBpdGVtX3ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfZHVyYXRpb25fbnMsIGZpbmFsX3ZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZpbmFsX2R1cmF0aW9uX25zLCBmaW5hbF92b2x1bWUsCisgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZpbmFsX21pbl92b2x1bWVfZHVyYXRpb25fbnMsIGZpbmFsX21pbl92b2x1bWUsCisgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZpbmFsX21heF92b2x1bWVfZHVyYXRpb25fbnMsIGZpbmFsX21heF92b2x1bWUpOwogCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjA4LDEyICsyODUsMTggQEAKICAgICBzaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9EVVJBVElPTl9OUywgZHVyYXRpb25fbnMpOwogICAgIHNpdGVtLT5zZXRJbnQzMihBVURJT19QT1dFUl9VU0FHRV9QUk9QX1RZUEUsIHR5cGUpOwogICAgIHNpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUsIGF2ZXJhZ2Vfdm9sKTsKKyAgICBzaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TLCBtaW5fdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICBzaXRlbS0+c2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUlOX1ZPTFVNRSwgbWluX3ZvbHVtZSk7CisgICAgc2l0ZW0tPnNldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRV9EVVJBVElPTl9OUywgbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucyk7CisgICAgc2l0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUUsIG1heF92b2x1bWUpOwogICAgIG1JdGVtcy5lbXBsYWNlX2JhY2soc2l0ZW0pOwogICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIEF1ZGlvUG93ZXJVc2FnZTo6c2F2ZUFzSXRlbXNfbCgKLSAgICAgICAgaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb25fbnMsIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQorICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wsCisgICAgICAgIGludDY0X3QgbWF4X3ZvbHVtZV9kdXJhdGlvbiwgZG91YmxlIG1heF92b2x1bWUsCisgICAgICAgIGludDY0X3QgbWluX3ZvbHVtZV9kdXJhdGlvbiwgZG91YmxlIG1pbl92b2x1bWUpCiB7CiAgICAgQUxPR1YoIiVzOiAoJSN4LCAlZCwgJWxsZCwgJWYpIiwgX19mdW5jX18sIGRldmljZSwgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkdXJhdGlvbl9ucywgYXZlcmFnZV92b2wgKTsKQEAgLTIzMiw3ICszMTUsOSBAQAogICAgICAgICBpbnQzMl90IHRtcF9kZXZpY2UgPSBkZXZpY2VfYml0cyAmIC1kZXZpY2VfYml0czsgLy8gZ2V0IGxvd2VzdCBiaXQKICAgICAgICAgZGV2aWNlX2JpdHMgXj0gdG1wX2RldmljZTsgIC8vIGNsZWFyIGxvd2VzdCBiaXQKICAgICAgICAgdG1wX2RldmljZSB8PSBpbnB1dF9iaXQ7ICAgIC8vIHJlc3RvcmUgaW5wdXQgYml0Ci0gICAgICAgIHJldCA9IHNhdmVBc0l0ZW1fbCh0bXBfZGV2aWNlLCBkdXJhdGlvbl9ucywgdHlwZSwgYXZlcmFnZV92b2wpOworICAgICAgICByZXQgPSBzYXZlQXNJdGVtX2wodG1wX2RldmljZSwgZHVyYXRpb25fbnMsIHR5cGUsIGF2ZXJhZ2Vfdm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZvbHVtZV9kdXJhdGlvbiwgbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl92b2x1bWVfZHVyYXRpb24sIG1pbl92b2x1bWUpOwogCiAgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICUjeCByZWNvcmRlZCwgcmVtYWluaW5nIGRldmljZV9iaXRzID0gJSN4IiwgX19mdW5jX18sCiAgICAgICAgICAgICB0bXBfZGV2aWNlLCBkZXZpY2VfYml0cyk7CkBAIC0yNTAsOSArMzM1LDI4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZG91YmxlIGRldmljZVZvbHVtZSA9IDEuOwotICAgIGlmIChpc1RyYWNrICYmICFpdGVtLT5nZXREb3VibGUoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgJmRldmljZVZvbHVtZSkpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGludDY0X3QgbWF4Vm9sdW1lRHVyYXRpb25OcyA9IDA7CisgICAgZG91YmxlIG1heFZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NQVhfVk9MVU1FOworICAgIGludDY0X3QgbWluVm9sdW1lRHVyYXRpb25OcyA9IDA7CisgICAgZG91YmxlIG1pblZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgIGlmIChpc1RyYWNrKSB7CisgICAgICAgIGlmICghaXRlbS0+Z2V0RG91YmxlKEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VWT0xVTUUsICZkZXZpY2VWb2x1bWUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpdGVtLT5nZXRJbnQ2NChBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FRFVSQVRJT05OUywgJm1heFZvbHVtZUR1cmF0aW9uTnMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1BWFZPTFVNRSwgJm1heFZvbHVtZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWl0ZW0tPmdldEludDY0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNSU5WT0xVTUVEVVJBVElPTk5TLCAmbWluVm9sdW1lRHVyYXRpb25OcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWl0ZW0tPmdldERvdWJsZShBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUlOVk9MVU1FLCAmbWluVm9sdW1lKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQorCiAgICAgaW50MzJfdCB0eXBlID0gMDsKICAgICBzdGQ6OnN0cmluZyB0eXBlX3N0cmluZzsKICAgICBpZiAoKGlzVHJhY2sgJiYgbUF1ZGlvQW5hbHl0aWNzLT5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KApAQCAtMjg1LDcgKzM4OSw4IEBACiAgICAgICAgIEFMT0dWKCJkZXZpY2UgPSAlcyA9PiAlZCIsIGRldmljZV9zdHJpbmdzLmNfc3RyKCksIGRldmljZSk7CiAgICAgfQogICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKLSAgICBzYXZlQXNJdGVtc19sKGRldmljZSwgZGV2aWNlVGltZU5zLCB0eXBlLCBkZXZpY2VWb2x1bWUpOworICAgIHNhdmVBc0l0ZW1zX2woZGV2aWNlLCBkZXZpY2VUaW1lTnMsIHR5cGUsIGRldmljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgIG1heFZvbHVtZUR1cmF0aW9uTnMsIG1heFZvbHVtZSwgbWluVm9sdW1lRHVyYXRpb25OcywgbWluVm9sdW1lKTsKIH0KIAogdm9pZCBBdWRpb1Bvd2VyVXNhZ2U6OmNoZWNrTW9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSkKQEAgLTI5OSwxMCArNDA0LDE3IEBACiAgICAgaWYgKG1Nb2RlID09ICJBVURJT19NT0RFX0lOX0NBTEwiKSB7IC8vIGxlYXZpbmcgY2FsbCBtb2RlCiAgICAgICAgIGNvbnN0IGludDY0X3QgZW5kQ2FsbE5zID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CiAgICAgICAgIGNvbnN0IGludDY0X3QgZHVyYXRpb25OcyA9IGVuZENhbGxOcyAtIG1EZXZpY2VUaW1lTnM7CisgICAgICAgIGNvbnN0IGludDY0X3Qgdm9sdW1lRHVyYXRpb25OcyA9IGVuZENhbGxOcyAtIG1Wb2x1bWVUaW1lTnM7CiAgICAgICAgIGlmIChkdXJhdGlvbk5zID4gMCkgewogICAgICAgICAgICAgbURldmljZVZvbHVtZSA9IChtRGV2aWNlVm9sdW1lICogZG91YmxlKG1Wb2x1bWVUaW1lTnMgLSBtRGV2aWNlVGltZU5zKSArCi0gICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZShlbmRDYWxsTnMgLSBtVm9sdW1lVGltZU5zKSkgLyAoZG91YmxlKWR1cmF0aW9uTnM7Ci0gICAgICAgICAgICBzYXZlQXNJdGVtc19sKG1QcmltYXJ5RGV2aWNlLCBkdXJhdGlvbk5zLCBWT0lDRV9DQUxMX1RZUEUsIG1EZXZpY2VWb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUodm9sdW1lRHVyYXRpb25OcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOworICAgICAgICAgICAgdXBkYXRlTWluTWF4Vm9sdW1lQW5kRHVyYXRpb24odm9sdW1lRHVyYXRpb25OcywgbVZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVEdXJhdGlvbk5zLCBtVm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhWb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NYXhWb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1pblZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1pblZvaWNlVm9sdW1lKTsKKyAgICAgICAgICAgIHNhdmVBc0l0ZW1zX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1heFZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWluVm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWluVm9pY2VWb2x1bWUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtb2RlID09ICJBVURJT19NT0RFX0lOX0NBTEwiKSB7IC8vIGVudGVyaW5nIGNhbGwgbW9kZQogICAgICAgICBtU3RhcnRDYWxsTnMgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsgLy8gYWR2aXNvcnkgb25seQpAQCAtMzI3LDEwICs0MzksMTUgQEAKICAgICBpZiAobU1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsKICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gdGltZU5zIC0gbURldmljZVRpbWVOczsKKyAgICAgICAgY29uc3QgaW50NjRfdCB2b2x1bWVEdXJhdGlvbk5zID0gdGltZU5zIC0gbVZvbHVtZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKHRpbWVOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKHZvbHVtZUR1cmF0aW9uTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKICAgICAgICAgICAgIG1Wb2x1bWVUaW1lTnMgPSB0aW1lTnM7CisgICAgICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWVBbmREdXJhdGlvbih2b2x1bWVEdXJhdGlvbk5zLCBtVm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1heFZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWluVm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWluVm9pY2VWb2x1bWUpOwogICAgICAgICB9CiAgICAgfQogICAgIEFMT0dWKCIlczogbmV3IHZvaWNlIHZvbHVtZTolbGYgIG9sZCB2b2ljZSB2b2x1bWU6JWxmIiwgX19mdW5jX18sIHZvaWNlVm9sdW1lLCBtVm9pY2VWb2x1bWUpOwpAQCAtMzU4LDE1ICs0NzUsMjYgQEAKICAgICAgICAgLy8gU2F2ZSBzdGF0aXN0aWNzCiAgICAgICAgIGNvbnN0IGludDY0X3QgZW5kRGV2aWNlTnMgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gZW5kRGV2aWNlTnMgLSBtRGV2aWNlVGltZU5zOworICAgICAgICBjb25zdCBpbnQ2NF90IHZvbHVtZUR1cmF0aW9uTnMgPSBlbmREZXZpY2VOcyAtIG1Wb2x1bWVUaW1lTnM7CiAgICAgICAgIGlmIChkdXJhdGlvbk5zID4gMCkgewogICAgICAgICAgICAgbURldmljZVZvbHVtZSA9IChtRGV2aWNlVm9sdW1lICogZG91YmxlKG1Wb2x1bWVUaW1lTnMgLSBtRGV2aWNlVGltZU5zKSArCi0gICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZShlbmREZXZpY2VOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKLSAgICAgICAgICAgIHNhdmVBc0l0ZW1zX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZSh2b2x1bWVEdXJhdGlvbk5zKSkgLyAoZG91YmxlKWR1cmF0aW9uTnM7CisgICAgICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWVBbmREdXJhdGlvbih2b2x1bWVEdXJhdGlvbk5zLCBtVm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1heFZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWluVm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWluVm9pY2VWb2x1bWUpOworICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gcmVzZXQgc3RhdGlzdGljcwogICAgICAgICBtRGV2aWNlVm9sdW1lID0gMDsKICAgICAgICAgbURldmljZVRpbWVOcyA9IGVuZERldmljZU5zOwogICAgICAgICBtVm9sdW1lVGltZU5zID0gZW5kRGV2aWNlTnM7CisgICAgICAgIG1NYXhWb2ljZVZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NQVhfVk9MVU1FOworICAgICAgICBtTWluVm9pY2VWb2x1bWUgPSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUlOX1ZPTFVNRTsKKyAgICAgICAgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcyA9IDA7CisgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMgPSAwOwogICAgIH0KICAgICBBTE9HVigiJXM6IG5ldyBwcmltYXJ5IGRldmljZTolI3ggIG9sZCBwcmltYXJ5IGRldmljZTolI3giLCBfX2Z1bmNfXywgZGV2aWNlLCBtUHJpbWFyeURldmljZSk7CiAgICAgbVByaW1hcnlEZXZpY2UgPSBkZXZpY2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAKaW5kZXggODM4Y2RkNS4uNmUyNGE1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcApAQCAtMTUsOCArMTUsMTAgQEAKICAqLwogCiAjaW5jbHVkZSAiQXVkaW9UeXBlcy5oIgorI2luY2x1ZGUgIk1lZGlhTWV0cmljc0NvbnN0YW50cy5oIgogI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPiAvLyByZXF1aXJlcyBsaWJtZWRpYV9oZWxwZXIgdG8gZ2V0IHRoZSBBdWRpbyBjb2RlLgorI2luY2x1ZGUgPHN0YXRzbG9nLmg+ICAgICAgICAgICAgLy8gc3RhdHNkCiAKIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OnR5cGVzIHsKIApAQCAtMTI2LDYgKzEyOCw5IEBACiAgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIsICAgICAgICAgICAgICAgMUxMIDw8IDMxfSwKICAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiwgICAgICAgICAgICAgICAxTEwgPDwgMzJ9LAogICAgICAgICB7IkFVRElPX0RFVklDRV9PVVRfSERNSV9FQVJDIiwgICAgICAgICAgICAgICAgIDFMTCA8PCAzM30sCisgICAgICAgIC8vIFMgdmFsdWVzIGFib3ZlCisgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNUIiwgICAgICAgICAgICAgMUxMIDw8IDM0fSwKKyAgICAgICAgLy8gVCB2YWx1ZXMgYWJvdmUKICAgICB9OwogICAgIHJldHVybiBtYXA7CiB9CkBAIC0xNDMsNiArMTQ4LDggQEAKICAgICAgICAgeyJNTUFQX1BMQVlCQUNLIiwgNX0sICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBmb3IgTU1BUCBwbGF5YmFjayBzdHJlYW0KICAgICAgICAgeyJNTUFQX0NBUFRVUkUiLCAgNn0sICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBmb3IgTU1BUCBjYXB0dXJlIHN0cmVhbQogICAgICAgICAvLyBSIHZhbHVlcyBhYm92ZS4KKyAgICAgICAgeyJTUEFUSUFMSVpFUiIsICAgN30sICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBmb3IgU3BhdGlhbGl6ZXJUaHJlYWQKKyAgICAgICAgLy8gUyB2YWx1ZXMgYWJvdmUuCiAgICAgfTsKICAgICByZXR1cm4gbWFwOwogfQpAQCAtMTkwLDYgKzE5NywzMSBAQAogICAgIHJldHVybiBtYXA7CiB9CiAKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50MzJfdD4mIGdldFN0YXR1c01hcCgpIHsKKyAgICAvLyBETyBOT1QgTU9ESUZZIFZBTFVFUyhPSyB0byBhZGQgbmV3IG9uZXMpLgorICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludDMyX3Q+IG1hcCB7CisgICAgICAgIHsiIiwKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fTk9fRVJST1J9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSywKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fTk9fRVJST1J9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9BUkdVTUVOVCwKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfQVJHVU1FTlR9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9JTywKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfSU99LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9NRU1PUlksCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX01FTU9SWX0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NFQ1VSSVRZLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9TRUNVUklUWX0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NUQVRFLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9TVEFURX0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1RJTUVPVVQsCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1RJTUVPVVR9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9VTktOT1dOLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9VTktOT1dOfSwKKyAgICB9OworICAgIHJldHVybiBtYXA7Cit9CisKIC8vIEhlbHBlcjogQ3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGludDMyIGZyb20gc3RyaW5nIGZsYWdzIHNwbGl0IHdpdGggJ3wnLgogdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWl0cz4KIGludDMyX3QgaW50MzJGcm9tRmxhZ3MoY29uc3Qgc3RkOjpzdHJpbmcgJmZsYWdzKQpAQCAtNDMxLDYgKzQ2MywxNyBAQAogfQogCiB0ZW1wbGF0ZSA8PgoraW50MzJfdCBsb29rdXA8U1RBVFVTPihjb25zdCBzdGQ6OnN0cmluZyAmc3RhdHVzKQoreworICAgIGF1dG8mIG1hcCA9IGdldFN0YXR1c01hcCgpOworICAgIGF1dG8gaXQgPSBtYXAuZmluZChzdGF0dXMpOworICAgIGlmIChpdCA9PSBtYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDw+CiBpbnQzMl90IGxvb2t1cDxUSFJFQURfVFlQRT4oY29uc3Qgc3RkOjpzdHJpbmcgJnRocmVhZFR5cGUpCiB7CiAgICAgYXV0byYgbWFwID0gZ2V0QXVkaW9UaHJlYWRUeXBlTWFwKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAKaW5kZXggMWQ2NDg3OC4uZmYxNmI5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIAogI2luY2x1ZGUgPHB3ZC5oPiAvL2dldHB3dWlkCkBAIC0yMDQsNiArMjA1LDE1IEBACiAgICAgLy8gbm93IGF0dGFjaCBlaXRoZXIgdGhlIGl0ZW0gb3IgaXRzIGR1cCB0byBhIGNvbnN0IHNoYXJlZCBwb2ludGVyCiAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4gc2l0ZW0ocmVsZWFzZSA/IGl0ZW0gOiBpdGVtLT5kdXAoKSk7CiAKKyAgICAvLyByZWdpc3RlciBsb2cgc2Vzc2lvbiBpZHMgd2l0aCBzaW5nbGV0b24uCisgICAgaWYgKHN0YXJ0c1dpdGgoaXRlbS0+Z2V0S2V5KCksICJtZXRyaWNzLm1hbmFnZXIiKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CisgICAgICAgIGlmIChpdGVtLT5nZXQoImxvZ1Nlc3Npb25JZCIsICZsb2dTZXNzaW9uSWQpCisgICAgICAgICAgICAgICAgJiYgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6aXNMb2dTZXNzaW9uSWQobG9nU2Vzc2lvbklkLmNfc3RyKCkpKSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OlZhbGlkYXRlSWQ6OmdldCgpLT5yZWdpc3RlcklkKGxvZ1Nlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAodm9pZCltQXVkaW9BbmFseXRpY3Muc3VibWl0KHNpdGVtLCBpc1RydXN0ZWQpOwogCiAgICAgKHZvaWQpZHVtcDJTdGF0c2Qoc2l0ZW0sIG1TdGF0c2RMb2cpOyAgLy8gZmFpbHVyZSBzaG91bGQgYmUgbG9nZ2VkIGluIGZ1bmN0aW9uLgpAQCAtMzA5LDggKzMxOSwyOCBAQAogICAgICAgICAgICAgICAgIHJlc3VsdCA8PCAiLS0gc29tZSBsaW5lcyBtYXkgYmUgdHJ1bmNhdGVkIC0tXG4iOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGhlYXRMaW5lc1RvRHVtcCA9IGFsbCA/IElOVDMyX01BWCA6IDIwOworICAgICAgICAgICAgY29uc3QgYXV0byBbIGhlYXREdW1wU3RyaW5nLCBoZWF0TGluZXNdID0KKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLmR1bXBIZWF0TWFwKGhlYXRMaW5lc1RvRHVtcCk7CisgICAgICAgICAgICByZXN1bHQgPDwgIlxuIiA8PCBoZWF0RHVtcFN0cmluZzsKKyAgICAgICAgICAgIGlmIChoZWF0TGluZXMgPT0gaGVhdExpbmVzVG9EdW1wKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0IDw8ICItLSBzb21lIGxpbmVzIG1heSBiZSB0cnVuY2F0ZWQgLS1cbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaGVhbHRoTGluZXNUb0R1bXAgPSBhbGwgPyBJTlQzMl9NQVggOiAxNTsKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiXG5IZWFsdGggTWVzc2FnZSBMb2c6IjsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gWyBoZWFsdGhEdW1wU3RyaW5nLCBoZWFsdGhMaW5lcyBdID0KKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLmR1bXBIZWFsdGgoaGVhbHRoTGluZXNUb0R1bXApOworICAgICAgICAgICAgcmVzdWx0IDw8ICJcbiIgPDwgaGVhbHRoRHVtcFN0cmluZzsKKyAgICAgICAgICAgIGlmIChoZWFsdGhMaW5lcyA9PSBoZWFsdGhMaW5lc1RvRHVtcCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA8PCAiLS0gc29tZSBsaW5lcyBtYXkgYmUgdHJ1bmNhdGVkIC0tXG4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgPDwgIlxuTG9nU2Vzc2lvbklkOlxuIgorICAgICAgICAgICAgICAgICAgIDw8IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPmR1bXAoKTsKKwogICAgICAgICAgICAgLy8gRHVtcCB0aGUgc3RhdHNkIGF0b21zIHdlIHNlbnQgb3V0LgotICAgICAgICAgICAgcmVzdWx0IDw8ICJTdGF0c2QgYXRvbXM6XG4iCisgICAgICAgICAgICByZXN1bHQgPDwgIlxuU3RhdHNkIGF0b21zOlxuIgogICAgICAgICAgICAgICAgICAgIDw8IG1TdGF0c2RMb2ctPmR1bXBUb1N0cmluZygiICAiIC8qIHByZWZpeCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCA/IFNUQVRTRF9MT0dfTElORVNfTUFYIDogU1RBVFNEX0xPR19MSU5FU19EVU1QKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1ZhbGlkYXRlSWQuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL1ZhbGlkYXRlSWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzg1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVmFsaWRhdGVJZC5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRyaWNzU2VydmljZSIgIC8vIG5vdCBWYWxpZGF0ZUlkCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgeworCitzdGQ6OnN0cmluZyBWYWxpZGF0ZUlkOjpkdW1wKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiRW50cmllczoiIDw8IG1JZFNldC5zaXplKCkgPDwgIiAgSW52YWxpZElkczoiIDw8IG1JbnZhbGlkSWRzIDw8ICJcbiI7CisgICAgc3MgPDwgbUlkU2V0LmR1bXAoMTApOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBWYWxpZGF0ZUlkOjpyZWdpc3RlcklkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkKK3sKKyAgICBpZiAoaWQuZW1wdHkoKSkgcmV0dXJuOworICAgIGlmICghbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6aXNMb2dTZXNzaW9uSWQoaWQuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR1coIiVzOiByZWplY3RpbmcgbWFsZm9ybWVkIGlkICVzIiwgX19mdW5jX18sIGlkLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCIlczogcmVnaXN0ZXJpbmcgJXMiLCBfX2Z1bmNfXywgaWQuY19zdHIoKSk7CisgICAgbUlkU2V0LmFkZChpZCk7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBWYWxpZGF0ZUlkOjp2YWxpZGF0ZUlkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZW1wdHl7fTsKKyAgICBpZiAoaWQuZW1wdHkoKSkgcmV0dXJuIGVtcHR5OworCisgICAgLy8gcmVqZWN0IGJlY2F1c2UgdGhlIGlkIGlzIG1hbGZvcm1lZAorICAgIGlmICghbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6aXNMb2dTZXNzaW9uSWQoaWQuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR1coIiVzOiByZWplY3RpbmcgbWFsZm9ybWVkIGlkICVzIiwgX19mdW5jX18sIGlkLmNfc3RyKCkpOworICAgICAgICArK21JbnZhbGlkSWRzOworICAgICAgICByZXR1cm4gZW1wdHk7CisgICAgfQorCisgICAgLy8gcmVqZWN0IGJlY2F1c2UgdGhlIGlkIGlzIHVucmVnaXN0ZXJlZAorICAgIGlmICghbUlkU2V0LmNoZWNrKGlkKSkgeworICAgICAgICBBTE9HVygiJXM6IHJlamVjdGluZyB1bnJlZ2lzdGVyZWQgaWQgJXMiLCBfX2Z1bmNfXywgaWQuY19zdHIoKSk7CisgICAgICAgICsrbUludmFsaWRJZHM7CisgICAgICAgIHJldHVybiBlbXB0eTsKKyAgICB9CisgICAgcmV0dXJuIGlkOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCBiMDNlNTE4Li44NGQ0OTRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwCkBAIC01NiwxMSArNTYsMTEgQEAKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFtZXRyaWNzIiwKLSAgICAgICAgInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZnV6el9jb25maWc6IHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcAppbmRleCA4YjBiNDc5Li40MzMzMzJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwCkBAIC0xOSwxNSArMTksMTQgQEAKICAqLwogI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWFtZXRyaWNzc2VydmljZS9NZWRpYU1ldHJpY3NTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWFtZXRyaWNzc2VydmljZS9TdHJpbmdVdGlscy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi0jaW5jbHVkZSAiQXVkaW9UeXBlcy5oIgotI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogLy8gbG93IHdhdGVyIG1hcmsKQEAgLTQ4LDYgKzQ3LDcgQEAKICAgICB2b2lkIGludm9rZUF1ZGlvQW5hbHl0aWNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2b2lkIGludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0ZDo6YXRvbWljX2ludCBtVmFsdWUgPSAwOwogfTsKIAogdm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VTdGFydHNXaXRoKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CkBAIC0zNDIsMTEgKzM0MiwxMCBAQAogdm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VUaW1lZEFjdGlvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CiAgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpUaW1lZEFjdGlvbiB0aW1lZEFjdGlvbjsKLSAgICBzdGQ6OmF0b21pY19pbnQgdmFsdWUgPSAwOwogCiAgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgewogICAgICAgICB0aW1lZEFjdGlvbi5wb3N0SW4oc3RkOjpjaHJvbm86OnNlY29uZHMoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmdmFsdWVdIHsgKyt2YWx1ZTsgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyArK21WYWx1ZTsgfSk7CiAgICAgICAgIHRpbWVkQWN0aW9uLnNpemUoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5hbHl0aWNzQWN0aW9ucy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NBY3Rpb25zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9BbmFseXRpY3NBY3Rpb25zLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQW5hbHl0aWNzQWN0aW9ucy5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5hbHl0aWNzU3RhdGUuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQW5hbHl0aWNzU3RhdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuYWx5dGljc1N0YXRlLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQW5hbHl0aWNzU3RhdGUuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvQW5hbHl0aWNzLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9BbmFseXRpY3MuaAppbmRleCAyYjQxYTk1Li41ZWU4YzMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuaAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvQW5hbHl0aWNzLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJBbmFseXRpY3NBY3Rpb25zLmgiCiAjaW5jbHVkZSAiQW5hbHl0aWNzU3RhdGUuaCIKICNpbmNsdWRlICJBdWRpb1Bvd2VyVXNhZ2UuaCIKKyNpbmNsdWRlICJIZWF0TWFwLmgiCiAjaW5jbHVkZSAiU3RhdHNkTG9nLmgiCiAjaW5jbHVkZSAiVGltZWRBY3Rpb24uaCIKICNpbmNsdWRlICJXcmFwLmgiCkBAIC03MywxMSArNzQsMzIgQEAKICAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDMyX3Q+IGR1bXAoCiAgICAgICAgICAgICBpbnQzMl90IGxpbmVzID0gSU5UMzJfTUFYLCBpbnQ2NF90IHNpbmNlTnMgPSAwLCBjb25zdCBjaGFyICpwcmVmaXggPSBudWxscHRyKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIGR1bXAgc3RyaW5nIGFuZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBIZWF0TWFwIGR1bXAuCisgICAgICovCisgICAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiBkdW1wSGVhdE1hcChpbnQzMl90IGxpbmVzID0gSU5UMzJfTUFYKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGVhdE1hcC5kdW1wKGxpbmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGFpciBjb25zaXN0aW5nIG9mIHRoZSBkdW1wIHN0cmluZyBhbmQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgc3RyaW5nLgorICAgICAqCisgICAgICogSGVhbHRoIGR1bXAuCisgICAgICovCisgICAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiBkdW1wSGVhbHRoKGludDMyX3QgbGluZXMgPSBJTlQzMl9NQVgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IZWFsdGguZHVtcChsaW5lcyk7CisgICAgfQorCiAgICAgdm9pZCBjbGVhcigpIHsKICAgICAgICAgLy8gdW5kZXJseWluZyBzdGF0ZSBpcyBsb2NrZWQuCiAgICAgICAgIG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT5jbGVhcigpOwogICAgICAgICBtQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7CiAKKyAgICAgICAgLy8gQ2xlYXJzIHRoZSBzdGF0dXMgbWFwCisgICAgICAgIG1IZWF0TWFwLmNsZWFyKCk7CisKICAgICAgICAgLy8gQ2xlYXIgcG93ZXIgdXNhZ2Ugc3RhdGUuCiAgICAgICAgIG1BdWRpb1Bvd2VyVXNhZ2UuY2xlYXIoKTsKICAgICB9CkBAIC05NiwxMSArMTE4LDMxIEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgZm9yIGFueSBwZW5kaW5nIGFjdGlvbnMgZm9yIGEgcGFydGljdWxhciBpdGVtLgorICAgICAqIFByb2Nlc3NlcyBhbnkgcGVuZGluZyBhY3Rpb25zIGZvciBhIHBhcnRpY3VsYXIgaXRlbS4KICAgICAgKgogICAgICAqIFxwYXJhbSBpdGVtIHRvIGNoZWNrIGFnYWluc3QgdGhlIGN1cnJlbnQgQW5hbHl0aWNzQWN0aW9ucy4KICAgICAgKi8KLSAgICB2b2lkIGNoZWNrQWN0aW9ucyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSk7CisgICAgdm9pZCBwcm9jZXNzQWN0aW9ucyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgc3RhdHVzIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgaXRlbS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpdGVtIHRvIGNoZWNrIGFnYWluc3QgZm9yIHN0YXR1cyBoYW5kbGluZworICAgICAqLworICAgIHZvaWQgcHJvY2Vzc1N0YXR1cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSk7CisKKyAgICAvLyBTcGVjaWZpYyByZXBvcnRpbmcgbWV0aG9kcworICAgIGJvb2wgcmVwb3J0QXVkaW9SZWNvcmRTdGF0dXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFN0ciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGF0dXNTdHJpbmcsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICBpbnQzMl90IHN1YkNvZGUpIGNvbnN0OworCisgICAgYm9vbCByZXBvcnRBdWRpb1RyYWNrU3RhdHVzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRTdHIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RhdHVzU3RyaW5nLCB1aWRfdCB1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAorICAgICAgICAgICAgaW50MzJfdCBzdWJDb2RlKSBjb25zdDsKIAogICAgIC8vIEhFTFBFUiBNRVRIT0RTCiAgICAgLyoqCkBAIC0xMjQsNiArMTY2LDkgQEAKICAgICBUaW1lZEFjdGlvbiBtVGltZWRBY3Rpb247IC8vIGxvY2tlZCBpbnRlcm5hbGx5CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRzZExvZz4gbVN0YXRzZExvZzsgLy8gbG9ja2VkIGludGVybmFsbHksIG9rIGZvciBtdWx0aXBsZSB0aHJlYWRzLgogCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0hlYXRFbnRyaWVzID0gMTAwOworICAgIEhlYXRNYXAgbUhlYXRNYXB7a0hlYXRFbnRyaWVzfTsgLy8gbG9ja2VkIGludGVybmFsbHksIG9rIGZvciBtdWx0aXBsZSB0aHJlYWRzLgorCiAgICAgLy8gRGV2aWNlVXNlIGlzIGEgbmVzdGVkIGNsYXNzIHdoaWNoIGhhbmRsZXMgYXVkaW8gZGV2aWNlIHVzYWdlIGFjY291bnRpbmcuCiAgICAgLy8gV2UgZGVmaW5lIHRoaXMgY2xhc3MgYXQgdGhlIGVuZCB0byBlbnN1cmUgcHJpb3IgdmFyaWFibGVzIGFsbCBwcm9wZXJseSBjb25zdHJ1Y3RlZC4KICAgICAvLyBUT0RPOiBUcmFjayAvIFRocmVhZCBpbnRlcmFjdGlvbgpAQCAtMjExLDYgKzI1Niw2NyBAQAogICAgICAgICBBdWRpb0FuYWx5dGljcyAmbUF1ZGlvQW5hbHl0aWNzOwogICAgIH0gbUFBdWRpb1N0cmVhbUluZm97KnRoaXN9OwogCisgICAgLy8gQ3JlYXRlIG5ldyBzdGF0ZSwgdHlwaWNhbGx5IG9jY3VycyBhZnRlciBhbiBBdWRpb0ZsaW5nZXIgY3RvciBldmVudC4KKyAgICB2b2lkIG5ld1N0YXRlKCk7CisKKyAgICAvLyBIZWFsdGggaXMgYSBuZXN0ZWQgY2xhc3MgdGhhdCB0cmFja3MgYXVkaW9zZXJ2ZXIgaGVhbHRoIHByb3BlcnRpZXMKKyAgICBjbGFzcyBIZWFsdGggeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSGVhbHRoKEF1ZGlvQW5hbHl0aWNzICZhdWRpb0FuYWx5dGljcykKKyAgICAgICAgICAgIDogbUF1ZGlvQW5hbHl0aWNzKGF1ZGlvQW5hbHl0aWNzKSB7fQorCisgICAgICAgIGVudW0gY2xhc3MgTW9kdWxlIHsKKyAgICAgICAgICAgIEFVRElPRkxJTkdFUiwKKyAgICAgICAgICAgIEFVRElPUE9MSUNZLAorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IGNoYXIgKmdldE1vZHVsZU5hbWUoTW9kdWxlIG1vZHVsZSkgeworICAgICAgICAgICAgc3dpdGNoIChtb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1vZHVsZTo6QVVESU9GTElOR0VSOiByZXR1cm4gIkF1ZGlvRmxpbmdlciI7CisgICAgICAgICAgICAgICAgY2FzZSBNb2R1bGU6OkFVRElPUE9MSUNZOiByZXR1cm4gIkF1ZGlvUG9saWN5IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiVW5rbm93biI7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsZWQgd2hlbiB3ZSBiZWxpZXZlIGF1ZGlvc2VydmVyIHN0YXJ0cyAoQXVkaW9GbGluZ2VyIGN0b3IpCisgICAgICAgIHZvaWQgb25BdWRpb1NlcnZlclN0YXJ0KE1vZHVsZSBtb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pOworCisgICAgICAgIC8vIENhbGxlZCB3aGVuIHdlIGJlbGlldmUgYXVkaW9zZXJ2ZXIgY3Jhc2hlcyAoVGltZUNoZWNrIHRpbWVvdXRzKS4KKyAgICAgICAgdm9pZCBvbkF1ZGlvU2VydmVyVGltZW91dChNb2R1bGUgbW9kdWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKTsKKworICAgICAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDMyX3Q+IGR1bXAoCisgICAgICAgICAgICAgICAgaW50MzJfdCBsaW5lcyA9IElOVDMyX01BWCwgY29uc3QgY2hhciAqcHJlZml4ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBBdWRpb0FuYWx5dGljcyYgbUF1ZGlvQW5hbHl0aWNzOworCisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKworICAgICAgICAvLyBMaWZlIGN5Y2xlIG9mIEF1ZGlvU2VydmVyCisgICAgICAgIC8vIG1BdWRpb0ZsaW5nZXJDdG9yVGltZQorICAgICAgICAvLyBtQXVkaW9Qb2xpY3lDdG9yVGltZQorICAgICAgICAvLyBtQXVkaW9Qb2xpY3lDdG9yRG9uZVRpbWUKKyAgICAgICAgLy8gLi4uCisgICAgICAgIC8vIHBvc3NpYmx5IG1TdG9wVGltZSAgKGlmIFRpbWVDaGVjayB0aHJlYWQpCisgICAgICAgIC8vCisgICAgICAgIC8vIFVwVGltZSBpcyBtZWFzdXJlZCBmcm9tIG1TdG9wVGltZSAtIG1BdWRpb0ZsaW5nZXJDdG9yVGltZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHN0b3AgZXZlbnRzIGNvbWUgZnJvbSBUaW1lQ2hlY2sgdGltZW91dCBhYm9ydHMuICBUaGVyZSBtYXkgYmUgb3RoZXIKKyAgICAgICAgLy8gdW5jYXVnaHQgc2lnbmFscywgZS5nLiBTSUdTRUdWLCB0aGF0IGNhdXNlIG1pc3Npbmcgc3RvcCBldmVudHMuCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgbUF1ZGlvRmxpbmdlckN0b3JUaW1lIEdVQVJERURfQlkobUxvY2spOworICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IG1BdWRpb1BvbGljeUN0b3JUaW1lIEdVQVJERURfQlkobUxvY2spOworICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IG1BdWRpb1BvbGljeUN0b3JEb25lVGltZSBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBtU3RvcFRpbWUgR1VBUkRFRF9CWShtTG9jayk7CisKKyAgICAgICAgLy8gbVN0YXJ0Q291bnQgYW5kIG1TdG9wQ291bnQgdHJhY2sgdGhlIGF1ZGlvc2VydmVyIHN0YXJ0IGFuZCBzdG9wIGV2ZW50cy4KKyAgICAgICAgaW50NjRfdCBtU3RhcnRDb3VudCBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisgICAgICAgIGludDY0X3QgbVN0b3BDb3VudCBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisKKyAgICAgICAgU2ltcGxlTG9nIG1TaW1wbGVMb2cgR1VBUkRFRF9CWShtTG9jaykgezY0fTsKKyAgICB9IG1IZWFsdGh7KnRoaXN9OworCiAgICAgQXVkaW9Qb3dlclVzYWdlIG1BdWRpb1Bvd2VyVXNhZ2U7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvUG93ZXJVc2FnZS5oCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1Bvd2VyVXNhZ2UuaAppbmRleCA3MDIxOTAyLi5iNzIxNWU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmgKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1Bvd2VyVXNhZ2UuaApAQCAtMjYsNiArMjYsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzIHsKIAorCiBjbGFzcyBBdWRpb0FuYWx5dGljczsKIAogY2xhc3MgQXVkaW9Qb3dlclVzYWdlIHsKQEAgLTgzLDEzICs4NCwyMSBAQAogICAgIHN0YXRpYyBib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9zdHJpbmcsIGludDMyX3QmIGRldmljZSk7CiAgICAgc3RhdGljIGludDMyX3QgZGV2aWNlRnJvbVN0cmluZ1BhaXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2Vfc3RyaW5ncyk7CiBwcml2YXRlOgotICAgIGJvb2wgc2F2ZUFzSXRlbV9sKGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCkKLSAgICAgICAgIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICBib29sIHNhdmVBc0l0ZW1fbChpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbiwgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhfdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl92b2x1bWVfZHVyYXRpb24sIGRvdWJsZSBtaW5fdm9sdW1lKQorICAgICAgICAgICAgICAgICAgICAgIFJFUVVJUkVTKG1Mb2NrKTsKICAgICB2b2lkIHNlbmRJdGVtKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKSBjb25zdDsKICAgICB2b2lkIGNvbGxlY3QoKTsKLSAgICBib29sIHNhdmVBc0l0ZW1zX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQotICAgICAgICAgUkVRVUlSRVMobUxvY2spOwotCisgICAgYm9vbCBzYXZlQXNJdGVtc19sKGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heF92b2x1bWVfZHVyYXRpb24sIGRvdWJsZSBtYXhfdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3ZvbHVtZV9kdXJhdGlvbiwgZG91YmxlIG1pbl92b2x1bWUpCisgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRVMobUxvY2spOworICAgIHZvaWQgdXBkYXRlTWluTWF4Vm9sdW1lQW5kRHVyYXRpb24oCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBjb25zdCBkb3VibGUgY3VyX21heF92b2x1bWUsCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cl9taW5fdm9sdW1lX2R1cmF0aW9uX25zLCBjb25zdCBkb3VibGUgY3VyX21pbl92b2x1bWUsCisgICAgICAgICAgICBpbnQ2NF90JiBmX21heF92b2x1bWVfZHVyYXRpb25fbnMsIGRvdWJsZSYgZl9tYXhfdm9sdW1lLAorICAgICAgICAgICAgaW50NjRfdCYgZl9taW5fdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUmIGZfbWluX3ZvbHVtZSk7CiAgICAgQXVkaW9BbmFseXRpY3MgKiBjb25zdCBtQXVkaW9BbmFseXRpY3M7CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRzZExvZz4gbVN0YXRzZExvZzsgIC8vIG1TdGF0c2RMb2cgaXMgaW50ZXJuYWxseSBsb2NrZWQKICAgICBjb25zdCBib29sIG1EaXNhYmxlZDsKQEAgLTEwMCw2ICsxMDksMTAgQEAKIAogICAgIGRvdWJsZSBtVm9pY2VWb2x1bWUgR1VBUkRFRF9CWShtTG9jaykgPSAwLjsKICAgICBkb3VibGUgbURldmljZVZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IDAuOworICAgIGRvdWJsZSBtTWF4Vm9pY2VWb2x1bWUgR1VBUkRFRF9CWShtTG9jaykgPSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUFYX1ZPTFVNRTsKKyAgICBkb3VibGUgbU1pblZvaWNlVm9sdW1lIEdVQVJERURfQlkobUxvY2spID0gQU1FRElBTUVUUklDU19JTklUSUFMX01JTl9WT0xVTUU7CisgICAgaW50NjRfdCBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zIEdVQVJERURfQlkobUxvY2spID0gMDsKKyAgICBpbnQ2NF90IG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOwogICAgIGludDY0X3QgbVN0YXJ0Q2FsbE5zIEdVQVJERURfQlkobUxvY2spID0gMDsgLy8gYWR2aXNvcnkgb25seQogICAgIGludDY0X3QgbVZvbHVtZVRpbWVOcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CiAgICAgaW50NjRfdCBtRGV2aWNlVGltZU5zIEdVQVJERURfQlkobUxvY2spID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaAppbmRleCA0Mzk0ZDc5Li41ZGJmZjliIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9UeXBlcy5oCkBAIC0zOSw2ICszOSwxMCBAQAogfTsKIAogLy8gRW51bWVyYXRpb24gZm9yIGFsbCB0aGUgc3RyaW5nIHRyYW5zbGF0aW9ucyB0byBpbnRlZ2VycyAoZ2VuZXJhbGx5IGludDMyX3QpIHVubGVzcyBub3RlZC4KKy8vIFRoaXMgaXMgdXNlZCB0byBpbmRleCB0aGUgdGVtcGxhdGUgbWV0aG9kIGJlbG93OgorLy8gdGVtcGxhdGUgPEF1ZGlvRW51bUNhdGVnb3J5IEMsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+ICBUIGxvb2t1cChjb25zdCBTICZzdHIpOworLy8KKy8vIE9rYXkgdG8ga2VlcCBBdWRpb0VudW1DYXRlZ29yeSBhbHBoYWJldGljYWwgYW5kIGFkZCBuZXcgdHJhbnNsYXRpb25zIGluIHRoZSBtaWRkbGUuCiBlbnVtIEF1ZGlvRW51bUNhdGVnb3J5IHsKICAgICBBQVVESU9fRElSRUNUSU9OLAogICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFLApAQCAtNTEsNiArNTUsNyBAQAogICAgIE9VVFBVVF9ERVZJQ0UsIC8vIGludDY0X3QKICAgICBPVVRQVVRfRkxBRywKICAgICBTT1VSQ0VfVFlQRSwKKyAgICBTVEFUVVMsCiAgICAgU1RSRUFNX1RZUEUsCiAgICAgVEhSRUFEX1RZUEUsCiAgICAgVFJBQ0tfVFJBSVRTLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9IZWF0TWFwLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0hlYXRNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1MDFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9IZWF0TWFwLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAiTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgeworCisvKioKKyAqIEhlYXREYXRhIGFjY3VtdWxhdGVzIHN0YXRpc3RpY3Mgb24gdGhlIHN0YXR1cyByZXBvcnRlZCBmb3IgYSBnaXZlbiBrZXkuCisgKgorICogSGVhdERhdGEgaXMgYSBoZWxwZXIgY2xhc3MgdXNlZCBieSBIZWF0TWFwIHRvIHJlcHJlc2VudCBzdGF0aXN0aWNzLiAgV2UgZXhwb3NlIGl0CisgKiBoZXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGN1cnJlbnRseS4KKyAqCisgKiBOb3RlOiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQgc2FmZSwgc28gbXV0dWFsIGV4Y2x1c2lvbiBzaG91bGQgYmUgb2J0YWluZWQgYnkgdGhlIGNhbGxlcgorICogd2hpY2ggaW4gdGhpcyBjYXNlIGlzIEhlYXRNYXAuICBIZWF0TWFwIGdldERhdGEoKSByZXR1cm5zIGEgbG9jYWwgY29weSBvZiBIZWF0RGF0YSwgc28gdXNlCisgKiBvZiB0aGF0IGlzIHRocmVhZC1zYWZlLgorICovCitjbGFzcyBIZWF0RGF0YSB7CisgICAgLyogSGVhdERhdGEgZm9yIGEga2V5IGlzIHN0b3JlZCBpbiBhIG1hcCBiYXNlZCBvbiB0aGUgZXZlbnQgKGUuZy4gInN0YXJ0IiwgInBhdXNlIiwgY3JlYXRlKQorICAgICAqIGFuZCB0aGVuIGFub3RoZXIgbWFwIGJhc2VkIG9uIHRoZSBzdGF0dXMgKGUuZy4gIm9rIiwgImFyZ3VtZW50IiwgInN0YXRlIikuCisgICAgICovCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcgLyogZXZlbnQgKi8sCisgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcgLyogc3RhdHVzIG5hbWUgKi8sIHNpemVfdCAvKiBjb3VudCwgbm9uemVybyAqLz4+IG1NYXA7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBZGQgc3RhdHVzIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3VmZml4ICAoaWdub3JlZCkgdGhlIHN1ZmZpeCB0byB0aGUga2V5IHRoYXQgd2FzIHN0cmlwcGVkLCBpZiBhbnkuCisgICAgICogXHBhcmFtIGV2ZW50ICAgICAgICAgICAgIHRoZSBldmVudCAoZS5nLiBjcmVhdGUsIHN0YXJ0LCBwYXVzZSwgc3RvcCwgZXRjLikuCisgICAgICogXHBhcmFtIHVpZCAgICAgKGlnbm9yZWQpIHRoZSB1aWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KKyAgICAgKiBccGFyYW0gbWVzc2FnZSAoaWdub3JlZCkgdGhlIHN0YXR1cyBtZXNzYWdlLCBpZiBhbnkuCisgICAgICogXHBhcmFtIHN1YkNvZGUgKGlnbm9yZWQpIHRoZSBzdGF0dXMgc3ViY29kZSwgaWYgYW55LgorICAgICAqLworICAgIHZvaWQgYWRkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXR1cywKKyAgICAgICAgICAgIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGludDMyX3Qgc3ViQ29kZSkgeworICAgICAgICAvLyBQZXJoYXBzIHRoZXJlIGNvdWxkIGJlIGEgbW9yZSBkZXRhaWxlZCBwcmludC4KKyAgICAgICAgKHZvaWQpc3VmZml4OworICAgICAgICAodm9pZCl1aWQ7CisgICAgICAgICh2b2lkKW1lc3NhZ2U7CisgICAgICAgICh2b2lkKXN1YkNvZGU7CisgICAgICAgICsrbU1hcFtldmVudF1bc3RhdHVzXTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV2ZW50IG5hbWVzIHdpdGggc3RhdHVzLiAqLworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1hcC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGRlcXVlIHdpdGggcGFpcnMgaW5kaWNhdGluZyB0aGUgY291bnQgb2YgT2tzIGFuZCBFcnJvcnMuCisgICAgICogVGhlIGZpcnN0IHBhaXIgaXMgdG90YWwsIHRoZSBvdGhlciBwYWlycyBhcmUgaW4gb3JkZXIgb2YgbU1hcC4KKyAgICAgKgorICAgICAqIEV4YW1wbGUgcmV0dXJuIHZhbHVlIG9mIHtvaywgZXJyb3J9IHBhaXJzOgorICAgICAqICAgICB0b3RhbCAgICAga2V5MSAgICAgIGtleTIKKyAgICAgKiB7IHsgMiwgMSB9LCB7IDEsIDAgfSwgeyAxLCAxIH0gfQorICAgICAqLworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHNpemVfdCAvKiBva3MgKi8sIHNpemVfdCAvKiBlcnJvcnMgKi8+PiBoZWF0Q291bnQoKSBjb25zdCB7CisgICAgICAgIHNpemVfdCB0b3RhbE9rID0gMDsKKyAgICAgICAgc2l6ZV90IHRvdGFsRXJyb3IgPSAwOworICAgICAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxzaXplX3QgLyogb2tzICovLCBzaXplX3QgLyogZXJyb3JzICovPj4gaGVhdDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZldmVudFBhaXIgOiBtTWFwKSB7CisgICAgICAgICAgICBzaXplX3Qgb2sgPSAwOworICAgICAgICAgICAgc2l6ZV90IGVycm9yID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmW25hbWUsIGNvdW50XSA6IGV2ZW50UGFpci5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LKSB7CisgICAgICAgICAgICAgICAgICAgIG9rICs9IGNvdW50OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IGNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsT2sgKz0gb2s7CisgICAgICAgICAgICB0b3RhbEVycm9yICs9IGVycm9yOworICAgICAgICAgICAgaGVhdC5lbXBsYWNlX2JhY2sob2ssIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBoZWF0LmVtcGxhY2VfZnJvbnQodG90YWxPaywgdG90YWxFcnJvcik7CisgICAgICAgIHJldHVybiBoZWF0OworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBlcnJvciBmcmFjdGlvbiBmcm9tIGEgcGFpciA8b2tzLCBlcnJvcnM+LCBhIGZsb2F0IGJldHdlZW4gMC5mIHRvIDEuZi4gKi8KKyAgICBzdGF0aWMgZmxvYXQgZnJhY3Rpb24oY29uc3Qgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiYgY291bnQpIHsKKyAgICAgICAgcmV0dXJuIChmbG9hdCljb3VudC5zZWNvbmQgLyAoY291bnQuZmlyc3QgKyBjb3VudC5zZWNvbmQpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBIZWF0TWFwIGluZm9ybWF0aW9uIGluIGEgc2luZ2xlIGxpbmUgc3RyaW5nLiAqLworICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdCB7CisgICAgICAgIGNvbnN0IGF1dG8gaGVhdCA9IGhlYXRDb3VudCgpOworICAgICAgICBhdXRvIGl0ID0gaGVhdC5iZWdpbigpOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgInsgIjsKKyAgICAgICAgZmxvYXQgZXJyb3JGcmFjdGlvbiA9IGZyYWN0aW9uKCppdCsrKTsKKyAgICAgICAgaWYgKGVycm9yRnJhY3Rpb24gPiAwLmYpIHsKKyAgICAgICAgICAgIHNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikgPDwgZXJyb3JGcmFjdGlvbiA8PCAiICI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZldmVudFBhaXIgOiBtTWFwKSB7CisgICAgICAgICAgICBzcyA8PCBldmVudFBhaXIuZmlyc3QgPDwgIjogeyAiOworICAgICAgICAgICAgZXJyb3JGcmFjdGlvbiA9IGZyYWN0aW9uKCppdCsrKTsKKyAgICAgICAgICAgIGlmIChlcnJvckZyYWN0aW9uID4gMC5mKSB7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBlcnJvckZyYWN0aW9uIDw8ICIgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmW25hbWUsIGNvdW50XTogZXZlbnRQYWlyLnNlY29uZCkgeworICAgICAgICAgICAgICAgIHNzIDw8ICJbICIgPDwgbmFtZSA8PCAiIDogIiA8PCBjb3VudCA8PCAiIF0gIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzIDw8ICJ9ICI7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgIiB9IjsKKyAgICAgICAgcmV0dXJuIHNzLnN0cigpOworICAgIH0KK307CisKKy8qKgorICogSGVhdE1hcCBpcyBhIHRocmVhZC1zYWZlIGNvbGxlY3Rpb24gdGhhdCBjb3VudHMgYWN0aXZpdHkgb2Ygc3RhdHVzIGVycm9ycyBwZXIga2V5LgorICoKKyAqIFRoZSBjbGFzc2ljIGhlYXQgbWFwIGlzIGEgMkQgcGljdHVyZSB3aXRoIGludGVuc2l0eSBzaG93biBieSBjb2xvci4KKyAqIEhlcmUgd2UgYWNjdW11bGF0ZSB0aGUgc3RhdHVzIHJlc3VsdHMgZnJvbSBrZXlzIHRvIHNlZSBpZiB0aGVyZSBhcmUgY29uc2lzdGVudAorICogZmFpbHVyZXMgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBUT0RPKGIvMjEwODU1NTU1KTogSGVhdG1hcCBpbXByb3ZlbWVudHMuCisgKiAgIDEpIGhlYXQgZGVjYXlzIGluIGludGVuc2l0eSBpbiB0aW1lIGZvciBwYXN0IGV2ZW50cywgY3VycmVudGx5IHdlIGRvbid0IGRlY2F5LgorICovCisKK2NsYXNzIEhlYXRNYXAgeworICAgIGNvbnN0IHNpemVfdCBtTWF4U2l6ZTsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc2l6ZV90IG1SZWplY3RlZCBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEhlYXREYXRhPiBtTWFwIEdVQVJERURfQlkobUxvY2spOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEhlYXRNYXAuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWF4U2l6ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgdHJhY2tlZC4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBIZWF0TWFwKHNpemVfdCBtYXhTaXplKSA6IG1NYXhTaXplKG1heFNpemUpIHsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMuICovCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1NYXAuc2l6ZSgpOworICAgIH0KKworICAgIC8qKiBDbGVhcnMgZXJyb3IgaGlzdG9yeS4gKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbChtTG9jayk7CisgICAgICAgIHJldHVybiBtTWFwLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgbnVtYmVyIG9mIGtleXMgcmVqZWN0ZWQgZHVlIHRvIHNwYWNlLiAqLworICAgIHNpemVfdCByZWplY3RlZCgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGwobUxvY2spOworICAgICAgICByZXR1cm4gbVJlamVjdGVkOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgaGVhdCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBrZXkuICovCisgICAgSGVhdERhdGEgZ2V0RGF0YShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1NYXAuY291bnQoa2V5KSA9PSAwID8gSGVhdERhdGF7fSA6IG1NYXAuYXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGVudHJ5LgorICAgICAqIFxwYXJhbSBrZXkgICAgICAgICAgICAgICB0aGUga2V5IGNhdGVnb3J5IChlLmcuIGF1ZGlvLnRyYWNrKS4KKyAgICAgKiBccGFyYW0gc3VmZml4ICAoaWdub3JlZCkgdGhlIHN1ZmZpeCB0byB0aGUga2V5IHRoYXQgd2FzIHN0cmlwcGVkLCBpZiBhbnkuCisgICAgICogXHBhcmFtIGV2ZW50ICAgICAgICAgICAgIHRoZSBldmVudCAoZS5nLiBjcmVhdGUsIHN0YXJ0LCBwYXVzZSwgc3RvcCwgZXRjLikuCisgICAgICogXHBhcmFtIHVpZCAgICAgKGlnbm9yZWQpIHRoZSB1aWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KKyAgICAgKiBccGFyYW0gbWVzc2FnZSAoaWdub3JlZCkgdGhlIHN0YXR1cyBtZXNzYWdlLCBpZiBhbnkuCisgICAgICogXHBhcmFtIHN1YkNvZGUgKGlnbm9yZWQpIHRoZSBzdGF0dXMgc3ViY29kZSwgaWYgYW55LgorICAgICAqLworICAgIHZvaWQgYWRkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGF0dXMsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGludDMyX3Qgc3ViQ29kZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbChtTG9jayk7CisKKyAgICAgICAgLy8gSGFyZCBsaW1pdCBvbiBoZWF0IG1hcCBlbnRyaWVzLgorICAgICAgICAvLyBUT0RPOiBoYXZlIGJldHRlciBHQy4KKyAgICAgICAgaWYgKG1NYXAuc2l6ZSgpID09IG1NYXhTaXplICYmIG1NYXAuY291bnQoa2V5KSA9PSAwKSB7CisgICAgICAgICAgICArK21SZWplY3RlZDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTWFwW2tleV0uYWRkKHN1ZmZpeCwgZXZlbnQsIHN0YXR1cywgdWlkLCBtZXNzYWdlLCBzdWJDb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGFpciBjb25zaXN0aW5nIG9mIHRoZSBkdW1wIHN0cmluZyBhbmQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgc3RyaW5nLgorICAgICAqLworICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50MzJfdD4gZHVtcChpbnQzMl90IGxpbmVzID0gSU5UMzJfTUFYKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBpbnQzMl90IGxsID0gbGluZXM7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKGxsID4gMCkgeworICAgICAgICAgICAgc3MgPDwgIkVycm9yIEhlYXQgTWFwIChyZWplY3RlZDogIiA8PCBtUmVqZWN0ZWQgPDwgIik6XG4iOworICAgICAgICAgICAgLS1sbDsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiByZXN0cmljdGlvbiBpcyBpbXBsZW1lbnRlZCBhbHBoYWJldGljYWxseSBub3Qgb24gcHJpb3JpdHkuCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgW25hbWUsIGRhdGFdIDogbU1hcCkgeworICAgICAgICAgICAgaWYgKGxsIDw9IDApIGJyZWFrOworICAgICAgICAgICAgc3MgPDwgbmFtZSA8PCAiOiAiIDw8IGRhdGEuZHVtcCgpIDw8ICJcbiI7CisgICAgICAgICAgICAtLWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7IHNzLnN0cigpLCBsaW5lcyAtIGxsIH07CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0xydVNldC5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9McnVTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBhYjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9McnVTZXQuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgeworCisvKioKKyAqIExydVNldCBrZWVwcyBhIHNldCBvZiB0aGUgbGFzdCAiU2l6ZSIgZWxlbWVudHMgYWRkZWQgb3IgYWNjZXNzZWQuCisgKgorICogKExydSBzdGFuZHMgZm9yIGxlYXN0LXJlY2VudGx5LXVzZWQgZXZpY3Rpb24gcG9saWN5KS4KKyAqCisgKiBSdW5zIGluIE8oMSkgdGltZSBmb3IgYWRkLCByZW1vdmUsIGFuZCBjaGVjay4gIEludGVybmFsbHkgaW1wbGVtZW50ZWQKKyAqIHdpdGggYW4gdW5vcmRlcmVkX21hcCBhbmQgYSBsaXN0LiAgSW4gb3JkZXIgdG8gcmVtb3ZlIGVsZW1lbnRzLAorICogYSBsaXN0IGl0ZXJhdG9yIGlzIHN0b3JlZCBpbiB0aGUgdW5vcmRlcmVkX21hcAorICogKG5vdGluZyB0aGF0IHN0ZDo6bGlzdDo6ZXJhc2UoKSBjb250cmFjdHVhbGx5CisgKiBkb2VzIG5vdCBhZmZlY3QgaXRlcmF0b3JzIG90aGVyIHRoYW4gdGhlIG9uZSBlcmFzZWQpLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTHJ1U2V0IHsKKyAgICBjb25zdCBzaXplX3QgbU1heFNpemU7CisgICAgc3RkOjpsaXN0PFQ+IG1BY2Nlc3NPcmRlcjsgICAgICAgICAgICAgICAgIC8vIGZyb250IGlzIHRoZSBtb3N0IHJlY2VudCwgYmFjayBpcyB0aGUgb2xkZXN0LgorICAgIC8vIGl0ZW0gVCB3aXRoIGl0cyBhY2Nlc3Mgb3JkZXIgaXRlcmF0b3IuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFQsIHR5cGVuYW1lIHN0ZDo6bGlzdDxUPjo6aXRlcmF0b3I+IG1NYXA7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgTHJ1U2V0IHdoaWNoIGNoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IHdhcworICAgICAqIGFjY2Vzc2VkIG9yIGFkZGVkIHJlY2VudGx5LgorICAgICAqCisgICAgICogVGhlIHBhcmFtZXRlciBtYXhTaXplIGlzIHVzZWQgdG8gY2FwIGdyb3d0aCBvZiBMcnVTZXQ7CisgICAgICogZXZpY3Rpb24gaXMgYmFzZWQgb24gbGVhc3QgcmVjZW50bHkgdXNlZCBMUlUuCisgICAgICogSWYgbWF4U2l6ZSBpcyB6ZXJvLCB0aGUgTHJ1U2V0IGNvbnRhaW5zIG5vIGVsZW1lbnRzCisgICAgICogYW5kIGNoZWNrKCkgYWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWF4U2l6ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgdHJhY2tlZC4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBMcnVTZXQoc2l6ZV90IG1heFNpemUpIDogbU1heFNpemUobWF4U2l6ZSkge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBMcnVTZXQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgbWF4U2l6ZS4KKyAgICAgKi8KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NYXAuc2l6ZSgpOworICAgIH0KKworICAgIC8qKiBDbGVhcnMgdGhlIGNvbnRhaW5lciBjb250ZW50cy4gKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtTWFwLmNsZWFyKCk7CisgICAgICAgIG1BY2Nlc3NPcmRlci5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIGR1bXAgb2YgdGhlIGxhc3QgbiBlbnRyaWVzLiAqLworICAgIHN0ZDo6c3RyaW5nIGR1bXAoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIGF1dG8gaXQgPSBtQWNjZXNzT3JkZXIuY2JlZ2luKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbiAmJiBpdCAhPSBtQWNjZXNzT3JkZXIuY2VuZCgpOyArK2kpIHsKKyAgICAgICAgICAgIHNzIDw8ICppdCsrIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNzLnN0cigpOworICAgIH0KKworICAgIC8qKiBBZGRzIGEgbmV3IGl0ZW0gdG8gdGhlIHNldC4gKi8KKyAgICB2b2lkIGFkZChjb25zdCBUJiB0KSB7CisgICAgICAgIGlmIChtTWF4U2l6ZSA9PSAwKSByZXR1cm47CisgICAgICAgIGF1dG8gaXQgPSBtTWFwLmZpbmQodCk7CisgICAgICAgIGlmIChpdCAhPSBtTWFwLmVuZCgpKSB7IC8vIGFscmVhZHkgZXhpc3RzLgorICAgICAgICAgICAgbUFjY2Vzc09yZGVyLmVyYXNlKGl0LT5zZWNvbmQpOyAgLy8gbW92ZS10by1mcm9udCBvbiB0aGUgY2hyb25vbG9naWNhbGx5IG9yZGVyZWQgbGlzdC4KKyAgICAgICAgfSBlbHNlIGlmIChtQWNjZXNzT3JkZXIuc2l6ZSgpID49IG1NYXhTaXplKSB7CisgICAgICAgICAgICBjb25zdCBUIGxhc3QgPSBtQWNjZXNzT3JkZXIuYmFjaygpOworICAgICAgICAgICAgbUFjY2Vzc09yZGVyLnBvcF9iYWNrKCk7CisgICAgICAgICAgICBtTWFwLmVyYXNlKGxhc3QpOworICAgICAgICB9CisgICAgICAgIG1BY2Nlc3NPcmRlci5wdXNoX2Zyb250KHQpOworICAgICAgICBtTWFwW3RdID0gbUFjY2Vzc09yZGVyLmJlZ2luKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0IGl0ZW0gdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBccmV0dXJuIGZhbHNlIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZXhpc3QuCisgICAgICovCisgICAgYm9vbCByZW1vdmUoY29uc3QgVCYgdCkgeworICAgICAgICBhdXRvIGl0ID0gbU1hcC5maW5kKHQpOworICAgICAgICBpZiAoaXQgPT0gbU1hcC5lbmQoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBtQWNjZXNzT3JkZXIuZXJhc2UoaXQtPnNlY29uZCk7CisgICAgICAgIG1NYXAuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHQgaXMgcHJlc2VudCAoYW5kIG1vdmVzIHRoZSBhY2Nlc3Mgb3JkZXIgb2YgdCB0byB0aGUgZnJvbnQpLiAqLworICAgIGJvb2wgY2hlY2soY29uc3QgVCYgdCkgeyAvLyBub3QgY29uc3QsIGFzIGl0IGFkanVzdHMgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIuCisgICAgICAgIGF1dG8gaXQgPSBtTWFwLmZpbmQodCk7CisgICAgICAgIGlmIChpdCA9PSBtTWFwLmVuZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIG1BY2Nlc3NPcmRlci5lcmFzZShpdC0+c2Vjb25kKTsKKyAgICAgICAgbUFjY2Vzc09yZGVyLnB1c2hfZnJvbnQoaXQtPmZpcnN0KTsKKyAgICAgICAgaXQtPnNlY29uZCA9IG1BY2Nlc3NPcmRlci5iZWdpbigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9NZWRpYU1ldHJpY3NTZXJ2aWNlLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9TdGF0c2RMb2cuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvU3RhdHNkTG9nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9TdGF0c2RMb2cuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9TdGF0c2RMb2cuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0cmluZ1V0aWxzLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1N0cmluZ1V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0cmluZ1V0aWxzLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvU3RyaW5nVXRpbHMuaAppbmRleCAwMTAzNGQ5Li5hNTZmNWI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvU3RyaW5nVXRpbHMuaAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1N0cmluZ1V0aWxzLmgKQEAgLTE2Nyw0ICsxNjcsNDEgQEAKICAgICByZXR1cm4gc3Muc3RyKCk7CiB9CiAKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgbm9uLW51bGwsIG5vdCBlbXB0eSwgYW5kIGNvbnRhaW5zIG9ubHkgZGlnaXRzLgorICovCitpbmxpbmUgY29uc3RleHByIGJvb2wgaXNOdW1lcmljKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaWYgKHMgPT0gbnVsbHB0ciB8fCAqcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgZG8geworICAgICAgICBpZiAoIWlzZGlnaXQoKnMpKSByZXR1cm4gZmFsc2U7CisgICAgfSB3aGlsZSAoKisrcyAhPSAwKTsKKyAgICByZXR1cm4gdHJ1ZTsgIC8vIGFsbCBkaWdpdHMKK30KKworLyoqCisgKiBFeHRyYWN0cyBvdXQgdGhlIHByZWZpeCBmcm9tIHRoZSBrZXksIHJldHVybmluZyBhIHBhaXIgb2YgcHJlZml4LCBzdWZmaXguCisgKgorICogVXN1YWxseSB0aGUga2V5IGlzIHNvbWV0aGluZyBsaWtlOgorICogUHJlZml4LihJRCkKKyAqICAgd2hlcmUgSUQgaXMgYW4gaW50ZWdlciwKKyAqICAgICAgICAgICAgICAgb3IgImVycm9yIiBpZiB0aGUgaWQgd2FzIG5vdCByZXR1cm5lZCBiZWNhdXNlIG9mIGZhaWx1cmUsCisgKiAgICAgICAgICAgICAgIG9yICJzdGF0dXMiIGlmIGdlbmVyYWwgc3RhdHVzLgorICoKKyAqIEV4YW1wbGU6IGF1ZGlvLnRyYWNrLjEwICAgICAtPiBwcmVmaXggPSBhdWRpby50cmFjaywgc3VmZml4ID0gMTAKKyAqICAgICAgICAgIGF1ZGlvLnRyYWNrLmVycm9yICAtPiBwcmVmaXggPSBhdWRpby50cmFjaywgc3VmZml4ID0gZXJyb3IKKyAqICAgICAgICAgIGF1ZGlvLnRyYWNrLnN0YXR1cyAtPiBwcmVmaXggPSBhdWRpby50cmFjaywgc3VmZml4ID0gc3RhdHVzCisgKiAgICAgICAgICBhdWRpby5tdXRlICAgICAgICAgLT4gcHJlZml4ID0gYXVkaW8ubXV0ZSwgIHN1ZmZpeCA9ICIiCisgKi8KK2lubGluZSBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcgLyogcHJlZml4ICovLAorICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAvKiBzdWZmaXggKi8+IHNwbGl0UHJlZml4S2V5KGNvbnN0IHN0ZDo6c3RyaW5nICZrZXkpCit7CisgICAgY29uc3Qgc2l6ZV90IHNwbGl0ID0ga2V5LnJmaW5kKCcuJyk7CisgICAgY29uc3QgY2hhciogc3VmZml4ID0ga2V5LmNfc3RyKCkgKyBzcGxpdCArIDE7CisgICAgaWYgKCpzdWZmaXggJiYgKCFzdHJjbXAoc3VmZml4LCAiZXJyb3IiKSB8fCAhc3RyY21wKHN1ZmZpeCwgInN0YXR1cyIpIHx8IGlzTnVtZXJpYyhzdWZmaXgpKSkgeworICAgICAgICByZXR1cm4geyBrZXkuc3Vic3RyKDAsIHNwbGl0KSwgc3VmZml4IH07CisgICAgfQorICAgIHJldHVybiB7IGtleSwgIiIgfTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlscwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1RpbWVNYWNoaW5lLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RpbWVNYWNoaW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9UaW1lTWFjaGluZS5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RpbWVNYWNoaW5lLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9UaW1lZEFjdGlvbi5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UaW1lZEFjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVGltZWRBY3Rpb24uaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UaW1lZEFjdGlvbi5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVHJhbnNhY3Rpb25Mb2cuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UcmFuc2FjdGlvbkxvZy5oCmluZGV4IDBjYTQ2MzkuLmZkNDI1MTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9UcmFuc2FjdGlvbkxvZy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVHJhbnNhY3Rpb25Mb2cuaApAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgICAgICAgICAgKytpdCkgewogICAgICAgICAgICAgaWYgKGxsIDw9IDApIGJyZWFrOwogICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxscHRyICYmICFzdGFydHNXaXRoKGl0LT5maXJzdCwgcHJlZml4KSkgYnJlYWs7Ci0gICAgICAgICAgICBhdXRvIFtzLCBsXSA9IGR1bXBNYXBUaW1lSXRlbShpdC0+c2Vjb25kLCBsbCAtIDEsIHNpbmNlTnMsIHByZWZpeCk7CisgICAgICAgICAgICBzdGQ6OnRpZShzLCBsKSA9IGR1bXBNYXBUaW1lSXRlbShpdC0+c2Vjb25kLCBsbCAtIDEsIHNpbmNlTnMsIHByZWZpeCk7CiAgICAgICAgICAgICBpZiAobCA9PSAwKSBjb250aW51ZTsgLy8gZG9uJ3Qgc2hvdyBlbXB0eSBncm91cHMgKGR1ZSB0byBzaW5jZU5zKS4KICAgICAgICAgICAgIHNzIDw8ICIgIiA8PCBpdC0+Zmlyc3QgPDwgIlxuIiA8PCBzOwogICAgICAgICAgICAgbGwgLT0gbCArIDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1ZhbGlkYXRlSWQuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVmFsaWRhdGVJZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NmIzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1ZhbGlkYXRlSWQuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJMcnVTZXQuaCIKKyNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIldyYXAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcyB7CisKKy8qCisgKiBWYWxpZGF0ZUlkIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgbG9nIHNlc3Npb24gaWQgaXMgcHJvcGVybHkgZm9ybWVkCisgKiBhbmQgaGFzIGJlZW4gcmVnaXN0ZXJlZCAoaS5lLiBmcm9tIHRoZSBKYXZhIE1lZGlhTWV0cmljc01hbmFnZXJTZXJ2aWNlKS4KKyAqCisgKiBUaGUgZGVmYXVsdCBtZW1vcnkgd2luZG93IHRvIHRyYWNrIHJlZ2lzdGVyZWQgaWRzIGlzIHNldCB0byBTSU5HTEVUT05fTFJVX1NFVF9TSVpFLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLCBidXQgdGhlIHNpbmdsZXRvbiByZXR1cm5lZCBieSBnZXQoKSB1c2VzIExvY2tXcmFwPD4KKyAqIHRvIGVuc3VyZSB0aHJlYWQtc2FmZXR5LgorICovCitjbGFzcyBWYWxpZGF0ZUlkIHsKKyAgICBtZWRpYW1ldHJpY3M6OkxydVNldDxzdGQ6OnN0cmluZz4gbUlkU2V0OworICAgIHNpemVfdCBtSW52YWxpZElkcyA9IDA7ICAvLyBjb3VudCBpbnZhbGlkIGlkcyBlbmNvdW50ZXJlZC4KK3B1YmxpYzoKKyAgICAvKiogQ3JlYXRlcyBhIFZhbGlkYXRlSWQgb2JqZWN0IHdpdGggc2l6ZSBtZW1vcnkgd2luZG93LiAqLworICAgIGV4cGxpY2l0IFZhbGlkYXRlSWQoc2l6ZV90IHNpemUpIDogbUlkU2V0e3NpemV9IHt9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyBkdW1wIG9mIHJlY2VudCBjb250ZW50cyBhbmQgc3RhdHMuICovCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIHRoZSBpZCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBJZiBpZCBzdHJpbmcgaXMgbWFsZm9ybWVkIChub3QgMTYgQmFzZTY0VXJsIGNoYXJzKSwgaXQgaXMgaWdub3JlZC4KKyAgICAgKiBPbmNlIHJlZ2lzdGVyZWQsIGNhbGxpbmcgdmFsaWRhdGVJZCgpIHdpbGwgcmV0dXJuIGlkIChpbnN0ZWFkIG9mIHRoZSBlbXB0eSBzdHJpbmcpLgorICAgICAqIFZhbGlkYXRlSWQgbWF5ICJmb3JnZXQiIHRoZSBpZCBhZnRlciBub3QgZW5jb3VudGVyaW5nIGl0IHdpdGhpbiB0aGUgcGFzdCBOIGlkcywKKyAgICAgKiB3aGVyZSBOIGlzIHRoZSBzaXplIHNldCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBwYXJhbSBpZCBzdHJpbmcgKGZyb20gTWVkaWFNZXRyaWNzTWFuYWdlclNlcnZpY2UpLgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJJZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIGlkIHN0cmluZyBpcyBtYWxmb3JtZWQgKG5vdCAxNiBCYXNlNjRVcmwgY2hhcnMpCisgICAgICogb3IgaWYgaWQgc3RyaW5nIGhhcyBub3QgYmVlbiBzZWVuIChpbiB0aGUgcmVjZW50IHNpemUgaWRzKTsKKyAgICAgKiBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgc2FtZSBpZCBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgc3RyaW5nICh0byBiZSBzZW50IHRvIHN0YXRzZCkuCisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbGlkYXRlSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKKworICAgIC8qKiBTaW5nbGV0b24gc2V0IHNpemUgKi8KKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0ZXhwciBzaXplX3QgU0lOR0xFVE9OX0xSVV9TRVRfU0laRSA9IDIwMDA7CisKKyAgICB1c2luZyBMb2NrZWRWYWxpZGF0ZUlkID0gbWVkaWFtZXRyaWNzOjpMb2NrV3JhcDxWYWxpZGF0ZUlkPjsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGxvY2tlZCBWYWxpZGF0ZUlkIG9iamVjdCB0aGF0IGlzIHRocmVhZC1zYWZlIHVzaW5nIExvY2tXcmFwPD4uCisgICAgICoKKyAgICAgKiBUaGUgU2luZ2xldG9uIFZhbGlkYXRlSWQgb2JqZWN0IGlzIGNyZWF0ZWQgd2l0aCBzaXplIExSVV9TRVRfU0laRSAoZHVyaW5nIGZpcnN0IGNhbGwpLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgTG9ja2VkVmFsaWRhdGVJZCYgZ2V0KCkgeworICAgICAgICBzdGF0aWMgTG9ja2VkVmFsaWRhdGVJZCBwcml2YXRlU2V0e1NJTkdMRVRPTl9MUlVfU0VUX1NJWkV9OworICAgICAgICByZXR1cm4gcHJpdmF0ZVNldDsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9XcmFwLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1dyYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL1dyYXAuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9XcmFwLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9jbGVhbmVyLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL2NsZWFuZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL2NsZWFuZXIuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9jbGVhbmVyLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pZmFjZV9zdGF0c2QuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvaWZhY2Vfc3RhdHNkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pZmFjZV9zdGF0c2QuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9pZmFjZV9zdGF0c2QuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL21haW5fbWVkaWFtZXRyaWNzLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9tYWluX21lZGlhbWV0cmljcy5jcHAKaW5kZXggM2E2NjUzOC4uNDU1ZDY3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL21haW5fbWVkaWFtZXRyaWNzLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvbWFpbl9tZWRpYW1ldHJpY3MuY3BwCkBAIC0xOCwxMSArMTgsMTAgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLQogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWFtZXRyaWNzc2VydmljZS9NZWRpYU1ldHJpY3NTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9MaW1pdFByb2Nlc3NNZW1vcnkuaD4KIAogaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2KQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3JlY29yZC5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcAppbmRleCA0MWVmY2FhLi5hN2IwNDVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcApAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCiAjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIApAQCAtODAsMTYgKzgwLDIwIEBACiAgICAgfQogCiAgICAgaW50NjRfdCBjcmVhdGVkX21pbGxpcyA9IC0xOworICAgIC8vIG5vdCBjdXJyZW50bHkgc2VudCBmcm9tIGNsaWVudC4KICAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY3JlYXRlZE1zIiwgJmNyZWF0ZWRfbWlsbGlzKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jcmVhdGVkX21pbGxpcyhjcmVhdGVkX21pbGxpcyk7CiAgICAgfQogCiAgICAgaW50NjRfdCBkdXJhdGlvbl9taWxsaXMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZHVyYXRpb25NcyIsICZkdXJhdGlvbl9taWxsaXMpKSB7CisgICAgZG91YmxlIGR1cmF0aW9uTXMgPSAwLjsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmR1cmF0aW9uTXMiLCAmZHVyYXRpb25NcykpIHsKKyAgICAgICAgZHVyYXRpb25fbWlsbGlzID0gKGludDY0X3QpZHVyYXRpb25NczsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfZHVyYXRpb25fbWlsbGlzKGR1cmF0aW9uX21pbGxpcyk7CiAgICAgfQogCiAgICAgaW50MzJfdCBjb3VudCA9IC0xOworICAgIC8vIG5vdCBjdXJyZW50bHkgc2VudCBmcm9tIGNsaWVudC4gIChzZWUgc3RhcnQgY291bnQgaW5zdGVhZCkuCiAgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLm4iLCAmY291bnQpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvdW50KGNvdW50KTsKICAgICB9CkBAIC0xMjksNyArMTMzLDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHN0YXJ0X2NvdW50ID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnN0YXJ0Y291bnQiLCAmc3RhcnRfY291bnQpKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnN0YXJ0Q291bnQiLCAmc3RhcnRfY291bnQpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXJ0X2NvdW50KHN0YXJ0X2NvdW50KTsKICAgICB9CiAKQEAgLTE0Myw4ICsxNDcsNyBAQAogICAgIC8vIGxvZ19zZXNzaW9uX2lkIChzdHJpbmcpCiAgICAgc3RkOjpzdHJpbmcgbG9nU2Vzc2lvbklkOwogICAgICh2b2lkKWl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5sb2dTZXNzaW9uSWQiLCAmbG9nU2Vzc2lvbklkKTsKLSAgICBjb25zdCBhdXRvIGxvZ19zZXNzaW9uX2lkID0KLSAgICAgICAgICAgIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CisgICAgY29uc3QgYXV0byBsb2dfc2Vzc2lvbl9pZCA9IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nU2Vzc2lvbklkKTsKIAogICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CiAgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1JFQ09SRF9SRVBPUlRFRCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwCmluZGV4IDU5NjI3YWUuLjY3NTE0ZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcApAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCiAjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIApAQCAtNTYsNTIgKzU2LDQ3IEBACiAgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCiAgICAgLy8KIAotICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0cmVhbVR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSI7CisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGlzIHdpdGhvdXQgY2hhbmdpbmcgQXVkaW9UcmFjay5jcHAgY29sbGVjdGlvbi4KKwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzdHJlYW1UeXBlOwogICAgIHN0ZDo6c3RyaW5nIHN0cmVhbV90eXBlOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zdHJlYW10eXBlIiwgJnN0cmVhbV90eXBlKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdHJlYW1fdHlwZShzdHJlYW1fdHlwZSk7CiAgICAgfQogCi0gICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrQ29udGVudFR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudHlwZSI7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnRUeXBlOwogICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRfdHlwZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudHlwZSIsICZjb250ZW50X3R5cGUpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvbnRlbnRfdHlwZShjb250ZW50X3R5cGUpOwogICAgIH0KIAotICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VzYWdlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIjsKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhY2tVc2FnZTsKICAgICBzdGQ6OnN0cmluZyB0cmFja191c2FnZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudXNhZ2UiLCAmdHJhY2tfdXNhZ2UpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RyYWNrX3VzYWdlKHRyYWNrX3VzYWdlKTsKICAgICB9CiAKLSAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiOwotICAgIC8vIG9wdGlvbmFsIGludDMyIHNhbXBsZXJhdGU7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgc2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IHNhbXBsZV9yYXRlID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc2FtcGxlcmF0ZSIsICZzYW1wbGVfcmF0ZSkpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zYW1wbGVSYXRlIiwgJnNhbXBsZV9yYXRlKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zYW1wbGVfcmF0ZShzYW1wbGVfcmF0ZSk7CiAgICAgfQogCi0gICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrQ2hhbm5lbE1hc2tbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suY2hhbm5lbG1hc2siOwogICAgIC8vIG9wdGlvbmFsIGludDY0IGNoYW5uZWxNYXNrOwogICAgIGludDY0X3QgY2hhbm5lbF9tYXNrID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suY2hhbm5lbG1hc2siLCAmY2hhbm5lbF9tYXNrKSkgeworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxNYXNrIiwgJmNoYW5uZWxfbWFzaykpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfY2hhbm5lbF9tYXNrKGNoYW5uZWxfbWFzayk7CiAgICAgfQogCi0gICAgLy8gTkI6IFRoZXNlIGFyZSBub3QgeWV0IGV4cG9zZWQgYXMgcHVibGljIEphdmEgQVBJIGNvbnN0YW50cy4KLSAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tVbmRlcnJ1bkZyYW1lc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bmZyYW1lcyI7Ci0gICAgLy8gb3B0aW9uYWwgaW50MzIgdW5kZXJydW5mcmFtZXM7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgdW5kZXJydW5GcmFtZXM7CiAgICAgaW50MzJfdCB1bmRlcnJ1bl9mcmFtZXMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bmZyYW1lcyIsICZ1bmRlcnJ1bl9mcmFtZXMpKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudW5kZXJydW5GcmFtZXMiLCAmdW5kZXJydW5fZnJhbWVzKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF91bmRlcnJ1bl9mcmFtZXModW5kZXJydW5fZnJhbWVzKTsKICAgICB9CiAKLSAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdGFydHVwR2xpdGNoW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmdsaXRjaC5zdGFydHVwIjsKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydHVwZ2xpdGNoOworICAgIC8vIG9wdGlvbmFsIGludDMyIGdsaXRjaC5zdGFydHVwOwogICAgIGludDMyX3Qgc3RhcnR1cF9nbGl0Y2ggPSAtMTsKKyAgICAvLyBOb3QgY3VycmVudGx5IHNlbnQgZnJvbSBjbGllbnQuCiAgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiLCAmc3RhcnR1cF9nbGl0Y2gpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXJ0dXBfZ2xpdGNoKHN0YXJ0dXBfZ2xpdGNoKTsKICAgICB9CkBAIC0xMzcsOCArMTMyLDcgQEAKICAgICAvLyBsb2dfc2Vzc2lvbl9pZCAoc3RyaW5nKQogICAgIHN0ZDo6c3RyaW5nIGxvZ1Nlc3Npb25JZDsKICAgICAodm9pZClpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5sb2dTZXNzaW9uSWQiLCAmbG9nU2Vzc2lvbklkKTsKLSAgICBjb25zdCBhdXRvIGxvZ19zZXNzaW9uX2lkID0KLSAgICAgICAgICAgIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CisgICAgY29uc3QgYXV0byBsb2dfc2Vzc2lvbl9pZCA9IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nU2Vzc2lvbklkKTsKIAogICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CiAgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RSQUNLX1JFUE9SVEVELApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2NvZGVjLmNwcAppbmRleCA0NmNiZGM4Li5hNzM3YmEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2NvZGVjLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2NvZGVjLmNwcApAQCAtMzQsNyArMzQsNyBAQAogCiAjaW5jbHVkZSAiY2xlYW5lci5oIgogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCkBAIC0yMjgsMTAgKzIyOCwxMCBAQAogCiAgICAgc3RkOjpzdHJpbmcgc2Vzc2lvbklkOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sb2ctc2Vzc2lvbi1pZCIsICZzZXNzaW9uSWQpKSB7Ci0gICAgICAgIHNlc3Npb25JZCA9IG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKHNlc3Npb25JZCk7CisgICAgICAgIHNlc3Npb25JZCA9IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQoc2Vzc2lvbklkKTsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfbG9nX3Nlc3Npb25faWQoc2Vzc2lvbklkKTsKICAgICB9Ci0gICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIGNvZGVjLmNfc3RyKCkpOworICAgIEFTdGF0c0V2ZW50X3dyaXRlU3RyaW5nKGV2ZW50LCBzZXNzaW9uSWQuY19zdHIoKSk7CiAKICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNoYW5uZWxDb3VudCIsICZjaGFubmVsQ291bnQpKSB7CkBAIC0zOTAsNiArMzkwLDYwIEBACiAgICAgfQogICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwQk1heE9yaSk7CiAKKyAgICBpbnQzMl90IGNvbmZpZ0NvbG9yU3RhbmRhcmQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb25maWctY29sb3Itc3RhbmRhcmQiLCAmY29uZmlnQ29sb3JTdGFuZGFyZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29uZmlnX2NvbG9yX3N0YW5kYXJkKGNvbmZpZ0NvbG9yU3RhbmRhcmQpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBjb25maWdDb2xvclN0YW5kYXJkKTsKKworICAgIGludDMyX3QgY29uZmlnQ29sb3JSYW5nZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbmZpZy1jb2xvci1yYW5nZSIsICZjb25maWdDb2xvclJhbmdlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jb25maWdfY29sb3JfcmFuZ2UoY29uZmlnQ29sb3JSYW5nZSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGNvbmZpZ0NvbG9yUmFuZ2UpOworCisgICAgaW50MzJfdCBjb25maWdDb2xvclRyYW5zZmVyID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29uZmlnLWNvbG9yLXRyYW5zZmVyIiwgJmNvbmZpZ0NvbG9yVHJhbnNmZXIpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvbmZpZ19jb2xvcl90cmFuc2Zlcihjb25maWdDb2xvclRyYW5zZmVyKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgY29uZmlnQ29sb3JUcmFuc2Zlcik7CisKKyAgICBpbnQzMl90IHBhcnNlZENvbG9yU3RhbmRhcmQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wYXJzZWQtY29sb3Itc3RhbmRhcmQiLCAmcGFyc2VkQ29sb3JTdGFuZGFyZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGFyc2VkX2NvbG9yX3N0YW5kYXJkKHBhcnNlZENvbG9yU3RhbmRhcmQpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBwYXJzZWRDb2xvclN0YW5kYXJkKTsKKworICAgIGludDMyX3QgcGFyc2VkQ29sb3JSYW5nZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBhcnNlZC1jb2xvci1yYW5nZSIsICZwYXJzZWRDb2xvclJhbmdlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wYXJzZWRfY29sb3JfcmFuZ2UocGFyc2VkQ29sb3JSYW5nZSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHBhcnNlZENvbG9yUmFuZ2UpOworCisgICAgaW50MzJfdCBwYXJzZWRDb2xvclRyYW5zZmVyID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGFyc2VkLWNvbG9yLXRyYW5zZmVyIiwgJnBhcnNlZENvbG9yVHJhbnNmZXIpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhcnNlZF9jb2xvcl90cmFuc2ZlcihwYXJzZWRDb2xvclRyYW5zZmVyKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcGFyc2VkQ29sb3JUcmFuc2Zlcik7CisKKyAgICBpbnQzMl90IGhkclN0YXRpY0luZm8gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZHItc3RhdGljLWluZm8iLCAmaGRyU3RhdGljSW5mbykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaGRyX3N0YXRpY19pbmZvKGhkclN0YXRpY0luZm8pOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBoZHJTdGF0aWNJbmZvKTsKKworICAgIGludDMyX3QgaGRyMTBQbHVzSW5mbyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9oZHIxMF9wbHVzX2luZm8oaGRyMTBQbHVzSW5mbyk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGhkcjEwUGx1c0luZm8pOworCisgICAgaW50MzJfdCBoZHJGb3JtYXQ9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhkci1mb3JtYXQiLCAmaGRyRm9ybWF0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9oZHJfZm9ybWF0KGhkckZvcm1hdCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGhkckZvcm1hdCk7CisKICAgICBpbnQgZXJyID0gQVN0YXRzRXZlbnRfd3JpdGUoZXZlbnQpOwogICAgIGlmIChlcnIgPCAwKSB7CiAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHdyaXRlIGNvZGVjIG1ldHJpY3MgdG8gc3RhdHNkICglZCkiLCBlcnIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9kcm0uY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9kcm0uY3BwCmluZGV4IDI4N2ZiOGQuLmUwNmE2MDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZHJtLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2RybS5jcHAKQEAgLTE3MSw3ICsxNzEsNyBAQAogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZihzdHIubGVuZ3RoKCkgLyA0ICogMywgMCk7CiAgICAgc2l6ZV90IHNpemUgPSBidWYuc2l6ZSgpOwogICAgIGlmIChkZWNvZGVCYXNlNjQoYnVmLmRhdGEoKSwgJnNpemUsIHN0ci5jX3N0cigpKSAmJiBzaXplIDw9IGJ1Zi5zaXplKCkpIHsKLSAgICAgICAgYnVmLmVyYXNlKGJ1Zi5iZWdpbigpICsgc2l6ZSwgYnVmLmVuZCgpKTsKKyAgICAgICAgYnVmLmVyYXNlKGJ1Zi5iZWdpbigpICsgKHB0cmRpZmZfdClzaXplLCBidWYuZW5kKCkpOwogICAgICAgICByZXR1cm4gYnVmOwogICAgIH0KICAgICByZXR1cm4ge307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAKaW5kZXggYmNmMmUwYS4uYThiZmVhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcApAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCiAjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIApAQCAtODYsNyArODYsNyBAQAogCiAgICAgc3RkOjpzdHJpbmcgbG9nX3Nlc3Npb25faWQ7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5sb2dTZXNzaW9uSWQiLCAmbG9nX3Nlc3Npb25faWQpKSB7Ci0gICAgICAgIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQobG9nX3Nlc3Npb25faWQpOworICAgICAgICBsb2dfc2Vzc2lvbl9pZCA9IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nX3Nlc3Npb25faWQpOwogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sb2dfc2Vzc2lvbl9pZChsb2dfc2Vzc2lvbl9pZCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX21lZGlhcGFyc2VyLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwCmluZGV4IDkyMWIzMjAuLjY3Y2E4NzRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX21lZGlhcGFyc2VyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX21lZGlhcGFyc2VyLmNwcApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCiAjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIApAQCAtODEsNyArODEsNyBAQAogCiAgICAgc3RkOjpzdHJpbmcgbG9nU2Vzc2lvbklkOwogICAgIGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBhcnNlci5sb2dTZXNzaW9uSWQiLCAmbG9nU2Vzc2lvbklkKTsKLSAgICBsb2dTZXNzaW9uSWQgPSBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOworICAgIGxvZ1Nlc3Npb25JZCA9IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nU2Vzc2lvbklkKTsKIAogICAgIGludCByZXN1bHQgPSBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfTUVESUFQQVJTRVJfUkVQT1JURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wX25hbm9zLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9yZWNvcmRlci5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcAppbmRleCBiMjlhZDczLi41ZjU0YTY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcApAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCiAjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIApAQCAtNTksNyArNTksNyBAQAogICAgIC8vIHN0cmluZyBrUmVjb3JkZXJMb2dTZXNzaW9uSWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmxvZy1zZXNzaW9uLWlkIjsKICAgICBzdGQ6OnN0cmluZyBsb2dfc2Vzc2lvbl9pZDsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubG9nLXNlc3Npb24taWQiLCAmbG9nX3Nlc3Npb25faWQpKSB7Ci0gICAgICAgIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQobG9nX3Nlc3Npb25faWQpOworICAgICAgICBsb2dfc2Vzc2lvbl9pZCA9IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnZhbGlkYXRlSWQobG9nX3Nlc3Npb25faWQpOwogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sb2dfc2Vzc2lvbl9pZChsb2dfc2Vzc2lvbl9pZCk7CiAgICAgfQogICAgIC8vIHN0cmluZyBrUmVjb3JkZXJBdWRpb01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLm1pbWUiOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icAppbmRleCAzYmFmNzM5Li5mNDZmYmFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icApAQCAtMzMsNiArMzMsNyBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9tZWRpYW1ldHJpY3NfdGVzdHMuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKaW5kZXggMjMzNmQ2Zi4uYmM3YjQ3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKQEAgLTE3LDE4ICsxNywxOCBAQAogI2RlZmluZSBMT0dfVEFHICJtZWRpYW1ldHJpY3NfdGVzdHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL1N0cmluZ1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFtZXRyaWNzc2VydmljZS9WYWxpZGF0ZUlkLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKLSNpbmNsdWRlICJBdWRpb1R5cGVzLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKLQogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyBzaXplX3QgY291bnROZXdsaW5lcyhjb25zdCBjaGFyICpzKSB7CkBAIC0xMTI3LDMgKzExMjcsMTY5IEBACiAgICB2YWxpZElkMlszXSA9ICchJzsKICAgIEFTU0VSVF9FUSgiIiwgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQodmFsaWRJZDIpKTsKIH0KKworVEVTVChtZWRpYW1ldHJpY3NfdGVzdHMsIExydVNldCkgeworICAgIGNvbnN0ZXhwciBzaXplX3QgTFJVX1NFVF9TSVpFID0gMjsKKyAgICBtZWRpYW1ldHJpY3M6OkxydVNldDxzdGQ6OnN0cmluZz4gbHJ1U2V0KExSVV9TRVRfU0laRSk7CisKKyAgICAvLyB0ZXN0IGFkZGluZyBhIGNvdXBsZSBzdHJpbmdzLgorICAgIGxydVNldC5hZGQoImFiYyIpOworICAgIEFTU0VSVF9FUSgxdSwgbHJ1U2V0LnNpemUoKSk7CisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJhYmMiKSk7CisgICAgbHJ1U2V0LmFkZCgiZGVmIik7CisgICAgQVNTRVJUX0VRKDJ1LCBscnVTZXQuc2l6ZSgpKTsKKworICAgIC8vIG5vdyBhZGRpbmcgdGhlIHRoaXJkIHN0cmluZyBjYXVzZXMgZXZpY3Rpb24gb2YgdGhlIG9sZGVzdC4KKyAgICBscnVTZXQuYWRkKCJnaGkiKTsKKyAgICBBU1NFUlRfRkFMU0UobHJ1U2V0LmNoZWNrKCJhYmMiKSk7CisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJnaGkiKSk7CisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJkZWYiKSk7ICAvLyAiZGVmIiBpcyBtb3N0IHJlY2VudC4KKyAgICBBU1NFUlRfRVEoMnUsIGxydVNldC5zaXplKCkpOyAgICAgIC8vICJhYmMiIGlzIGNvcnJlY3RseSBkaXNjYXJkZWQuCisKKyAgICAvLyBhZGRpbmcgYW5vdGhlciBzdHJpbmcgd2lsbCBldmljdCB0aGUgb2xkZXN0LgorICAgIGxydVNldC5hZGQoImZvbyIpOworICAgIEFTU0VSVF9GQUxTRShscnVTZXQuY2hlY2soImdoaSIpKTsgLy8gbm90ZTogImdoaSIgZGlzY2FyZGVkIHdoZW4gImZvbyIgYWRkZWQuCisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJmb28iKSk7CisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJkZWYiKSk7CisKKyAgICAvLyBtYW51YWwgcmVtb3Zpbmcgb2YgYSBzdHJpbmcgd29ya3MsIHRvby4KKyAgICBBU1NFUlRfVFJVRShscnVTZXQucmVtb3ZlKCJkZWYiKSk7CisgICAgQVNTRVJUX0ZBTFNFKGxydVNldC5jaGVjaygiZGVmIikpOyAvLyB3ZSBtYW51YWxseSByZW1vdmVkICJkZWYiLgorICAgIEFTU0VSVF9UUlVFKGxydVNldC5jaGVjaygiZm9vIikpOyAgLy8gImZvbyIgaXMgc3RpbGwgdGhlcmUuCisgICAgQVNTRVJUX0VRKDF1LCBscnVTZXQuc2l6ZSgpKTsKKworICAgIC8vIHlvdSBjYW4ndCByZW1vdmUgYSBzdHJpbmcgdGhhdCBoYXMgbm90IGJlZW4gYWRkZWQuCisgICAgQVNTRVJUX0ZBTFNFKGxydVNldC5yZW1vdmUoImJhciIpKTsgLy8gTm90ZTogImJhciIgZG9lc24ndCBleGlzdCwgc28gcmVtb3ZlIHJldHVybnMgZmFsc2UuCisgICAgQVNTRVJUX0VRKDF1LCBscnVTZXQuc2l6ZSgpKTsKKworICAgIGxydVNldC5hZGQoImZvbyIpOyAgIC8vIGFkZGluZyAiZm9vIiAod2hpY2ggYWxyZWFkeSBleGlzdHMpIGRvZXNuJ3QgY2hhbmdlIHNpemUuCisgICAgQVNTRVJUX0VRKDF1LCBscnVTZXQuc2l6ZSgpKTsKKyAgICBscnVTZXQuYWRkKCJiYXIiKTsgICAvLyBhZGQgImJhciIKKyAgICBBU1NFUlRfRVEoMnUsIGxydVNldC5zaXplKCkpOworICAgIGxydVNldC5hZGQoImdsb3JwIik7IC8vIGFkZCAiZ2xvcnAiIGV2aWN0cyAiZm9vIi4KKyAgICBBU1NFUlRfRVEoMnUsIGxydVNldC5zaXplKCkpOworICAgIEFTU0VSVF9UUlVFKGxydVNldC5jaGVjaygiYmFyIikpOworICAgIEFTU0VSVF9UUlVFKGxydVNldC5jaGVjaygiZ2xvcnAiKSk7CisgICAgQVNTRVJUX0ZBTFNFKGxydVNldC5jaGVjaygiZm9vIikpOworfQorCitURVNUKG1lZGlhbWV0cmljc190ZXN0cywgTHJ1U2V0MCkgeworICAgIGNvbnN0ZXhwciBzaXplX3QgTFJVX1NFVF9TSVpFID0gMDsKKyAgICBtZWRpYW1ldHJpY3M6OkxydVNldDxzdGQ6OnN0cmluZz4gbHJ1U2V0KExSVV9TRVRfU0laRSk7CisKKyAgICBscnVTZXQuYWRkKCJhIik7CisgICAgQVNTRVJUX0VRKDB1LCBscnVTZXQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UobHJ1U2V0LmNoZWNrKCJhIikpOworICAgIEFTU0VSVF9GQUxTRShscnVTZXQucmVtb3ZlKCJhIikpOyAvLyBuZXZlciBhZGRlZC4KKyAgICBBU1NFUlRfRVEoMHUsIGxydVNldC5zaXplKCkpOworfQorCisvLyBSZXR1cm5zIGEgMTYgQmFzZTY0VXJsIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdmFsdWUKKy8vICh3aXRoIGxlYWRpbmcgMHMpIGUuZy4gMDAwMDAwMDAwMDAwMDAwMCwgMDAwMDAwMDAwMDAwMDAwMSwgMDAwMDAwMDAwMDAwMDAwMiwgLi4uCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2VuZXJhdGVJZChzaXplX3QgdmFsdWUpCit7CisgICAgY2hhciBpZFsxNiArIDFdOyAvLyB0byBiZSBmaWxsZWQgd2l0aCAxNiBCYXNlNjRVcmwgY2hhcnMgKGFuZCB6ZXJvIHRlcm1pbmF0aW9uKQorICAgIGNoYXIgKnNwdHIgPSBpZCArIDE2OyAvLyBzdGFydCBhdCB0aGUgZW5kLgorICAgICpzcHRyLS0gPSAwOyAvLyB6ZXJvIHRlcm1pbmF0ZS4KKyAgICAvLyBvdXRwdXQgdGhlIGRpZ2l0cyBmcm9tIGxlYXN0IHNpZ25pZmljYW50IHRvIG1vc3Qgc2lnbmlmaWNhbnQuCisgICAgd2hpbGUgKHZhbHVlKSB7CisgICAgICAgICpzcHRyLS0gPSB2YWx1ZSAlIDEwOworICAgICAgICB2YWx1ZSAvPSAxMDsKKyAgICB9CisgICAgLy8gYWRkIGxlYWRpbmcgMCdzCisgICAgd2hpbGUgKHNwdHIgPiBpZCkgeworICAgICAgICAqc3B0ci0tID0gJzAnOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoaWQpOworfQorCitURVNUKG1lZGlhbWV0cmljc190ZXN0cywgVmFsaWRhdGVJZCkgeworICAgIGNvbnN0ZXhwciBzaXplX3QgTFJVX1NFVF9TSVpFID0gMzsKKyAgICBjb25zdGV4cHIgc2l6ZV90IElEUyA9IDEwOworICAgIHN0YXRpY19hc3NlcnQoSURTID4gTFJVX1NFVF9TSVpFKTsgIC8vIElEUyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBMUlVfU0VUX1NJWkUuCisgICAgbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkIHZhbGlkYXRlSWQoTFJVX1NFVF9TSVpFKTsKKworCisgICAgLy8gcmVnaXN0ZXIgSURzIGFzIGludGVnZXIgc3RyaW5ncyBjb3VudGluZyBmcm9tIDAuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBJRFM7ICsraSkgeworICAgICAgICB2YWxpZGF0ZUlkLnJlZ2lzdGVySWQoZ2VuZXJhdGVJZChpKSk7CisgICAgfQorCisgICAgLy8gb25seSB0aGUgbGFzdCBMUlVfU0VUX1NJWkUgZXhpc3QuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBJRFMgLSBMUlVfU0VUX1NJWkU7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoIiIsIHZhbGlkYXRlSWQudmFsaWRhdGVJZChnZW5lcmF0ZUlkKGkpKSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSBJRFMgLSBMUlVfU0VUX1NJWkU7IGkgPCBJRFM7ICsraSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBpZCA9IGdlbmVyYXRlSWQoaSk7CisgICAgICAgIEFTU0VSVF9FUShpZCwgdmFsaWRhdGVJZC52YWxpZGF0ZUlkKGlkKSk7CisgICAgfQorfQorCitURVNUKG1lZGlhbWV0cmljc190ZXN0cywgU3RhdHVzQ29udmVyc2lvbikgeworICAgIGNvbnN0ZXhwciBzdGF0dXNfdCBzdGF0dXNlc1tdID0geworICAgICAgICBOT19FUlJPUiwKKyAgICAgICAgQkFEX1ZBTFVFLAorICAgICAgICBERUFEX09CSkVDVCwKKyAgICAgICAgTk9fTUVNT1JZLAorICAgICAgICBQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgIFdPVUxEX0JMT0NLLAorICAgICAgICBVTktOT1dOX0VSUk9SLAorICAgIH07CisKKyAgICBhdXRvIHJvdW5kVHJpcCA9IFtdKHN0YXR1c190IHN0YXR1cykgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpzdGF0dXNTdHJpbmdUb1N0YXR1cygKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OnN0YXR1c1RvU3RhdHVzU3RyaW5nKHN0YXR1cykpOworICAgIH07CisKKyAgICAvLyBQcmltYXJ5IHN0YXR1cyBlcnJvciBjYXRlZ29yaWVzLgorICAgIGZvciAoY29uc3QgYXV0byBzdGF0dXMgOiBzdGF0dXNlcykgeworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCByb3VuZFRyaXAoc3RhdHVzKSk7CisgICAgfQorCisgICAgLy8gU3RhdHVzIGVycm9ycyBzcGVjaWFsbHkgY29uc2lkZXJlZC4KKyAgICBBU1NFUlRfRVEoREVBRF9PQkpFQ1QsIHJvdW5kVHJpcChGQUlMRURfVFJBTlNBQ1RJT04pKTsKK30KKworVEVTVChtZWRpYW1ldHJpY3NfdGVzdHMsIEhlYXRNYXApIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IFNJWkUgPSAyOworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SGVhdE1hcCBoZWF0TWFwe1NJWkV9OworICAgIGNvbnN0ZXhwciB1aWRfdCBVSUQgPSAwOworICAgIGNvbnN0ZXhwciBpbnQzMl90IFNVQkNPREUgPSAxOworCisgICAgQVNTRVJUX0VRKChzaXplX3QpMCwgaGVhdE1hcC5zaXplKCkpOworICAgIGhlYXRNYXAuYWRkKCJzb21lS2V5IiwgInNvbWVTdWZmaXgiLCAic29tZUV2ZW50IiwKKyAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfT0ssIFVJRCwgIm1lc3NhZ2UiLCBTVUJDT0RFKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkxLCBoZWF0TWFwLnNpemUoKSk7CisgICAgaGVhdE1hcC5hZGQoInNvbWVLZXkiLCAic29tZVN1ZmZpeCIsICJzb21lRXZlbnQiLAorICAgICAgICAgICAgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSywgVUlELCAibWVzc2FnZSIsIFNVQkNPREUpOworICAgIGhlYXRNYXAuYWRkKCJzb21lS2V5IiwgInNvbWVTdWZmaXgiLCAiYW5vdGhlckV2ZW50IiwKKyAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfQVJHVU1FTlQsIFVJRCwgIm1lc3NhZ2UiLCBTVUJDT0RFKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkxLCBoZWF0TWFwLnNpemUoKSk7CisgICAgaGVhdE1hcC5hZGQoImFub3RoZXJLZXkiLCAic29tZVN1ZmZpeCIsICJzb21lRXZlbnQiLAorICAgICAgICAgICAgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSywgVUlELCAibWVzc2FnZSIsIFNVQkNPREUpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTIsIGhlYXRNYXAuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkwLCBoZWF0TWFwLnJlamVjdGVkKCkpOworCisgICAgaGVhdE1hcC5hZGQoInRoaXJkS2V5IiwgInNvbWVTdWZmaXgiLCAic29tZUV2ZW50IiwKKyAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfT0ssIFVJRCwgIm1lc3NhZ2UiLCBTVUJDT0RFKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkyLCBoZWF0TWFwLnNpemUoKSk7CisgICAgQVNTRVJUX0VRKChzaXplX3QpMSwgaGVhdE1hcC5yZWplY3RlZCgpKTsKKworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SGVhdERhdGEgaGVhdERhdGEgPSBoZWF0TWFwLmdldERhdGEoInNvbWVLZXkiKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkyLCBoZWF0RGF0YS5zaXplKCkpOworICAgIGF1dG8gY291bnQgPSBoZWF0RGF0YS5oZWF0Q291bnQoKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkzLCBjb3VudC5zaXplKCkpOyAvLyBwYWlycyBpbiBvcmRlciB7IHRvdGFsLCAiYW5vdGhlckV2ZW50IiwgInNvbWVFdmVudCIgfQorICAgIC8vIGNoZWNrIHRvdGFsIHZhbHVlCisgICAgQVNTRVJUX0VRKChzaXplX3QpMiwgY291bnRbMF0uZmlyc3QpOyAgLy8gT0sKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkxLCBjb3VudFswXS5zZWNvbmQpOyAvLyBFUlJPUjsKKyAgICAvLyBmaXJzdCBrZXkgImFub3RoZXJFdmVudCIKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkwLCBjb3VudFsxXS5maXJzdCk7ICAvLyBPSworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGNvdW50WzFdLnNlY29uZCk7IC8vIEVSUk9SOworICAgIC8vIHNlY29uZCBrZXkgInNvbWVFdmVudCIKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkyLCBjb3VudFsyXS5maXJzdCk7ICAvLyBPSworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTAsIGNvdW50WzJdLnNlY29uZCk7IC8vIEVSUk9SOworCisgICAgaGVhdE1hcC5jbGVhcigpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTAsIGhlYXRNYXAuc2l6ZSgpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCmluZGV4IGYzMTIwMmIuLjVkODA3NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icApAQCAtOTAsNyArOTAsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIl0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9JTWVkaWFSZXNvdXJjZU1vbml0b3IuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oCmluZGV4IGY5MmQ1NTcuLjRkZDg3ZTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oCkBAIC0zMiw2ICszMiw3IEBACiAgICAgZW51bSB7CiAgICAgICAgIFRZUEVfVklERU9fQ09ERUMgPSAwLAogICAgICAgICBUWVBFX0FVRElPX0NPREVDID0gMSwKKyAgICAgICAgVFlQRV9JTUFHRV9DT0RFQyA9IDIsCiAgICAgfTsKIAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvdXJjZUdyYW50ZWQoLyppbiovIGludDMyX3QgcGlkLCAvKmluKi8gY29uc3QgaW50MzJfdCB0eXBlKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDk1MzY4NmIuLmI0NjEwYmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCkBAIC01MSw4ICs1MSw4IEBACiAKIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgRGVhdGhOb3RpZmllcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UsCi0gICAgICAgICAgICBpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKTsKKyAgICBEZWF0aE5vdGlmaWVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiAmc2VydmljZSwgaW50IHBpZCwKKyAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQpOwogCiAgICAgdmlydHVhbCB+RGVhdGhOb3RpZmllcigpIHt9CiAKQEAgLTEzMCwyNyArMTMwLDQ4IEBACiAgICAgcmV0dXJuIGl0ZW1zU3RyOwogfQogCi1zdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBjb25zdCBSZXNvdXJjZUxpc3QmIHJlc291cmNlcykgeworc3RhdGljIGJvb2wgaGFzUmVzb3VyY2VUeXBlKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAorICAgICAgICBNZWRpYVJlc291cmNlUGFyY2VsIHJlc291cmNlKSB7CisgICAgaWYgKHR5cGUgIT0gcmVzb3VyY2UudHlwZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgLy8gQ29kZWMgc3VidHlwZXMgKGUuZy4gdmlkZW8gdnMuIGF1ZGlvKSBhcmUgZWFjaCBjb25zaWRlcmVkIHNlcGFyYXRlIHJlc291cmNlcywgc28KKyAgICAgICAgLy8gY29tcGFyZSB0aGUgc3VidHlwZXMgYXMgd2VsbC4KKyAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM6CisgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjOgorICAgICAgICAgICAgaWYgKHJlc291cmNlLnN1YlR5cGUgPT0gc3ViVHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE5vbi1jb2RlYyByZXNvdXJjZXMgYXJlIG5vdCBzZWdyZWdhdGVkIGJ5IHRoZSBzdWJ0eXBlIChlLmcuIHZpZGVvIHZzLiBhdWRpbykuCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgIGNvbnN0IFJlc291cmNlTGlzdCYgcmVzb3VyY2VzKSB7CiAgICAgZm9yIChhdXRvIGl0ID0gcmVzb3VyY2VzLmJlZ2luKCk7IGl0ICE9IHJlc291cmNlcy5lbmQoKTsgaXQrKykgewotICAgICAgICBpZiAoaXQtPnNlY29uZC50eXBlID09IHR5cGUpIHsKKyAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBzdWJUeXBlLCBpdC0+c2Vjb25kKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBjb25zdCBSZXNvdXJjZUluZm9zJiBpbmZvcykgeworc3RhdGljIGJvb2wgaGFzUmVzb3VyY2VUeXBlKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAorICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zJiBpbmZvcykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBpbmZvc1tpXS5yZXNvdXJjZXMpKSB7CisgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgc3ViVHlwZSwgaW5mb3NbaV0ucmVzb3VyY2VzKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgUmVzb3VyY2VJbmZvcyYgZ2V0UmVzb3VyY2VJbmZvc0ZvckVkaXQoCi0gICAgICAgIGludCBwaWQsCi0gICAgICAgIFBpZFJlc291cmNlSW5mb3NNYXAmIG1hcCkgeworc3RhdGljIFJlc291cmNlSW5mb3MmIGdldFJlc291cmNlSW5mb3NGb3JFZGl0KGludCBwaWQsIFBpZFJlc291cmNlSW5mb3NNYXAmIG1hcCkgewogICAgIHNzaXplX3QgaW5kZXggPSBtYXAuaW5kZXhPZktleShwaWQpOwogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgLy8gbmV3IHBpZApAQCAtMTYxLDExICsxODIsOCBAQAogICAgIHJldHVybiBtYXAuZWRpdFZhbHVlRm9yKHBpZCk7CiB9CiAKLXN0YXRpYyBSZXNvdXJjZUluZm8mIGdldFJlc291cmNlSW5mb0ZvckVkaXQoCi0gICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIFJlc291cmNlSW5mb3MmIGluZm9zKSB7CitzdGF0aWMgUmVzb3VyY2VJbmZvJiBnZXRSZXNvdXJjZUluZm9Gb3JFZGl0KHVpZF90IHVpZCwgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsIFJlc291cmNlSW5mb3MmIGluZm9zKSB7CiAgICAgc3NpemVfdCBpbmRleCA9IGluZm9zLmluZGV4T2ZLZXkoY2xpZW50SWQpOwogCiAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtMTg4LDE3ICsyMDYsMjQgQEAKICAgICBpZiAoYmluZGVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8SU1lZGlhUmVzb3VyY2VNb25pdG9yPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVzb3VyY2VNb25pdG9yPihiaW5kZXIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5zdWJUeXBlID09IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtBdWRpb0NvZGVjKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX0FVRElPX0NPREVDKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VzW2ldLnN1YlR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLT5ub3RpZnlSZXNvdXJjZUdyYW50ZWQocGlkLCBJTWVkaWFSZXNvdXJjZU1vbml0b3I6OlRZUEVfVklERU9fQ09ERUMpOworICAgICAgICAgICAgc3dpdGNoIChyZXNvdXJjZXNbaV0uc3ViVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeVJlc291cmNlR3JhbnRlZChwaWQsIElNZWRpYVJlc291cmNlTW9uaXRvcjo6VFlQRV9BVURJT19DT0RFQyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeVJlc291cmNlR3JhbnRlZChwaWQsIElNZWRpYVJlc291cmNlTW9uaXRvcjo6VFlQRV9WSURFT19DT0RFQyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeVJlc291cmNlR3JhbnRlZChwaWQsIElNZWRpYVJlc291cmNlTW9uaXRvcjo6VFlQRV9JTUFHRV9DT0RFQyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLWJpbmRlcl9zdGF0dXNfdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpkdW1wKAotICAgICAgICBpbnQgZmQsIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pIHsKK2JpbmRlcl9zdGF0dXNfdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgY2hhcioqIC8qYXJncyovLCB1aW50MzJfdCAvKm51bUFyZ3MqLykgewogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CkBAIC0yNzUsOCArMzAwLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0cnVjdCBTeXN0ZW1DYWxsYmFja0ltcGwgOgotICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2Ugeworc3RydWN0IFN5c3RlbUNhbGxiYWNrSW1wbCA6IHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpTeXN0ZW1DYWxsYmFja0ludGVyZmFjZSB7CiAgICAgU3lzdGVtQ2FsbGJhY2tJbXBsKCkgOiBtQ2xpZW50VG9rZW4obmV3IEJCaW5kZXIoKSkge30KIAogICAgIHZpcnR1YWwgdm9pZCBub3RlU3RhcnRWaWRlbyhpbnQgdWlkKSBvdmVycmlkZSB7CkBAIC0zMDMsOCArMzI3LDcgQEAKIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2UoKQogICAgIDogUmVzb3VyY2VNYW5hZ2VyU2VydmljZShuZXcgUHJvY2Vzc0luZm8oKSwgbmV3IFN5c3RlbUNhbGxiYWNrSW1wbCgpKSB7fQogCi1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKAotICAgICAgICBjb25zdCBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gJnByb2Nlc3NJbmZvLAorUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZShjb25zdCBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gJnByb2Nlc3NJbmZvLAogICAgICAgICBjb25zdCBzcDxTeXN0ZW1DYWxsYmFja0ludGVyZmFjZT4gJnN5c3RlbVJlc291cmNlKQogICAgIDogbVByb2Nlc3NJbmZvKHByb2Nlc3NJbmZvKSwKICAgICAgIG1TeXN0ZW1DQihzeXN0ZW1SZXNvdXJjZSksCkBAIC0zNjIsOCArMzg1LDggQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi12b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om9uRmlyc3RBZGRlZCgKLSAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcmVzb3VyY2UsIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbykgewordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvbkZpcnN0QWRkZWQoY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcmVzb3VyY2UsCisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbykgewogICAgIC8vIGZpcnN0IHRpbWUgYWRkZWQKICAgICBpZiAocmVzb3VyY2UudHlwZSA9PSBNZWRpYVJlc291cmNlOjpUeXBlOjprQ3B1Qm9vc3QKICAgICAgJiYgcmVzb3VyY2Uuc3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlKSB7CkBAIC0zODAsOCArNDAzLDggQEAKICAgICB9CiB9CiAKLXZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b25MYXN0UmVtb3ZlZCgKLSAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcmVzb3VyY2UsIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbykgewordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvbkxhc3RSZW1vdmVkKGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwmIHJlc291cmNlLAorICAgICAgICBjb25zdCBSZXNvdXJjZUluZm8mIGNsaWVudEluZm8pIHsKICAgICBpZiAocmVzb3VyY2UudHlwZSA9PSBNZWRpYVJlc291cmNlOjpUeXBlOjprQ3B1Qm9vc3QKICAgICAgICAgICAgICYmIHJlc291cmNlLnN1YlR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZQogICAgICAgICAgICAgJiYgbUNwdUJvb3N0Q291bnQgPiAwKSB7CkBAIC0zOTQsOCArNDE3LDggQEAKICAgICB9CiB9CiAKLXZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6bWVyZ2VSZXNvdXJjZXMoCi0gICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWwmIHIxLCBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByMikgewordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjptZXJnZVJlc291cmNlcyhNZWRpYVJlc291cmNlUGFyY2VsJiByMSwKKyAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcjIpIHsKICAgICAvLyBUaGUgcmVzb3VyY2UgZW50cnkgb24gcmVjb3JkIGlzIG1haW50YWluZWQgdG8gYmUgaW4gWzAsSU5UNjRfTUFYXS4KICAgICAvLyBDbGFtcCBpZiBtZXJnaW5nIGluIHRoZSBuZXcgcmVzb3VyY2UgdmFsdWUgY2F1c2VzIGl0IHRvIGdvIG91dCBvZiBib3VuZC4KICAgICAvLyBOb3RlIHRoYXQgdGhlIG5ldyByZXNvdXJjZSB2YWx1ZSBjb3VsZCBiZSBuZWdhdGl2ZSwgZWcuRHJtU2Vzc2lvbiwgdGhlCkBAIC00MTEsMTAgKzQzNCw3IEBACiAgICAgfQogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6YWRkUmVzb3VyY2UoCi0gICAgICAgIGludDMyX3QgcGlkLAotICAgICAgICBpbnQzMl90IHVpZCwKLSAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKK1N0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjphZGRSZXNvdXJjZShpbnQzMl90IHBpZCwgaW50MzJfdCB1aWQsIGludDY0X3QgY2xpZW50SWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoImFkZFJlc291cmNlKHBpZCAlZCwgY2xpZW50SWQgJWxsZCwgcmVzb3VyY2VzICVzKSIsCkBAIC00MjIsMTEgKzQ0MiwxMSBAQAogICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVWlkVHJ1c3RlZChwaWQsIHVpZCkpIHsKICAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkLCB1aWQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgcGlkLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQgb3IgdWlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCwgdWlkICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBpZCwgdWlkLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKTsKICAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKICAgICB9CkBAIC00NjMsNyArNDgzLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoaW5mby5jb29raWUgPT0gMCAmJiBjbGllbnQgIT0gbnVsbHB0cikgewotICAgICAgICBpbmZvLmNvb2tpZSA9IGFkZENvb2tpZUFuZExpbmtfbChjbGllbnQtPmFzQmluZGVyKCksCisgICAgICAgIGluZm8uY29va2llID0gYWRkQ29va2llQW5kTGlua19sKGNsaWVudCwKICAgICAgICAgICAgICAgICBuZXcgRGVhdGhOb3RpZmllcihyZWY8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oKSwgcGlkLCBjbGllbnRJZCkpOwogICAgIH0KICAgICBpZiAobU9ic2VydmVyU2VydmljZSAhPSBudWxscHRyICYmICFyZXNvdXJjZUFkZGVkLmVtcHR5KCkpIHsKQEAgLTQ3MywxNSArNDkzLDE0IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJlc291cmNlKAotICAgICAgICBpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKK1N0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVSZXNvdXJjZShpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4mIHJlc291cmNlcykgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZW1vdmVSZXNvdXJjZShwaWQgJWQsIGNsaWVudElkICVsbGQsIHJlc291cmNlcyAlcykiLAogICAgICAgICAgICAgcGlkLCAobG9uZyBsb25nKSBjbGllbnRJZCwgZ2V0U3RyaW5nKHJlc291cmNlcykuc3RyaW5nKCkpOwogICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChwaWQpKSB7CiAgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOwpAQCAtNTQ5LDcgKzU2OCw3IEBACiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1ZhbGlkICYmICFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgeworICAgIGlmIChjaGVja1ZhbGlkICYmICFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChwaWQpKSB7CiAgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOwpAQCAtNTczLDcgKzU5Miw3IEBACiAgICAgICAgIG9uTGFzdFJlbW92ZWQoaXQtPnNlY29uZCwgaW5mbyk7CiAgICAgfQogCi0gICAgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woaW5mby5jbGllbnQtPmFzQmluZGVyKCksIGluZm8uY29va2llKTsKKyAgICByZW1vdmVDb29raWVBbmRVbmxpbmtfbChpbmZvLmNsaWVudCwgaW5mby5jb29raWUpOwogCiAgICAgaWYgKG1PYnNlcnZlclNlcnZpY2UgIT0gbnVsbHB0ciAmJiAhaW5mby5yZXNvdXJjZXMuZW1wdHkoKSkgewogICAgICAgICBtT2JzZXJ2ZXJTZXJ2aWNlLT5vblJlc291cmNlUmVtb3ZlZChpbmZvLnVpZCwgcGlkLCBpbmZvLnJlc291cmNlcyk7CkBAIC01ODMsMjIgKzYwMiwxOSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0Q2xpZW50Rm9yUmVzb3VyY2VfbCgKLSAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgKnJlcywKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChpbnQgY2FsbGluZ1BpZCwgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCAqcmVzLAogICAgICAgICBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAqY2xpZW50cykgewogICAgIGlmIChyZXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgaWYgKGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGNhbGxpbmdQaWQsIHJlcy0+dHlwZSwgJmNsaWVudCkpIHsKKyAgICBpZiAoZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woY2FsbGluZ1BpZCwgcmVzLT50eXBlLCByZXMtPnN1YlR5cGUsICZjbGllbnQpKSB7CiAgICAgICAgIGNsaWVudHMtPnB1c2hfYmFjayhjbGllbnQpOwogICAgIH0KIH0KIAotU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1SZXNvdXJjZSgKLSAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzLAotICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZWNsYWltUmVzb3VyY2UoaW50MzJfdCBjYWxsaW5nUGlkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVjbGFpbVJlc291cmNlKGNhbGxpbmdQaWQgJWQsIHJlc291cmNlcyAlcykiLAogICAgICAgICAgICAgY2FsbGluZ1BpZCwgZ2V0U3RyaW5nKHJlc291cmNlcykuc3RyaW5nKCkpOwogICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKQEAgLTYwNyw3ICs2MjMsNyBAQAogICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+IGNsaWVudHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKGNhbGxpbmdQaWQpKSB7CisgICAgICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1BpZFRydXN0ZWQoY2FsbGluZ1BpZCkpIHsKICAgICAgICAgICAgIHBpZF90IGFjdHVhbENhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgYWN0dWFsIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBhY3R1YWxDYWxsaW5nUGlkKTsKQEAgLTYxOCwzNCArNjM0LDQzIEBACiAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgKmdyYXBoaWNNZW1vcnkgPSBOVUxMOwogICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsICpkcm1TZXNzaW9uID0gTlVMTDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSA9IHJlc291cmNlc1tpXS50eXBlOwotICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS50eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYykgewotICAgICAgICAgICAgICAgIHNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMpIHsKLSAgICAgICAgICAgICAgICBub25TZWN1cmVDb2RlYyA9ICZyZXNvdXJjZXNbaV07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBncmFwaGljTWVtb3J5ID0gJnJlc291cmNlc1tpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNZWRpYVJlc291cmNlOjpUeXBlOjprRHJtU2Vzc2lvbikgewotICAgICAgICAgICAgICAgIGRybVNlc3Npb24gPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgc3dpdGNoIChyZXNvdXJjZXNbaV0udHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjOgorICAgICAgICAgICAgICAgICAgICBzZWN1cmVDb2RlYyA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjOgorICAgICAgICAgICAgICAgICAgICBub25TZWN1cmVDb2RlYyA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk6CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNNZW1vcnkgPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtEcm1TZXNzaW9uOgorICAgICAgICAgICAgICAgICAgICBkcm1TZXNzaW9uID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBmaXJzdCBwYXNzIHRvIGhhbmRsZSBzZWN1cmUvbm9uLXNlY3VyZSBjb2RlYyBjb25mbGljdAogICAgICAgICBpZiAoc2VjdXJlQ29kZWMgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcykgewotICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywgJmNsaWVudHMpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvZGVjLT5zdWJUeXBlLCAmY2xpZW50cykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYykgewotICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywgJmNsaWVudHMpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvZGVjLT5zdWJUeXBlLCAmY2xpZW50cykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5vblNlY3VyZUNvZGVjICE9IE5VTEwpIHsKICAgICAgICAgICAgIGlmICghbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBub25TZWN1cmVDb2RlYy0+c3ViVHlwZSwgJmNsaWVudHMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNjcxLDIxICs2OTYsMjEgQEAKICAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBoZXJlLCBydW4gdGhlIGZvdXJ0aCBwYXNzIHRvIGZyZWUgb25lIGNvZGVjIHdpdGggdGhlIGRpZmZlcmVudCB0eXBlLgogICAgICAgICAgICAgaWYgKHNlY3VyZUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlIHRlbXAoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLCAxKTsKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlIHRlbXAoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLCBzZWN1cmVDb2RlYy0+c3ViVHlwZSwgMSk7CiAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCAmdGVtcCwgJmNsaWVudHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5vblNlY3VyZUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlIHRlbXAoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAxKTsKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlIHRlbXAoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCBub25TZWN1cmVDb2RlYy0+c3ViVHlwZSwgMSk7CiAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCAmdGVtcCwgJmNsaWVudHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgKl9haWRsX3JldHVybiA9IHJlY2xhaW1JbnRlcm5hbChjbGllbnRzKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gcmVjbGFpbVVuY29uZGl0aW9uYWxseUZyb20oY2xpZW50cyk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZWNsYWltSW50ZXJuYWwoCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1VbmNvbmRpdGlvbmFsbHlGcm9tKAogICAgICAgICBjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cykgewogICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcwNyw2ICs3MzIsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBpbnQgZmFpbGVkQ2xpZW50UGlkID0gLTE7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKQEAgLTcyMSwyMCArNzQ3LDIxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkQ2xpZW50UGlkID0gbU1hcC5rZXlBdChpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICBBTE9HVigiZGlkbid0IGZpbmQgZmFpbGVkIGNsaWVudCIpOworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVjbGFpbSByZXNvdXJjZXMgZnJvbSBjbGllbnQgd2l0aCBwaWQgJWQiLCBmYWlsZWRDbGllbnRQaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWNsYWltIHJlc291cmNlcyBmcm9tIHVubG9jYXRlYWJsZSBjbGllbnQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUGlkKAotICAgICAgICBpbnQgb3JpZ2luYWxQaWQsCi0gICAgICAgIGludCBuZXdQaWQpIHsKK1N0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvdmVycmlkZVBpZChpbnQgb3JpZ2luYWxQaWQsIGludCBuZXdQaWQpIHsKICAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgib3ZlcnJpZGVQaWQob3JpZ2luYWxQaWQgJWQsIG5ld1BpZCAlZCkiLAogICAgICAgICAgICAgb3JpZ2luYWxQaWQsIG5ld1BpZCk7CiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwpAQCAtNzYzLDkgKzc5MCw3IEBACiB9CiAKIFN0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvdmVycmlkZVByb2Nlc3NJbmZvKAotICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgaW50IHBpZCwKLSAgICAgICAgaW50IHByb2NTdGF0ZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsIGludCBwaWQsIGludCBwcm9jU3RhdGUsCiAgICAgICAgIGludCBvb21TY29yZSkgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJvdmVycmlkZVByb2Nlc3NJbmZvKHBpZCAlZCwgcHJvY1N0YXRlICVkLCBvb21TY29yZSAlZCkiLAogICAgICAgICAgICAgcGlkLCBwcm9jU3RhdGUsIG9vbVNjb3JlKTsKQEAgLTc5MSw3ICs4MTYsNyBAQAogICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKICAgICB9CiAKLSAgICB1aW50cHRyX3QgY29va2llID0gYWRkQ29va2llQW5kTGlua19sKGNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICB1aW50cHRyX3QgY29va2llID0gYWRkQ29va2llQW5kTGlua19sKGNsaWVudCwKICAgICAgICAgICAgIG5ldyBPdmVycmlkZVByb2Nlc3NJbmZvRGVhdGhOb3RpZmllcihyZWY8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oKSwgcGlkKSk7CiAKICAgICBtUHJvY2Vzc0luZm9PdmVycmlkZU1hcC5lbXBsYWNlKHBpZCwgUHJvY2Vzc0luZm9PdmVycmlkZXtjb29raWUsIGNsaWVudH0pOwpAQCAtODAwLDIzICs4MjUsMjggQEAKIH0KIAogdWludHB0cl90IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmFkZENvb2tpZUFuZExpbmtfbCgKLSAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyLCBjb25zdCBzcDxEZWF0aE5vdGlmaWVyPiYgbm90aWZpZXIpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsIGNvbnN0IHNwPERlYXRoTm90aWZpZXI+JiBub3RpZmllcikgeworICAgIGlmIChjbGllbnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre3NDb29raWVMb2NrfTsKIAogICAgIHVpbnRwdHJfdCBjb29raWU7CiAgICAgLy8gTmVlZCB0byBza2lwIGNvb2tpZSAwIChpZiBpdCB3cmFwcyBhcm91bmQpLiBSZXNvdXJjZUluZm8gaGFzIGNvb2tpZSBpbml0aWFsaXplZCB0byAwCiAgICAgLy8gaW5kaWNhdGluZyB0aGUgZGVhdGggbm90aWZpZXIgaXMgbm90IGNyZWF0ZWQgeWV0LgogICAgIHdoaWxlICgoY29va2llID0gKytzQ29va2llQ291bnRlcikgPT0gMCk7Ci0gICAgQUlCaW5kZXJfbGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOworICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKGNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCAodm9pZCopY29va2llKTsKICAgICBzQ29va2llVG9EZWF0aE5vdGlmaWVyTWFwLmVtcGxhY2UoY29va2llLCBub3RpZmllcik7CiAKICAgICByZXR1cm4gY29va2llOwogfQogCiB2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZUNvb2tpZUFuZFVubGlua19sKAotICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIHVpbnRwdHJfdCBjb29raWUpIHsKKyAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LCB1aW50cHRyX3QgY29va2llKSB7CiAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre3NDb29raWVMb2NrfTsKLSAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCAodm9pZCopY29va2llKTsKKyAgICBpZiAoY2xpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUlCaW5kZXJfdW5saW5rVG9EZWF0aChjbGllbnQtPmFzQmluZGVyKCkuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwgKHZvaWQqKWNvb2tpZSk7CisgICAgfQogICAgIHNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZXJhc2UoY29va2llKTsKIH0KIApAQCAtODM0LDcgKzg2NCw3IEBACiAKICAgICBtUHJvY2Vzc0luZm8tPnJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUocGlkKTsKIAotICAgIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGl0LT5zZWNvbmQuY2xpZW50LT5hc0JpbmRlcigpLCBpdC0+c2Vjb25kLmNvb2tpZSk7CisgICAgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woaXQtPnNlY29uZC5jbGllbnQsIGl0LT5zZWNvbmQuY29va2llKTsKIAogICAgIG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmVyYXNlKHBpZCk7CiB9CkBAIC04NDYsNyArODc2LDcgQEAKICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgeworICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1BpZFRydXN0ZWQocGlkKSkgewogICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgcGlkLCBjYWxsaW5nUGlkKTsKQEAgLTg3OCw3ICs5MDgsNyBAQAogICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+IGNsaWVudHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKKyAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChwaWQpKSB7CiAgICAgICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOwpAQCAtODg5LDE2ICs5MTksMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0RybVNlc3Npb259KSB7Ci0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OwotICAgICAgICAgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRfbChwaWQsIHR5cGUsICZjbGllbnQsIHRydWUgLyogcGVuZGluZ1JlbW92YWxPbmx5ICovKSkgewotICAgICAgICAgICAgICAgIGNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyBDb2RlYyByZXNvdXJjZXMgYXJlIHNlZ3JlZ2F0ZWQgYnkgYXVkaW8sIHZpZGVvIGFuZCBpbWFnZSBkb21haW5zLgorICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjOgorICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjOgorICAgICAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSA6IHtNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtJbWFnZUNvZGVjfSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRCaWdnZXN0Q2xpZW50UGVuZGluZ1JlbW92YWxfbChwaWQsIHR5cGUsIHN1YlR5cGUsICZjbGllbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBOb24tY29kZWMgcmVzb3VyY2VzIGFyZSBzaGFyZWQgYnkgYXVkaW8sIHZpZGVvIGFuZCBpbWFnZSBjb2RlY3MgKG5vIHN1YnR5cGUpLgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRCaWdnZXN0Q2xpZW50UGVuZGluZ1JlbW92YWxfbChwaWQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgJmNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMuYWRkKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIWNsaWVudHMuZW1wdHkoKSkgewotICAgICAgICByZWNsYWltSW50ZXJuYWwoY2xpZW50cyk7CisgICAgICAgIHJlY2xhaW1VbmNvbmRpdGlvbmFsbHlGcm9tKGNsaWVudHMpOwogICAgIH0KICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQpAQCAtOTE1LDE0ICs5NjMsMTMgQEAKICAgICByZXR1cm4gbVByb2Nlc3NJbmZvLT5nZXRQcmlvcml0eShuZXdQaWQsIHByaW9yaXR5KTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRBbGxDbGllbnRzX2woCi0gICAgICAgIGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCi0gICAgICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKSB7Citib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEFsbENsaWVudHNfbChpbnQgY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKSB7CiAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gdGVtcDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGkpOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIGluZm9zW2pdLnJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgc3ViVHlwZSwgaW5mb3Nbal0ucmVzb3VyY2VzKSkgewogICAgICAgICAgICAgICAgIGlmICghaXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbChjYWxsaW5nUGlkLCBtTWFwLmtleUF0KGkpKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGhpZ2hlci9lcXVhbCBwcmlvcml0eSBwcm9jZXNzIG93bnMgdGhlIHJlc291cmNlLAogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QgY2FuJ3QgYmUgZnVsZmlsbGVkLgpAQCAtOTQyLDggKzk4OSw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woCi0gICAgICAgIGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGludCBjYWxsaW5nUGlkLAorICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpIHsKICAgICBpbnQgbG93ZXN0UHJpb3JpdHlQaWQ7CiAgICAgaW50IGxvd2VzdFByaW9yaXR5OwpAQCAtOTUxLDcgKzk5OCw3IEBACiAKICAgICAvLyBCZWZvcmUgbG9va2luZyBpbnRvIG90aGVyIHByb2Nlc3NlcywgY2hlY2sgaWYgd2UgaGF2ZSBjbGllbnRzIG1hcmtlZCBmb3IKICAgICAvLyBwZW5kaW5nIHJlbW92YWwgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KLSAgICBpZiAoZ2V0QmlnZ2VzdENsaWVudF9sKGNhbGxpbmdQaWQsIHR5cGUsIGNsaWVudCwgdHJ1ZSAvKiBwZW5kaW5nUmVtb3ZhbE9ubHkgKi8pKSB7CisgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKGNhbGxpbmdQaWQsIHR5cGUsIHN1YlR5cGUsIGNsaWVudCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghZ2V0UHJpb3JpdHlfbChjYWxsaW5nUGlkLCAmY2FsbGluZ1ByaW9yaXR5KSkgewpAQCAtOTU5LDcgKzEwMDYsNyBAQAogICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmICghZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmbG93ZXN0UHJpb3JpdHlQaWQsICZsb3dlc3RQcmlvcml0eSkpIHsKKyAgICBpZiAoIWdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgc3ViVHlwZSwgJmxvd2VzdFByaW9yaXR5UGlkLCAmbG93ZXN0UHJpb3JpdHkpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGxvd2VzdFByaW9yaXR5IDw9IGNhbGxpbmdQcmlvcml0eSkgewpAQCAtOTY4LDE0ICsxMDE1LDE0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWdldEJpZ2dlc3RDbGllbnRfbChsb3dlc3RQcmlvcml0eVBpZCwgdHlwZSwgY2xpZW50KSkgeworICAgIGlmICghZ2V0QmlnZ2VzdENsaWVudF9sKGxvd2VzdFByaW9yaXR5UGlkLCB0eXBlLCBzdWJUeXBlLCBjbGllbnQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCgKLSAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBpbnQgKmxvd2VzdFByaW9yaXR5UGlkLCBpbnQgKmxvd2VzdFByaW9yaXR5KSB7Citib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldExvd2VzdFByaW9yaXR5UGlkX2woTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIGludCAqbG93ZXN0UHJpb3JpdHlQaWQsIGludCAqbG93ZXN0UHJpb3JpdHkpIHsKICAgICBpbnQgcGlkID0gLTE7CiAgICAgaW50IHByaW9yaXR5ID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWFwLnNpemUoKTsgKytpKSB7CkBAIC05ODMsNyArMTAzMCw3IEBACiAgICAgICAgICAgICAvLyBubyBjbGllbnQgb24gdGhpcyBwcm9jZXNzLgogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFoYXNSZXNvdXJjZVR5cGUodHlwZSwgbU1hcC52YWx1ZUF0KGkpKSkgeworICAgICAgICBpZiAoIWhhc1Jlc291cmNlVHlwZSh0eXBlLCBzdWJUeXBlLCBtTWFwLnZhbHVlQXQoaSkpKSB7CiAgICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSB0eXBlCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMTAyMSw4ICsxMDY4LDEzIEBACiAgICAgcmV0dXJuIChjYWxsaW5nUGlkUHJpb3JpdHkgPCBwcmlvcml0eSk7CiB9CiAKLWJvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0QmlnZ2VzdENsaWVudF9sKAotICAgICAgICBpbnQgcGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50LAorYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRCaWdnZXN0Q2xpZW50UGVuZGluZ1JlbW92YWxfbChpbnQgcGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpIHsKKyAgICByZXR1cm4gZ2V0QmlnZ2VzdENsaWVudF9sKHBpZCwgdHlwZSwgc3ViVHlwZSwgY2xpZW50LCB0cnVlIC8qIHBlbmRpbmdSZW1vdmFsT25seSAqLyk7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0QmlnZ2VzdENsaWVudF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCwKICAgICAgICAgYm9vbCBwZW5kaW5nUmVtb3ZhbE9ubHkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtMTA0MSw3ICsxMDkzLDcgQEAKICAgICAgICAgfQogICAgICAgICBmb3IgKGF1dG8gaXQgPSByZXNvdXJjZXMuYmVnaW4oKTsgaXQgIT0gcmVzb3VyY2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsICZyZXNvdXJjZSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UudHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIHN1YlR5cGUsIHJlc291cmNlKSkgewogICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS52YWx1ZSA+IGxhcmdlc3RWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICBsYXJnZXN0VmFsdWUgPSByZXNvdXJjZS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGVtcCA9IGluZm9zW2ldLmNsaWVudDsKQEAgLTEwNTIsOCArMTEwNCw4IEBACiAKICAgICBpZiAoY2xpZW50VGVtcCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFX0lGKCFwZW5kaW5nUmVtb3ZhbE9ubHksCi0gICAgICAgICAgICAgICAgICJnZXRCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGZpbmQgcmVzb3VyY2UgdHlwZSAlcyBmb3IgcGlkICVkIiwKLSAgICAgICAgICAgICAgICAgYXNTdHJpbmcodHlwZSksIHBpZCk7CisgICAgICAgICAgICAgICAgICJnZXRCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGZpbmQgcmVzb3VyY2UgdHlwZSAlcyBhbmQgc3VidHlwZSAlcyBmb3IgcGlkICVkIiwKKyAgICAgICAgICAgICAgICAgYXNTdHJpbmcodHlwZSksIGFzU3RyaW5nKHN1YlR5cGUpLCBwaWQpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggOWMyNjM2ZS4uYzYzNmEwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaApAQCAtNzcsMjYgKzc3LDE5IEBACiAgICAgICAgICAgICBpbnQgLypmZCovLCBjb25zdCBjaGFyKiogLyphcmdzKi8sIHVpbnQzMl90IC8qbnVtQXJncyovKTsKIAogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2UoKTsKLSAgICBleHBsaWNpdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+ICZwcm9jZXNzSW5mbywKKyAgICBleHBsaWNpdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKGNvbnN0IHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiAmcHJvY2Vzc0luZm8sCiAgICAgICAgICAgICBjb25zdCBzcDxTeXN0ZW1DYWxsYmFja0ludGVyZmFjZT4gJnN5c3RlbVJlc291cmNlKTsKICAgICB2aXJ0dWFsIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCk7Ci0gICAgdm9pZCBzZXRPYnNlcnZlclNlcnZpY2UoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+JiBvYnNlcnZlclNlcnZpY2UpOworICAgIHZvaWQgc2V0T2JzZXJ2ZXJTZXJ2aWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4mIG9ic2VydmVyU2VydmljZSk7CiAKICAgICAvLyBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBpbnRlcmZhY2UKICAgICBTdGF0dXMgY29uZmlnKGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWw+JiBwb2xpY2llcykgb3ZlcnJpZGU7CiAKLSAgICBTdGF0dXMgYWRkUmVzb3VyY2UoCi0gICAgICAgICAgICBpbnQzMl90IHBpZCwKLSAgICAgICAgICAgIGludDMyX3QgdWlkLAotICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICBTdGF0dXMgYWRkUmVzb3VyY2UoaW50MzJfdCBwaWQsIGludDMyX3QgdWlkLCBpbnQ2NF90IGNsaWVudElkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyByZW1vdmVSZXNvdXJjZSgKLSAgICAgICAgICAgIGludDMyX3QgcGlkLAotICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICBTdGF0dXMgcmVtb3ZlUmVzb3VyY2UoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzKSBvdmVycmlkZTsKIAogICAgIFN0YXR1cyByZW1vdmVDbGllbnQoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQpIG92ZXJyaWRlOwpAQCAtMTA0LDIwICs5NywxMyBAQAogICAgIC8vIFRyaWVzIHRvIHJlY2xhaW0gcmVzb3VyY2UgZnJvbSBwcm9jZXNzZXMgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBjYWxsaW5nIHByb2Nlc3MKICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMuCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSByZXNvdXJjZSBoYXMgYmVlbiByZWNsYWltZWQsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgIFN0YXR1cyByZWNsYWltUmVzb3VyY2UoCi0gICAgICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzLAorICAgIFN0YXR1cyByZWNsYWltUmVzb3VyY2UoaW50MzJfdCBjYWxsaW5nUGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzLAogICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyBvdmVycmlkZVBpZCgKLSAgICAgICAgICAgIGludCBvcmlnaW5hbFBpZCwKLSAgICAgICAgICAgIGludCBuZXdQaWQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBvdmVycmlkZVBpZChpbnQgb3JpZ2luYWxQaWQsIGludCBuZXdQaWQpIG92ZXJyaWRlOwogCi0gICAgU3RhdHVzIG92ZXJyaWRlUHJvY2Vzc0luZm8oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgIGludCBwaWQsCi0gICAgICAgICAgICBpbnQgcHJvY1N0YXRlLAotICAgICAgICAgICAgaW50IG9vbVNjb3JlKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3ZlcnJpZGVQcm9jZXNzSW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgaW50IHBpZCwKKyAgICAgICAgICAgIGludCBwcm9jU3RhdGUsIGludCBvb21TY29yZSkgb3ZlcnJpZGU7CiAKICAgICBTdGF0dXMgbWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkKSBvdmVycmlkZTsKIApAQCAtMTMyLDMwICsxMTgsMzQgQEAKIAogICAgIC8vIFJlY2xhaW1zIHJlc291cmNlcyBmcm9tIHxjbGllbnRzfC4gUmV0dXJucyB0cnVlIGlmIHJlY2xhaW0gc3VjY2VlZGVkCiAgICAgLy8gZm9yIGFsbCBjbGllbnRzLgotICAgIGJvb2wgcmVjbGFpbUludGVybmFsKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gJmNsaWVudHMpOworICAgIGJvb2wgcmVjbGFpbVVuY29uZGl0aW9uYWxseUZyb20oY29uc3QgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gJmNsaWVudHMpOwogCiAgICAgLy8gR2V0cyB0aGUgbGlzdCBvZiBhbGwgdGhlIGNsaWVudHMgd2hvIG93biB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUuCiAgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2xpZW50IGJlbG9uZ3MgdG8gYSBwcm9jZXNzIHdpdGggaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlCiAgICAgLy8gY2FsbGluZyBwcm9jZXNzLiBUaGUgY2xpZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgcmV0dXJucyBmYWxzZS4KLSAgICBib29sIGdldEFsbENsaWVudHNfbChpbnQgY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgIGJvb2wgZ2V0QWxsQ2xpZW50c19sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwKICAgICAgICAgICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKTsKIAogICAgIC8vIEdldHMgdGhlIGNsaWVudCB3aG8gb3ducyBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZSBmcm9tIGxvd2VzdCBwb3NzaWJsZSBwcmlvcml0eSBwcm9jZXNzLgogICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBwcmlvcml0eSBpcyBub3QgaGlnaGVyIHRoYW4gdGhlIGxvd2VzdCBwcm9jZXNzCiAgICAgLy8gcHJpb3JpdHkuIFRoZSBjbGllbnQgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIHJldHVybnMgZmFsc2UuCiAgICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChpbnQgY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpOworICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCk7CiAKICAgICAvLyBHZXRzIGxvd2VzdCBwcmlvcml0eSBwcm9jZXNzIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KICAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGZhaWxlZC4gVGhlIG91dHB1dCBwYXJhbWV0ZXJzIHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiBmYWlsZWQuCi0gICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eVBpZF9sKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgaW50ICpwaWQsIGludCAqcHJpb3JpdHkpOworICAgIGJvb2wgZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbChNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgaW50ICpwaWQsCisgICAgICAgICAgICAgICAgaW50ICpwcmlvcml0eSk7CiAKICAgICAvLyBHZXRzIHRoZSBjbGllbnQgd2hvIG93bnMgYmlnZ2VzdCBwaWVjZSBvZiBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZSBmcm9tIHBpZC4KLSAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGZhaWxlZC4gVGhlIGNsaWVudCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgZmFpbGVkLgotICAgIGJvb2wgZ2V0QmlnZ2VzdENsaWVudF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKKyAgICAvLyBSZXR1cm5zIGZhbHNlIHdpdGggbm8gY2hhbmdlIHRvIGNsaWVudCBpZiB0aGVyZSBhcmUgbm8gY2xpZW50cyBob2xkaWluZyByZXNvdXJjZXMgb2YgdGhpc2kKKyAgICAvLyB0eXBlLgorICAgIGJvb2wgZ2V0QmlnZ2VzdENsaWVudF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQsCiAgICAgICAgICAgICBib29sIHBlbmRpbmdSZW1vdmFsT25seSA9IGZhbHNlKTsKKyAgICAvLyBTYW1lIG1ldGhvZCBhcyBhYm92ZSwgYnV0IHdpdGggcGVuZGluZ1JlbW92YWxPbmx5IGFzIHRydWUuCisgICAgYm9vbCBnZXRCaWdnZXN0Q2xpZW50UGVuZGluZ1JlbW92YWxfbChpbnQgcGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KTsKIAogICAgIGJvb2wgaXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbChpbnQgY2FsbGluZ1BpZCwgaW50IHBpZCk7CiAKQEAgLTE3Niw4ICsxNjYsMTAgQEAKICAgICB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IHBpZCk7CiAKICAgICB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGVfbChpbnQgcGlkKTsKLSAgICB1aW50cHRyX3QgYWRkQ29va2llQW5kTGlua19sKDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKTsKLSAgICB2b2lkIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgdWludHB0cl90IGNvb2tpZSk7CisgICAgdWludHB0cl90IGFkZENvb2tpZUFuZExpbmtfbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERlYXRoTm90aWZpZXI+JiBub3RpZmllcik7CisgICAgdm9pZCByZW1vdmVDb29raWVBbmRVbmxpbmtfbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBjb29raWUpOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKICAgICBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gbVByb2Nlc3NJbmZvOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VTdWJUeXBlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbAppbmRleCBhZjJiYTY4Li43MmEwNTUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbApAQCAtMjYsNCArMjYsNSBAQAogICAgIGtVbnNwZWNpZmllZFN1YlR5cGUgPSAwLAogICAgIGtBdWRpb0NvZGVjID0gMSwKICAgICBrVmlkZW9Db2RlYyA9IDIsCisgICAga0ltYWdlQ29kZWMgPSAzLAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL21lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcAppbmRleCA2NjkwYjE2Li5lNGFhZWEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcApAQCAtNzEsNyArNzEsOCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgLyogcGlkICovKSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIGlzUGlkVHJ1c3RlZChpbnQgLyogcGlkICovKSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIGlzUGlkVWlkVHJ1c3RlZChpbnQgLyogcGlkICovLCBpbnQgLyogdWlkICovKSB7IHJldHVybiB0cnVlOyB9CiAgICAgdmlydHVhbCBib29sIG92ZXJyaWRlUHJvY2Vzc0luZm8oaW50IC8qIHBpZCAqLywgaW50IC8qcHJvY1N0YXRlKi8sIGludCAvKm9vbVNjb3JlKi8pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMjI2LDMzICsyMjcsMzEgQEAKICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtNaW5UaHJlYWRQYWlycywga01heFRocmVhZFBhaXJzKTsKICAgICAvLyBNYWtlIGV2ZW4gbnVtYmVyIG9mIHRocmVhZHMKICAgICBzaXplX3QgbnVtVGhyZWFkcyA9IG51bVRocmVhZFBhaXJzICogMjsKLSAgICByZXNvdXJjZVRocmVhZEFyZ3MgdGhyZWFkQXJnczsKLSAgICB2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gbWVkaWFSZXNvdXJjZTsKKyAgICByZXNvdXJjZVRocmVhZEFyZ3MgdGhyZWFkQXJnc1tudW1UaHJlYWRQYWlyc107CisgICAgdmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IG1lZGlhUmVzb3VyY2VbbnVtVGhyZWFkUGFpcnNdOwogICAgIHB0aHJlYWRfdCBwdFtudW1UaHJlYWRzXTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkcyAtIDE7IGkgKz0gMikgewotICAgICAgICB0aHJlYWRBcmdzLnBpZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOwotICAgICAgICB0aHJlYWRBcmdzLnVpZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtVGhyZWFkUGFpcnM7ICsraykgeworICAgICAgICB0aHJlYWRBcmdzW2tdLnBpZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICB0aHJlYWRBcmdzW2tdLnVpZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOwogICAgICAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VUeXBlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigKICAgICAgICAgICAgIGtNaW5SZXNvdXJjZVR5cGUsIGtNYXhSZXNvdXJjZVR5cGUpOwogICAgICAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VTdWJUeXBlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigKICAgICAgICAgICAgIGtNaW5SZXNvdXJjZVR5cGUsIGtNYXhSZXNvdXJjZVR5cGUpOwogICAgICAgICB1aW50NjRfdCBtZWRpYVJlc291cmNlVmFsdWUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCk7Ci0gICAgICAgIHRocmVhZEFyZ3Muc2VydmljZSA9IG1TZXJ2aWNlOworICAgICAgICB0aHJlYWRBcmdzW2tdLnNlcnZpY2UgPSBtU2VydmljZTsKICAgICAgICAgc2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiB0ZXN0Q2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KHRocmVhZEFyZ3MucGlkLCBtU2VydmljZSk7Ci0gICAgICAgIHRocmVhZEFyZ3MudGVzdENsaWVudCA9IHRlc3RDbGllbnQ7Ci0gICAgICAgIHRocmVhZEFyZ3MudGVzdENsaWVudElkID0gZ2V0SWQodGVzdENsaWVudCk7Ci0gICAgICAgIG1lZGlhUmVzb3VyY2UucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2Uoc3RhdGljX2Nhc3Q8TWVkUmVzVHlwZT4obWVkaWFSZXNvdXJjZVR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZFJlc1N1YlR5cGU+KG1lZGlhUmVzb3VyY2VTdWJUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKLSAgICAgICAgdGhyZWFkQXJncy5tZWRpYVJlc291cmNlID0gbWVkaWFSZXNvdXJjZTsKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnB0W2ldLCBudWxscHRyLCBhZGRSZXNvdXJjZSwgJnRocmVhZEFyZ3MpOwotICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbaSArIDFdLCBudWxscHRyLCByZW1vdmVSZXNvdXJjZSwgJnRocmVhZEFyZ3MpOwotICAgICAgICBtZWRpYVJlc291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4odGhyZWFkQXJnc1trXS5waWQsIG1TZXJ2aWNlKTsKKyAgICAgICAgdGhyZWFkQXJnc1trXS50ZXN0Q2xpZW50ID0gdGVzdENsaWVudDsKKyAgICAgICAgdGhyZWFkQXJnc1trXS50ZXN0Q2xpZW50SWQgPSBnZXRJZCh0ZXN0Q2xpZW50KTsKKyAgICAgICAgbWVkaWFSZXNvdXJjZVtrXS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkUmVzU3ViVHlwZT4obWVkaWFSZXNvdXJjZVN1YlR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVzb3VyY2VWYWx1ZSkpOworICAgICAgICB0aHJlYWRBcmdzW2tdLm1lZGlhUmVzb3VyY2UgPSBtZWRpYVJlc291cmNlW2tdOworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbMiAqIGtdLCBudWxscHRyLCBhZGRSZXNvdXJjZSwgJnRocmVhZEFyZ3Nba10pOworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbMiAqIGsgKyAxXSwgbnVsbHB0ciwgcmVtb3ZlUmVzb3VyY2UsICZ0aHJlYWRBcmdzW2tdKTsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgKytpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UaHJlYWRzOyArK2kpIHsKICAgICAgICAgcHRocmVhZF9qb2luKHB0W2ldLCBudWxscHRyKTsKICAgICB9CiAKQEAgLTI2NSwxNCArMjY0LDE0IEBACiAgICAgaW50MzJfdCBtZWRpYVJlc291cmNlU3ViVHlwZSA9CiAgICAgICAgIG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblJlc291cmNlVHlwZSwga01heFJlc291cmNlVHlwZSk7CiAgICAgdWludDY0X3QgbWVkaWFSZXNvdXJjZVZhbHVlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpOwotICAgIG1lZGlhUmVzb3VyY2UucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2Uoc3RhdGljX2Nhc3Q8TWVkUmVzVHlwZT4obWVkaWFSZXNvdXJjZVR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkUmVzU3ViVHlwZT4obWVkaWFSZXNvdXJjZVN1YlR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSZXNvdXJjZVZhbHVlKSk7CisgICAgdmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IG1lZGlhUmVzOworICAgIG1lZGlhUmVzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKHN0YXRpY19jYXN0PE1lZFJlc1R5cGU+KG1lZGlhUmVzb3VyY2VUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRSZXNTdWJUeXBlPihtZWRpYVJlc291cmNlU3ViVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSZXNvdXJjZVZhbHVlKSk7CiAgICAgYm9vbCByZXN1bHQ7Ci0gICAgbVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShwaWRaZXJvLCBtZWRpYVJlc291cmNlLCAmcmVzdWx0KTsKLSAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UocGlkWmVybywgZ2V0SWQodGVzdENsaWVudCksIG1lZGlhUmVzb3VyY2UpOworICAgIG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2UocGlkWmVybywgbWVkaWFSZXMsICZyZXN1bHQpOworICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSwgbWVkaWFSZXMpOwogICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQocGlkWmVybywgZ2V0SWQodGVzdENsaWVudCkpOwotICAgIG1lZGlhUmVzb3VyY2UuY2xlYXIoKTsKIH0KIAogdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyOjpzZXRTZXJ2aWNlTG9nKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCmluZGV4IGVjNGJhNTguLjYxODYyNmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKQEAgLTU2LDcgKzU2LDcgQEAKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCi0gICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5kayIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RVdGlscy5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmgKaW5kZXggOGUyOTMxMi4uNWJmNDRjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmgKQEAgLTQ2LDcgKzQ2LDExIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCAvKiBwaWQgKi8pIHsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRUcnVzdGVkKGludCAvKiBwaWQgKi8pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzUGlkVWlkVHJ1c3RlZChpbnQgLyogcGlkICovLCBpbnQgLyogdWlkICovKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMTE5LDExICsxMjMsMTEgQEAKIAogc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgewogICAgIFRlc3RDbGllbnQoaW50IHBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlKQotICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisgICAgICAgIDogbVBpZChwaWQpLCBtU2VydmljZShzZXJ2aWNlKSB7fQogCiAgICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChtUGlkLCBnZXRJZChyZWY8VGVzdENsaWVudD4oKSkpOwotICAgICAgICBtUmVjbGFpbWVkID0gdHJ1ZTsKKyAgICAgICAgbVdhc1JlY2xhaW1SZXNvdXJjZUNhbGxlZCA9IHRydWU7CiAgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOwogICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgIH0KQEAgLTEzMywxOCArMTM3LDE2IEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogCi0gICAgYm9vbCByZWNsYWltZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVjbGFpbWVkOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1SZWNsYWltZWQgPSBmYWxzZTsKKyAgICBib29sIGNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpIHsKKyAgICAgICAgYm9vbCB3YXNSZWNsYWltUmVzb3VyY2VDYWxsZWQgPSBtV2FzUmVjbGFpbVJlc291cmNlQ2FsbGVkOworICAgICAgICBtV2FzUmVjbGFpbVJlc291cmNlQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiB3YXNSZWNsYWltUmVzb3VyY2VDYWxsZWQ7CiAgICAgfQogCiAgICAgdmlydHVhbCB+VGVzdENsaWVudCgpIHt9CiAKIHByaXZhdGU6Ci0gICAgYm9vbCBtUmVjbGFpbWVkOworICAgIGJvb2wgbVdhc1JlY2xhaW1SZXNvdXJjZUNhbGxlZCA9IGZhbHNlOwogICAgIGludCBtUGlkOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0Q2xpZW50KTsKQEAgLTE2NiwxNCArMTY4LDMwIEBACiAgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy5hcmcgPT0gcmhzLmFyZzsKIH0KIAotI2RlZmluZSBDSEVDS19TVEFUVVNfVFJVRShjb25kaXRpb24pIFwKLSAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uKS5pc09rKCkgJiYgKHJlc3VsdCkpCisvLyBUaGUgY29uZGl0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHN0YXR1cyBidXQgYWxzbyB1cGRhdGUgdGhlIGxvY2FsCisvLyByZXN1bHQgdmFyaWFibGUuCisjZGVmaW5lIENIRUNLX1NUQVRVU19UUlVFKGNvbmRpdGlvblRoYXRVcGRhdGVzUmVzdWx0KSBcCisgICAgZG8geyBcCisgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7IFwKKyAgICAgICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvblRoYXRVcGRhdGVzUmVzdWx0KS5pc09rKCkpOyBcCisgICAgICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7IFwKKyAgICB9IHdoaWxlKGZhbHNlKQogCi0jZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb24pIFwKLSAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uKS5pc09rKCkgJiYgIShyZXN1bHQpKQorLy8gVGhlIGNvbmRpdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBzdGF0dXMgYnV0IGFsc28gdXBkYXRlIHRoZSBsb2NhbAorLy8gcmVzdWx0IHZhcmlhYmxlLgorI2RlZmluZSBDSEVDS19TVEFUVVNfRkFMU0UoY29uZGl0aW9uVGhhdFVwZGF0ZXNSZXN1bHQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYm9vbCByZXN1bHQgPSB0cnVlOyBcCisgICAgICAgIEVYUEVDVF9UUlVFKChjb25kaXRpb25UaGF0VXBkYXRlc1Jlc3VsdCkuaXNPaygpKTsgXAorICAgICAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsgXAorICAgIH0gd2hpbGUoZmFsc2UpCiAKIGNsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewogcHVibGljOgorICAgIHN0YXRpYyBUZXN0Q2xpZW50KiB0b1Rlc3RDbGllbnQoc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IHRlc3RDbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPih0ZXN0Q2xpZW50LmdldCgpKTsKKyAgICB9CisKICAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UoKQogICAgICAgICA6IG1TeXN0ZW1DQihuZXcgVGVzdFN5c3RlbUNhbGxiYWNrKCkpLAogICAgICAgICAgIG1TZXJ2aWNlKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlclNlcnZpY2U+KApAQCAtMTgzLDYgKzIwMSwxMCBAQAogICAgICAgICAgIG1UZXN0Q2xpZW50Myg6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihrVGVzdFBpZDIsIG1TZXJ2aWNlKSkgewogICAgIH0KIAorICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjcmVhdGVUZXN0Q2xpZW50KGludCBwaWQpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KHBpZCwgbVNlcnZpY2UpOworICAgIH0KKwogICAgIHNwPFRlc3RTeXN0ZW1DYWxsYmFjaz4gbVN5c3RlbUNCOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQxOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCmluZGV4IGEwMjlkNDUuLjg3MzljM2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKQEAgLTI1LDIyICsyNSw2MCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCA6IHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UgeworcHJpdmF0ZToKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtWaWRlb0NvZGVjLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWMsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtJbWFnZUNvZGVjLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprSW1hZ2VDb2RlYywgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnksCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprRHJtU2Vzc2lvbiwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlQmF0dGVyeVJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprQmF0dGVyeSwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsIDEpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZUNwdUJvb3N0UmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtDcHVCb29zdCwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsIDEpOworICAgIH0KKwogcHVibGljOgogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0KCkgOiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UoKSB7fQogCi0gICAgdm9pZCB2ZXJpZnlDbGllbnRzKGJvb2wgYzEsIGJvb2wgYzIsIGJvb2wgYzMpIHsKLSAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MSA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDEuZ2V0KCkpOwotICAgICAgICBUZXN0Q2xpZW50ICpjbGllbnQyID0gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KG1UZXN0Q2xpZW50Mi5nZXQoKSk7Ci0gICAgICAgIFRlc3RDbGllbnQgKmNsaWVudDMgPSBzdGF0aWNfY2FzdDxUZXN0Q2xpZW50Kj4obVRlc3RDbGllbnQzLmdldCgpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoYzEsIGNsaWVudDEtPnJlY2xhaW1lZCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGMyLCBjbGllbnQyLT5yZWNsYWltZWQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShjMywgY2xpZW50My0+cmVjbGFpbWVkKCkpOwotCi0gICAgICAgIGNsaWVudDEtPnJlc2V0KCk7Ci0gICAgICAgIGNsaWVudDItPnJlc2V0KCk7Ci0gICAgICAgIGNsaWVudDMtPnJlc2V0KCk7Ci0gICAgfQogCiAgICAgLy8gdGVzdCBzZXQgdXAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI2OCw3ICszMDYsNiBAQAogCiAgICAgdm9pZCB0ZXN0T3ZlcnJpZGVQaWQoKSB7CiAKLSAgICAgICAgYm9vbCByZXN1bHQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywgMSkpOwogICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnksIDE1MCkpOwpAQCAtMjkzLDggKzMzMCw2IEBACiAgICAgfQogCiAgICAgdm9pZCB0ZXN0TWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKCkgewotICAgICAgICBib29sIHJlc3VsdDsKLQogICAgICAgICB7CiAgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOwogICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IHRydWU7CkBAIC0zMDcsMTMgKzM0MiwxNyBAQAogCiAgICAgICAgICAgICAvLyBubyBsb3dlciBwcmlvcml0eSBjbGllbnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtUZXN0UGlkMiwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSk7CiAKICAgICAgICAgICAgIC8vIGNsaWVudCBtYXJrZWQgZm9yIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSBzYW1lIHByb2Nlc3MgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrVGVzdFBpZDIsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKHRydWUsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNsaWVudCAzIHdoaWNoIHN0aWxsIGxlZnQKICAgICAgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpKTsKQEAgLTMzMSwxMSArMzcwLDE1IEBACiAgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZnJvbSB0aGUgc2FtZSBwcm9jZXNzIGdvdCByZWNsYWltZWQKICAgICAgICAgICAgIC8vIGZpcnN0LCBldmVuIHRob3VnaCB0aGVyZSBhcmUgbG93ZXIgcHJpb3JpdHkgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrVGVzdFBpZDIsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKHRydWUsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IGNsaWVudCBnb3QgcmVjbGFpbWVkCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtUZXN0UGlkMiwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwpAQCAtMzQ5LDE3ICszOTIsMjMgQEAKIAogICAgICAgICAgICAgLy8gY2xpZW50IG1hcmtlZCBmb3IgcGVuZGluZyByZW1vdmFsIGdvdCByZWNsYWltZWQKICAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChrVGVzdFBpZDIpLmlzT2soKSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gTm8gbW9yZSBjbGllbnRzIG1hcmtlZCBmb3IgcmVtb3ZhbAogICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpKTsKIAogICAgICAgICAgICAgLy8gY2xpZW50IG1hcmtlZCBmb3IgcGVuZGluZyByZW1vdmFsIGdvdCByZWNsYWltZWQKICAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChrVGVzdFBpZDIpLmlzT2soKSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDEgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSkpOwpAQCAtMzg0LDE0ICs0MzMsMTUgQEAKIAogICAgIHZvaWQgdGVzdEdldEFsbENsaWVudHMoKSB7CiAgICAgICAgIGFkZFJlc291cmNlKCk7Ci0KICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjOworICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUgPSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlOworCiAgICAgICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gPiBjbGllbnRzOwotICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnRzKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtMb3dQcmlvcml0eVBpZCwgdHlwZSwgc3ViVHlwZSwgJmNsaWVudHMpKTsKICAgICAgICAgLy8gc29tZSBoaWdoZXIgcHJpb3JpdHkgcHJvY2VzcyAoZS5nLiBrVGVzdFBpZDIpIG93bnMgdGhlIHJlc291cmNlLCBzbyBnZXRBbGxDbGllbnRzX2wKICAgICAgICAgLy8gd2lsbCBmYWlsLgotICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrTWlkUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnRzKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa01pZFByaW9yaXR5UGlkLCB0eXBlLCBzdWJUeXBlLCAmY2xpZW50cykpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsICZjbGllbnRzKSk7CiAKICAgICAgICAgRVhQRUNUX0VRKDJ1LCBjbGllbnRzLnNpemUoKSk7CiAgICAgICAgIC8vIChPSyB0byByZXF1aXJlIG9yZGVyaW5nIGluIGNsaWVudHNbXSwgYXMgdGhlIHBpZCBtYXAgaXMgc29ydGVkKQpAQCAtNDAwLDcgKzQ1MCw2IEBACiAgICAgfQogCiAgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlU2VjdXJlKCkgewotICAgICAgICBib29sIHJlc3VsdDsKICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAxKSk7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwgMTUwKSk7CkBAIC00MTcsMTEgKzQ2NiwxNSBAQAogCiAgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBzZWN1cmUgY29kZWNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIG9uZSBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTQzOSw3ICs0OTIsOSBAQAogCiAgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBzZWN1cmUgYW5kIG5vbi1zZWN1cmUgY29kZWNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTQ1OCwxNSArNTEzLDIxIEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIG5vbi1zZWN1cmUgY29kZWNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CkBAIC00ODMsMTUgKzU0NCwyMSBAQAogCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwogICAgICAgICAgICAgLy8gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCi0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTUwOCwyMCArNTc1LDI1IEBACiAKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CiAgICAgICAgICAgICAvLyBzZWN1cmUgY29kZWMgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCi0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIG5vIG1vcmUgc2VjdXJlIGNvZGVjLCBub24tc2VjdXJlIGNvZGVjIHdpbGwgYmUgcmVjbGFpbWVkLgogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlTm9uU2VjdXJlKCkgewotICAgICAgICBib29sIHJlc3VsdDsKICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLCAxKSk7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwgMTUwKSk7CkBAIC01MzcsMTEgKzYwOSwxNSBAQAogCiAgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBzZWN1cmUgY29kZWNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIG9uZSBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CkBAIC01NTgsMTUgKzYzNCwyMSBAQAogCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwogICAgICAgICAgICAgLy8gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCi0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTU4MiwxMSArNjY0LDE1IEBACiAKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CiAgICAgICAgICAgICAvLyBvbmUgbm9uIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBubyBtb3JlIG5vbi1zZWN1cmUgY29kZWMsIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcmlvcml0eSBwcm9jZXNzIHdpbGwgYmUgcmVjbGFpbWVkCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNsaWVudCAzIHdoaWNoIHN0aWxsIGxlZnQKICAgICAgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpKTsKQEAgLTU5NSwxMyArNjgxLDE3IEBACiAKICAgICB2b2lkIHRlc3RHZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnQoKSB7CiAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSA9IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5OworICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUgPSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlOwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OwotICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCBzdWJUeXBlLAorICAgICAgICAgICAgICAgICZjbGllbnQpKTsKIAogICAgICAgICBhZGRSZXNvdXJjZSgpOwogCi0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0xvd1ByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50KSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0xvd1ByaW9yaXR5UGlkLCB0eXBlLCBzdWJUeXBlLAorICAgICAgICAgICAgICAgICZjbGllbnQpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsCisgICAgICAgICAgICAgICAgJmNsaWVudCkpOwogCiAgICAgICAgIC8vIGtUZXN0UGlkMSBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IHByb2Nlc3Mgd2l0aCBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeS4KICAgICAgICAgLy8gbVRlc3RDbGllbnQxIGhhcyB0aGUgbGFyZ2VzdCBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSB3aXRoaW4ga1Rlc3RQaWQxLgpAQCAtNjE0LDM1ICs3MDQsMjUgQEAKICAgICAgICAgVGVzdFByb2Nlc3NJbmZvIHByb2Nlc3NJbmZvOwogCiAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSA9IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5OwotICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSA9IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCBzdWJUeXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKIAogICAgICAgICBhZGRSZXNvdXJjZSgpOwogCi0gICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZwaWQsICZwcmlvcml0eSkpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCBzdWJUeXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKICAgICAgICAgRVhQRUNUX0VRKGtUZXN0UGlkMSwgcGlkKTsKICAgICAgICAgaW50IHByaW9yaXR5MTsKICAgICAgICAgcHJvY2Vzc0luZm8uZ2V0UHJpb3JpdHkoa1Rlc3RQaWQxLCAmcHJpb3JpdHkxKTsKICAgICAgICAgRVhQRUNUX0VRKHByaW9yaXR5MSwgcHJpb3JpdHkpOwogCiAgICAgICAgIHR5cGUgPSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZwaWQsICZwcmlvcml0eSkpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCBzdWJUeXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKICAgICAgICAgRVhQRUNUX0VRKGtUZXN0UGlkMiwgcGlkKTsKICAgICAgICAgaW50IHByaW9yaXR5MjsKICAgICAgICAgcHJvY2Vzc0luZm8uZ2V0UHJpb3JpdHkoa1Rlc3RQaWQyLCAmcHJpb3JpdHkyKTsKICAgICAgICAgRVhQRUNUX0VRKHByaW9yaXR5MiwgcHJpb3JpdHkpOwogICAgIH0KIAotICAgIHZvaWQgdGVzdEdldEJpZ2dlc3RDbGllbnQoKSB7Ci0gICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSA9IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5OwotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OwotICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEJpZ2dlc3RDbGllbnRfbChrVGVzdFBpZDIsIHR5cGUsICZjbGllbnQpKTsKLQotICAgICAgICBhZGRSZXNvdXJjZSgpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRCaWdnZXN0Q2xpZW50X2woa1Rlc3RQaWQyLCB0eXBlLCAmY2xpZW50KSk7Ci0gICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDIsIGNsaWVudCk7Ci0gICAgfQotCiAgICAgdm9pZCB0ZXN0SXNDYWxsaW5nUHJpb3JpdHlIaWdoZXIoKSB7CiAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCgxMDEsIDEwMCkpOwogICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woMTAwLCAxMDApKTsKQEAgLTcyNSw2ICs4MDUsMzYxIEBACiAgICAgICAgIEVYUEVDVF9FUSg0dSwgbVN5c3RlbUNCLT5ldmVudENvdW50KCkpOwogICAgICAgICBFWFBFQ1RfRVEoRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgbVN5c3RlbUNCLT5sYXN0RXZlbnRUeXBlKCkpOwogICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aFZpZGVvQ29kZWNfcmVjbGFpbXNPbmx5VmlkZW9Db2RlYygpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBhdWRpb0ltYWdlVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MTsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiB2aWRlb1Rlc3RDbGllbnQgPSBtVGVzdENsaWVudDI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGF1ZGlvIGFuZCBpbWFnZSBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBhdWRpb0ltYWdlUmVzb3VyY2VzOworICAgICAgICBhdWRpb0ltYWdlUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIGF1ZGlvSW1hZ2VSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQxLCBnZXRJZChhdWRpb0ltYWdlVGVzdENsaWVudCksCisgICAgICAgICAgICAgICAgYXVkaW9JbWFnZVRlc3RDbGllbnQsIGF1ZGlvSW1hZ2VSZXNvdXJjZXMpOworCisgICAgICAgIC8vIEZhaWwgdG8gcmVjbGFpbSBhIHZpZGVvIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlY2xhaW1SZXNvdXJjZXM7CisgICAgICAgIHJlY2xhaW1SZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVjbGFpbVJlc291cmNlcywgJnJlc3VsdCkpOworCisgICAgICAgIC8vIE5vdyBhZGQgYSB2aWRlbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiB2aWRlb1Jlc291cmNlczsKKyAgICAgICAgdmlkZW9SZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQxLCBnZXRJZCh2aWRlb1Rlc3RDbGllbnQpLCB2aWRlb1Rlc3RDbGllbnQsCisgICAgICAgICAgICAgICAgdmlkZW9SZXNvdXJjZXMpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBuZXdseS1jcmVhdGVkIHZpZGVvIGNvZGVjIHJlc291cmNlIGNhbiBiZSByZWNsYWltZWQKKyAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGF1ZGlvIGFuZCBpbWFnZSByZXNvdXJjZXMgYXJlIHVudG91Y2hlZAorICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGF1ZGlvSW1hZ2VUZXN0Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBCdXQgdGhlIHZpZGVvIHJlc291cmNlIHdhcyByZWNsYWltZWQKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KHZpZGVvVGVzdENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VzX3dpdGhBdWRpb0NvZGVjX3JlY2xhaW1zT25seUF1ZGlvQ29kZWMoKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJiB2aWRlb0ltYWdlVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MTsKKyAgICAgICAgY29uc3QgYXV0byAmIGF1ZGlvVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MjsKKworICAgICAgICAvLyBDcmVhdGUgYSB2aWRlbyBhbmQgYXVkaW8gY29kZWMgcmVzb3VyY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gdmlkZW9JbWFnZVJlc291cmNlczsKKyAgICAgICAgdmlkZW9JbWFnZVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICB2aWRlb0ltYWdlUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIGtUZXN0VWlkMSwgZ2V0SWQodmlkZW9JbWFnZVRlc3RDbGllbnQpLAorICAgICAgICAgICAgICAgIHZpZGVvSW1hZ2VUZXN0Q2xpZW50LCB2aWRlb0ltYWdlUmVzb3VyY2VzKTsKKworICAgICAgICAvLyBGYWlsIHRvIHJlY2xhaW0gYW4gYXVkaW8gY29kZWMgcmVzb3VyY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVjbGFpbVJlc291cmNlczsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gTm93IGFkZCBhbiBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBhdWRpb1Jlc291cmNlczsKKyAgICAgICAgYXVkaW9SZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQyLCBnZXRJZChhdWRpb1Rlc3RDbGllbnQpLCBhdWRpb1Rlc3RDbGllbnQsCisgICAgICAgICAgICAgICAgYXVkaW9SZXNvdXJjZXMpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBuZXdseS1jcmVhdGVkIGF1ZGlvIGNvZGVjIHJlc291cmNlIGNhbiBiZSByZWNsYWltZWQKKyAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHZpZGVvIGFuZCBpbWFnZSByZXNvdXJjZXMgYXJlIHVudG91Y2hlZAorICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHZpZGVvSW1hZ2VUZXN0Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBCdXQgdGhlIGF1ZGlvIHJlc291cmNlIHdhcyByZWNsYWltZWQKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGF1ZGlvVGVzdENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VzX3dpdGhJbWFnZUNvZGVjX3JlY2xhaW1zT25seUltYWdlQ29kZWMoKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJiB2aWRlb0F1ZGlvVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MTsKKyAgICAgICAgY29uc3QgYXV0byAmIGltYWdlVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MjsKKworICAgICAgICAvLyBDcmVhdGUgYSB2aWRlbyBhbmQgYXVkaW8gY29kZWMgcmVzb3VyY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gdmlkZW9BdWRpb1Jlc291cmNlczsKKyAgICAgICAgdmlkZW9BdWRpb1Jlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICB2aWRlb0F1ZGlvUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIGtUZXN0VWlkMSwgZ2V0SWQodmlkZW9BdWRpb1Rlc3RDbGllbnQpLAorICAgICAgICAgICAgICAgIHZpZGVvQXVkaW9UZXN0Q2xpZW50LCB2aWRlb0F1ZGlvUmVzb3VyY2VzKTsKKworICAgICAgICAvLyBGYWlsIHRvIHJlY2xhaW0gYW4gaW1hZ2UgY29kZWMgcmVzb3VyY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVjbGFpbVJlc291cmNlczsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gTm93IGFkZCBhbiBpbWFnZSBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBpbWFnZVJlc291cmNlczsKKyAgICAgICAgaW1hZ2VSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQyLCBnZXRJZChpbWFnZVRlc3RDbGllbnQpLCBpbWFnZVRlc3RDbGllbnQsCisgICAgICAgICAgICAgICAgaW1hZ2VSZXNvdXJjZXMpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBuZXdseS1jcmVhdGVkIGltYWdlIGNvZGVjIHJlc291cmNlIGNhbiBiZSByZWNsYWltZWQKKyAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHZpZGVvIGFuZCBhdWRpbyByZXNvdXJjZXMgYXJlIHVudG91Y2hlZAorICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gQnV0IHRoZSBpbWFnZSByZXNvdXJjZSB3YXMgcmVjbGFpbWVkCisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlc193aGVuUGFydGlhbFJlc291cmNlTWF0Y2hfcmVjbGFpbXMoKSB7CisgICAgICAgIGNvbnN0IGludCBvbmx5VWlkID0ga1Rlc3RVaWQxOworICAgICAgICBjb25zdCBhdXRvIG9ubHlDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KGtMb3dQcmlvcml0eVBpZCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gb3duZWRSZXNvdXJjZXM7CisgICAgICAgIG93bmVkUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIG93bmVkUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoMTAwKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIG9ubHlVaWQsIGdldElkKG9ubHlDbGllbnQpLCBvbmx5Q2xpZW50LAorICAgICAgICAgICAgICAgIG93bmVkUmVzb3VyY2VzKTsKKworICAgICAgICAvLyBSZWNsYWltIGFuIGltYWdlIGNvZGVjIGluc3RlYWQgb2YgdGhlIHZpZGVvIGNvZGVjIHRoYXQgaXMgb3duZWQsIGJ1dCBhbHNvIHJlY2xhaW0KKyAgICAgICAgLy8gZ3JhcGhpY3MgbWVtb3J5LCB3aGljaCB3aWxsIHRyaWdnZXIgdGhlIHJlY2xhaW0uCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlY2xhaW1SZXNvdXJjZXM7CisgICAgICAgIHJlY2xhaW1SZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlR3JhcGhpY01lbW9yeVJlc291cmNlKDEwMCkpOworICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdmlkZW8gY29kZWMgcmVzb3VyY2VzIChpbmNsdWRpbmcgdGhlIG5lZWRlZCBncmFwaGljIG1lbW9yeSkgaXMgcmVjbGFpbWVkCisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChvbmx5Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZXNGcm9tTWFya2VkQ2xpZW50c19yZW1vdmVzQmlnZ2VzdE1hcmtlZENsaWVudEZvclNvbWVSZXNvdXJjZXMoKSB7CisgICAgICAgIC8vIHRoaXMgdGVzdCBvbmx5IHVzZXMgb25lIHBpZCBhbmQgb25lIHVpZAorICAgICAgICBjb25zdCBpbnQgb25seVBpZCA9IGtUZXN0UGlkMTsKKyAgICAgICAgY29uc3QgaW50IG9ubHlVaWQgPSBrVGVzdFVpZDE7CisKKyAgICAgICAgLy8gc2VjdXJlIHZpZGVvIGNvZGVjCisgICAgICAgIGNvbnN0IGF1dG8gc21hbGxTZWN1cmVWaWRlb01hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VzdFNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMSkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKHNtYWxsU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBzbWFsbFNlY3VyZVZpZGVvTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgyKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDMpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChzbWFsbFNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQobGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCkpOworICAgICAgICAvLyBkb24ndCBtYXJrIHRoZSBsYXJnZXN0IGNsaWVudAorCisgICAgICAgIC8vIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbE5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZU5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0Tm9uU2VjdXJlVmlkZW9BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZU5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3ROb25TZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3ROb25TZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZU5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gc2VjdXJlIGF1ZGlvIGNvZGVjCisgICAgICAgIGNvbnN0IGF1dG8gc21hbGxTZWN1cmVBdWRpb01hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VTZWN1cmVBdWRpb01hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VzdFNlY3VyZUF1ZGlvQWN0aXZlQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoMSkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBzbWFsbFNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgyKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VTZWN1cmVBdWRpb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKDMpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChzbWFsbFNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQobGFyZ2VTZWN1cmVBdWRpb01hcmtlZENsaWVudCkpOworICAgICAgICAvLyBkb24ndCBtYXJrIHRoZSBsYXJnZXN0IGNsaWVudAorCisgICAgICAgIC8vIG5vbi1zZWN1cmUgYXVkaW8gY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbE5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0Tm9uU2VjdXJlQXVkaW9BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3ROb25TZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3ROb25TZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gc2VjdXJlIGltYWdlIGNvZGVjCisgICAgICAgIGNvbnN0IGF1dG8gc21hbGxTZWN1cmVJbWFnZU1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VTZWN1cmVJbWFnZU1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VzdFNlY3VyZUltYWdlQWN0aXZlQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoMSkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKHNtYWxsU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBzbWFsbFNlY3VyZUltYWdlTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgyKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VTZWN1cmVJbWFnZU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKDMpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZXN0U2VjdXJlSW1hZ2VBY3RpdmVDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZXN0U2VjdXJlSW1hZ2VBY3RpdmVDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChzbWFsbFNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSk7CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQobGFyZ2VTZWN1cmVJbWFnZU1hcmtlZENsaWVudCkpOworICAgICAgICAvLyBkb24ndCBtYXJrIHRoZSBsYXJnZXN0IGNsaWVudAorCisgICAgICAgIC8vIG5vbi1zZWN1cmUgaW1hZ2UgY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbE5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZU5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0Tm9uU2VjdXJlSW1hZ2VBY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZU5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3ROb25TZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3ROb25TZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZU5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gZ3JhcGhpYyBtZW1vcnkKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbEdyYXBoaWNNZW1vcnlNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VzdEdyYXBoaWNNZW1vcnlBY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZSgxMDApKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbEdyYXBoaWNNZW1vcnlNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBzbWFsbEdyYXBoaWNNZW1vcnlNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlR3JhcGhpY01lbW9yeVJlc291cmNlKDIwMCkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoMzAwKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdEdyYXBoaWNNZW1vcnlBY3RpdmVDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCkpOworICAgICAgICAvLyBkb24ndCBtYXJrIHRoZSBsYXJnZXN0IGNsaWVudAorCisgICAgICAgIC8vIERSTSBzZXNzaW9uCisgICAgICAgIGNvbnN0IGF1dG8gc21hbGxEcm1TZXNzaW9uTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZURybVNlc3Npb25NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3REcm1TZXNzaW9uQWN0aXZlQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVEcm1TZXNzaW9uUmVzb3VyY2UoMSkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKHNtYWxsRHJtU2Vzc2lvbk1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsRHJtU2Vzc2lvbk1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVEcm1TZXNzaW9uUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlRHJtU2Vzc2lvbk1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlRHJtU2Vzc2lvbk1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVEcm1TZXNzaW9uUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3REcm1TZXNzaW9uQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChzbWFsbERybVNlc3Npb25NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZURybVNlc3Npb25NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBiYXR0ZXJ5CisgICAgICAgIGNvbnN0IGF1dG8gYmF0dGVyeU1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlQmF0dGVyeVJlc291cmNlKCkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGJhdHRlcnlNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBiYXR0ZXJ5TWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoYmF0dGVyeU1hcmtlZENsaWVudCkpOworCisgICAgICAgIC8vIENQVSBib29zdAorICAgICAgICBjb25zdCBhdXRvIGNwdUJvb3N0TWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVDcHVCb29zdFJlc291cmNlKCkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGNwdUJvb3N0TWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgY3B1Qm9vc3RNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChjcHVCb29zdE1hcmtlZENsaWVudCkpOworCisgICAgICAgIC8vIG5vdyB3ZSBleHBlY3QgdGhhdCB3ZSBvbmx5IHJlY2xhaW0gcmVzb3VyY2VzIGZyb20gdGhlIGJpZ2dlc3QgbWFya2VkIGNsaWVudAorICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwob25seVBpZCkuaXNPaygpKTsKKyAgICAgICAgLy8gc2VjdXJlIHZpZGVvIGNvZGVjCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxTZWN1cmVWaWRlb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdFNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBub24tc2VjdXJlIHZpZGVvIGNvZGVjCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdE5vblNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBzZWN1cmUgYXVkaW8gY29kZWMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbFNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VTZWN1cmVBdWRpb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0U2VjdXJlQXVkaW9BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIG5vbi1zZWN1cmUgYXVkaW8gY29kZWMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbE5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0Tm9uU2VjdXJlQXVkaW9BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIHNlY3VyZSBpbWFnZSBjb2RlYworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3RTZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBpbWFnZSBjb2RlYworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZU5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3ROb25TZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gZ3JhcGhpYyBtZW1vcnkKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbEdyYXBoaWNNZW1vcnlNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZUdyYXBoaWNNZW1vcnlNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdEdyYXBoaWNNZW1vcnlBY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIERSTSBzZXNzaW9uCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxEcm1TZXNzaW9uTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VEcm1TZXNzaW9uTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3REcm1TZXNzaW9uQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBiYXR0ZXJ5IGlzIG5vdCBleHBlY3RlZCB0byBiZSByZWNsYWltZWQgd2hlbiBtYXJrZWQgYXMgcGVuZGluZyByZW1vdmFsCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoYmF0dGVyeU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gQ1BVIGJvb3N0IGlzIG5vdCBleHBlY3RlZCB0byBiZSByZWNsYWltZWQgd2hlbiBtYXJrZWQgYXMgcGVuZGluZyByZW1vdmFsCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoY3B1Qm9vc3RNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgfQogfTsKIAogVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBjb25maWcpIHsKQEAgLTc2OCwxOSArMTIwMywxNSBAQAogICAgIHRlc3RHZXRMb3dlc3RQcmlvcml0eVBpZCgpOwogfQogCi1URVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGdldEJpZ2dlc3RDbGllbnRfbCkgewotICAgIHRlc3RHZXRCaWdnZXN0Q2xpZW50KCk7Ci19Ci0KIFRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgaXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCkgewogICAgIHRlc3RJc0NhbGxpbmdQcmlvcml0eUhpZ2hlcigpOwogfQogCi1URVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHRlc3RCYXR0ZXJ5U3RhdHMpIHsKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgYmF0dGVyeVN0YXRzKSB7CiAgICAgdGVzdEJhdHRlcnlTdGF0cygpOwogfQogCi1URVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHRlc3RDcHVzZXRCb29zdCkgeworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBjcHVzZXRCb29zdCkgewogICAgIHRlc3RDcHVzZXRCb29zdCgpOwogfQogCkBAIC03OTIsNCArMTIyMywyNSBAQAogICAgIHRlc3RNYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoKTsKIH0KIAorVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZWNsYWltUmVzb3VyY2VzX3dpdGhWaWRlb0NvZGVjX3JlY2xhaW1zT25seVZpZGVvQ29kZWMpIHsKKyAgICB0ZXN0UmVjbGFpbVJlc291cmNlc193aXRoVmlkZW9Db2RlY19yZWNsYWltc09ubHlWaWRlb0NvZGVjKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVjbGFpbVJlc291cmNlc193aXRoQXVkaW9Db2RlY19yZWNsYWltc09ubHlBdWRpb0NvZGVjKSB7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEF1ZGlvQ29kZWNfcmVjbGFpbXNPbmx5QXVkaW9Db2RlYygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlY2xhaW1SZXNvdXJjZXNfd2l0aEltYWdlQ29kZWNfcmVjbGFpbXNPbmx5SW1hZ2VDb2RlYykgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VzX3dpdGhJbWFnZUNvZGVjX3JlY2xhaW1zT25seUltYWdlQ29kZWMoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZWNsYWltUmVzb3VyY2VzX3doZW5QYXJ0aWFsUmVzb3VyY2VNYXRjaF9yZWNsYWltcykgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VzX3doZW5QYXJ0aWFsUmVzb3VyY2VNYXRjaF9yZWNsYWltcygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsCisgICAgICAgIHJlY2xhaW1SZXNvdXJjZXNGcm9tTWFya2VkQ2xpZW50c19yZW1vdmVzQmlnZ2VzdE1hcmtlZENsaWVudEZvclNvbWVSZXNvdXJjZXMpIHsKKyAgICB0ZXN0UmVjbGFpbVJlc291cmNlc0Zyb21NYXJrZWRDbGllbnRzX3JlbW92ZXNCaWdnZXN0TWFya2VkQ2xpZW50Rm9yU29tZVJlc291cmNlcygpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcAppbmRleCBhY2Q5ZGYxLi4wMDM1NjlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKQEAgLTExNiw2ICsxMTYsMjYgQEAKIAogY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQ7CiAKK3N0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMsIGFtb3VudCk7Cit9CisKK3N0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMsIGFtb3VudCk7Cit9CisKK3N0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWMsIGFtb3VudCk7Cit9CisKK3N0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWMsIGFtb3VudCk7Cit9CisKIC8vIE9wZXJhdG9ycyBmb3IgR1Rlc3QgbWFjcm9zLgogYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIGxocywgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgcmhzKSB7CiAgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy51aWQgPT0gcmhzLnVpZCAmJiBsaHMucGlkID09IHJocy5waWQgJiYKQEAgLTIzMywzMCArMjUzLDMwIEBACiAKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgLy8gQWRkIHNlY3VyZSB2aWRlbyBjb2RlYy4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKIAogICAgIC8vIEFkZCBub24tc2VjdXJlIHZpZGVvIGNvZGVjLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSwgbVRlc3RDbGllbnQyLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOwogCiAgICAgLy8gQWRkIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczMpKTsKIAogICAgIC8vIEFkZCBhZGRpdGlvbmFsIGF1ZGlvIGNvZGVjcywgc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pKTsKLSAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLykpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCkpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCkpOwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczIpKTsKQEAgLTI3Niw5ICsyOTYsOSBAQAogCiAgICAgLy8gQWRkIG11bHRpcGxlIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgogICAgIC8vIE11bHRpcGxlIGVudHJpZXMgb2YgdGhlIHNhbWUgdHlwZSBzaG91bGQgYmUgbWVyZ2VkLCBjb3VudCBzaG91bGQgYmUgcHJvcGFnYXRlZCBjb3JyZWN0bHkuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLywgMyAvKmNvdW50Ki8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMyl9OwogICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDJ9fTsKICAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAzfX07CiAgICAgb2JzZXJ2YWJsZXMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMn0sCkBAIC0zMDAsNyArMzIwLDcgQEAKIAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICAvLyBBZGQgc2VjdXJlIHZpZGVvIGNvZGVjIHRvIGNsaWVudDEuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwpAQCAtMzIyLDcgKzM0Miw3IEBACiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKIAogICAgIC8vIEFkZCBub24tc2VjdXJlIHZpZGVvIGNvZGVjIHRvIGNsaWVudDIuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOwpAQCAtMzQ0LDI0ICszNjQsMjQgQEAKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogCiAgICAgLy8gQWRkIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLCBwbHVzIGF1ZGlvIGNvZGVjcyAodGhhdCdzIGlnbm9yZWQpLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMykpOwogICAgIC8vIFJlbW92ZSBvbmUgYXVkaW8gY29kZWMsIHNob3VsZCBoYXZlIG5vIGV2ZW50LgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAgICAgLy8gUmVtb3ZlIHRoZSBvdGhlciBhdWRpbyBjb2RlYyBhbmQgdGhlIHNlY3VyZSB2aWRlbyBjb2RlYywgb25seSBzZWN1cmUgdmlkZW8gY29kZWMKICAgICAvLyByZW1vdmFsIHNob3VsZCBiZSByZXBvcnRlZC4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CkBAIC0zODYsMTAgKzQwNiwxMCBAQAogCiAgICAgLy8gQWRkIG11bHRpcGxlIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLCBwbHVzIGF1ZGlvIGNvZGVjcyAodGhhdCdzIGlnbm9yZWQpLgogICAgIC8vIChSZXNvdXJjZU1hbmFnZXIgd2lsbCBtZXJnZSB0aGVzZSBpbnRlcm5hbGx5LikKLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCA0IC8qY291bnQqLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDQpLAorICAgICAgICAgICAgICAgICBjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOwogICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKICAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCA0fX07CkBAIC00MDAsMTAgKzQyMCwxMCBAQAogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7CiAgICAgLy8gUmVtb3ZlIG9uZSBhdWRpbyBjb2RlYywgMiBzZWN1cmUgdmlkZW8gY29kZWNzIGFuZCAyIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgogICAgIC8vIDEgc2VjdXJlIHZpZGVvIGNvZGVjIHJlbW92YWwgYW5kIDIgbm9uLXNlY3VyZSB2aWRlbyBjb2RlYyByZW1vdmFscyBzaG91bGQgYmUgcmVwb3J0ZWQuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLywgMiAvKmNvdW50Ki8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDIpfTsKICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCByZXNvdXJjZXMpOwogICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKICAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAyfX07CkBAIC00NDMsOCArNDYzLDggQEAKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAKICAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAppbmRleCBhOWZkMTRmLi5mYTVlYjRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtODAsNyArODAsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCBjYjE4MGVjLi5hZTEzNjU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zNCw4ICszNCw4IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgICAgICAibGlibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmggYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oCmluZGV4IDBjYjJmYWQuLjhlMTdmNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaApAQCAtMjU5LDkgKzI1OSw3IEBACiBzdGF0aWMgY29uc3RleHByIGJvb2wgc3VjY2VzcyA9IHRydWU7CiBzdGF0aWMgY29uc3RleHByIGJvb2wgZmFpbCA9IGZhbHNlOwogCi1zdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRXZlbnRUcmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRlc3RDbGllbnRDYWxsYmFjaz4geworc3RydWN0IFRlc3RDbGllbnRDYWxsYmFjayA6IHB1YmxpYyBCblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2ssIHB1YmxpYyBFdmVudFRyYWNrZXIgewogICAgIFRlc3RDbGllbnRDYWxsYmFjayhjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSwgaW50MzJfdCBpZCkKICAgICAgICAgICA6IG1DbGllbnRJZChpZCksIG1DbGllbnRQaWQoUElEKGlkKSksIG1DbGllbnRVaWQoVUlEKGlkKSksIG1QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkgewogICAgICAgICBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrICVkIGNyZWF0ZWQ6IHBpZCAlZCwgdWlkICVkIiwgaWQsIFBJRChpZCksIFVJRChpZCkpOwpAQCAtMzQ4LDggKzM0Niw4IEBACiAgICAgICAgIEFMT0dEKCJyZWdpc3RlcmluZyAlcyB3aXRoIHVpZCAlZCIsIHBhY2thZ2VOYW1lLCBtQ2xpZW50VWlkKTsKIAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPQotICAgICAgICAgICAgICAgIHNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KHNoYXJlZF9mcm9tX3RoaXMoKSwga0NsaWVudE5hbWUsIHBhY2thZ2VOYW1lLCAmY2xpZW50KTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IHNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KHJlZjxUZXN0Q2xpZW50Q2FsbGJhY2s+KCksIGtDbGllbnROYW1lLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnQpOwogCiAgICAgICAgIG1DbGllbnQgPSBzdGF0dXMuaXNPaygpID8gY2xpZW50IDogbnVsbHB0cjsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCmluZGV4IDNhODllMTIuLmRlY2M1ZmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icApAQCAtMjgsMTcgKzI4LDExIEBACiAgICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotfQorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKLS8vIEJ5IGFkZGluZyAidmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSIgdG8gImxpYmF2c2VydmljZXNfbWluaWphaWwiLCB3ZSBkb24ndAotLy8gbmVlZCB0byBoYXZlICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIgYW55IGxvbmdlci4KLS8vICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIgd2lsbCBiZSByZW1vdmVkLCBvbmNlIHdlIHJlcGxhY2UgaXQgd2l0aAotLy8gImxpYmF2c2VydmljZXNfbWluaWphaWwiIGluIGFsbCB2ZW5kb3IgbW9kdWxlcy4gKGIvMTQ2MzEzNzEwKQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCi0gICAgdmVuZG9yOiB0cnVlLAotICAgIGRlZmF1bHRzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWxfZGVmYXVsdHMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWluaWphaWwvT1dORVJTIGIvc2VydmljZXMvbWluaWphaWwvT1dORVJTCmluZGV4IDE5ZjRmOWYuLjllYmY0MWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUworKysgYi9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMKQEAgLTEsMiArMSwyIEBACiBqb3JnZWxvQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDE4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9Db21tYW5kUXVldWUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjaHJvbm8+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBdWRpb0NvbW1hbmRRdWV1ZS5oIgorCituYW1lc3BhY2UgYWF1ZGlvIHsKKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0NvbW1hbmRRdWV1ZTo6c2VuZENvbW1hbmQoc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmQ+IGNvbW1hbmQpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICBpZiAoIW1SdW5uaW5nKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJpZWQgdG8gc2VuZCBjb21tYW5kIHdoaWxlIGl0IHdhcyBub3QgcnVubmluZyIpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICB9CisgICAgICAgIG1Db21tYW5kcy5wdXNoKGNvbW1hbmQpOworICAgICAgICBtV2FpdFdvcmtDb25kLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIF9jbChjb21tYW5kLT5sb2NrKTsKKyAgICBhbmRyb2lkOjpiYXNlOjpTY29wZWRMb2NrQXNzZXJ0aW9uIGxvY2tBc3NlcnRpb24oY29tbWFuZC0+bG9jayk7CisgICAgQUxPR1YoIlNlbmRpbmcgY29tbWFuZCAlZCwgd2FpdCBmb3IgcmVwbHkoJWQpIHdpdGggdGltZW91dCAlamQiLAorICAgICAgICAgICBjb21tYW5kLT5vcGVyYXRpb25Db2RlLCBjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSwgY29tbWFuZC0+dGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICAvLyBgbVdhaXRGb3JSZXBseWAgaXMgZmlyc3QgaW5pdGlhbGl6ZWQgd2hlbiB0aGUgY29tbWFuZCBpcyBjb25zdHJ1Y3RlZC4gSXQgd2lsbCBiZSBmbGlwcGVkCisgICAgLy8gd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQuCisgICAgYXV0byB0aW1lb3V0RXhwaXJlID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkKKyAgICAgICAgICAgICsgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKGNvbW1hbmQtPnRpbWVvdXROYW5vc2Vjb25kcyk7CisgICAgd2hpbGUgKGNvbW1hbmQtPmlzV2FpdGluZ0ZvclJlcGx5KSB7CisgICAgICAgIGlmIChjb21tYW5kLT5jb25kaXRpb25WYXJpYWJsZS53YWl0X3VudGlsKF9jbCwgdGltZW91dEV4cGlyZSkKKyAgICAgICAgICAgICAgICA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgeworICAgICAgICAgICAgQUxPR0QoIkNvbW1hbmQgJWQgdGltZSBvdXQiLCBjb21tYW5kLT5vcGVyYXRpb25Db2RlKTsKKyAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IEFBVURJT19FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiQ29tbWFuZCAlZCBzZW50IHdpdGggcmVzdWx0IGFzICVkIiwgY29tbWFuZC0+b3BlcmF0aW9uQ29kZSwgY29tbWFuZC0+cmVzdWx0KTsKKyAgICByZXR1cm4gY29tbWFuZC0+cmVzdWx0OworfQorCitzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gQUF1ZGlvQ29tbWFuZFF1ZXVlOjp3YWl0Rm9yQ29tbWFuZChpbnQ2NF90IHRpbWVvdXROYW5vcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kPiBjb21tYW5kOworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBfbChtTG9jayk7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihtTG9jayk7CisgICAgICAgIGlmICh0aW1lb3V0TmFub3MgPj0gMCkgeworICAgICAgICAgICAgbVdhaXRXb3JrQ29uZC53YWl0X2ZvcihfbCwgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHRpbWVvdXROYW5vcyksIFt0aGlzXSgpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTY29wZWRMb2NrQXNzZXJ0aW9uIGxvY2tBc3NlcnRpb24obUxvY2spOworICAgICAgICAgICAgICAgIHJldHVybiAhbVJ1bm5pbmcgfHwgIW1Db21tYW5kcy5lbXB0eSgpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtV2FpdFdvcmtDb25kLndhaXQoX2wsIFt0aGlzXSgpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTY29wZWRMb2NrQXNzZXJ0aW9uIGxvY2tBc3NlcnRpb24obUxvY2spOworICAgICAgICAgICAgICAgIHJldHVybiAhbVJ1bm5pbmcgfHwgIW1Db21tYW5kcy5lbXB0eSgpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ29tbWFuZHMuZW1wdHkoKSAmJiBtUnVubmluZykgeworICAgICAgICAgICAgY29tbWFuZCA9IG1Db21tYW5kcy5mcm9udCgpOworICAgICAgICAgICAgbUNvbW1hbmRzLnBvcCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb21tYW5kOworfQorCit2b2lkIEFBdWRpb0NvbW1hbmRRdWV1ZTo6c3RhcnRXYWl0aW5nKCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgIG1SdW5uaW5nID0gdHJ1ZTsKK30KKwordm9pZCBBQXVkaW9Db21tYW5kUXVldWU6OnN0b3BXYWl0aW5nKCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgLy8gQ2xlYXIgYWxsIGNvbW1hbmRzIGluIHRoZSBxdWV1ZSBhcyB0aGUgY29tbWFuZCB0aHJlYWQgaXMgc3RvcHBlZC4KKyAgICB3aGlsZSAoIW1Db21tYW5kcy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gY29tbWFuZCA9IG1Db21tYW5kcy5mcm9udCgpOworICAgICAgICBtQ29tbWFuZHMucG9wKCk7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gX2NsKGNvbW1hbmQtPmxvY2spOworICAgICAgICAvLyBJZiB0aGUgY29tbWFuZCBpcyB3YWl0aW5nIGZvciByZXN1bHQsIHJldHVybnMgQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUKKyAgICAgICAgLy8gYXMgdGhlcmUgaXMgbm8gdGhyZWFkIHdhaXRpbmcgZm9yIHRoZSBjb21tYW5kLgorICAgICAgICBpZiAoY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkpIHsKKyAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbW1hbmQtPmNvbmRpdGlvblZhcmlhYmxlLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtV2FpdFdvcmtDb25kLm5vdGlmeV9vbmUoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYWF1ZGlvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ29tbWFuZFF1ZXVlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQ0MmEzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ29tbWFuZFF1ZXVlLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisKK25hbWVzcGFjZSBhYXVkaW8geworCit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2NvbW1hbmRfb3Bjb2RlOworCitjbGFzcyBBQXVkaW9Db21tYW5kUGFyYW0geworcHVibGljOgorICAgIEFBdWRpb0NvbW1hbmRQYXJhbSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5BQXVkaW9Db21tYW5kUGFyYW0oKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBBQXVkaW9Db21tYW5kIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBQXVkaW9Db21tYW5kKAorICAgICAgICAgICAgYWF1ZGlvX2NvbW1hbmRfb3Bjb2RlIG9wQ29kZSwgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmRQYXJhbT4gcGFyYW0gPSBudWxscHRyLAorICAgICAgICAgICAgYm9vbCB3YWl0Rm9yUmVwbHkgPSBmYWxzZSwgaW50NjRfdCB0aW1lb3V0TmFub3MgPSAwKQorICAgICAgICAgICAgOiBvcGVyYXRpb25Db2RlKG9wQ29kZSksIHBhcmFtZXRlcihwYXJhbSksIGlzV2FpdGluZ0ZvclJlcGx5KHdhaXRGb3JSZXBseSksCisgICAgICAgICAgICAgIHRpbWVvdXROYW5vc2Vjb25kcyh0aW1lb3V0TmFub3MpIHsgfQorICAgIHZpcnR1YWwgfkFBdWRpb0NvbW1hbmQoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6Om11dGV4IGxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY29uZGl0aW9uVmFyaWFibGU7CisKKyAgICBjb25zdCBhYXVkaW9fY29tbWFuZF9vcGNvZGUgb3BlcmF0aW9uQ29kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZFBhcmFtPiBwYXJhbWV0ZXI7CisgICAgYm9vbCBpc1dhaXRpbmdGb3JSZXBseSBHVUFSREVEX0JZKGxvY2spOworICAgIGNvbnN0IGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgR1VBUkRFRF9CWShsb2NrKSA9IEFBVURJT19PSzsKK307CisKK2NsYXNzIEFBdWRpb0NvbW1hbmRRdWV1ZSB7CitwdWJsaWM6CisgICAgQUF1ZGlvQ29tbWFuZFF1ZXVlKCkgPSBkZWZhdWx0OworICAgIH5BQXVkaW9Db21tYW5kUXVldWUoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgY29tbWFuZCBxdWV1ZS4gVGhlIHJldHVybiB3aWxsIGJlIHdhaXRpbmcgZm9yIGEgc3BlY2lmaWVkIHRpbWVvdXQKKyAgICAgKiBwZXJpb2QgaW5kaWNhdGVkIGJ5IHRoZSBjb21tYW5kIGlmIGl0IGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gc2VuZCB0byB0aGUgY29tbWFuZCBxdWV1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2Ygc2VuZGluZyB0aGUgY29tbWFuZCBvciB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgY29tbWFuZCBpZiBjb21tYW5kCisgICAgICogICAgICAgICBuZWVkIHRvIHdhaXQgZm9yIGEgcmVwbHkuIElmIHRpbWVvdXQgaGFwcGVucywgQUFVRElPX0VSUk9SX1RJTUVPVVQgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZENvbW1hbmQoc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmQ+IGNvbW1hbmQpOworCisgICAgLyoqCisgICAgICogV2FpdCBmb3IgbmV4dCBhdmFpbGFibGUgY29tbWFuZCBPUiB1bnRpbCB0aGUgdGltZW91dCBpcyBleHBpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVvdXROYW5vcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIG5leHQgY29tbWFuZCAoMCBtZWFucyByZXR1cm4gaW1tZWRpYXRlbHkgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFueSBjYXNlKSwgbmVnYXRpdmUgdG8gd2FpdCBmb3JldmVyLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYXZhaWxhYmxlIGNvbW1hbmQgaWYgYW55IG9yIGEgbnVsbHB0ciB3aGVuIHRoZXJlIGlzIG5vbmUuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmQ+IHdhaXRGb3JDb21tYW5kKGludDY0X3QgdGltZW91dE5hbm9zID0gLTEpOworCisgICAgLyoqCisgICAgICogU3RhcnQgd2FpdGluZyBmb3IgY29tbWFuZHMuIENvbW1hbmRzIGNhbiBvbmx5IGJlIHB1c2hlZCBpbnRvIHRoZSBjb21tYW5kIHF1ZXVlIGFmdGVyIGl0CisgICAgICogc3RhcnRzIHdhaXRpbmcuCisgICAgICovCisgICAgdm9pZCBzdGFydFdhaXRpbmcoKTsKKworICAgIC8qKgorICAgICAqIEZvcmNlIHN0b3Agd2FpdGluZyBmb3IgbmV4dCBjb21tYW5kCisgICAgICovCisgICAgdm9pZCBzdG9wV2FpdGluZygpOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVdhaXRXb3JrQ29uZDsKKworICAgIHN0ZDo6cXVldWU8c3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmQ+PiBtQ29tbWFuZHMgR1VBUkRFRF9CWShtTG9jayk7CisgICAgYm9vbCBtUnVubmluZyBHVUFSREVEX0JZKG1Mb2NrKSA9IGZhbHNlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWF1ZGlvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCA0MGE2NjRlLi4yNjc5YjJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMjgwLDYgKzI4MCwyMiBAQAogICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPnVucmVnaXN0ZXJBdWRpb1RocmVhZChjbGllbnRUaHJlYWRJZCkpOwogfQogCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6ZXhpdFN0YW5kYnkoaW50MzJfdCBzdHJlYW1IYW5kbGUsIEVuZHBvaW50KiBlbmRwb2ludCwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJnZXRTdHJlYW1EZXNjcmlwdGlvbigpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGVuZHBvaW50UGFyY2VsYWJsZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+ZXhpdFN0YW5kYnkoJmVuZHBvaW50UGFyY2VsYWJsZSk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgKmVuZHBvaW50ID0gc3RkOjptb3ZlKGVuZHBvaW50UGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIH0KKyAgICBBSURMX1JFVFVSTihyZXN1bHQpOworfQorCiBib29sIEFBdWRpb1NlcnZpY2U6OmlzQ2FsbGVySW5TZXJ2aWNlKCkgewogICAgIHBpZF90IGNsaWVudFBpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QobUF1ZGlvQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnBpZCkpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QobUF1ZGlvQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCmluZGV4IDdjMWI3OTYuLjBhMTExZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKQEAgLTgyLDYgKzgyLDkgQEAKICAgICBiaW5kZXI6OlN0YXR1cyB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoaW50MzJfdCBzdHJlYW1IYW5kbGUsIGludDMyX3QgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKKyAgICBiaW5kZXI6OlN0YXR1cyBleGl0U3RhbmRieShpbnQzMl90IHN0cmVhbUhhbmRsZSwgOjphYXVkaW86OkVuZHBvaW50KiBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggMTNkZDNkMy4uYjU1YjYwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC01OSw3ICs1OSw5IEBACiAgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgQ291bnQ6ICAgICAgICAiIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgRm9ybWF0OiAgICAgICAgICAgICAgICIgPDwgZ2V0Rm9ybWF0KCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBDaGFubmVsIE1hc2s6ICAgICAgICAgMHgiIDw8IHN0ZDo6aGV4IDw8IGdldENoYW5uZWxNYXNrKCkgPDwgc3RkOjpkZWMgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGb3JtYXQ6ICAgICAgICAgICAgICAgIiA8PCBnZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhnZXRGb3JtYXQoKSkgPDwgIilcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgRnJhbWVzIFBlciBCdXJzdDogICAgICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgVXNhZ2U6ICAgICAgICAgICAgICAgICIgPDwgZ2V0VXNhZ2UoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENvbnRlbnRUeXBlOiAgICAgICAgICAiIDw8IGdldENvbnRlbnRUeXBlKCkgPDwgIlxuIjsKQEAgLTE2NCw2ICsxNjYsMTAgQEAKICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBnZXRTYW1wbGVzUGVyRnJhbWUoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGlmIChjb25maWd1cmF0aW9uLmdldENoYW5uZWxNYXNrKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmCisgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0Q2hhbm5lbE1hc2soKSAhPSBnZXRDaGFubmVsTWFzaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTE4OCw3ICsxOTQsOSBAQAogICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKICAgICAgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1kKICAgICAgICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzaygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+Z2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5nZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmlzQ29udGVudFNwYXRpYWxpemVkKCkpKTsKICAgICB9IGVsc2UgewogICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oQVVESU9fRkxBR19MT1dfTEFURU5DWQogICAgICAgICAgICAgICAgIHwgQUF1ZGlvQ29udmVydF9wcml2YWN5U2Vuc2l0aXZlVG9BdWRpb0ZsYWdzTWFzayhwYXJhbXMtPmlzUHJpdmFjeVNlbnNpdGl2ZSgpKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCmluZGV4IGE3ZjYzZDMuLjkyMDA0YzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCkBAIC03Nyw2ICs3NywxNiBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YW5kYnkoKSB7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YW5kYnkoKSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUiKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50OjpleGl0U3RhbmRieSgpIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEBwYXJhbSBwb3NpdGlvbkZyYW1lcwogICAgICAqIEBwYXJhbSB0aW1lTmFub3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggYmM3NjlmMC4uOTViZDRiYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTY2LDggKzY2LDcgQEAKICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgIEFMT0dEKCIlcygpIHJlYWQoKSByZXR1cm5lZCBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEIiwgX19mdW5jX18pOwotICAgICAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdGhlIHJldHVybmVkIHZlY3Rvci4KLSAgICAgICAgICAgICh2b2lkKSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgICAgICAgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpoYW5kbGVEaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXNBc3luYygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJjYWxsYmFja0xvb3AoKSByZWFkICVkIC8gJWQiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAppbmRleCBhMDgwOThjLi4zZjE4Yjk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtODAsMTYgKzgwLDE2IEBACiAKICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOwogCi0gICAgLy8gRkxPQVQgaXMgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSB0aGUgSEFMIHNvIGFzayBmb3IgYSAzMi1iaXQuCi0gICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhlc2UgbG9ncyB3aGVuIGZpbmlzaGVkIGRlYnVnZ2luZy4KLSAgICAgICAgQUxPR0QoIiVzKCkgY2hhbmdlIGZvcm1hdCBmcm9tICVkIHRvIDMyX0JJVCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCk7Ci0gICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7Ci0gICAgfQotCiAgICAgcmVzdWx0ID0gb3BlbldpdGhGb3JtYXQoYXVkaW9Gb3JtYXQpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgJiYgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRCgiJXMoKSBGTE9BVCBmYWlsZWQsIHBlcmhhcHMgZHVlIHRvIGZvcm1hdC4gVHJ5IGFnYWluIHdpdGggMzJfQklUIiwgX19mdW5jX18pOworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OworCiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgJiYgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQpIHsKICAgICAgICAgQUxPR0QoIiVzKCkgMzJfQklUIGZhaWxlZCwgcGVyaGFwcyBkdWUgdG8gZm9ybWF0LiBUcnkgYWdhaW4gd2l0aCAyNF9CSVRfUEFDS0VEIiwgX19mdW5jX18pOwogICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKQEAgLTEyNiwyMCArMTI2LDE1IEBACiAgICAgfQogICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGFhdWRpb1NhbXBsZVJhdGU7CiAKLSAgICBpbnQzMl90IGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpOwotCiAgICAgY29uc3QgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOwogCisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IEFBdWRpb19nZXRDaGFubmVsTWFza0Zvck9wZW4oCisgICAgICAgICAgICBnZXRDaGFubmVsTWFzaygpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworCiAgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoYWF1ZGlvU2FtcGxlc1BlckZyYW1lKTsKICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gT1VUUFVUX0VTVElNQVRFRF9IQVJEV0FSRV9PRkZTRVRfTkFOT1M7IC8vIGZyYW1lcyBhdCBEQUMgbGF0ZXIKIAogICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9ICAoYWF1ZGlvU2FtcGxlc1BlckZyYW1lID09IEFBVURJT19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOwogICAgICAgICBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MgPSBJTlBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TOyAvLyBmcmFtZXMgYXQgQURDIGVhcmxpZXIKIAogICAgIH0gZWxzZSB7CkBAIC0xODgsNzEgKzE4MywzOSBAQAogICAgICAgICAgICAgPyBBQVVESU9fU0VTU0lPTl9JRF9OT05FCiAgICAgICAgICAgICA6IChhYXVkaW9fc2Vzc2lvbl9pZF90KSBzZXNzaW9uSWQ7CiAgICAgc2V0U2Vzc2lvbklkKGFjdHVhbFNlc3Npb25JZCk7Ci0gICAgQUxPR0QoIiVzKCkgZGV2aWNlSWQgPSAlZCwgc2Vzc2lvbklkID0gJWQiLCBfX2Z1bmNfXywgZ2V0RGV2aWNlSWQoKSwgZ2V0U2Vzc2lvbklkKCkpOworCisgICAgQUxPR0QoIiVzKGZvcm1hdCA9IDB4JVgpIGRldmljZUlkID0gJWQsIHNlc3Npb25JZCA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQsIGdldERldmljZUlkKCksIGdldFNlc3Npb25JZCgpKTsKIAogICAgIC8vIENyZWF0ZSBNTUFQL05PSVJRIGJ1ZmZlci4KLSAgICBpbnQzMl90IG1pblNpemVGcmFtZXMgPSBnZXRCdWZmZXJDYXBhY2l0eSgpOwotICAgIGlmIChtaW5TaXplRnJhbWVzIDw9IDApIHsgLy8gemVybyB3aWxsIGdldCByZWplY3RlZAotICAgICAgICBtaW5TaXplRnJhbWVzID0gQUFVRElPX0JVRkZFUl9DQVBBQ0lUWV9NSU47Ci0gICAgfQotICAgIHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsICZtTW1hcEJ1ZmZlcmluZm8pOwotICAgIGJvb2wgaXNCdWZmZXJTaGFyZWFibGUgPSBtTW1hcEJ1ZmZlcmluZm8uZmxhZ3MgJiBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIC0gY3JlYXRlTW1hcEJ1ZmZlcigpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIHJlc3VsdCA9IGNyZWF0ZU1tYXBCdWZmZXIoJm1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZ290byBlcnJvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiJXMoKSBjcmVhdGVNbWFwQnVmZmVyKCkgYnVmZmVyX3NpemUgPSAlZCBmciwgYnVyc3Rfc2l6ZSAlZCBmciIKLSAgICAgICAgICAgICAgICAgICAgICAiLCBTaGFyYWJsZSBGRDogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcywKLSAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLAotICAgICAgICAgICAgICBpc0J1ZmZlclNoYXJlYWJsZSA/ICJZZXMiIDogIk5vIik7Ci0gICAgfQotCi0gICAgc2V0QnVmZmVyQ2FwYWNpdHkobU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyk7Ci0gICAgaWYgKCFpc0J1ZmZlclNoYXJlYWJsZSkgewotICAgICAgICAvLyBFeGNsdXNpdmUgbW9kZSBjYW4gb25seSBiZSB1c2VkIGJ5IHRoZSBzZXJ2aWNlIGJlY2F1c2UgdGhlIEZEIGNhbm5vdCBiZSBzaGFyZWQuCi0gICAgICAgIGludDMyX3QgYXVkaW9TZXJ2aWNlVWlkID0KLSAgICAgICAgICAgIFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoZ2V0dWlkKCkpKTsKLSAgICAgICAgaWYgKChtTW1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZS51aWQgIT0gYXVkaW9TZXJ2aWNlVWlkKSAmJgotICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgQUxPR1coIiVzKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50IiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyZWFtIGFuZCBwYXNzIGl0IGJhY2sgdG8gdGhlIGNhbGxlci4KLSAgICBzZXRTYW1wbGVzUGVyRnJhbWUoKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKLSAgICAgICAgICAgICAgICAgICAgICAgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLmNoYW5uZWxfbWFzaykKLSAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKSk7CisgICAgc2V0Q2hhbm5lbE1hc2soQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsTWFzaygKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQsCisgICAgICAgICAgICBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGNvbmZpZy5jaGFubmVsX21hc2spKSk7CiAKLSAgICAvLyBBQXVkaW8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBGRCBhbmQgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGNvcHkuCi0gICAgLy8gQXNzdW1lIHRoYXQgQXVkaW9GbGluZ2VyIHdpbGwgY2xvc2UgdGhlIG9yaWdpbmFsIHNoYXJlZF9tZW1vcnlfZmQuCi0gICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLnJlc2V0KGR1cChtTW1hcEJ1ZmZlcmluZm8uc2hhcmVkX21lbW9yeV9mZCkpOwotICAgIGlmIChtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IuZ2V0KCkgPT0gLTEpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgLSBjb3VsZCBub3QgZHVwIHNoYXJlZF9tZW1vcnlfZmQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KLSAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCi0gICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgotICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uIHBvc2l0aW9uOwotICAgIG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKLQotICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKICAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwogCi0gICAgQUxPR0QoIiVzKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCIKLSAgICAgICAgICAiLCBkZXZpY2VJZCA9ICVkLCBjYXBhY2l0eSA9ICVkXG4iLAotICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgLy8gSWYgdGhlIHBvc2l0aW9uIGlzIG5vdCB1cGRhdGVkIHdoaWxlIHRoZSB0aW1lc3RhbXAgaXMgdXBkYXRlZCBmb3IgbW9yZSB0aGFuIGEgY2VydGFpbiBhbW91bnQsCisgICAgLy8gdGhlIHRpbWVzdGFtcCByZXBvcnRlZCBmcm9tIHRoZSBIQUwgbWF5IG5vdCBiZSBhY2N1cmF0ZS4gSGVyZSwgYSB0aW1lc3RhbXAgZ3JhY2UgcGVyaW9kIGlzCisgICAgLy8gc2V0IGFzIDUgYnVyc3Qgc2l6ZS4gV2UgbWF5IHdhbnQgdG8gdXBkYXRlIHRoaXMgdmFsdWUgaWYgdGhlcmUgaXMgYW55IHJlcG9ydCBmcm9tIE9FTXMgc2F5aW5nCisgICAgLy8gdGhhdCBpcyB0b28gc2hvcnQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1RpbWVzdGFtcEdyYWNlQnVyc3RDb3VudCA9IDU7CisgICAgbVRpbWVzdGFtcEdyYWNlUGVyaW9kTXMgPSAoKGludDY0X3QpIGtUaW1lc3RhbXBHcmFjZUJ1cnN0Q291bnQgKiBtRnJhbWVzUGVyQnVyc3QKKyAgICAgICAgICAgICogQUFVRElPX01JTExJU19QRVJfU0VDT05EKSAvIGdldFNhbXBsZVJhdGUoKTsKIAotICAgIEFMT0dEKCIlcygpIGZvcm1hdCA9IDB4JTA4eCwgZnJhbWUgc2l6ZSA9ICVkLCBidXJzdCBzaXplID0gJWQiLAotICAgICAgICAgIF9fZnVuY19fLCBnZXRGb3JtYXQoKSwgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBtRnJhbWVzUGVyQnVyc3QpOworICAgIEFMT0dEKCIlcygpIGdvdCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQgY2hhbm5lbE1hc2sgPSAlI3gsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCisgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGdldENoYW5uZWxNYXNrKCksCisgICAgICAgICAgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworCisgICAgQUxPR0QoIiVzKCkgZ290IGZvcm1hdCA9IDB4JVggPSAlcywgZnJhbWUgc2l6ZSA9ICVkLCBidXJzdCBzaXplID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRGb3JtYXQoKSwgYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhnZXRGb3JtYXQoKSksCisgICAgICAgICAgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBtRnJhbWVzUGVyQnVyc3QpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKIApAQCAtMzIwLDYgKzI4MywzMiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFuZGJ5KCkgeworICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdGFuZGJ5KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpleGl0U3RhbmRieShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgeworICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICB9CisgICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGNyZWF0ZU1tYXBCdWZmZXIoJm1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpOworICAgICAgICBpbnQzMl90IGNhcGFjaXR5SW5CeXRlcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCkgKiBieXRlc1BlckZyYW1lOworICAgICAgICBpbnQgZmRJbmRleCA9IHBhcmNlbGFibGUtPmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICAgICAgcGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldHVwTWVtb3J5KGZkSW5kZXgsIDAsIGNhcGFjaXR5SW5CeXRlcyk7CisgICAgICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRCeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpOworICAgICAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKyAgICAgICAgcGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldENhcGFjaXR5SW5GcmFtZXMoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIC8vIEdldCBmcmVlLXJ1bm5pbmcgRFNQIG9yIERNQSBoYXJkd2FyZSBwb3NpdGlvbiBmcm9tIHRoZSBIQUwuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKQEAgLTQwNiwzMCArMzk1LDE1MCBAQAogLyoqCiAgKiBHZXQgYW4gaW1tdXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIHF1ZXVlIGZyb20gdGhlIEhBTC4KICAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldERvd25EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbigKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpCiB7CiAgICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIHF1ZXVlIGJhc2VkIG9uIEhBTCBpbmZvLgogICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKTsKICAgICBpbnQzMl90IGNhcGFjaXR5SW5CeXRlcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCkgKiBieXRlc1BlckZyYW1lOwotICAgIGludCBmZEluZGV4ID0gcGFyY2VsYWJsZS5hZGRGaWxlRGVzY3JpcHRvcihtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IsIGNhcGFjaXR5SW5CeXRlcyk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0dXBNZW1vcnkoZmRJbmRleCwgMCwgY2FwYWNpdHlJbkJ5dGVzKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRCeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEZyYW1lc1BlckJ1cnN0KG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Q2FwYWNpdHlJbkZyYW1lcyhnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICBpbnQgZmRJbmRleCA9IHBhcmNlbGFibGUtPmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0dXBNZW1vcnkoZmRJbmRleCwgMCwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Qnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKTsKKyAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKyAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Q2FwYWNpdHlJbkZyYW1lcyhnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpCiB7Ci0gICAgaWYgKCFtRXh0ZXJuYWxQb3NpdGlvblN1cHBvcnRlZCkgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgaWYgKG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzICE9IEFBVURJT19PSykgeworICAgICAgICByZXR1cm4gbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXM7CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRFeHRlcm5hbFBvc2l0aW9uKHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOwotICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgLy8gZ2V0RXh0ZXJuYWxQb3NpdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiBTZXQgbUV4dGVybmFsUG9zaXRpb25TdXBwb3J0ZWQgYXMgZmFsc2UKKyAgICB1aW50NjRfdCB0ZW1wUG9zaXRpb25GcmFtZXM7CisgICAgaW50NjRfdCB0ZW1wVGltZU5hbm9zOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRFeHRlcm5hbFBvc2l0aW9uKCZ0ZW1wUG9zaXRpb25GcmFtZXMsICZ0ZW1wVGltZU5hbm9zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIC8vIGdldEV4dGVybmFsUG9zaXRpb24gcmVwb3J0cyBlcnJvci4gVGhlIEhBTCBtYXkgbm90IHN1cHBvcnQgdGhlIEFQSS4gQ2FjaGUgdGhlIHJlc3VsdAogICAgICAgICAvLyBzbyB0aGF0IHRoZSBjYWxsIHdpbGwgbm90IGdvIHRvIHRoZSBIQUwgbmV4dCB0aW1lLgotICAgICAgICBtRXh0ZXJuYWxQb3NpdGlvblN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1cyA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKICAgICB9Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CisKKyAgICAvLyBJZiB0aGUgSEFMIGtlZXBzIHJlcG9ydGluZyB0aGUgc2FtZSBwb3NpdGlvbiBvciB0aW1lc3RhbXAsIHRoZSBIQUwgbWF5IGJlIGhhdmluZyBzb21lIGlzc3VlcworICAgIC8vIHRvIHJlcG9ydCBjb3JyZWN0IGV4dGVybmFsIHBvc2l0aW9uLiBJbiB0aGF0IGNhc2UsIHdlIHdpbGwgbm90IHRydXN0IHRoZSB2YWx1ZXMgcmVwb3J0ZWQgZnJvbQorICAgIC8vIHRoZSBIQUwuIElkZWFsbHksIHdlIG1heSB3YW50IHRvIHN0b3AgcXVlcnlpbmcgZXh0ZXJuYWwgcG9zaXRpb24gaWYgdGhlIEhBTCBjYW5ub3QgcmVwb3J0CisgICAgLy8gY29ycmVjdCBwb3NpdGlvbiB3aXRoaW4gYSBwZXJpb2QuIEJ1dCBpdCBtYXkgbm90IGJlIGEgZ29vZCBpZGVhIHRvIGdldCBzeXN0ZW0gdGltZSB0b28gb2Z0ZW4uCisgICAgLy8gSW4gdGhhdCBjYXNlLCBhIG1heGltdW0gbnVtYmVyIG9mIGZyb3plbiBleHRlcm5hbCBwb3NpdGlvbiBpcyBkZWZpbmVkIHNvIHRoYXQgaWYgdGhlCisgICAgLy8gY291bnQgb2YgdGhlIHNhbWUgdGltZXN0YW1wIG9yIHBvc2l0aW9uIGlzIHJlcG9ydGVkIGJ5IHRoZSBIQUwgY29udGludW91c2x5LCB0aGUgdmFsdWVzIGZyb20KKyAgICAvLyB0aGUgSEFMIHdpbGwgbm8gbG9uZ2VyIGJlIHRydXN0ZWQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEZyb3plbkNvdW50ID0gMjA7CisgICAgLy8gSWYgdGhlIEhBTCB2ZXJzaW9uIGlzIGxlc3MgdGhhbiA3LjAsIHRoZSBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiBpcyBhbiBvcHRpb25hbCBBUEkuCisgICAgLy8gSWYgdGhlIEhBTCB2ZXJzaW9uIGlzIDcuMCBvciBsYXRlciwgdGhlIGdldFByZXNlbnRhdGlvblBvc2l0aW9uIGlzIGEgbWFuZGF0b3J5IEFQSS4KKyAgICAvLyBJbiB0aGF0IGNhc2UsIGV2ZW4gdGhlIHJldHVybmVkIHN0YXR1cyBpcyBOT19FUlJPUiwgaXQgZG9lc24ndCBpbmRpY2F0ZSB0aGUgcmV0dXJuZWQKKyAgICAvLyBwb3NpdGlvbiBpcyBhIHZhbGlkIG9uZS4gRG8gYSBzaW1wbGUgdmFsaWRhdGlvbiwgd2hpY2ggaXMgY2hlY2tpbmcgaWYgdGhlIHBvc2l0aW9uIGlzCisgICAgLy8gZm9yd2FyZCB3aXRoaW4gaGFsZiBhIHNlY29uZCBvciBub3QsIGhlcmUgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gZXJyb3IgaWYKKyAgICAvLyB0aGUgdmFsaWRhdGlvbiBmYWlscy4gTm90ZSB0aGF0IHdlIGRvbid0IG9ubHkgYXBwbHkgdGhpcyB2YWxpZGF0aW9uIGxvZ2ljIHRvIEhBTCBBUEkKKyAgICAvLyBsZXNzIHRoYW4gNy4wLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlcmUgaXMgYSBjaGFuY2UgdGhlIEhBTCBpcyBub3QgcmVwb3J0aW5nIHRoZQorICAgIC8vIHRpbWVzdGFtcCBhbmQgcG9zaXRpb24gY29ycmVjdGx5LgorICAgIGlmIChtTGFzdFBvc2l0aW9uRnJhbWVzID4gdGVtcFBvc2l0aW9uRnJhbWVzKSB7CisgICAgICAgIC8vIElmIHRoZSBwb3NpdGlvbiBpcyBnb2luZyBiYWNrd2FyZHMsIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIEhBTC4KKyAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBkbyBub3QgdHJ1c3QgdGhlIHZhbHVlcyByZXBvcnRlZCBieSB0aGUgSEFMLgorICAgICAgICBBTE9HVygiJXMgcG9zaXRpb24gaXMgZ29pbmcgYmFja3dhcmRzLCBsYXN0IHBvc2l0aW9uKCVqZCkgY3VycmVudCBwb3NpdGlvbiglamQpIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1MYXN0UG9zaXRpb25GcmFtZXMsIHRlbXBQb3NpdGlvbkZyYW1lcyk7CisgICAgICAgIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICByZXR1cm4gbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXM7CisgICAgfSBlbHNlIGlmIChtTGFzdFBvc2l0aW9uRnJhbWVzID09IHRlbXBQb3NpdGlvbkZyYW1lcykgeworICAgICAgICBpZiAodGVtcFRpbWVOYW5vcyAtIG1UaW1lc3RhbXBOYW5vc0Zvckxhc3RQb3NpdGlvbiA+CisgICAgICAgICAgICAgICAgQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCAqIG1UaW1lc3RhbXBHcmFjZVBlcmlvZE1zKSB7CisgICAgICAgICAgICBBTE9HVygiJXMsIHRoZSByZXBvcnRlZCBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZCB3aXRoaW4gJWQgbXNlYy4gIgorICAgICAgICAgICAgICAgICAgIlNldCB0aGUgZXh0ZXJuYWwgcG9zaXRpb24gYXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLCBtVGltZXN0YW1wR3JhY2VQZXJpb2RNcyk7CisgICAgICAgICAgICBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1cyA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBtRnJvemVuUG9zaXRpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Gcm96ZW5Qb3NpdGlvbkNvdW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uID4gdGVtcFRpbWVOYW5vcykgeworICAgICAgICAvLyBJZiB0aGUgdGltZXN0YW1wIGlzIGdvaW5nIGJhY2t3YXJkcywgdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgSEFMLgorICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCB0cnVzdCB0aGUgdmFsdWVzIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCisgICAgICAgIEFMT0dXKCIlcyB0aW1lc3RhbXAgaXMgZ29pbmcgYmFja3dhcmRzLCBsYXN0IHRpbWVzdGFtcCglamQpLCBjdXJyZW50IHRpbWVzdGFtcCglamQpIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1UaW1lc3RhbXBOYW5vc0Zvckxhc3RQb3NpdGlvbiwgdGVtcFRpbWVOYW5vcyk7CisgICAgICAgIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICByZXR1cm4gbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXM7CisgICAgfSBlbHNlIGlmIChtVGltZXN0YW1wTmFub3NGb3JMYXN0UG9zaXRpb24gPT0gdGVtcFRpbWVOYW5vcykgeworICAgICAgICBtRnJvemVuVGltZXN0YW1wQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtRnJvemVuVGltZXN0YW1wQ291bnQgPSAwOworICAgIH0KKworICAgIGlmIChtRnJvemVuVGltZXN0YW1wQ291bnQgKyBtRnJvemVuUG9zaXRpb25Db3VudCA+IGtNYXhGcm96ZW5Db3VudCkgeworICAgICAgICBBTE9HVygiJXMgdG9vIG1hbnkgZnJvemVuIGV4dGVybmFsIHBvc2l0aW9uIGZyb20gSEFMLiIsIF9fZnVuY19fKTsKKyAgICAgICAgbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKKyAgICB9CisKKyAgICBtTGFzdFBvc2l0aW9uRnJhbWVzID0gdGVtcFBvc2l0aW9uRnJhbWVzOworICAgIG1UaW1lc3RhbXBOYW5vc0Zvckxhc3RQb3NpdGlvbiA9IHRlbXBUaW1lTmFub3M7CisKKyAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgdGltZXN0YW1wIGFuZCBwb3NpdGlvbiB3aGVuIHRoZXkgbG9va3MgdmFsaWQuCisgICAgKnBvc2l0aW9uRnJhbWVzID0gdGVtcFBvc2l0aW9uRnJhbWVzOworICAgICp0aW1lTmFub3MgPSB0ZW1wVGltZU5hbm9zOworICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNyZWF0ZU1tYXBCdWZmZXIoCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogZmlsZURlc2NyaXB0b3IpCit7CisgICAgbWVtc2V0KCZtTW1hcEJ1ZmZlcmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbykpOworICAgIGludDMyX3QgbWluU2l6ZUZyYW1lcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7CisgICAgaWYgKG1pblNpemVGcmFtZXMgPD0gMCkgeyAvLyB6ZXJvIHdpbGwgZ2V0IHJlamVjdGVkCisgICAgICAgIG1pblNpemVGcmFtZXMgPSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgJm1NbWFwQnVmZmVyaW5mbyk7CisgICAgYm9vbCBpc0J1ZmZlclNoYXJlYWJsZSA9IG1NbWFwQnVmZmVyaW5mby5mbGFncyAmIEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBjcmVhdGVNbWFwQnVmZmVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkICVzIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSBidWZmZXJfc2l6ZSA9ICVkIGZyLCBidXJzdF9zaXplICVkIGZyIgorICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzLAorICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgIGlzQnVmZmVyU2hhcmVhYmxlID8gIlllcyIgOiAiTm8iKTsKKyAgICB9CisKKyAgICBzZXRCdWZmZXJDYXBhY2l0eShtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKTsKKyAgICBpZiAoIWlzQnVmZmVyU2hhcmVhYmxlKSB7CisgICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYmVjYXVzZSB0aGUgRkQgY2Fubm90IGJlIHNoYXJlZC4KKyAgICAgICAgaW50MzJfdCBhdWRpb1NlcnZpY2VVaWQgPQorICAgICAgICAgICAgVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOworICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCisgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQUF1ZGlvIGNyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgRkQgYW5kIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBjb3B5LgorICAgIC8vIEFzc3VtZSB0aGF0IEF1ZGlvRmxpbmdlciB3aWxsIGNsb3NlIHRoZSBvcmlnaW5hbCBzaGFyZWRfbWVtb3J5X2ZkLgorICAgIGZpbGVEZXNjcmlwdG9yLT5yZXNldChkdXAobU1tYXBCdWZmZXJpbmZvLnNoYXJlZF9tZW1vcnlfZmQpKTsKKyAgICBpZiAoZmlsZURlc2NyaXB0b3ItPmdldCgpID09IC0xKSB7CisgICAgICAgIEFMT0dFKCIlcygpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIC8vIENhbGwgdG8gSEFMIHRvIG1ha2Ugc3VyZSB0aGUgdHJhbnNwb3J0IEZEIHdhcyBhYmxlIHRvIGJlIGNsb3NlZCBieSBiaW5kZXIuCisgICAgLy8gVGhpcyBpcyBhIHRyaWNreSB3b3JrYXJvdW5kIGZvciBhIHByb2JsZW0gaW4gQmluZGVyLgorICAgIC8vIFRPRE86W2IvMTkyMDQ4ODQyXSBXaGVuIHRoYXQgcHJvYmxlbSBpcyBmaXhlZCB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUgb3IgY2hhbmdlIHRoaXMgY29kZS4KKyAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiBwb3NpdGlvbjsKKyAgICBtTW1hcFN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKCZwb3NpdGlvbik7CisKKyAgICBtRnJhbWVzUGVyQnVyc3QgPSBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXM7CisKKyAgICByZXR1cm4gQUFVRElPX09LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCmluZGV4IDVhNTM4ODUuLjNlN2YyYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKQEAgLTY0LDYgKzY0LDEwIEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgIG92ZXJyaWRlOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YW5kYnkoKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CisKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CkBAIC03OSw3ICs4Myw3IEBACiAgICAgdm9pZCBvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgb3ZlcnJpZGU7CiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldERvd25EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpOwogCiAgICAgaW50NjRfdCBnZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vczsKQEAgLTkxLDYgKzk1LDggQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuV2l0aEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCk7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgY3JlYXRlTW1hcEJ1ZmZlcihhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGZpbGVEZXNjcmlwdG9yKTsKKwogICAgIE1vbm90b25pY0NvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUcmFuc2ZlcnJlZDsKIAogICAgIC8vIEludGVyZmFjZSB0byB0aGUgQXVkaW9GbGluZ2VyIE1NQVAgc3VwcG9ydC4KQEAgLTEwNiw3ICsxMTIsMTIgQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IDA7IC8vIFRPRE8gZ2V0IGZyb20gSEFMCiAKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXh0ZXJuYWxQb3NpdGlvblN1cHBvcnRlZCA9IHRydWU7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgPSBBQVVESU9fT0s7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RQb3NpdGlvbkZyYW1lcyA9IDA7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wR3JhY2VQZXJpb2RNczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJvemVuUG9zaXRpb25Db3VudCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyb3plblRpbWVzdGFtcENvdW50ID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCA0ZTQ2MDMzLi4yYTU5MzlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogCiAjaW5jbHVkZSAiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgiCkBAIC01MSw3ICs1Miw3IEBACiAgICAgICAgIG1NaXhlci5hbGxvY2F0ZShnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkpOwogCi0gICAgICAgIGludDMyX3QgYnVyc3RzUGVyQnVmZmVyID0gQUF1ZGlvUHJvcGVydHlfZ2V0TWl4ZXJCdXJzdHMoKTsKKyAgICAgICAgaW50MzJfdCBidXJzdHNQZXJCdWZmZXIgPSBBdWRpb1N5c3RlbTo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7CiAgICAgICAgIGlmIChidXJzdHNQZXJCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgbUxhdGVuY3lUdW5pbmdFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJ1cnN0c1BlckJ1ZmZlciA9IEJVUlNUU19QRVJfQlVGRkVSX0RFRkFVTFQ7CkBAIC0xNDYsOCArMTQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBBTE9HRCgiJXMoKSB3cml0ZSgpIHJldHVybmVkIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0aGUgcmV0dXJuZWQgdmVjdG9yLgotICAgICAgICAgICAgKHZvaWQpIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CisgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmhhbmRsZURpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtc0FzeW5jKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgQUxPR1coImNhbGxiYWNrTG9vcCgpIHdyb3RlICVkIC8gJWQiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKaW5kZXggNWZiY2FkYi4uZGQ0MjFmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCkBAIC03OCw3ICs3OCw3IEBACiAgICAgcmVzdWx0ID0gbVN0cmVhbUludGVybmFsLT5vcGVuKGJ1aWxkZXIpOwogCiAgICAgc2V0U2FtcGxlUmF0ZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSk7Ci0gICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIHNldENoYW5uZWxNYXNrKG1TdHJlYW1JbnRlcm5hbC0+Z2V0Q2hhbm5lbE1hc2soKSk7CiAgICAgc2V0RGV2aWNlSWQobVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpKTsKICAgICBzZXRTZXNzaW9uSWQobVN0cmVhbUludGVybmFsLT5nZXRTZXNzaW9uSWQoKSk7CiAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOyAvLyBmb3JjZSBmb3IgbWl4ZXIKQEAgLTIxNCwzICsyMTQsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KKwordm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmhhbmRsZURpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtc0FzeW5jKCkgeworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gaG9sZEVuZHBvaW50KHRoaXMpOworICAgIHN0ZDo6dGhyZWFkIGFzeW5jVGFzayhbaG9sZEVuZHBvaW50XSgpIHsKKyAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgICAgICAgaG9sZEVuZHBvaW50LT5kaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICB9KTsKKyAgICBhc3luY1Rhc2suZGV0YWNoKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IDgzNTc1NjcuLjNlNzYwYzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC02OSw2ICs2OSw4IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RvcFNoYXJpbmdUaHJlYWQoKTsKIAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXNBc3luYygpOworCiAgICAgLy8gQW4gTU1BUCBzdHJlYW0gdGhhdCBpcyBzaGFyZWQgYnkgbXVsdGlwbGUgY2xpZW50cy4KICAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbUludGVybmFsPiBtU3RyZWFtSW50ZXJuYWw7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAppbmRleCAzNGRkZDRkLi45ZjQ4ZjgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCkBAIC0zNCwyMCArMzQsMjMgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKLSNpbmNsdWRlICJUaW1lc3RhbXBTY2hlZHVsZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCitzdGF0aWMgY29uc3QgaW50NjRfdCBUSU1FT1VUX05BTk9TID0gM0xMICogMTAwMCAqIDEwMDAgKiAxMDAwOworLy8gSWYgdGhlIHN0cmVhbSBpcyBpZGxlIGZvciBtb3JlIHRoYW4gYElETEVfVElNRU9VVF9OQU5PU2AsIHRoZSBzdHJlYW0gd2lsbCBiZSBwdXQgaW50byBzdGFuZGJ5Lgorc3RhdGljIGNvbnN0IGludDY0X3QgSURMRV9USU1FT1VUX05BTk9TID0gM2U5OworCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIHN0cmVhbXMgaW4gdGhlIHNlcnZpY2UuCiAgKiBAcmV0dXJuCiAgKi8KIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKLSAgICAgICAgOiBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQorICAgICAgICA6IG1Db21tYW5kVGhyZWFkKCJBQUNvbW1hbmQiKQogICAgICAgICAsIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CkBAIC03MCwxMCArNzMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlIHN0cmVhbSAlcCBzdGlsbCBvcGVuLCBzdGF0ZSA9ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGdldFN0YXRlKCkpOworCisgICAgLy8gU3RvcCB0aGUgY29tbWFuZCB0aHJlYWQgYmVmb3JlIGRlc3Ryb3lpbmcuCisgICAgaWYgKG1UaHJlYWRFbmFibGVkKSB7CisgICAgICAgIG1UaHJlYWRFbmFibGVkID0gZmFsc2U7CisgICAgICAgIG1Db21tYW5kUXVldWUuc3RvcFdhaXRpbmcoKTsKKyAgICAgICAgbUNvbW1hbmRUaHJlYWQuc3RvcCgpOworICAgIH0KIH0KIAogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmR1bXBIZWFkZXIoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIgICAgVCAgIEhhbmRsZSAgIFVJZCAgIFBvcnQgUnVuIFN0YXRlIEZvcm1hdCBCdXJzdCBDaGFuIENhcGFjaXR5Iik7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKAorICAgICAgICAgICAgIiAgICBUICAgSGFuZGxlICAgVUlkICAgUG9ydCBSdW4gU3RhdGUgRm9ybWF0IEJ1cnN0IENoYW4gTWFzayAgICAgQ2FwYWNpdHkiKTsKIH0KIAogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmR1bXAoKSBjb25zdCB7CkBAIC04OCw2ICs5OSw3IEBACiAgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg3KSA8PCBnZXRGb3JtYXQoKTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDYpIDw8IG1GcmFtZXNQZXJCdXJzdDsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDUpIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOCkgPDwgc3RkOjpoZXggPDwgZ2V0Q2hhbm5lbE1hc2soKSA8PCBzdGQ6OmRlYzsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDkpIDw8IGdldEJ1ZmZlckNhcGFjaXR5KCk7CiAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwpAQCAtMTY0LDE2ICsxNzYsMzYgQEAKICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKICAgICAgICAgY29weUZyb20oKm1TZXJ2aWNlRW5kcG9pbnQpOwogICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBkb2VzIG5vdCBnZXQgZGVsZXRlZCBiZWZvcmUgdGhlIHJ1bigpIG1ldGhvZAorICAgIC8vIGNhbiBwcm90ZWN0IGl0IGJ5IG1ha2luZyBhIHN0cm9uZyBwb2ludGVyLgorICAgIG1Db21tYW5kUXVldWUuc3RhcnRXYWl0aW5nKCk7CisgICAgbVRocmVhZEVuYWJsZWQgPSB0cnVlOworICAgIGluY1N0cm9uZyhudWxscHRyKTsgLy8gU2VlIHJ1bigpIG1ldGhvZC4KKyAgICByZXN1bHQgPSBtQ29tbWFuZFRocmVhZC5zdGFydCh0aGlzKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBkZWNTdHJvbmcobnVsbHB0cik7IC8vIHJ1bigpIGNhbid0IGRvIGl0IHNvIHdlIGhhdmUgdG8gZG8gaXQgaGVyZS4KKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6Ci0gICAgY2xvc2UoKTsKKyAgICBjbG9zZUFuZENsZWFyKCk7CisgICAgbVRocmVhZEVuYWJsZWQgPSBmYWxzZTsKKyAgICBtQ29tbWFuZFF1ZXVlLnN0b3BXYWl0aW5nKCk7CisgICAgbUNvbW1hbmRUaHJlYWQuc3RvcCgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2UoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgIHJldHVybiBjbG9zZV9sKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlbmRDb21tYW5kKENMT1NFLCBudWxscHRyLCB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sIFRJTUVPVVRfTkFOT1MpOworCisgICAgLy8gU3RvcCB0aGUgY29tbWFuZCB0aHJlYWQgYXMgdGhlIHN0cmVhbSBpcyBjbG9zZWQuCisgICAgbVRocmVhZEVuYWJsZWQgPSBmYWxzZTsKKyAgICBtQ29tbWFuZFF1ZXVlLnN0b3BXYWl0aW5nKCk7CisgICAgbUNvbW1hbmRUaHJlYWQuc3RvcCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZV9sKCkgewpAQCAtMTgxLDI5ICsyMTMsMTAgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKLSAgICAvLyBUaGlzIHdpbGwgY2FsbCBzdG9wVGltZXN0YW1wVGhyZWFkKCkgYW5kIGFsc28gc3RvcCB0aGUgc3RyZWFtLAotICAgIC8vIGp1c3QgaW4gY2FzZSBpdCB3YXMgbm90IGFscmVhZHkgc3RvcHBlZC4KKyAgICAvLyBUaGlzIHdpbGwgc3RvcCB0aGUgc3RyZWFtLCBqdXN0IGluIGNhc2UgaXQgd2FzIG5vdCBhbHJlYWR5IHN0b3BwZWQuCiAgICAgc3RvcF9sKCk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwotICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7Ci0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW5kcG9pbnQtPnVucmVnaXN0ZXJTdHJlYW0odGhpcyk7Ci0gICAgICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmZW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwotICAgICAgICBlbmRwb2ludE1hbmFnZXIuY2xvc2VFbmRwb2ludChlbmRwb2ludCk7Ci0KLSAgICAgICAgLy8gQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oKSBwcmV2ZW50cyB0d28gdGhyZWFkcyBmcm9tIGNsb3NpbmcgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgICAgbVNlcnZpY2VFbmRwb2ludC5jbGVhcigpOyAvLyBlbmRwb2ludCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KLSAgICB9Ci0KLSAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7Ci0KLSAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKLSAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DTE9TRSkKLSAgICAgICAgLnJlY29yZCgpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGNsb3NlQW5kQ2xlYXIoKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydERldmljZSgpIHsKQEAgLTIyMiw4ICsyMzUsMTAgQEAKICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KICAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKFNUQVJULCBudWxscHRyLCB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sIFRJTUVPVVRfTkFOT1MpOworfQogCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0X2woKSB7CiAgICAgY29uc3QgaW50NjRfdCBiZWdpbk5zID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC0yMzQsNiArMjQ5LDEyIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKKyAgICBpZiAobVN0YW5kYnkpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgdGhlIHN0cmVhbSBpcyBzdGFuZGJ5LCByZXR1cm4gRVJST1JfU1RBTkRCWSwgIgorICAgICAgICAgICAgICAiZXhwZWN0aW5nIHRoZSBjbGllbnQgY2FsbCBleGl0U3RhbmRieSBiZWZvcmUgc3RhcnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfU1RBTkRCWTsKKyAgICB9CisKICAgICBtZWRpYW1ldHJpY3M6OkRlZmVyIGRlZmVyKFsmXSB7CiAgICAgICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQogICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVEFSVCkKQEAgLTI1OSwxNSArMjgwLDYgQEAKICAgICAvLyBUaGlzIHNob3VsZCBoYXBwZW4gYXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQuCiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOwotICAgIG1UaHJlYWRFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBkb2VzIG5vdCBnZXQgZGVsZXRlZCBiZWZvcmUgdGhlIHJ1bigpIG1ldGhvZAotICAgIC8vIGNhbiBwcm90ZWN0IGl0IGJ5IG1ha2luZyBhIHN0cm9uZyBwb2ludGVyLgotICAgIGluY1N0cm9uZyhudWxscHRyKTsgLy8gU2VlIHJ1bigpIG1ldGhvZC4KLSAgICByZXN1bHQgPSBtVGltZXN0YW1wVGhyZWFkLnN0YXJ0KHRoaXMpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIGRlY1N0cm9uZyhudWxscHRyKTsgLy8gcnVuKCkgY2FuJ3QgZG8gaXQgc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLgotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiAKQEAgLTI3Nyw4ICsyODksNyBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcGF1c2VfbCgpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChQQVVTRSwgbnVsbHB0ciwgdHJ1ZSAvKndhaXRGb3JSZXBseSovLCBUSU1FT1VUX05BTk9TKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpwYXVzZV9sKCkgewpAQCAtMjk2LDEyICszMDcsNiBAQAogICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTLCAoaW50MzJfdClyZXN1bHQpCiAgICAgICAgICAgICAucmVjb3JkKCk7IH0pOwogCi0gICAgcmVzdWx0ID0gc3RvcFRpbWVzdGFtcFRocmVhZCgpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3RfbCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CiAgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOwpAQCAtMzIwLDggKzMyNSw3IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHN0b3BfbCgpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChTVE9QLCBudWxscHRyLCB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sIFRJTUVPVVRfTkFOT1MpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0b3BfbCgpIHsKQEAgLTM0MSwxMiArMzQ1LDYgQEAKIAogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogCi0gICAgLy8gVGVtcG9yYXJpbHkgdW5sb2NrIGJlY2F1c2Ugd2UgYXJlIGpvaW5pbmcgdGhlIHRpbWVzdGFtcCB0aHJlYWQgYW5kIGl0IG1heSB0cnkKLSAgICAvLyB0byBhY3F1aXJlIG1Mb2NrLgotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJlc3VsdCA9IHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKLSAgICBtTG9jay5sb2NrKCk7Ci0KICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBkaXNjb25uZWN0X2woKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTM3MSwxNyArMzY5LDExIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wVGltZXN0YW1wVGhyZWFkKCkgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgLy8gY2xlYXIgZmxhZyB0aGF0IHRlbGxzIHRocmVhZCB0byBsb29wCi0gICAgaWYgKG1UaHJlYWRFbmFibGVkLmV4Y2hhbmdlKGZhbHNlKSkgewotICAgICAgICByZXN1bHQgPSBtVGltZXN0YW1wVGhyZWFkLnN0b3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKSB7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKEZMVVNILCBudWxscHRyLCB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sIFRJTUVPVVRfTkFOT1MpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2hfbCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2lzRmx1c2hBbGxvd2VkKGdldFN0YXRlKCkpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC00MDIsNDggKzM5NCwxMjIgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi0vLyBpbXBsZW1lbnQgUnVubmFibGUsIHBlcmlvZGljYWxseSBzZW5kIHRpbWVzdGFtcHMgdG8gY2xpZW50CisvLyBpbXBsZW1lbnQgUnVubmFibGUsIHBlcmlvZGljYWxseSBzZW5kIHRpbWVzdGFtcHMgdG8gY2xpZW50IGFuZCBwcm9jZXNzIGNvbW1hbmRzIGZyb20gcXVldWUuCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKLSAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgIEFMT0dEKCIlcygpICVzIGVudGVyaW5nID4+Pj4+Pj4+Pj4+Pj4+IENPTU1BTkRTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOwogICAgIC8vIEhvbGQgb250byB0aGUgcmVmIGNvdW50ZWQgc3RyZWFtIHVudGlsIHRoZSBlbmQuCiAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGhvbGRTdHJlYW0odGhpcyk7CiAgICAgVGltZXN0YW1wU2NoZWR1bGVyIHRpbWVzdGFtcFNjaGVkdWxlcjsKKyAgICBpbnQ2NF90IG5leHRUaW1lOworICAgIGludDY0X3Qgc3RhbmRieVRpbWUgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpICsgSURMRV9USU1FT1VUX05BTk9TOwogICAgIC8vIEJhbGFuY2UgdGhlIGluY1N0cm9uZyBmcm9tIHdoZW4gdGhlIHRocmVhZCB3YXMgbGF1bmNoZWQuCiAgICAgaG9sZFN0cmVhbS0+ZGVjU3Ryb25nKG51bGxwdHIpOwogCi0gICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7Ci0gICAgaW50NjRfdCBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CisgICAgLy8gVGFraW5nIG1Mb2NrIHdoaWxlIHN0YXJ0aW5nIHRoZSB0aHJlYWQuIEFsbCB0aGUgb3BlcmF0aW9uIG11c3QgYmUgYWJsZSB0bworICAgIC8vIHJ1biB3aXRoIGhvbGRpbmcgdGhlIGxvY2suCisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKICAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICB3aGlsZShtVGhyZWFkRW5hYmxlZC5sb2FkKCkpIHsKKyAgICB3aGlsZSAobVRocmVhZEVuYWJsZWQubG9hZCgpKSB7CiAgICAgICAgIGxvb3BDb3VudCsrOwotICAgICAgICBpZiAoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSA+PSBuZXh0VGltZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgdGltZXN0YW1wIHRocmVhZCBnb3QgcmVzdWx0ID0gJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3MgPSAtMTsKKyAgICAgICAgaWYgKGlzUnVubmluZygpIHx8IChpc0lkbGVfbCgpICYmICFpc1N0YW5kYnlfbCgpKSkgeworICAgICAgICAgICAgdGltZW91dE5hbm9zID0gKGlzUnVubmluZygpID8gbmV4dFRpbWUgOiBzdGFuZGJ5VGltZSkgLSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgdGltZW91dE5hbm9zID0gc3RkOjptYXg8aW50NjRfdD4oMCwgdGltZW91dE5hbm9zKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gY29tbWFuZCA9IG1Db21tYW5kUXVldWUud2FpdEZvckNvbW1hbmQodGltZW91dE5hbm9zKTsKKyAgICAgICAgaWYgKCFtVGhyZWFkRW5hYmxlZCkgeworICAgICAgICAgICAgLy8gQnJlYWsgdGhlIGxvb3AgaWYgdGhlIHRocmVhZCBpcyBkaXNhYmxlZC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzUnVubmluZygpICYmIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgPj0gbmV4dFRpbWUpIHsKKyAgICAgICAgICAgIC8vIEl0IGlzIHRpbWUgdG8gdXBkYXRlIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIGlmIChzZW5kQ3VycmVudFRpbWVzdGFtcF9sKCkgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZW5kIGN1cnJlbnQgdGltZXN0YW1wLCBzdG9wIHVwZGF0aW5nIHRpbWVzdGFtcCIpOworICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RfbCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7Ci0gICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgLy8gU2xlZXAgdW50aWwgaXQgaXMgdGltZSB0byBzZW5kIHRoZSBuZXh0IHRpbWVzdGFtcC4KLSAgICAgICAgICAgIC8vIFRPRE8gV2FpdCBmb3IgYSBzaWduYWwgd2l0aCBhIHRpbWVvdXQgc28gdGhhdCB3ZSBjYW4gc3RvcCBtb3JlIHF1aWNrbHkuCi0gICAgICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcFVudGlsTmFub1RpbWUobmV4dFRpbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0lkbGVfbCgpICYmIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgPj0gc3RhbmRieVRpbWUpIHsKKyAgICAgICAgICAgIHN0YW5kYnlfbCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfY29tbWFuZExvY2soY29tbWFuZC0+bG9jayk7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm9wZXJhdGlvbkNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVJUOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBzdGFydF9sKCk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zZXRCdXJzdFBlcmlvZChtRnJhbWVzUGVyQnVyc3QsIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zdGFydChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBBVVNFOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBwYXVzZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSArIElETEVfVElNRU9VVF9OQU5PUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVE9QOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBzdG9wX2woKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpICsgSURMRV9USU1FT1VUX05BTk9TOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZMVVNIOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBmbHVzaF9sKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0xPU0U6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IGNsb3NlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0X2woKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRUdJU1RFUl9BVURJT19USFJFQUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSAqKSBjb21tYW5kLT5wYXJhbWV0ZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPT0gbnVsbHB0ciA/IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZ2lzdGVyQXVkaW9UaHJlYWRfbChwYXJhbS0+bU93bmVyUGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPm1DbGllbnRUaHJlYWRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5tUHJpb3JpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0FVRElPX1RIUkVBRDogeworICAgICAgICAgICAgICAgICAgICBVbnJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVbnJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSAqKSBjb21tYW5kLT5wYXJhbWV0ZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPT0gbnVsbHB0ciA/IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVucmVnaXN0ZXJBdWRpb1RocmVhZF9sKHBhcmFtLT5tQ2xpZW50VGhyZWFkSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHRVRfREVTQ1JJUFRJT046IHsKKyAgICAgICAgICAgICAgICAgICAgR2V0RGVzY3JpcHRpb25QYXJhbSAqcGFyYW0gPSAoR2V0RGVzY3JpcHRpb25QYXJhbSAqKSBjb21tYW5kLT5wYXJhbWV0ZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IHBhcmFtID09IG51bGxwdHIgPyBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldERlc2NyaXB0aW9uX2wocGFyYW0tPm1QYXJjZWxhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVhJVF9TVEFOREJZOiB7CisgICAgICAgICAgICAgICAgICAgIEV4aXRTdGFuZGJ5UGFyYW0gKnBhcmFtID0gKEV4aXRTdGFuZGJ5UGFyYW0gKikgY29tbWFuZC0+cGFyYW1ldGVyLmdldCgpOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBwYXJhbSA9PSBudWxscHRyID8gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV4aXRTdGFuZGJ5X2wocGFyYW0tPm1QYXJjZWxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpICsgSURMRV9USU1FT1VUX05BTk9TOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY29tbWFuZCBvcCBjb2RlOiAlZCIsIGNvbW1hbmQtPm9wZXJhdGlvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSkgeworICAgICAgICAgICAgICAgIGNvbW1hbmQtPmlzV2FpdGluZ0ZvclJlcGx5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29tbWFuZC0+Y29uZGl0aW9uVmFyaWFibGUubm90aWZ5X29uZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIC8vIFRoaXMgd2FzIG1vdmVkIGZyb20gdGhlIGNhbGxzIGluIHN0b3BfbCgpIGFuZCBwYXVzZV9sKCksIHdoaWNoIGNvdWxkIGNhdXNlIGEgZGVhZGxvY2sKLSAgICAvLyBpZiBpdCByZXN1bHRlZCBpbiBhIGNhbGwgdG8gZGlzY29ubmVjdC4KLSAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICAodm9pZCkgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKLSAgICB9Ci0gICAgQUxPR0QoIiVzKCkgJXMgZXhpdGluZyBhZnRlciAlZCBsb29wcyA8PDw8PDw8PDw8PDw8PCBUSU1FU1RBTVBTIiwKKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIGFmdGVyICVkIGxvb3BzIDw8PDw8PDw8PDw8PDw8IENPTU1BTkRTIiwKICAgICAgICAgICBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSwgbG9vcENvdW50KTsKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGlzY29ubmVjdCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgZGlzY29ubmVjdF9sKCk7CisgICAgc2VuZENvbW1hbmQoRElTQ09OTkVDVCk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3RfbCgpIHsKQEAgLTQ1OSwxNSArNTI1LDIxIEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWQocGlkX3QgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgIGludCBwcmlvcml0eSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChwaWRfdCBjbGllbnRUaHJlYWRJZCwgaW50IHByaW9yaXR5KSB7CisgICAgY29uc3QgcGlkX3Qgb3duZXJQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7IC8vIFRPRE8gcmV2aWV3CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKFJFR0lTVEVSX0FVRElPX1RIUkVBRCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtPihvd25lclBpZCwgY2xpZW50VGhyZWFkSWQsIHByaW9yaXR5KSwKKyAgICAgICAgICAgIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywKKyAgICAgICAgICAgIFRJTUVPVVRfTkFOT1MpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWRfbCgKKyAgICAgICAgcGlkX3Qgb3duZXJQaWQsIHBpZF90IGNsaWVudFRocmVhZElkLCBpbnQgcHJpb3JpdHkpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGlmIChnZXRSZWdpc3RlcmVkVGhyZWFkKCkgIT0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OklMTEVHQUxfVEhSRUFEX0lEKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCksIHRocmVhZCBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgcGlkX3Qgb3duZXJQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7IC8vIFRPRE8gcmV2aWV3CiAgICAgICAgIHNldFJlZ2lzdGVyZWRUaHJlYWQoY2xpZW50VGhyZWFkSWQpOwogICAgICAgICBpbnQgZXJyID0gYW5kcm9pZDo6cmVxdWVzdFByaW9yaXR5KG93bmVyUGlkLCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwgdHJ1ZSAvKiBpc0ZvckFwcCAqLyk7CkBAIC00ODEsNyArNTUzLDEzIEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBzZW5kQ29tbWFuZChVTlJFR0lTVEVSX0FVRElPX1RIUkVBRCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VW5yZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0+KGNsaWVudFRocmVhZElkKSwKKyAgICAgICAgICAgIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywKKyAgICAgICAgICAgIFRJTUVPVVRfTkFOT1MpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZF9sKHBpZF90IGNsaWVudFRocmVhZElkKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBpZiAoZ2V0UmVnaXN0ZXJlZFRocmVhZCgpICE9IGNsaWVudFRocmVhZElkKSB7CiAgICAgICAgIEFMT0dFKCIlcygpLCB3cm9uZyB0aHJlYWQiLCBfX2Z1bmNfXyk7CkBAIC01NTAsNyArNjI4LDcgQEAKICAgICByZXR1cm4gc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9YUlVOLCAoaW50NjRfdCkgeFJ1bkNvdW50KTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzZW5kQ3VycmVudFRpbWVzdGFtcCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZEN1cnJlbnRUaW1lc3RhbXBfbCgpIHsKICAgICBBQXVkaW9TZXJ2aWNlTWVzc2FnZSBjb21tYW5kOwogICAgIC8vIEl0IGlzIG5vdCB3b3J0aCBmaWxsaW5nIHVwIHRoZSBxdWV1ZSB3aXRoIHRpbWVzdGFtcHMuCiAgICAgLy8gVGhhdCBjYW4gY2F1c2UgdGhlIHN0cmVhbSB0byBnZXQgc3VzcGVuZGVkLgpAQCAtNTYwLDggKzYzOCw4IEBACiAgICAgfQogCiAgICAgLy8gU2VuZCBhIHRpbWVzdGFtcCBmb3IgdGhlIGNsb2NrIG1vZGVsLgotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbl9sKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIEFMT0dWKCIlcygpIFNFUlZJQ0UgICU4bGxkIGF0ICVsbGQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCkBAIC01NzEsOCArNjQ5LDggQEAKIAogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAgICAgLy8gU2VuZCBhIGhhcmR3YXJlIHRpbWVzdGFtcCBmb3IgcHJlc2VudGF0aW9uIHRpbWUuCi0gICAgICAgICAgICByZXN1bHQgPSBnZXRIYXJkd2FyZVRpbWVzdGFtcCgmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldEhhcmR3YXJlVGltZXN0YW1wX2woJmNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCkgSEFSRFdBUkUgJThsbGQgYXQgJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLApAQCAtNTk0LDcgKzY3MiwxNCBAQAogICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgogICovCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmdldERlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBzZW5kQ29tbWFuZCgKKyAgICAgICAgICAgIEdFVF9ERVNDUklQVElPTiwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8R2V0RGVzY3JpcHRpb25QYXJhbT4oJnBhcmNlbGFibGUpLAorICAgICAgICAgICAgdHJ1ZSAvKndhaXRGb3JSZXBseSovLAorICAgICAgICAgICAgVElNRU9VVF9OQU5PUyk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Z2V0RGVzY3JpcHRpb25fbChBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgewogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgewpAQCAtNjAzLDExICs2ODgsNTAgQEAKICAgICAgICAgfQogICAgICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1lc3NhZ2UgcXVldWUuCiAgICAgICAgIG1VcE1lc3NhZ2VRdWV1ZS0+ZmlsbFBhcmNlbGFibGUocGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLm1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUtPm1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUpOwogICAgIH0KLSAgICByZXR1cm4gZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24ocGFyY2VsYWJsZSk7CisgICAgcmV0dXJuIGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uX2wocGFyY2VsYWJsZSk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZXhpdFN0YW5kYnkoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgKnBhcmNlbGFibGUpIHsKKyAgICBhdXRvIGNvbW1hbmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFBdWRpb0NvbW1hbmQ+KAorICAgICAgICAgICAgRVhJVF9TVEFOREJZLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxFeGl0U3RhbmRieVBhcmFtPihwYXJjZWxhYmxlKSwKKyAgICAgICAgICAgIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywKKyAgICAgICAgICAgIFRJTUVPVVRfTkFOT1MpOworICAgIHJldHVybiBtQ29tbWFuZFF1ZXVlLnNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvblZvbHVtZUNoYW5nZWQoZmxvYXQgdm9sdW1lKSB7CiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUsIHZvbHVtZSk7CiB9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZENvbW1hbmQoYWF1ZGlvX2NvbW1hbmRfb3Bjb2RlIG9wQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmRQYXJhbT4gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FpdEZvclJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcykgeworICAgIHJldHVybiBtQ29tbWFuZFF1ZXVlLnNlbmRDb21tYW5kKHN0ZDo6bWFrZV9zaGFyZWQ8QUF1ZGlvQ29tbWFuZD4oCisgICAgICAgICAgICBvcENvZGUsIHBhcmFtLCB3YWl0Rm9yUmVwbHksIHRpbWVvdXROYW5vcykpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlQW5kQ2xlYXIoKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIGVuZHBvaW50LT51bnJlZ2lzdGVyU3RyZWFtKHRoaXMpOworICAgICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJmVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgZW5kcG9pbnRNYW5hZ2VyLmNsb3NlRW5kcG9pbnQoZW5kcG9pbnQpOworCisgICAgICAgIC8vIEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKCkgcHJldmVudHMgdHdvIHRocmVhZHMgZnJvbSBjbG9zaW5nIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQuY2xlYXIoKTsgLy8gZW5kcG9pbnQgd2lsbCBob2xkIHRoZSBwb2ludGVyIGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgfQorCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOworCisgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ0xPU0UpCisgICAgICAgIC5yZWNvcmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggOTc2OTk2ZC4uYjJiYTcyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC0zMyw4ICszMywxMCBAQAogI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAKLSNpbmNsdWRlICJTaGFyZWRSaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiQUF1ZGlvQ29tbWFuZFF1ZXVlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvVGhyZWFkLmgiCisjaW5jbHVkZSAiU2hhcmVkUmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIlRpbWVzdGFtcFNjaGVkdWxlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAgICAgY2xhc3MgQUF1ZGlvU2VydmljZTsKQEAgLTExNCw2ICsxMTYsMTEgQEAKICAgICAgKi8KICAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKSBFWENMVURFUyhtTG9jayk7CiAKKyAgICAvKioKKyAgICAgKiBFeGl0IHN0YW5kYnkgbW9kZS4gVGhlIE1NQVAgYnVmZmVyIHdpbGwgYmUgcmVhbGxvY2F0ZWQuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICpwYXJjZWxhYmxlKSBFWENMVURFUyhtTG9jayk7CisKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUgX191bnVzZWQpIHsKQEAgLTIzNSwxMCArMjQyLDQ2IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZV9sKCkgUkVRVUlSRVMobUxvY2spOwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlX2woKSBSRVFVSVJFUyhtTG9jayk7CiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcF9sKCkgUkVRVUlSRVMobUxvY2spOwogICAgIHZvaWQgZGlzY29ubmVjdF9sKCkgUkVRVUlSRVMobUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaF9sKCkgUkVRVUlSRVMobUxvY2spOworCisgICAgY2xhc3MgUmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtIDogcHVibGljIEFBdWRpb0NvbW1hbmRQYXJhbSB7CisgICAgcHVibGljOgorICAgICAgICBSZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0ocGlkX3Qgb3duZXJQaWQsIHBpZF90IGNsaWVudFRocmVhZElkLCBpbnQgcHJpb3JpdHkpCisgICAgICAgICAgICAgICAgOiBBQXVkaW9Db21tYW5kUGFyYW0oKSwgbU93bmVyUGlkKG93bmVyUGlkKSwKKyAgICAgICAgICAgICAgICAgIG1DbGllbnRUaHJlYWRJZChjbGllbnRUaHJlYWRJZCksIG1Qcmlvcml0eShwcmlvcml0eSkgeyB9CisgICAgICAgIH5SZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0oKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgcGlkX3QgbU93bmVyUGlkOworICAgICAgICBwaWRfdCBtQ2xpZW50VGhyZWFkSWQ7CisgICAgICAgIGludCBtUHJpb3JpdHk7CisgICAgfTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZF9sKAorICAgICAgICAgICAgcGlkX3Qgb3duZXJQaWQsIHBpZF90IGNsaWVudFRocmVhZElkLCBpbnQgcHJpb3JpdHkpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIGNsYXNzIFVucmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtIDogcHVibGljIEFBdWRpb0NvbW1hbmRQYXJhbSB7CisgICAgcHVibGljOgorICAgICAgICBVbnJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbShwaWRfdCBjbGllbnRUaHJlYWRJZCkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb0NvbW1hbmRQYXJhbSgpLCBtQ2xpZW50VGhyZWFkSWQoY2xpZW50VGhyZWFkSWQpIHsgfQorICAgICAgICB+VW5yZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0oKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgcGlkX3QgbUNsaWVudFRocmVhZElkOworICAgIH07CisgICAgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZF9sKHBpZF90IGNsaWVudFRocmVhZElkKSBSRVFVSVJFUyhtTG9jayk7CisKKyAgICBjbGFzcyBHZXREZXNjcmlwdGlvblBhcmFtIDogcHVibGljIEFBdWRpb0NvbW1hbmRQYXJhbSB7CisgICAgcHVibGljOgorICAgICAgICBHZXREZXNjcmlwdGlvblBhcmFtKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKQorICAgICAgICAgICAgICAgIDogQUF1ZGlvQ29tbWFuZFBhcmFtKCksIG1QYXJjZWxhYmxlKHBhcmNlbGFibGUpIHsgfQorICAgICAgICB+R2V0RGVzY3JpcHRpb25QYXJhbSgpID0gZGVmYXVsdDsKKworICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogbVBhcmNlbGFibGU7CisgICAgfTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RGVzY3JpcHRpb25fbChBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgUkVRVUlSRVMobUxvY2spOwogCiAgICAgdm9pZCBzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpOwogCkBAIC0yNTAsNyArMjkzLDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCB3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ3VycmVudFRpbWVzdGFtcCgpIEVYQ0xVREVTKG1Mb2NrKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXBfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kWFJ1bkNvdW50KGludDMyX3QgeFJ1bkNvdW50KTsKIApAQCAtMjU5LDExICszMDIsMTMgQEAKICAgICAgKiBAcGFyYW0gdGltZU5hbm9zCiAgICAgICogQHJldHVybiBBQVVESU9fT0sgb3IgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIG9yIG90aGVyIG5lZ2F0aXZlIGVycm9yCiAgICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbl9sKAorICAgICAgICAgICAgaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wX2woaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbl9sKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSA9IDA7CisKIAogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKIApAQCAtMjc0LDE0ICszMTksNTMgQEAKICAgICAgICAgbURpc2Nvbm5lY3RlZCA9IGZsYWc7CiAgICAgfQogCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhbmRieV9sKCkgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisgICAgY2xhc3MgRXhpdFN0YW5kYnlQYXJhbSA6IHB1YmxpYyBBQXVkaW9Db21tYW5kUGFyYW0geworICAgIHB1YmxpYzoKKyAgICAgICAgRXhpdFN0YW5kYnlQYXJhbShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb0NvbW1hbmRQYXJhbSgpLCBtUGFyY2VsYWJsZShwYXJjZWxhYmxlKSB7IH0KKyAgICAgICAgfkV4aXRTdGFuZGJ5UGFyYW0oKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIG1QYXJjZWxhYmxlOworICAgIH07CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnlfbCgKKyAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlIF9fdW51c2VkKSBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICBib29sIGlzU3RhbmRieV9sKCkgY29uc3QgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgcmV0dXJuIG1TdGFuZGJ5OworICAgIH0KKyAgICB2b2lkIHNldFN0YW5kYnlfbChib29sIHN0YW5kYnkpIFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIG1TdGFuZGJ5ID0gc3RhbmRieTsKKyAgICB9CisKKyAgICBib29sIGlzSWRsZV9sKCkgY29uc3QgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4gfHwgbVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VECisgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRDsKKyAgICB9CisKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZENsaWVudFRocmVhZCA9IElMTEVHQUxfVEhSRUFEX0lEOwogCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlTG9jazsKICAgICBzdGQ6OnNoYXJlZF9wdHI8U2hhcmVkUmluZ0J1ZmZlcj4gbVVwTWVzc2FnZVF1ZXVlOwogCi0gICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbVRpbWVzdGFtcFRocmVhZDsKLSAgICAvLyBUaGlzIGlzIHVzZWQgYnkgb25lIHRocmVhZCB0byB0ZWxsIGFub3RoZXIgdGhyZWFkIHRvIGV4aXQuIFNvIGl0IG11c3QgYmUgYXRvbWljLgorICAgIGVudW0gOiBpbnQzMl90IHsKKyAgICAgICAgU1RBUlQsCisgICAgICAgIFBBVVNFLAorICAgICAgICBTVE9QLAorICAgICAgICBGTFVTSCwKKyAgICAgICAgQ0xPU0UsCisgICAgICAgIERJU0NPTk5FQ1QsCisgICAgICAgIFJFR0lTVEVSX0FVRElPX1RIUkVBRCwKKyAgICAgICAgVU5SRUdJU1RFUl9BVURJT19USFJFQUQsCisgICAgICAgIEdFVF9ERVNDUklQVElPTiwKKyAgICAgICAgRVhJVF9TVEFOREJZLAorICAgIH07CisgICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbUNvbW1hbmRUaHJlYWQ7CiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVRocmVhZEVuYWJsZWR7ZmFsc2V9OworICAgIEFBdWRpb0NvbW1hbmRRdWV1ZSAgICAgIG1Db21tYW5kUXVldWU7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSAwOwogICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgIG1NbWFwQ2xpZW50OyAvLyBzZXQgaW4gb3BlbiwgdXNlZCBpbiBNTUFQIHN0YXJ0KCkKQEAgLTMxNSw2ICszOTksMTMgQEAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFNlcnZpY2VFdmVudChhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkYXRhRG91YmxlKTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ29tbWFuZChhYXVkaW9fY29tbWFuZF9vcGNvZGUgb3BDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZFBhcmFtPiBwYXJhbSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FpdEZvclJlcGx5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gMCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2VBbmRDbGVhcigpOworCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWV1ZSBpcyBnZXR0aW5nIGZ1bGwuCiAgICAgICovCkBAIC0zMzMsOSArNDI0LDEzIEBACiAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkIEdVQVJERURfQlkobUxvY2spIHtmYWxzZX07CiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSBHVUFSREVEX0JZKG1Mb2NrKSA9IGZhbHNlOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gTG9ja2luZyBvcmRlciBpcyBpbXBvcnRhbnQuCiAgICAgLy8gQWNxdWlyZSBtTG9jayBiZWZvcmUgYWNxdWlyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bUxvY2tTdHJlYW1zCisgICAgLy8gVGhlIGxvY2sgd2lsbCBiZSBoZWxkIGJ5IHRoZSBjb21tYW5kIHRocmVhZC4gQWxsIG9wZXJhdGlvbnMgbmVlZGluZyB0aGUgbG9jayBtdXN0IHJ1biBmcm9tCisgICAgLy8gdGhlIGNvbW1hbmQgdGhyZWFkLgogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1Mb2NrOyAvLyBQcmV2ZW50IHN0YXJ0L3N0b3AvY2xvc2UgZXRjZXRlcmEgZnJvbSBjb2xsaWRpbmcKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAppbmRleCA1N2RjMWFiLi5lYzliMmUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCkBAIC0xMTcsNiArMTE3LDM1IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdGFuZGJ5X2woKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5zdGFuZGJ5KCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgc2V0U3RhbmRieV9sKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmV4aXRTdGFuZGJ5X2woQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPmV4aXRTdGFuZGJ5KHBhcmNlbGFibGUpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHNldFN0YW5kYnlfbChmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzIGZhaWxlZCwgcmVzdWx0ICVkLCBkaXNjb25uZWN0aW5nIHN0cmVhbS4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKKyAgICAgICAgZGlzY29ubmVjdF9sKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKQEAgLTE0MSw3ICsxNzAsNyBAQAogfQogCiAvLyBHZXQgZnJlZS1ydW5uaW5nIERTUCBvciBETUEgaGFyZHdhcmUgcG9zaXRpb24gZnJvbSB0aGUgSEFMLgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uX2woaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwogICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CkBAIC0xNTgsMTYgKzE4NywxNSBAQAogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOwogICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewotICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgIGRpc2Nvbm5lY3RfbCgpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvLyBHZXQgdGltZXN0YW1wIGZyb20gcHJlc2VudGF0aW9uIHBvc2l0aW9uLgogLy8gSWYgaXQgZmFpbHMsIGdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCkKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEhhcmR3YXJlVGltZXN0YW1wX2woaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0KICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwogICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKQEAgLTE3NiwxNyArMjA0LDE3IEBACiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gc2VydmljZUVuZHBvaW50TU1BUCA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQICo+KGVuZHBvaW50LmdldCgpKTsKIAotICAgIC8vIERpc2FibGUgdGhpcyBjb2RlIHRlbXBvcmFyaWx5IGJlY2F1c2UgdGhlIEhBTCBpcyBub3QgcmV0dXJuaW5nCi0gICAgLy8gYSB1c2VmdWwgcmVzdWx0LgotI2lmIDAKICAgICB1aW50NjRfdCBwb3NpdGlvbjsKLSAgICBpZiAoc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0RXh0ZXJuYWxQb3NpdGlvbigmcG9zaXRpb24sIHRpbWVOYW5vcykgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIGdldEV4dGVybmFsUG9zaXRpb24oKSBzYXlzIHBvcyA9ICUiIFBSSWk2NCAiLCB0aW1lID0gJSIgUFJJaTY0LAorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRFeHRlcm5hbFBvc2l0aW9uKCZwb3NpdGlvbiwgdGltZU5hbm9zKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBBTE9HVigiJXMoKSBnZXRFeHRlcm5hbFBvc2l0aW9uKCkgc2F5cyBwb3MgPSAlIiBQUklpNjQgIiwgdGltZSA9ICUiIFBSSWk2NCwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcG9zaXRpb24sICp0aW1lTmFub3MpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSAoaW50NjRfdCkgcG9zaXRpb247CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfSBlbHNlCi0jZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXMoKSBnZXRFeHRlcm5hbFBvc2l0aW9uKCkgcmV0dXJucyBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOworICAgIH0KKwogICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgewogICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwpAQCAtMTk4LDggKzIyNiw4IEBACiB9CiAKIC8vIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKLSAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEF1ZGlvRGF0YURlc2NyaXB0aW9uX2woCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKQogewogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CiAgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCmluZGV4IDY2NzQ2NWEuLmNkOGM5MWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaApAQCAtNzEsMTIgKzcxLDE4IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcF9sKCkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhbmRieV9sKCkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCi0gICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIEVYQ0xVREVTKG1Mb2NrKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnlfbChBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbl9sKAorICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uX2woaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcF9sKAorICAgICAgICAgICAgaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogRGV2aWNlIHNwZWNpZmljIHN0YXJ0dXAuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IGM2NjVjZGEuLjA0ZmNkNmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xNjQsMTEgKzE2NCwxMSBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgc2V0Q2hhbm5lbE1hc2soY29uZmlndXJhdGlvbklucHV0LmdldENoYW5uZWxNYXNrKCkpOworICAgIGlmIChnZXRDaGFubmVsTWFzaygpID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBzZXRDaGFubmVsTWFzayhlbmRwb2ludC0+Z2V0Q2hhbm5lbE1hc2soKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICUjeCwgbmVlZCAlI3giLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yMTEsOCArMjExLDggQEAKIC8qKgogICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBjcmVhdGVkIGJ5IHRoaXMgc2VydmljZS4KICAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKAotICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbl9sKAorICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkKIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhdWRpb0RhdGFRdWV1ZUxvY2spOwogICAgIGlmIChtQXVkaW9EYXRhUXVldWUgPT0gbnVsbHB0cikgewpAQCAtMjIxLDggKzIyMSw4IEBACiAgICAgfQogICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBxdWV1ZS4KICAgICBtQXVkaW9EYXRhUXVldWUtPmZpbGxQYXJjZWxhYmxlKHBhcmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QoZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChnZXRGcmFtZXNQZXJCdXJzdCgpKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCkBAIC0yMzEsOCArMjMxLDggQEAKIH0KIAogLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IG1peGVyIG9yIGRpc3RyaWJ1dG9yLgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uX2woaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewogICAgIC8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMCiAgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKQEAgLTI0NSw4ICsyNDUsOCBAQAogfQogCiAvLyBHZXQgdGltZXN0YW1wIGZyb20gbG93ZXIgbGV2ZWwgc2VydmljZS4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRIYXJkd2FyZVRpbWVzdGFtcF9sKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAKICAgICBpbnQ2NF90IHBvc2l0aW9uID0gMDsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCmluZGV4IDRmYWU1YjQuLjc4Zjk3ODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKQEAgLTg4LDExICs4OCwxNCBAQAogCiBwcm90ZWN0ZWQ6CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbl9sKAorICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uX2woCisgICAgICAgICAgICBpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wX2woCisgICAgICAgICAgICBpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKICAgICAvKioKICAgICAgKiBAcGFyYW0gcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCmluZGV4IDY4NDk2YWMuLjU0OWZhNTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcApAQCAtMTYsOSArMTYsMTAgQEAKIAogI2RlZmluZSBMT0dfVEFHICJBQXVkaW9UaHJlYWQiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaD4KQEAgLTM4LDcgKzM5LDcgQEAKIH0KIAogQUF1ZGlvVGhyZWFkOjp+QUF1ZGlvVGhyZWFkKCkgewotICAgIEFMT0dFX0lGKHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIG1UaHJlYWQpLAorICAgIEFMT0dFX0lGKG1UaHJlYWQuZ2V0X2lkKCkgPT0gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCksCiAgICAgICAgICAgICAiJXMoKSBkZXN0cnVjdG9yIHJ1bm5pbmcgaW4gdGhyZWFkIiwgX19mdW5jX18pOwogICAgIEFMT0dFX0lGKG1IYXNUaHJlYWQsICIlcygpIHRocmVhZCBuZXZlciBqb2luZWQiLCBfX2Z1bmNfXyk7CiB9CkBAIC02MCwzMiArNjEsMTYgQEAKICAgICB9CiB9CiAKLS8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgbmV3IHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZVRocmVhZF9sKCkuCi0vLyBJdCBjb252ZXJ0cyB0aGUgJ0MnIGZ1bmN0aW9uIGNhbGwgdG8gYSBDKysgbWV0aG9kIGNhbGwuCi1zdGF0aWMgdm9pZCAqIEFBdWRpb1RocmVhZF9pbnRlcm5hbFRocmVhZFByb2Modm9pZCAqYXJnKSB7Ci0gICAgQUF1ZGlvVGhyZWFkICphYXVkaW9UaHJlYWQgPSAoQUF1ZGlvVGhyZWFkICopIGFyZzsKLSAgICBhYXVkaW9UaHJlYWQtPmRpc3BhdGNoKCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9UaHJlYWQ6OnN0YXJ0KFJ1bm5hYmxlICpydW5uYWJsZSkgewogICAgIGlmIChtSGFzVGhyZWFkKSB7CiAgICAgICAgIEFMT0dFKCJzdGFydCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICAvLyBtUnVubmFibGUgd2lsbCBiZSByZWFkIGJ5IHRoZSBuZXcgdGhyZWFkIHdoZW4gaXQgc3RhcnRzLgotICAgIC8vIHB0aHJlYWRfY3JlYXRlKCkgZm9yY2VzIGEgbWVtb3J5IHN5bmNocm9uaXphdGlvbiBzbyBtUnVubmFibGUgZG9lcyBub3QgbmVlZCB0byBiZSBhdG9taWMuCisgICAgLy8gbVJ1bm5hYmxlIHdpbGwgYmUgcmVhZCBieSB0aGUgbmV3IHRocmVhZCB3aGVuIGl0IHN0YXJ0cy4gQSBzdGQ6OnRocmVhZCBpcyBjcmVhdGVkLgogICAgIG1SdW5uYWJsZSA9IHJ1bm5hYmxlOwotICAgIGludCBlcnIgPSBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgbnVsbHB0ciwgQUF1ZGlvVGhyZWFkX2ludGVybmFsVGhyZWFkUHJvYywgdGhpcyk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydCgpIC0gcHRocmVhZF9jcmVhdGUoKSByZXR1cm5lZCAlZCAlcyIsIGVyciwgc3RyZXJyb3IoZXJyKSk7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgZXJyID0gcHRocmVhZF9zZXRuYW1lX25wKG1UaHJlYWQsIG1OYW1lKTsKLSAgICAgICAgQUxPR1dfSUYoKGVyciAhPSAwKSwgIkNvdWxkIG5vdCBzZXQgbmFtZSBvZiBBQXVkaW9UaHJlYWQuIGVyciA9ICVkIiwgZXJyKTsKLSAgICAgICAgbUhhc1RocmVhZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQorICAgIG1IYXNUaHJlYWQgPSB0cnVlOworICAgIG1UaHJlYWQgPSBzdGQ6OnRocmVhZCgmQUF1ZGlvVGhyZWFkOjpkaXNwYXRjaCwgdGhpcyk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1RocmVhZDo6c3RvcCgpIHsKQEAgLTkzLDE4ICs3OCwxOCBAQAogICAgICAgICBBTE9HRSgic3RvcCgpIGJ1dCBubyB0aHJlYWQgcnVubmluZyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdGhyZWFkIGlzIHRyeWluZyB0byBzdG9wIGl0c2VsZi4KLSAgICBpZiAocHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCkpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgYXR0ZW1wdCB0byBwdGhyZWFkX2pvaW4oKSBmcm9tIGxhdW5jaGVkIHRocmVhZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7Ci0gICAgfQogCi0gICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCBudWxscHRyKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoInN0b3AoKSAtIHB0aHJlYWRfam9pbigpIHJldHVybmVkICVkICVzIiwgZXJyLCBzdHJlcnJvcihlcnIpKTsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKG1UaHJlYWQuZ2V0X2lkKCkgPT0gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCkpIHsKKyAgICAgICAgLy8gVGhlIHRocmVhZCBtdXN0IG5vdCBiZSBqb2luZWQgYnkgaXRzZWxmLgorICAgICAgICBBTE9HRSgiJXMoKSBhdHRlbXB0IHRvIGpvaW4oKSBmcm9tIGxhdW5jaGVkIHRocmVhZCEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfSBlbHNlIGlmIChtVGhyZWFkLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgLy8gRG91YmxlIGNoZWNrIGlmIHRoZSB0aHJlYWQgaXMgam9pbmFibGUgdG8gYXZvaWQgZXhjZXB0aW9uIHdoZW4gY2FsbGluZyBqb2luLgorICAgICAgICBtVGhyZWFkLmpvaW4oKTsKICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcygpIHRoZSB0aHJlYWQgaXMgbm90IGpvaW5hYmxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmgKaW5kZXggMDhhOGE5OC4uYjI3NzRlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgQUFVRElPX1RIUkVBRF9ICiAKICNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHRocmVhZD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIApAQCAtMzcsNyArMzcsNiBAQAogCiAvKioKICAqIEFic3RyYWN0aW9uIGZvciBhIGhvc3QgZGVwZW5kZW50IHRocmVhZC4KLSAqIFRPRE8gQ29uc2lkZXIgdXNpbmcgQW5kcm9pZCAiVGhyZWFkIiBjbGFzcyBvciBzdGQ6OnRocmVhZCBpbnN0ZWFkLgogICovCiBjbGFzcyBBQXVkaW9UaHJlYWQKIHsKQEAgLTczLDcgKzcyLDcgQEAKIAogICAgIFJ1bm5hYmxlICAgICptUnVubmFibGUgPSBudWxscHRyOwogICAgIGJvb2wgICAgICAgICBtSGFzVGhyZWFkID0gZmFsc2U7Ci0gICAgcHRocmVhZF90ICAgIG1UaHJlYWQgPSB7fTsKKyAgICBzdGQ6OnRocmVhZCAgbVRocmVhZDsKIAogICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbU5leHRUaHJlYWRJbmRleDsKICAgICBjaGFyICAgICAgICAgbU5hbWVbMTZdOyAvLyBtYXggbGVuZ3RoIGZvciBhIHB0aHJlYWRfbmFtZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNGM1ODA0MC4uODBlNDI5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCkBAIC0yNyw2ICsyNyw3IEBACiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQXVkaW9DbGllbnRUcmFja2VyLmNwcCIsCisgICAgICAgICJBQXVkaW9Db21tYW5kUXVldWUuY3BwIiwKICAgICAgICAgIkFBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAiLAogICAgICAgICAiQUF1ZGlvTWl4ZXIuY3BwIiwKICAgICAgICAgIkFBdWRpb1NlcnZpY2UuY3BwIiwKQEAgLTY4LDYgKzY5LDggQEAKICAgICAgICAgImFhdWRpby1haWRsLWNwcCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmNwcAppbmRleCBjMWQ0ZTE2Li5mZDJhNDU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmNwcApAQCAtODUsOSArODUsOSBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLXZvaWQgU2hhcmVkUmluZ0J1ZmZlcjo6ZmlsbFBhcmNlbGFibGUoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50UGFyY2VsYWJsZSwKK3ZvaWQgU2hhcmVkUmluZ0J1ZmZlcjo6ZmlsbFBhcmNlbGFibGUoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIGVuZHBvaW50UGFyY2VsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUgJnJpbmdCdWZmZXJQYXJjZWxhYmxlKSB7Ci0gICAgaW50IGZkSW5kZXggPSBlbmRwb2ludFBhcmNlbGFibGUuYWRkRmlsZURlc2NyaXB0b3IobUZpbGVEZXNjcmlwdG9yLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMpOworICAgIGludCBmZEluZGV4ID0gZW5kcG9pbnRQYXJjZWxhYmxlLT5hZGRGaWxlRGVzY3JpcHRvcihtRmlsZURlc2NyaXB0b3IsIG1TaGFyZWRNZW1vcnlTaXplSW5CeXRlcyk7CiAgICAgcmluZ0J1ZmZlclBhcmNlbGFibGUuc2V0dXBNZW1vcnkoZmRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRURfUklOR0JVRkZFUl9EQVRBX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YU1lbW9yeVNpemVJbkJ5dGVzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oCmluZGV4IGMzYTliYjcuLmNmZjEyNjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBhbGxvY2F0ZShhbmRyb2lkOjpmaWZvX2ZyYW1lc190IGJ5dGVzUGVyRnJhbWUsIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcyk7CiAKLSAgICB2b2lkIGZpbGxQYXJjZWxhYmxlKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZlbmRwb2ludFBhcmNlbGFibGUsCisgICAgdm9pZCBmaWxsUGFyY2VsYWJsZShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogZW5kcG9pbnRQYXJjZWxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUgJnJpbmdCdWZmZXJQYXJjZWxhYmxlKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL1JFQURNRS5tZCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9SRUFETUUubWQKaW5kZXggMDBiODVkZi4uYWU3YWYzZWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9SRUFETUUubWQKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL1JFQURNRS5tZApAQCAtMTUsNyArMTUsNyBAQAogNC4gSW5TZXJ2aWNlCiA1LiBEZXZpY2VJZAogNi4gU2FtcGxlUmF0ZQotNy4gU2FtcGxlc1BlckZyYW1lCis3LiBDaGFubmVsTWFzawogOC4gRGlyZWN0aW9uCiA5LiBTaGFyaW5nTW9kZQogMTAuIFVzYWdlCkBAIC0zMSw3ICszMSw3IEBACiB8IGBJblNlcnZpY2VgICAgfCBgYm9vbGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CiB8IGBEZXZpY2VJZGAgICB8IGBJTlQzMl9NSU5gIHRvIGBJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAogfCBgU2FtcGxlUmF0ZWAgICB8IGBJTlQzMl9NSU5gIHRvIGBJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAotfCBgU2FtcGxlc1BlckZyYW1lYCB8IGBJTlQzMl9NSU5gIHRvIGBJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgQ2hhbm5lbE1hc2tgIHwgYEFBVURJT19VTlNQRUNJRklFRGAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzFgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfM2AsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzRgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNmAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzdgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOWAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEwYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTFgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMmAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEzYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTRgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNWAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE2YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTdgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOGAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE5YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjBgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMWAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIyYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjNgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yNGAsIGBBQVVESU9fQ0hBTk5FTF9NT05PYCwgYEFBVURJT19DSEFOTkVMX1NURVJFT2AsIGBBQVVESU9fQ0hBTk5FTF9GUk9OVF9CQUNLYCwgYEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyYCwgYEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfNVBPSU5UMWAsIGBBQVVESU9fQ0hBTk5FTF9NT05PYCwgYEFBVURJT19DSEFOTkVMX1NURVJFT2AsIGBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxYCwgYEFBVURJT19DSEFOTkVMX1RSSWAsIGBBQVVESU9fQ0hBTk5FTF9UUklfQkFDS2AsIGBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxYCwgYEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyYCwgYEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfUVVBRGAsIGBBQVVESU9fQ0hBTk5FTF9RVUFEX1NJREVgLCBgQUFVRElPX0NIQU5ORUxfU1VSUk9VTkRgLCBgQUFVRElPX0NIQU5ORUxfUEVOVEFgLCBgQUFVRElPX0NIQU5ORUxfNVBPSU5UMWAsIGBBQVVESU9fQ0hBTk5FTF81UE9JTlQxX1NJREVgLCBgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQ0YCwgYEFBVURJT19DSEFOTkVMXzZQT0lOVDFgLCBgQUFVRElPX0NIQU5ORUxfN1BPSU5UMWAsIGBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQyYCwgYEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDRgLCBgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNGAsIGBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ2YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKIHwgYERpcmVjdGlvbmAgfCBgQUFVRElPX0RJUkVDVElPTl9PVVRQVVRgLCBgQUFVRElPX0RJUkVDVElPTl9JTlBVVGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKIHwgYFNoYXJpbmdNb2RlYCB8IGBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRWAsIGBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKIHwgYFVzYWdlYCB8IGBBQVVESU9fVVNBR0VfTUVESUFgLCBgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05gLCBgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElOR2AsIGBBQVVESU9fVVNBR0VfQUxBUk1gLCBgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTmAsIGBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FYCwgYEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlRgLCBgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWWAsIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFYCwgYEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTmAsIGBBQVVESU9fVVNBR0VfR0FNRWAsIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5UYCwgYEFBVURJT19TWVNURU1fVVNBR0VfRU1FUkdFTkNZYCwgYEFBVURJT19TWVNURU1fVVNBR0VfU0FGRVRZYCwgYEFBVURJT19TWVNURU1fVVNBR0VfVkVISUNMRV9TVEFUVVNgLCBgQUFVRElPX1NZU1RFTV9VU0FHRV9BTk5PVU5DRU1FTlRgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvb2JvZXNlcnZpY2VfZnV6emVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9vYm9lc2VydmljZV9mdXp6ZXIuY3BwCmluZGV4IDRiYzY2MWMuLjVlNDg5NTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9vYm9lc2VydmljZV9mdXp6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9vYm9lc2VydmljZV9mdXp6ZXIuY3BwCkBAIC02OCwxMCArNjgsNzEgQEAKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VELCAgICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFLAogfTsKIAorYWF1ZGlvX2NoYW5uZWxfbWFza190IGtBQXVkaW9DaGFubmVsTWFza3NbXSA9IHsKKyAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMiwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzksCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMCwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzExLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTIsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMywKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE0LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTUsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNiwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE3LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTgsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIwLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMiwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIzLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjQsCisgICAgQUFVRElPX0NIQU5ORUxfTU9OTywKKyAgICBBQVVESU9fQ0hBTk5FTF9TVEVSRU8sCisgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQkFDSywKKyAgICBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDFQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfM1BPSU5UMFBPSU5UMiwKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMXzVQT0lOVDEsCisgICAgQUFVRElPX0NIQU5ORUxfTU9OTywKKyAgICBBQVVESU9fQ0hBTk5FTF9TVEVSRU8sCisgICAgQUFVRElPX0NIQU5ORUxfMlBPSU5UMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9UUkksCisgICAgQUFVRElPX0NIQU5ORUxfVFJJX0JBQ0ssCisgICAgQUFVRElPX0NIQU5ORUxfM1BPSU5UMSwKKyAgICBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDFQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfM1BPSU5UMFBPSU5UMiwKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMX1FVQUQsCisgICAgQUFVRElPX0NIQU5ORUxfUVVBRF9TSURFLAorICAgIEFBVURJT19DSEFOTkVMX1NVUlJPVU5ELAorICAgIEFBVURJT19DSEFOTkVMX1BFTlRBLAorICAgIEFBVURJT19DSEFOTkVMXzVQT0lOVDEsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMV9TSURFLAorICAgIEFBVURJT19DSEFOTkVMXzVQT0lOVDFQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UNCwKKyAgICBBQVVESU9fQ0hBTk5FTF82UE9JTlQxLAorICAgIEFBVURJT19DSEFOTkVMXzdQT0lOVDEsCisgICAgQUFVRElPX0NIQU5ORUxfN1BPSU5UMVBPSU5UMiwKKyAgICBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQ0LAorICAgIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDQsCisgICAgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNiwKK307CisKIGNvbnN0IHNpemVfdCBrTnVtQUF1ZGlvRm9ybWF0cyA9IHN0ZDo6c2l6ZShrQUF1ZGlvRm9ybWF0cyk7CiBjb25zdCBzaXplX3Qga051bUFBdWRpb1VzYWdlcyA9IHN0ZDo6c2l6ZShrQUF1ZGlvVXNhZ2VzKTsKIGNvbnN0IHNpemVfdCBrTnVtQUF1ZGlvQ29udGVudFR5cGVzID0gc3RkOjpzaXplKGtBQXVkaW9Db250ZW50VHlwZXMpOwogY29uc3Qgc2l6ZV90IGtOdW1BQXVkaW9JbnB1dFByZXNldHMgPSBzdGQ6OnNpemUoa0FBdWRpb0lucHV0UHJlc2V0cyk7Citjb25zdCBzaXplX3Qga051bUFBdWRpb0NoYW5uZWxNYXNrcyA9IHN0ZDo6c2l6ZShrQUF1ZGlvQ2hhbm5lbE1hc2tzKTsKIAogY2xhc3MgRnV6ekFBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHB1YmxpYyBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlIHsKICAgIHB1YmxpYzoKQEAgLTExOSw2ICsxODAsMTEgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlIFVOVVNFRF9QQVJBTSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKwogICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHt9CiAKICAgICBpbnQgZ2V0RGVhdGhDb3VudCgpIHsgcmV0dXJuIG1EZWF0aENvdW50OyB9CkBAIC0zMDUsNyArMzcxLDExIEBACiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREZXZpY2VJZChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZVJhdGUoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKLSAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVzUGVyRnJhbWUoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRDaGFubmVsTWFzaygoYWF1ZGlvX2NoYW5uZWxfbWFza190KSgKKyAgICAgICAgZmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgID8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpCisgICAgICAgICAgICA6IGtBQXVkaW9DaGFubmVsTWFza3NbZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgIDAsIGtOdW1BQXVkaW9DaGFubmVsTWFza3MgLSAxKV0pKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREaXJlY3Rpb24oCiAgICAgICAgIGZkcC5Db25zdW1lQm9vbCgpID8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGZkcC5Db25zdW1lQm9vbCgpID8gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQgOiBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci8uY2xhbmctZm9ybWF0IGIvc2VydmljZXMvdHVuZXIvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRjYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDMzIEBACistLS0KK0Jhc2VkT25TdHlsZTogR29vZ2xlCitBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZTogSW5saW5lCitBbGxvd1Nob3J0SWZTdGF0ZW1lbnRzT25BU2luZ2xlTGluZTogdHJ1ZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogdHJ1ZQorQmluUGFja0FyZ3VtZW50czogdHJ1ZQorQmluUGFja1BhcmFtZXRlcnM6IHRydWUKK0NvbW1lbnRQcmFnbWFzOiBOT0xJTlQ6LioKK0NvbnRpbnVhdGlvbkluZGVudFdpZHRoOiA4CitEZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQorSW5kZW50V2lkdGg6IDQKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiA0CisKKyMgRGV2aWF0aW9ucyBmcm9tIHRoZSBhYm92ZSBmaWxlOgorIyAiRG9uJ3QgaW5kZW50IHRoZSBzZWN0aW9uIGxhYmVsIgorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC00CisjICJFYWNoIGxpbmUgb2YgdGV4dCBpbiB5b3VyIGNvZGUgc2hvdWxkIGJlIGF0IG1vc3QgMTAwIGNvbHVtbnMgbG9uZy4iCitDb2x1bW5MaW1pdDogMTAwCisjICJDb25zdHJ1Y3RvciBpbml0aWFsaXplciBsaXN0cyBjYW4gYmUgYWxsIG9uIG9uZSBsaW5lIG9yIHdpdGggc3Vic2VxdWVudAorIyBsaW5lcyBpbmRlbnRlZCBlaWdodCBzcGFjZXMuIi4gY2xhbmctZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgaGF2aW5nIHRoZSBjb2xvbgorIyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLCBzbyB0aGlzIGlzIHRoZSBiZXN0CisjIGFwcHJveGltYXRpb24gb2YgdGhhdCBydWxlLCB3aGljaCBtYWtlcyBhbGwgZW50cmllcyBpbiB0aGUgbGlzdCAoZXhjZXB0IHRoZQorIyBmaXJzdCBvbmUpIGhhdmUgYW4gZWlnaHQgc3BhY2UgaW5kZW50YXRpb24uCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDYKKyMgVGhlcmUgaXMgbm90aGluZyBpbiBnby9kcm9pZGNwcHN0eWxlIGFib3V0IGNhc2UgbGFiZWxzLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUKKyMgbW9yZSBjb2RlIHRoYXQgZG9lcyBub3QgaW5kZW50IHRoZSBjYXNlIGxhYmVscyBpbiBmcmFtZXdvcmtzL2Jhc2UuCitJbmRlbnRDYXNlTGFiZWxzOiBmYWxzZQorIyBUaGVyZSBoYXZlIGJlZW4gc29tZSBidWdzIGluIHdoaWNoIHN1YnNlcXVlbnQgZm9ybWF0dGluZyBvcGVyYXRpb25zIGludHJvZHVjZQorIyB3ZWlyZCBjb21tZW50IGp1bXBzLgorUmVmbG93Q29tbWVudHM6IGZhbHNlCisjIEFuZHJvaWQgZG9lcyBzdXBwb3J0IEMrKzExIG5vdy4KK1N0YW5kYXJkOiBDcHAxMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy90dW5lci9BbmRyb2lkLmJwCmluZGV4IGNkMTFjODguLjVjMWRkYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icApAQCAtNywzMyArNywxNSBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKIH0KIAotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAidHZfdHVuZXJfYWlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyLyouYWlkbCIsCi0gICAgXSwKLSAgICBwYXRoOiAiYWlkbCIsCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogInR2X3R1bmVyX2Zyb250ZW5kX2luZm8iLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kKkNhcGFiaWxpdGllcy5haWRsIiwKLSAgICBdLAotICAgIHBhdGg6ICJhaWRsIiwKLX0KLQogYWlkbF9pbnRlcmZhY2UgewogICAgIG5hbWU6ICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZSIsCiAgICAgdW5zdGFibGU6IHRydWUsCiAgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6dHZfdHVuZXJfYWlkbCIsCi0gICAgXSwKKyAgICBzcmNzOiBbImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci8qLmFpZGwiXSwKICAgICBpbXBvcnRzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci1WMSIsCiAgICAgXSwKIAogICAgIGJhY2tlbmQ6IHsKQEAgLTQ5LDM3ICszMSwxOCBAQAogICAgIH0sCiB9CiAKLWFpZGxfaW50ZXJmYWNlIHsKLSAgICBuYW1lOiAidHZfdHVuZXJfZnJvbnRlbmRfaW5mb19haWRsX2ludGVyZmFjZSIsCi0gICAgdW5zdGFibGU6IHRydWUsCi0gICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6dHZfdHVuZXJfZnJvbnRlbmRfaW5mbyIsCi0gICAgXSwKLQotICAgIGJhY2tlbmQ6IHsKLSAgICAgICAgamF2YTogewotICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICAgICAgY3BwOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgICAgICB9LAotICAgICAgICBuZGs6IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnR1bmVyc2VydmljZSIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJUdW5lciouY3BwIiwKKyAgICAgICAgImhpZGwvVHVuZXIqLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLVYxLW5kayIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKQEAgLTg5LDEzICs1MiwxMyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEtbmRrIiwKICAgICAgICAgImxpYmFpZGxjb21tb25zdXBwb3J0IiwKICAgICBdLAogCkBAIC0xMjIsMTggKzg1LDE1IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXItVjEtbmRrIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmZtcSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidHVuZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtY3BwIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBpbml0X3JjOiBbIm1lZGlhdHVuZXIucmMiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL09XTkVSUyBiL3NlcnZpY2VzL3R1bmVyL09XTkVSUwppbmRleCAwY2ViOGU4Li5iZjlmZTM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9PV05FUlMKKysrIGIvc2VydmljZXMvdHVuZXIvT1dORVJTCkBAIC0xLDIgKzEsMiBAQAotbmNoYWxrb0Bnb29nbGUuY29tCitoZ2NoZW5AZ29vZ2xlLmNvbQogcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcAppbmRleCAxMTIyMzY4Li5hNmYzYTJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcApAQCAtMTYsMjMgKzE2LDMyIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJEZW11eCIKIAotI2luY2x1ZGUgIlR1bmVyRHZyLmgiCiAjaW5jbHVkZSAiVHVuZXJEZW11eC5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEdnIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUR2ckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZpbHRlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lUaW1lRmlsdGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorCisjaW5jbHVkZSAiVHVuZXJEdnIuaCIKICNpbmNsdWRlICJUdW5lclRpbWVGaWx0ZXIuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEFscEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWFpblR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhJcEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VGx2RmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkR2clR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUR2cjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUR2ckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklUaW1lRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJEZW11eDo6VHVuZXJEZW11eChzcDxJRGVtdXg+IGRlbXV4LCBpbnQgaWQpIHsKK1R1bmVyRGVtdXg6OlR1bmVyRGVtdXgoc2hhcmVkX3B0cjxJRGVtdXg+IGRlbXV4LCBpbnQgaWQpIHsKICAgICBtRGVtdXggPSBkZW11eDsKICAgICBtRGVtdXhJZCA9IGlkOwogfQpAQCAtNDEsMTkyICs1MCwxNDMgQEAKICAgICBtRGVtdXggPSBudWxscHRyOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6c2V0RnJvbnRlbmREYXRhU291cmNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGZyb250ZW5kKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBpbl9mcm9udGVuZCkgewogICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCiAgICAgaW50IGZyb250ZW5kSWQ7Ci0gICAgZnJvbnRlbmQtPmdldEZyb250ZW5kSWQoJmZyb250ZW5kSWQpOwotICAgIFJlc3VsdCByZXMgPSBtRGVtdXgtPnNldEZyb250ZW5kRGF0YVNvdXJjZShmcm9udGVuZElkKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBpbl9mcm9udGVuZC0+Z2V0RnJvbnRlbmRJZCgmZnJvbnRlbmRJZCk7CisKKyAgICByZXR1cm4gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpvcGVuRmlsdGVyKAotICAgICAgICBpbnQgdHlwZSwgaW50IHN1YlR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBjYiwKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6c2V0RnJvbnRlbmREYXRhU291cmNlQnlJZChpbnQgZnJvbnRlbmRJZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1EZW11eC0+c2V0RnJvbnRlbmREYXRhU291cmNlKGZyb250ZW5kSWQpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGZpbHRlcjsKKyAgICBzaGFyZWRfcHRyPFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjaz4gZmlsdGVyQ2IgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrPihpbl9jYik7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyQ2FsbGJhY2s+IGNiID0gZmlsdGVyQ2I7CisgICAgYXV0byBzdGF0dXMgPSBtRGVtdXgtPm9wZW5GaWx0ZXIoaW5fdHlwZSwgaW5fYnVmZmVyU2l6ZSwgY2IsICZmaWx0ZXIpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZpbHRlcj4oZmlsdGVyLCBmaWx0ZXJDYiwgaW5fdHlwZSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6b3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgRGVtdXhGaWx0ZXJNYWluVHlwZSBtYWluVHlwZSA9IHN0YXRpY19jYXN0PERlbXV4RmlsdGVyTWFpblR5cGU+KHR5cGUpOwotICAgIERlbXV4RmlsdGVyVHlwZSBmaWx0ZXJUeXBlIHsKLSAgICAgICAgLm1haW5UeXBlID0gbWFpblR5cGUsCi0gICAgfTsKLQotICAgIHN3aXRjaChtYWluVHlwZSkgewotICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWFpblR5cGU6OlRTOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRzRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eFRzRmlsdGVyVHlwZT4oc3ViVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUDoKLSAgICAgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5tbXRwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eE1tdHBGaWx0ZXJUeXBlPihzdWJUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1haW5UeXBlOjpJUDoKLSAgICAgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5pcEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8RGVtdXhJcEZpbHRlclR5cGU+KHN1YlR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWFpblR5cGU6OlRMVjoKLSAgICAgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS50bHZGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PERlbXV4VGx2RmlsdGVyVHlwZT4oc3ViVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6QUxQOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLmFscEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8RGVtdXhBbHBGaWx0ZXJUeXBlPihzdWJUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBzcDxJRmlsdGVyPiBmaWx0ZXJTcDsKLSAgICBzcDxJRmlsdGVyQ2FsbGJhY2s+IGNiU3AgPSBuZXcgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrKGNiKTsKLSAgICBtRGVtdXgtPm9wZW5GaWx0ZXIoZmlsdGVyVHlwZSwgYnVmZmVyU2l6ZSwgY2JTcCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUZpbHRlcj4mIGZpbHRlcikgewotICAgICAgICAgICAgICAgIGZpbHRlclNwID0gZmlsdGVyOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgc2hhcmVkX3B0cjxJVGltZUZpbHRlcj4gZmlsdGVyOworICAgIGF1dG8gc3RhdHVzID0gbURlbXV4LT5vcGVuVGltZUZpbHRlcigmZmlsdGVyKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJUaW1lRmlsdGVyPihmaWx0ZXIpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZpbHRlcj4oZmlsdGVyU3AsIHR5cGUsIHN1YlR5cGUpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6Z2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIHR1bmVyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElUaW1lRmlsdGVyPiBmaWx0ZXJTcDsKLSAgICBtRGVtdXgtPm9wZW5UaW1lRmlsdGVyKFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVRpbWVGaWx0ZXI+JiBmaWx0ZXIpIHsKLSAgICAgICAgZmlsdGVyU3AgPSBmaWx0ZXI7Ci0gICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclRpbWVGaWx0ZXI+KGZpbHRlclNwKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0gKHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIuZ2V0KCkpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgcmV0dXJuIG1EZW11eC0+Z2V0QXZTeW5jSHdJZChoYWxGaWx0ZXIsIF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNId0lkKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgdHVuZXJGaWx0ZXIsIGludCogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNUaW1lKGludDMyX3QgYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgdWludDMyX3QgYXZTeW5jSHdJZDsKLSAgICBSZXN1bHQgcmVzOwotICAgIHNwPElGaWx0ZXI+IGhhbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBtRGVtdXgtPmdldEF2U3luY0h3SWQoaGFsRmlsdGVyLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBpZCkgewotICAgICAgICAgICAgICAgIHJlcyA9IHI7Ci0gICAgICAgICAgICAgICAgYXZTeW5jSHdJZCA9IGlkOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSAoaW50KWF2U3luY0h3SWQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbURlbXV4LT5nZXRBdlN5bmNUaW1lKGF2U3luY0h3SWQsIF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNUaW1lKGludCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5EdnIoRHZyVHlwZSBpbl9kdmJUeXBlLCBpbnQzMl90IGluX2J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICB1aW50NjRfdCB0aW1lOwotICAgIFJlc3VsdCByZXM7Ci0gICAgbURlbXV4LT5nZXRBdlN5bmNUaW1lKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdlN5bmNId0lkKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgdHMpIHsKLSAgICAgICAgICAgICAgICByZXMgPSByOwotICAgICAgICAgICAgICAgIHRpbWUgPSB0czsKLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBzaGFyZWRfcHRyPElEdnJDYWxsYmFjaz4gY2FsbGJhY2sgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckR2cjo6RHZyQ2FsbGJhY2s+KGluX2NiKTsKKyAgICBzaGFyZWRfcHRyPElEdnI+IGhhbER2cjsKKyAgICBhdXRvIHJlcyA9IG1EZW11eC0+b3BlbkR2cihpbl9kdmJUeXBlLCBpbl9idWZmZXJTaXplLCBjYWxsYmFjaywgJmhhbER2cik7CisgICAgaWYgKHJlcy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRHZyPihoYWxEdnIsIGluX2R2YlR5cGUpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdCl0aW1lOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5EdnIoaW50IGR2clR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiYgY2IsCi0gICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyPiogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4Ojpjb25uZWN0Q2lDYW0oaW50MzJfdCBjaUNhbUlkKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlczsKLSAgICBzcDxJRHZyQ2FsbGJhY2s+IGNhbGxiYWNrID0gbmV3IFR1bmVyRHZyOjpEdnJDYWxsYmFjayhjYik7Ci0gICAgc3A8SUR2cj4gaGlkbER2cjsKLSAgICBtRGVtdXgtPm9wZW5EdnIoc3RhdGljX2Nhc3Q8RHZyVHlwZT4oZHZyVHlwZSksIGJ1ZmZlclNpemUsIGNhbGxiYWNrLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRHZyPiYgZHZyKSB7Ci0gICAgICAgICAgICAgICAgaGlkbER2ciA9IGR2cjsKLSAgICAgICAgICAgICAgICByZXMgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEdnI+KGhpZGxEdnIsIGR2clR5cGUpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EZW11eC0+Y29ubmVjdENpQ2FtKGNpQ2FtSWQpOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6Y29ubmVjdENpQ2FtKGludCBjaUNhbUlkKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpkaXNjb25uZWN0Q2lDYW0oKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+Y29ubmVjdENpQ2FtKHN0YXRpY19jYXN0PHVpbnQzMl90PihjaUNhbUlkKSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRGVtdXgtPmRpc2Nvbm5lY3RDaUNhbSgpOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6ZGlzY29ubmVjdENpQ2FtKCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6Y2xvc2UoKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+ZGlzY29ubmVjdENpQ2FtKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIGF1dG8gcmVzID0gbURlbXV4LT5jbG9zZSgpOworICAgIG1EZW11eCA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gcmVzOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCByZXMgPSBtRGVtdXgtPmNsb3NlKCk7Ci0gICAgbURlbXV4ID0gTlVMTDsKLQotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5oCmluZGV4IDJhOTgzNmIuLmNkYjNhYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmgKQEAgLTE3LDUyICsxNyw1NSBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZW11eC5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRGVtdXguaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KIAotdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJEZW11eDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRHZyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEdnJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRnJvbnRlbmQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lclRpbWVGaWx0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2cjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2ckNhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJVGltZUZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVtdXg7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAogY2xhc3MgVHVuZXJEZW11eCA6IHB1YmxpYyBCblR1bmVyRGVtdXggewogCiBwdWJsaWM6Ci0gICAgVHVuZXJEZW11eChzcDxJRGVtdXg+IGRlbXV4LCBpbnQgZGVtdXhJZCk7CisgICAgVHVuZXJEZW11eChzaGFyZWRfcHRyPElEZW11eD4gZGVtdXgsIGludCBkZW11eElkKTsKICAgICB2aXJ0dWFsIH5UdW5lckRlbXV4KCk7Ci0gICAgU3RhdHVzIHNldEZyb250ZW5kRGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiYgZnJvbnRlbmQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRmlsdGVyKAotICAgICAgICBpbnQgbWFpblR5cGUsIGludCBzdWJ0eXBlLCBpbnQgYnVmZmVyU2l6ZSwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGNiLAotICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiB0dW5lckZpbHRlciwgaW50KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRBdlN5bmNUaW1lKGludCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRHZyKAotICAgICAgICBpbnQgZHZiVHlwZSwgaW50IGJ1ZmZlclNpemUsIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBjYiwKLSAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjb25uZWN0Q2lDYW0oaW50IGNpQ2FtSWQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBkaXNjb25uZWN0Q2lDYW0oKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldEZyb250ZW5kRGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBpbl9mcm9udGVuZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlQnlJZChpbnQgZnJvbnRlbmRJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkZpbHRlcihjb25zdCBEZW11eEZpbHRlclR5cGUmIGluX3R5cGUsIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuVGltZUZpbHRlcihzaGFyZWRfcHRyPElUdW5lclRpbWVGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl90dW5lckZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QXZTeW5jVGltZShpbnQzMl90IGluX2F2U3luY0h3SWQsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkR2cihEdnJUeXBlIGluX2R2YlR5cGUsIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25uZWN0Q2lDYW0oaW50MzJfdCBpbl9jaUNhbUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkaXNjb25uZWN0Q2lDYW0oKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwogCiAgICAgaW50IGdldElkKCkgeyByZXR1cm4gbURlbXV4SWQ7IH0KIAogcHJpdmF0ZToKLSAgICBzcDxJRGVtdXg+IG1EZW11eDsKKyAgICBzaGFyZWRfcHRyPElEZW11eD4gbURlbXV4OwogICAgIGludCBtRGVtdXhJZDsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkRFTVVYX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKaW5kZXggYjdhZTE2Ny4uNzBhZWUyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKQEAgLTE2LDE3ICsxNiwyNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIlR1bmVyRGVzY3JhbWJsZXIiCiAKLSNpbmNsdWRlICJUdW5lckZpbHRlci5oIgotI2luY2x1ZGUgIlR1bmVyRGVtdXguaCIKICNpbmNsdWRlICJUdW5lckRlc2NyYW1ibGVyLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRmlsdGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiVHVuZXJEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLVR1bmVyRGVzY3JhbWJsZXI6OlR1bmVyRGVzY3JhbWJsZXIoc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcikgeworVHVuZXJEZXNjcmFtYmxlcjo6VHVuZXJEZXNjcmFtYmxlcihzaGFyZWRfcHRyPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXIpIHsKICAgICBtRGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlcjsKIH0KIApAQCAtMzQsOTEgKzQ0LDc0IEBACiAgICAgbURlc2NyYW1ibGVyID0gbnVsbHB0cjsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldERlbXV4U291cmNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGRlbXV4KSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjpzZXREZW11eFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGluX3R1bmVyRGVtdXgpIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldERlbXV4U291cmNlKHN0YXRpY19jYXN0PFR1bmVyRGVtdXgqPihkZW11eC5nZXQoKSktPmdldElkKCkpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRGVzY3JhbWJsZXItPnNldERlbXV4U291cmNlKChzdGF0aWNfY2FzdDxUdW5lckRlbXV4Kj4oaW5fdHVuZXJEZW11eC5nZXQoKSkpLT5nZXRJZCgpKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldEtleVRva2VuKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYga2V5VG9rZW4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldEtleVRva2VuKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgaW5fa2V5VG9rZW4pIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldEtleVRva2VuKGtleVRva2VuKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbURlc2NyYW1ibGVyLT5zZXRLZXlUb2tlbihpbl9rZXlUb2tlbik7CiB9CiAKLVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjphZGRQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAotICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIG9wdGlvbmFsU291cmNlRmlsdGVyKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjphZGRQaWQoCisgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIHNwPElGaWx0ZXI+IGhhbEZpbHRlciA9IChvcHRpb25hbFNvdXJjZUZpbHRlciA9PSBOVUxMKQotICAgICAgICAgICAgPyBOVUxMIDogc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihvcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOwotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPmFkZFBpZChnZXRIaWRsRGVtdXhQaWQocGlkKSwgaGFsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9CisgICAgICAgICAgICAoaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihpbl9vcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworCisgICAgcmV0dXJuIG1EZXNjcmFtYmxlci0+YWRkUGlkKGluX3BpZCwgaGFsRmlsdGVyKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnJlbW92ZVBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQsCi0gICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnJlbW92ZVBpZCgKKyAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgewogICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgc3A8SUZpbHRlcj4gaGFsRmlsdGVyID0gKG9wdGlvbmFsU291cmNlRmlsdGVyID09IE5VTEwpCi0gICAgICAgICAgICA/IE5VTEwgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KG9wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7Ci0gICAgUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+cmVtb3ZlUGlkKGdldEhpZGxEZW11eFBpZChwaWQpLCBoYWxGaWx0ZXIpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0KKyAgICAgICAgICAgIChpbl9vcHRpb25hbFNvdXJjZUZpbHRlciA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KGluX29wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisKKyAgICByZXR1cm4gbURlc2NyYW1ibGVyLT5yZW1vdmVQaWQoaW5fcGlkLCBoYWxGaWx0ZXIpOwogfQogCi1TdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6Y2xvc2UoKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjpjbG9zZSgpIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5jbG9zZSgpOwotICAgIG1EZXNjcmFtYmxlciA9IE5VTEw7CisgICAgYXV0byByZXMgPSBtRGVzY3JhbWJsZXItPmNsb3NlKCk7CisgICAgbURlc2NyYW1ibGVyID0gbnVsbHB0cjsKIAotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gcmVzOwogfQogCi1EZW11eFBpZCBUdW5lckRlc2NyYW1ibGVyOjpnZXRIaWRsRGVtdXhQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkKSB7Ci0gICAgRGVtdXhQaWQgaGlkbFBpZDsKLSAgICBzd2l0Y2ggKHBpZC5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRGVtdXhQaWQ6OnRQaWQ6IHsKLSAgICAgICAgICAgIGhpZGxQaWQudFBpZCgodWludDE2X3QpcGlkLmdldDxUdW5lckRlbXV4UGlkOjp0UGlkPigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJEZW11eFBpZDo6bW10cFBpZDogewotICAgICAgICAgICAgaGlkbFBpZC5tbXRwUGlkKCh1aW50MTZfdClwaWQuZ2V0PFR1bmVyRGVtdXhQaWQ6Om1tdHBQaWQ+KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGhpZGxQaWQ7Ci19Cit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuaAppbmRleCAxOTcwZmI3Li5iMWQ1ZmI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmgKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5oCkBAIC0xNywzOCArMTcsNDMgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkRFU0NSQU1CTEVSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkRFU0NSQU1CTEVSX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRGVzY3JhbWJsZXIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckRlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRGVzY3JhbWJsZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckRlbXV4OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRGVtdXhQaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4UGlkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVzY3JhbWJsZXI7CiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAogY2xhc3MgVHVuZXJEZXNjcmFtYmxlciA6IHB1YmxpYyBCblR1bmVyRGVzY3JhbWJsZXIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJEZXNjcmFtYmxlcihzcDxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyKTsKKyAgICBUdW5lckRlc2NyYW1ibGVyKHNoYXJlZF9wdHI8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcik7CiAgICAgdmlydHVhbCB+VHVuZXJEZXNjcmFtYmxlcigpOwotICAgIFN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgZGVtdXgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRLZXlUb2tlbihjb25zdCB2ZWN0b3I8dWludDhfdD4mIGtleVRva2VuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgYWRkUGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCwKLSAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOwotICAgIFN0YXR1cyByZW1vdmVQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAotICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBvcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgaW5fdHVuZXJEZW11eCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0S2V5VG9rZW4oY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlUb2tlbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWRkUGlkKGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZVBpZCgKKyAgICAgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX29wdGlvbmFsU291cmNlRmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICAgIERlbXV4UGlkIGdldEhpZGxEZW11eFBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQpOwotCi0gICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CisgICAgc2hhcmVkX3B0cjxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkRFU0NSQU1CTEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmNwcAppbmRleCBkYjRlMDdiLi44Nzc2ZjdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuY3BwCkBAIC0xNiwxOTQgKzE2LDE1MiBAQAogCiAjZGVmaW5lIExPR19UQUcgIlR1bmVyRHZyIgogCi0jaW5jbHVkZSA8Zm1xL0NvbnZlcnRNUURlc2NyaXB0b3JzLmg+CiAjaW5jbHVkZSAiVHVuZXJEdnIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGF0YUZvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJEdnI6OlR1bmVyRHZyKHNwPElEdnI+IGR2ciwgaW50IHR5cGUpIHsKK1R1bmVyRHZyOjpUdW5lckR2cihzaGFyZWRfcHRyPElEdnI+IGR2ciwgRHZyVHlwZSB0eXBlKSB7CiAgICAgbUR2ciA9IGR2cjsKLSAgICBtVHlwZSA9IHN0YXRpY19jYXN0PER2clR5cGU+KHR5cGUpOworICAgIG1UeXBlID0gdHlwZTsKIH0KIAogVHVuZXJEdnI6On5UdW5lckR2cigpIHsKLSAgICBtRHZyID0gTlVMTDsKKyAgICBtRHZyID0gbnVsbHB0cjsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjpnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgTVFEZXNjIGR2ck1RRGVzYzsKLSAgICBSZXN1bHQgcmVzOwotICAgIG1EdnItPmdldFF1ZXVlRGVzYyhbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzYyYgZGVzYykgewotICAgICAgICBkdnJNUURlc2MgPSBkZXNjOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICBBaWRsTVFEZXNjIGFpZGxNUURlc2M7Ci0gICAgdW5zYWZlSGlkbFRvQWlkbE1RRGVzY3JpcHRvcjx1aW50OF90LCBpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4oCi0gICAgICAgICAgICAgICAgZHZyTVFEZXNjLCAgJmFpZGxNUURlc2MpOwotICAgICpfYWlkbF9yZXR1cm4gPSBtb3ZlKGFpZGxNUURlc2MpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EdnItPmdldFF1ZXVlRGVzYyhfYWlkbF9yZXR1cm4pOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OmNvbmZpZ3VyZShjb25zdCBUdW5lckR2clNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpjb25maWd1cmUoY29uc3QgRHZyU2V0dGluZ3MmIGluX3NldHRpbmdzKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRHZyLT5jb25maWd1cmUoZ2V0SGlkbER2clNldHRpbmdzRnJvbUFpZGwoc2V0dGluZ3MpKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+Y29uZmlndXJlKGluX3NldHRpbmdzKTsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjphdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6YXR0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIElUdW5lckZpbHRlciogdHVuZXJGaWx0ZXIgPSBmaWx0ZXIuZ2V0KCk7Ci0gICAgc3A8SUZpbHRlcj4gaGlkbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBpZiAoaGlkbEZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICBpZiAoaW5fZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPmF0dGFjaEZpbHRlcihoaWRsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9IChzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KGluX2ZpbHRlci5nZXQoKSkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBpZiAoaGFsRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICByZXR1cm4gbUR2ci0+YXR0YWNoRmlsdGVyKGhhbEZpbHRlcik7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6ZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmRldGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBJVHVuZXJGaWx0ZXIqIHR1bmVyRmlsdGVyID0gZmlsdGVyLmdldCgpOwotICAgIHNwPElGaWx0ZXI+IGhpZGxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KHR1bmVyRmlsdGVyKS0+Z2V0SGFsRmlsdGVyKCk7Ci0gICAgaWYgKGhpZGxGaWx0ZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgaWYgKGluX2ZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRHZyLT5kZXRhY2hGaWx0ZXIoaGlkbEZpbHRlcik7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyPiBoYWxGaWx0ZXIgPSAoc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihpbl9maWx0ZXIuZ2V0KCkpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgaWYgKGhhbEZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgcmV0dXJuIG1EdnItPmRldGFjaEZpbHRlcihoYWxGaWx0ZXIpOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OnN0YXJ0KCkgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpzdGFydCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPnN0YXJ0KCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EdnItPnN0YXJ0KCk7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6c3RvcCgpIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6c3RvcCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPnN0b3AoKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+c3RvcCgpOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OmZsdXNoKCkgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpmbHVzaCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPmZsdXNoKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EdnItPmZsdXNoKCk7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmNsb3NlKCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUR2ci0+Y2xvc2UoKTsKLSAgICBtRHZyID0gTlVMTDsKKyAgICBhdXRvIHN0YXR1cyA9IG1EdnItPmNsb3NlKCk7CisgICAgbUR2ciA9IG51bGxwdHI7CiAKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotRHZyU2V0dGluZ3MgVHVuZXJEdnI6OmdldEhpZGxEdnJTZXR0aW5nc0Zyb21BaWRsKFR1bmVyRHZyU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICBEdnJTZXR0aW5ncyBzOwotICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgY2FzZSBEdnJUeXBlOjpQTEFZQkFDSzogewotICAgICAgICAgICAgcy5wbGF5YmFjayh7Ci0gICAgICAgICAgICAgICAgLnN0YXR1c01hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5zdGF0dXNNYXNrKSwKLSAgICAgICAgICAgICAgICAubG93VGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmxvd1RocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgLmhpZ2hUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuaGlnaFRocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgLmRhdGFGb3JtYXQgPSBzdGF0aWNfY2FzdDxEYXRhRm9ybWF0PihzZXR0aW5ncy5kYXRhRm9ybWF0KSwKLSAgICAgICAgICAgICAgICAucGFja2V0U2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnBhY2tldFNpemUpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICBjYXNlIER2clR5cGU6OlJFQ09SRDogewotICAgICAgICAgICAgcy5yZWNvcmQoewotICAgICAgICAgICAgICAgIC5zdGF0dXNNYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3Muc3RhdHVzTWFzayksCi0gICAgICAgICAgICAgICAgLmxvd1RocmVzaG9sZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5sb3dUaHJlc2hvbGQpLAotICAgICAgICAgICAgICAgIC5oaWdoVGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmhpZ2hUaHJlc2hvbGQpLAotICAgICAgICAgICAgICAgIC5kYXRhRm9ybWF0ID0gc3RhdGljX2Nhc3Q8RGF0YUZvcm1hdD4oc2V0dGluZ3MuZGF0YUZvcm1hdCksCi0gICAgICAgICAgICAgICAgLnBhY2tldFNpemUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5wYWNrZXRTaXplKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gczsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAvLy8vLy8vLy8vLy8vLy8gSUR2ckNhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVJldHVybjx2b2lkPiBUdW5lckR2cjo6RHZyQ2FsbGJhY2s6Om9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpIHsKLSAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25SZWNvcmRTdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25SZWNvcmRTdGF0dXMoY29uc3QgUmVjb3JkU3RhdHVzIHN0YXR1cykgeworICAgIGlmIChtVHVuZXJEdnJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckR2ckNhbGxiYWNrLT5vblJlY29yZFN0YXR1cyhzdGF0dXMpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckR2cjo6RHZyQ2FsbGJhY2s6Om9uUGxheWJhY2tTdGF0dXMoY29uc3QgUGxheWJhY2tTdGF0dXMgc3RhdHVzKSB7Ci0gICAgaWYgKG1UdW5lckR2ckNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbVR1bmVyRHZyQ2FsbGJhY2stPm9uUGxheWJhY2tTdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25QbGF5YmFja1N0YXR1cyhjb25zdCBQbGF5YmFja1N0YXR1cyBzdGF0dXMpIHsKKyAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25QbGF5YmFja1N0YXR1cyhzdGF0dXMpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmgKaW5kZXggYTUwOGU5OS4uMTg1NGQwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5oCkBAIC0xNyw4MSArMTcsNzEgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkRWUl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJEVlJfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0JuRHZyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRHZyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRHZyVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRHZyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1BsYXliYWNrU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1JlY29yZFN0YXR1cy5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRHZyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ckNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgogCi0jaW5jbHVkZSA8VHVuZXJGaWx0ZXIuaD4KKyNpbmNsdWRlICJUdW5lckZpbHRlci5oIgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpHcmFudG9yRGVzY3JpcHRvcjsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRHZyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEdnJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckR2clNldHRpbmdzOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RHZyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2cjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2ckNhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpQbGF5YmFja1N0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVjb3JkU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpCbkR2ckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RHZyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUR2cjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UGxheWJhY2tTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlY29yZFN0YXR1czsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCi11c2luZyBNUURlc2MgPSBNUURlc2NyaXB0b3JTeW5jPHVpbnQ4X3Q+OwogdXNpbmcgQWlkbE1RRGVzYyA9IE1RRGVzY3JpcHRvcjxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CiAKIGNsYXNzIFR1bmVyRHZyIDogcHVibGljIEJuVHVuZXJEdnIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJEdnIoc3A8SUR2cj4gZHZyLCBpbnQgdHlwZSk7CisgICAgVHVuZXJEdnIoc2hhcmVkX3B0cjxJRHZyPiBkdnIsIER2clR5cGUgdHlwZSk7CiAgICAgflR1bmVyRHZyKCk7CiAKLSAgICBTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlKGNvbnN0IER2clNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYXR0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyBjb25maWd1cmUoY29uc3QgVHVuZXJEdnJTZXR0aW5ncyYgc2V0dGluZ3MpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIGF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7Ci0KLSAgICBzdHJ1Y3QgRHZyQ2FsbGJhY2sgOiBwdWJsaWMgSUR2ckNhbGxiYWNrIHsKKyAgICBzdHJ1Y3QgRHZyQ2FsbGJhY2sgOiBwdWJsaWMgQm5EdnJDYWxsYmFjayB7CiAgICAgICAgIER2ckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IHR1bmVyRHZyQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgOiBtVHVuZXJEdnJDYWxsYmFjayh0dW5lckR2ckNhbGxiYWNrKSB7fTsKKyAgICAgICAgICAgICAgOiBtVHVuZXJEdnJDYWxsYmFjayh0dW5lckR2ckNhbGxiYWNrKXt9OwogCi0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpOwotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblBsYXliYWNrU3RhdHVzKGNvbnN0IFBsYXliYWNrU3RhdHVzIHN0YXR1cyk7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblBsYXliYWNrU3RhdHVzKGNvbnN0IFBsYXliYWNrU3RhdHVzIHN0YXR1cykgb3ZlcnJpZGU7CiAKLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IG1UdW5lckR2ckNhbGxiYWNrOworICAgIHByaXZhdGU6CisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IG1UdW5lckR2ckNhbGxiYWNrOwogICAgIH07CiAKIHByaXZhdGU6Ci0gICAgRHZyU2V0dGluZ3MgZ2V0SGlkbER2clNldHRpbmdzRnJvbUFpZGwoVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncyk7Ci0KLSAgICBzcDxJRHZyPiBtRHZyOworICAgIHNoYXJlZF9wdHI8SUR2cj4gbUR2cjsKICAgICBEdnJUeXBlIG1UeXBlOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSRFZSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmNwcAppbmRleCAwMzlmZDMxLi5lOGM3NzY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuY3BwCkBAIC0xOCw4OTMgKzE4LDQ2OSBAQAogCiAjaW5jbHVkZSAiVHVuZXJGaWx0ZXIuaCIKIAotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb247CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhBbHBMZW5ndGhUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwUGlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFJlY29yZFNjSW5kZXhUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFN0cmVhbUlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdWRpb1N0cmVhbVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkNvbnN0YW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpWaWRlb1N0cmVhbVR5cGU7CisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKyNpbmNsdWRlICJUdW5lclNlcnZpY2UuaCIKIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotVHVuZXJGaWx0ZXI6OlR1bmVyRmlsdGVyKAotICAgICAgICBzcDxJRmlsdGVyPiBmaWx0ZXIsIGludCBtYWluVHlwZSwgaW50IHN1YlR5cGUpIHsKLSAgICBtRmlsdGVyID0gZmlsdGVyOwotICAgIG1GaWx0ZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyOjpjYXN0RnJvbShmaWx0ZXIpOwotICAgIG1NYWluVHlwZSA9IG1haW5UeXBlOwotICAgIG1TdWJUeXBlID0gc3ViVHlwZTsKLX0KK1R1bmVyRmlsdGVyOjpUdW5lckZpbHRlcihzaGFyZWRfcHRyPElGaWx0ZXI+IGZpbHRlciwgc2hhcmVkX3B0cjxGaWx0ZXJDYWxsYmFjaz4gY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhGaWx0ZXJUeXBlIHR5cGUpCisgICAgICA6IG1GaWx0ZXIoZmlsdGVyKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgICAgbVNoYXJlZChmYWxzZSksCisgICAgICAgIG1DbGllbnRQaWQoLTEpLAorICAgICAgICBtRmlsdGVyQ2FsbGJhY2soY2IpIHt9CiAKIFR1bmVyRmlsdGVyOjp+VHVuZXJGaWx0ZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtRmlsdGVyID0gbnVsbHB0cjsKLSAgICBtRmlsdGVyXzFfMSA9IG51bGxwdHI7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgewotICAgIGlmIChtRmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgTVFEZXNjIGZpbHRlck1RRGVzYzsKLSAgICBSZXN1bHQgcmVzOwotICAgIG1GaWx0ZXItPmdldFF1ZXVlRGVzYyhbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzYyYgZGVzYykgewotICAgICAgICBmaWx0ZXJNUURlc2MgPSBkZXNjOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICBBaWRsTVFEZXNjIGFpZGxNUURlc2M7Ci0gICAgdW5zYWZlSGlkbFRvQWlkbE1RRGVzY3JpcHRvcjx1aW50OF90LCBpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4oCi0gICAgICAgICAgICAgICAgZmlsdGVyTVFEZXNjLCAgJmFpZGxNUURlc2MpOwotICAgICpfYWlkbF9yZXR1cm4gPSBtb3ZlKGFpZGxNUURlc2MpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXM7Ci0gICAgbUZpbHRlci0+Z2V0SWQoWyZdKFJlc3VsdCByLCB1aW50MzJfdCBmaWx0ZXJJZCkgewotICAgICAgICByZXMgPSByOwotICAgICAgICBtSWQgPSBmaWx0ZXJJZDsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CiAgICAgfQotICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIHJldHVybiBtRmlsdGVyLT5nZXRRdWV1ZURlc2MoX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBSZXN1bHQgcmVzOwotICAgIG1GaWx0ZXJfMV8xLT5nZXRJZDY0Qml0KFsmXShSZXN1bHQgciwgdWludDY0X3QgZmlsdGVySWQpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgbUlkNjRCaXQgPSBmaWx0ZXJJZDsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgKl9haWRsX3JldHVybiA9IG1JZDY0Qml0OwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgRGVtdXhGaWx0ZXJTZXR0aW5ncyBzZXR0aW5nczsKLSAgICBzd2l0Y2ggKGNvbmZpZy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6dHM6IHsKLSAgICAgICAgICAgIGdldEhpZGxUc1NldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246Om1tdHA6IHsKLSAgICAgICAgICAgIGdldEhpZGxNbXRwU2V0dGluZ3MoY29uZmlnLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6aXA6IHsKLSAgICAgICAgICAgIGdldEhpZGxJcFNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRsdjogewotICAgICAgICAgICAgZ2V0SGlkbFRsdlNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OmFscDogewotICAgICAgICAgICAgZ2V0SGlkbEFscFNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5jb25maWd1cmUoc2V0dGluZ3MpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1GaWx0ZXItPmdldElkKCZtSWQpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVNb25pdG9yRXZlbnQoaW50IG1vbml0b3JFdmVudFR5cGUpIHsKLSAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVNb25pdG9yRXZlbnQobW9uaXRvckV2ZW50VHlwZSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludCBjaWQpIHsKLSAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVJcENpZChjaWQpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSkgewotICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBBdlN0cmVhbVR5cGUgdHlwZTsKLSAgICBpZiAoIWdldEhpZGxBdlN0cmVhbVR5cGUoYXZTdHJlYW1UeXBlLCB0eXBlKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVBdlN0cmVhbVR5cGUodHlwZSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIElUdW5lckZpbHRlciogdHVuZXJGaWx0ZXIgPSBmaWx0ZXIuZ2V0KCk7Ci0gICAgc3A8SUZpbHRlcj4gaGlkbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+c2V0RGF0YVNvdXJjZShoaWRsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OmdldEhpZGxUc1NldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIHRzQ29uZiA9IGNvbmZpZy5nZXQ8VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjp0cz4oKTsKLSAgICBEZW11eFRzRmlsdGVyU2V0dGluZ3MgdHN7Ci0gICAgICAgIC50cGlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRzQ29uZi50cGlkKSwKLSAgICB9OwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyB0dW5lclNldHRpbmdzID0gdHNDb25mLmZpbHRlclNldHRpbmdzOwotICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmF2OiB7Ci0gICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5hdihnZXRBdlNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRTZWN0aW9uU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpwZXNEYXRhOiB7Ci0gICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldFBlc0RhdGFTZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnJlY29yZDogewotICAgICAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3MucmVjb3JkKGdldFJlY29yZFNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0dGluZ3MudHModHMpOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsTW10cFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIG1tdHBDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246Om1tdHA+KCk7Ci0gICAgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3MgbW10cHsKLSAgICAgICAgLm1tdHBQaWQgPSBzdGF0aWNfY2FzdDxEZW11eE1tdHBQaWQ+KG1tdHBDb25mLm1tdHBQaWQpLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSBtbXRwQ29uZi5maWx0ZXJTZXR0aW5nczsKLSAgICBzd2l0Y2ggKHR1bmVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjphdjogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5hdihnZXRBdlNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucGVzRGF0YShnZXRQZXNEYXRhU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpyZWNvcmQ6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucmVjb3JkKGdldFJlY29yZFNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6ZG93bmxvYWQ6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MuZG93bmxvYWQoZ2V0RG93bmxvYWRTZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0dGluZ3MubW10cChtbXRwKTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6Z2V0SGlkbElwU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gaXBDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OmlwPigpOwotICAgIERlbXV4SXBBZGRyZXNzIGlwQWRkcnsKLSAgICAgICAgLnNyY1BvcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXBDb25mLmlwQWRkci5zcmNQb3J0KSwKLSAgICAgICAgLmRzdFBvcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXBDb25mLmlwQWRkci5kc3RQb3J0KSwKLSAgICB9OwotCi0gICAgaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MuaXNJcFY2Ci0gICAgICAgICAgICA/IGlwQWRkci5zcmNJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKQotICAgICAgICAgICAgOiBpcEFkZHIuc3JjSXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuc3JjSXBBZGRyZXNzKSk7Ci0gICAgaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MuaXNJcFY2Ci0gICAgICAgICAgICA/IGlwQWRkci5kc3RJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKQotICAgICAgICAgICAgOiBpcEFkZHIuZHN0SXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuZHN0SXBBZGRyZXNzKSk7Ci0gICAgRGVtdXhJcEZpbHRlclNldHRpbmdzIGlwewotICAgICAgICAuaXBBZGRyID0gaXBBZGRyLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSBpcENvbmYuZmlsdGVyU2V0dGluZ3M7Ci0gICAgc3dpdGNoICh0dW5lclNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgaXAuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRTZWN0aW9uU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjppc1Bhc3N0aHJvdWdoOiB7Ci0gICAgICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5iUGFzc3Rocm91Z2godHVuZXJTZXR0aW5ncy5pc1Bhc3N0aHJvdWdoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0dGluZ3MuaXAoaXApOwotfQotCi1oaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gVHVuZXJGaWx0ZXI6OmdldElwVjZBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcikgewotICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBpcDsKLSAgICBpZiAoYWRkci5hZGRyLnNpemUoKSAhPSBJUF9WNl9MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIGlwOwotICAgIH0KLSAgICBjb3B5KGFkZHIuYWRkci5iZWdpbigpLCBhZGRyLmFkZHIuZW5kKCksIGlwLmRhdGEoKSk7Ci0gICAgcmV0dXJuIGlwOwotfQotCi1oaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y0X0xFTkdUSD4gVHVuZXJGaWx0ZXI6OmdldElwVjRBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcikgewotICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBpcDsKLSAgICBpZiAoYWRkci5hZGRyLnNpemUoKSAhPSBJUF9WNF9MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIGlwOwotICAgIH0KLSAgICBjb3B5KGFkZHIuYWRkci5iZWdpbigpLCBhZGRyLmFkZHIuZW5kKCksIGlwLmRhdGEoKSk7Ci0gICAgcmV0dXJuIGlwOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsVGx2U2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gdGx2Q29uZiA9IGNvbmZpZy5nZXQ8VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjp0bHY+KCk7Ci0gICAgRGVtdXhUbHZGaWx0ZXJTZXR0aW5ncyB0bHZ7Ci0gICAgICAgIC5wYWNrZXRUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odGx2Q29uZi5wYWNrZXRUeXBlKSwKLSAgICAgICAgLmlzQ29tcHJlc3NlZElwUGFja2V0ID0gdGx2Q29uZi5pc0NvbXByZXNzZWRJcFBhY2tldCwKLSAgICB9OwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyB0dW5lclNldHRpbmdzID0gdGx2Q29uZi5maWx0ZXJTZXR0aW5nczsKLSAgICBzd2l0Y2ggKHR1bmVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRTZWN0aW9uU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjppc1Bhc3N0aHJvdWdoOiB7Ci0gICAgICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3MuYlBhc3N0aHJvdWdoKHR1bmVyU2V0dGluZ3MuaXNQYXNzdGhyb3VnaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy50bHYodGx2KTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6Z2V0SGlkbEFscFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIGFscENvbmYgPSBjb25maWcuZ2V0PFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6YWxwPigpOwotICAgIERlbXV4QWxwRmlsdGVyU2V0dGluZ3MgYWxwewotICAgICAgICAucGFja2V0VHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFscENvbmYucGFja2V0VHlwZSksCi0gICAgICAgIC5sZW5ndGhUeXBlID0gc3RhdGljX2Nhc3Q8RGVtdXhBbHBMZW5ndGhUeXBlPihhbHBDb25mLmxlbmd0aFR5cGUpLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSBhbHBDb25mLmZpbHRlclNldHRpbmdzOwotICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb246IHsKLSAgICAgICAgICAgIGFscC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBhbHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy5hbHAoYWxwKTsKLX0KLQotRGVtdXhGaWx0ZXJBdlNldHRpbmdzIFR1bmVyRmlsdGVyOjpnZXRBdlNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgRGVtdXhGaWx0ZXJBdlNldHRpbmdzIGF2IHsKLSAgICAgICAgLmlzUGFzc3Rocm91Z2ggPSBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6YXY+KCkuaXNQYXNzdGhyb3VnaCwKLSAgICB9OwotICAgIHJldHVybiBhdjsKLX0KLQotRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgVHVuZXJGaWx0ZXI6OmdldFNlY3Rpb25TZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gcyA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpOwotICAgIERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzIHNlY3Rpb257Ci0gICAgICAgIC5pc0NoZWNrQ3JjID0gcy5pc0NoZWNrQ3JjLAotICAgICAgICAuaXNSZXBlYXQgPSBzLmlzUmVwZWF0LAotICAgICAgICAuaXNSYXcgPSBzLmlzUmF3LAotICAgIH07Ci0KLSAgICBzd2l0Y2ggKHMuY29uZGl0aW9uLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uOjpzZWN0aW9uQml0czogewotICAgICAgICAgICAgYXV0byBzZWN0aW9uQml0cyA9IHMuY29uZGl0aW9uLmdldDxUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnNlY3Rpb25CaXRzPigpOwotICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGZpbHRlcihzZWN0aW9uQml0cy5maWx0ZXIuYmVnaW4oKSwgc2VjdGlvbkJpdHMuZmlsdGVyLmVuZCgpKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBtYXNrKHNlY3Rpb25CaXRzLm1hc2suYmVnaW4oKSwgc2VjdGlvbkJpdHMubWFzay5lbmQoKSk7Ci0gICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gbW9kZShzZWN0aW9uQml0cy5tb2RlLmJlZ2luKCksIHNlY3Rpb25CaXRzLm1vZGUuZW5kKCkpOwotICAgICAgICAgICAgc2VjdGlvbi5jb25kaXRpb24uc2VjdGlvbkJpdHMoewotICAgICAgICAgICAgICAgIC5maWx0ZXIgPSBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgLm1hc2sgPSBtYXNrLAotICAgICAgICAgICAgICAgIC5tb2RlID0gbW9kZSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnRhYmxlSW5mbzogewotICAgICAgICAgICAgYXV0byB0YWJsZUluZm8gPSBzLmNvbmRpdGlvbi5nZXQ8VHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uOjp0YWJsZUluZm8+KCk7Ci0gICAgICAgICAgICBzZWN0aW9uLmNvbmRpdGlvbi50YWJsZUluZm8oewotICAgICAgICAgICAgICAgIC50YWJsZUlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRhYmxlSW5mby50YWJsZUlkKSwKLSAgICAgICAgICAgICAgICAudmVyc2lvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pih0YWJsZUluZm8udmVyc2lvbiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZWN0aW9uOwotfQotCi1EZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0UGVzRGF0YVNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MgcGVzewotICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxEZW11eFN0cmVhbUlkPigKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YT4oKS5zdHJlYW1JZCksCi0gICAgICAgIC5pc1JhdyA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpLmlzUmF3LAotICAgIH07Ci0gICAgcmV0dXJuIHBlczsKLX0KLQotRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0UmVjb3JkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIHIgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6cmVjb3JkPigpOwotICAgIERlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3MgcmVjb3JkewotICAgICAgICAudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oci50c0luZGV4TWFzayksCi0gICAgICAgIC5zY0luZGV4VHlwZSA9IHN0YXRpY19jYXN0PERlbXV4UmVjb3JkU2NJbmRleFR5cGU+KHIuc2NJbmRleFR5cGUpLAotICAgIH07Ci0KLSAgICBzd2l0Y2ggKHIuc2NJbmRleE1hc2suZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzYzogewotICAgICAgICAgICAgcmVjb3JkLnNjSW5kZXhNYXNrLnNjKHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgci5zY0luZGV4TWFzay5nZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2M+KCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjOiB7Ci0gICAgICAgICAgICByZWNvcmQuc2NJbmRleE1hc2suc2NIZXZjKHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgci5zY0luZGV4TWFzay5nZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVjb3JkOwotfQotCi1EZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgVHVuZXJGaWx0ZXI6OmdldERvd25sb2FkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgZG93bmxvYWQgewotICAgICAgICAuZG93bmxvYWRJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6ZG93bmxvYWQ+KCkuZG93bmxvYWRJZCksCi0gICAgfTsKLSAgICByZXR1cm4gZG93bmxvYWQ7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0QXZTaGFyZWRIYW5kbGVJbmZvKFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlczsKLSAgICBtRmlsdGVyXzFfMS0+Z2V0QXZTaGFyZWRIYW5kbGUoWyZdKFJlc3VsdCByLCBoaWRsX2hhbmRsZSBhdk1lbW9yeSwgdWludDY0X3QgYXZNZW1TaXplKSB7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgICAgIGlmIChyZXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgICAgICBUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8gaW5mb3sKLSAgICAgICAgICAgICAgICAuaGFuZGxlID0gZHVwVG9BaWRsKGF2TWVtb3J5KSwKLSAgICAgICAgICAgICAgICAuc2l6ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGF2TWVtU2l6ZSksCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IG1vdmUoaW5mbyk7CisgICAgYXV0byBzdGF0dXMgPSBtRmlsdGVyLT5nZXRJZDY0Qml0KCZtSWQ2NEJpdCk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG1JZDY0Qml0OworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIGluX3NldHRpbmdzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZpbHRlci0+Y29uZmlndXJlKGluX3NldHRpbmdzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQzMl90IG1vbml0b3JFdmVudFR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIHJldHVybiBtRmlsdGVyLT5jb25maWd1cmVNb25pdG9yRXZlbnQobW9uaXRvckV2ZW50VHlwZSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQzMl90IGNpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmNvbmZpZ3VyZUlwQ2lkKGNpZCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlJiBpbl9hdlN0cmVhbVR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIHJldHVybiBtRmlsdGVyLT5jb25maWd1cmVBdlN0cmVhbVR5cGUoaW5fYXZTdHJlYW1UeXBlKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4oZmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgcmV0dXJuIG1GaWx0ZXItPnNldERhdGFTb3VyY2UoaGFsRmlsdGVyKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldEF2U2hhcmVkSGFuZGxlKE5hdGl2ZUhhbmRsZSogb3V0X2F2TWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmdldEF2U2hhcmVkSGFuZGxlKG91dF9hdk1lbW9yeSwgX2FpZGxfcmV0dXJuKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnJlbGVhc2VBdkhhbmRsZShjb25zdCBOYXRpdmVIYW5kbGUmIGluX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbl9hdkRhdGFJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPnJlbGVhc2VBdkhhbmRsZShpbl9oYW5kbGUsIGluX2F2RGF0YUlkKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzLmlzT2soKSkgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gbUZpbHRlci0+c3RvcCgpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gcmVzOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Zmx1c2goKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmZsdXNoKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjbG9zZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhTVEFUVVNfSU5BQ0NFU1NJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUdW5lclNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5yZW1vdmVTaGFyZWRGaWx0ZXIodGhpcy0+cmVmPFR1bmVyRmlsdGVyPigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9haWRsX3JldHVybiA9IE5VTEw7CisgICAgICAgICAgICAvLyBDYWxsaW5nIGZyb20gc2hhcmVkIHByb2Nlc3MsIGRvIG5vdCByZWFsbHkgY2xvc2UgdGhpcyBmaWx0ZXIuCisgICAgICAgICAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5kZXRhY2hDYWxsYmFja3MoKTsKKyAgICB9CisgICAgYXV0byByZXMgPSBtRmlsdGVyLT5jbG9zZSgpOworICAgIG1GaWx0ZXIgPSBudWxscHRyOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNoYXJlZCA9IGZhbHNlOworICAgIG1DbGllbnRQaWQgPSAtMTsKKworICAgIHJldHVybiByZXM7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6cmVsZWFzZUF2SGFuZGxlKAotICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSYgaGFuZGxlLCBpbnQ2NF90IGF2RGF0YUlkKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6YWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnJlbGVhc2VBdkhhbmRsZShoaWRsX2hhbmRsZShtYWtlRnJvbUFpZGwoaGFuZGxlKSksIGF2RGF0YUlkKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgaWYgKG1TaGFyZWQgfHwgbVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0QoImNyZWF0ZSBTaGFyZWRGaWx0ZXIgaW4gd3Jvbmcgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBtQ2xpZW50UGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgc3RyaW5nIHRva2VuID0gVHVuZXJTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+YWRkRmlsdGVyVG9TaGFyZWQodGhpcy0+cmVmPFR1bmVyRmlsdGVyPigpKTsKKyAgICBfYWlkbF9yZXR1cm4tPmFzc2lnbih0b2tlbik7CisgICAgbVNoYXJlZCA9IHRydWU7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6c3RhcnQoKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6ZnJlZVNoYXJlZEZpbHRlclRva2VuKGNvbnN0IHN0cmluZyYgLyogaW5fZmlsdGVyVG9rZW4gKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9Ci0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnN0YXJ0KCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworCisgICAgaWYgKCFtU2hhcmVkKSB7CisgICAgICAgIC8vIFRoZSBmaWx0ZXIgaXMgbm90IHNoYXJlZCBvciB0aGUgc2hhcmVkIGZpbHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPnNlbmRTaGFyZWRGaWx0ZXJTdGF0dXMoU1RBVFVTX0lOQUNDRVNTSUJMRSk7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKTsKKyAgICB9CisKKyAgICBUdW5lclNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5yZW1vdmVTaGFyZWRGaWx0ZXIodGhpcy0+cmVmPFR1bmVyRmlsdGVyPigpKTsKKyAgICBtU2hhcmVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6c3RvcCgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRGaWx0ZXJUeXBlKERlbXV4RmlsdGVyVHlwZSogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5zdG9wKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgKl9haWRsX3JldHVybiA9IG1UeXBlOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpmbHVzaCgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpzZXREZWxheUhpbnQoY29uc3QgRmlsdGVyRGVsYXlIaW50JiBpbl9oaW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5mbHVzaCgpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIHJldHVybiBtRmlsdGVyLT5zZXREZWxheUhpbnQoaW5faGludCk7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNsb3NlKCk7Ci0gICAgbUZpbHRlciA9IE5VTEw7Ci0gICAgbUZpbHRlcl8xXzEgPSBOVUxMOwotCi0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworYm9vbCBUdW5lckZpbHRlcjo6aXNTaGFyZWRGaWx0ZXJBbGxvd2VkKGludCBjYWxsaW5nUGlkKSB7CisgICAgcmV0dXJuIG1TaGFyZWQgJiYgbUNsaWVudFBpZCAhPSBjYWxsaW5nUGlkOwogfQogCi1zcDxJRmlsdGVyPiBUdW5lckZpbHRlcjo6Z2V0SGFsRmlsdGVyKCkgewordm9pZCBUdW5lckZpbHRlcjo6YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKSB7CisgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soaW5fY2IpOworICAgIH0KK30KKworc2hhcmVkX3B0cjxJRmlsdGVyPiBUdW5lckZpbHRlcjo6Z2V0SGFsRmlsdGVyKCkgewogICAgIHJldHVybiBtRmlsdGVyOwogfQogCi1ib29sIFR1bmVyRmlsdGVyOjppc0F1ZGlvRmlsdGVyKCkgewotICAgIHJldHVybiAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFMKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eFRzRmlsdGVyVHlwZTo6QVVESU8pCi0gICAgICAgICAgICB8fCAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUAotICAgICAgICAgICAgICAgICAgICAmJiBtU3ViVHlwZSA9PSAoaW50KURlbXV4TW10cEZpbHRlclR5cGU6OkFVRElPKTsKLX0KLQotYm9vbCBUdW5lckZpbHRlcjo6aXNWaWRlb0ZpbHRlcigpIHsKLSAgICByZXR1cm4gKG1NYWluVHlwZSA9PSAoaW50KURlbXV4RmlsdGVyTWFpblR5cGU6OlRTCi0gICAgICAgICAgICAgICAgICAgICYmIG1TdWJUeXBlID09IChpbnQpRGVtdXhUc0ZpbHRlclR5cGU6OlZJREVPKQotICAgICAgICAgICAgfHwgKG1NYWluVHlwZSA9PSAoaW50KURlbXV4RmlsdGVyTWFpblR5cGU6Ok1NVFAKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eE1tdHBGaWx0ZXJUeXBlOjpWSURFTyk7Ci19Ci0KLWJvb2wgVHVuZXJGaWx0ZXI6OmdldEhpZGxBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSwgQXZTdHJlYW1UeXBlJiB0eXBlKSB7Ci0gICAgaWYgKGlzQXVkaW9GaWx0ZXIoKSkgewotICAgICAgICB0eXBlLmF1ZGlvKHN0YXRpY19jYXN0PEF1ZGlvU3RyZWFtVHlwZT4oYXZTdHJlYW1UeXBlKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChpc1ZpZGVvRmlsdGVyKCkpIHsKLSAgICAgICAgdHlwZS52aWRlbyhzdGF0aWNfY2FzdDxWaWRlb1N0cmVhbVR5cGU+KGF2U3RyZWFtVHlwZSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIC8vLy8vLy8vLy8vLy8vLyBGaWx0ZXJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1SZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIHsKLSAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJTdGF0dXMoKGludClzdGF0dXMpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyU3RhdHVzKHN0YXR1cyk7CiAgICAgfQotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1SZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50KGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50KSB7Ci0gICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBlbXB0eUV2ZW50c0V4dDsKLSAgICBEZW11eEZpbHRlckV2ZW50RXh0IGVtcHR5RmlsdGVyRXZlbnRFeHQgewotICAgICAgICAgICAgLmV2ZW50cyA9IGVtcHR5RXZlbnRzRXh0LAotICAgIH07Ci0gICAgb25GaWx0ZXJFdmVudF8xXzEoZmlsdGVyRXZlbnQsIGVtcHR5RmlsdGVyRXZlbnRFeHQpOwotICAgIHJldHVybiBWb2lkKCk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgZXZlbnRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlckV2ZW50KGV2ZW50cyk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6b25GaWx0ZXJFdmVudF8xXzEoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQsCi0gICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnRFeHQmIGZpbHRlckV2ZW50RXh0KSB7Ci0gICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiBldmVudHMgPSBmaWx0ZXJFdmVudC5ldmVudHM7Ci0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4gZXZlbnRzRXh0ID0gZmlsdGVyRXZlbnRFeHQuZXZlbnRzOwotICAgICAgICB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4gdHVuZXJFdmVudDsKLQotICAgICAgICBnZXRBaWRsRmlsdGVyRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnQpOwotICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJFdmVudCh0dW5lckV2ZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vIEZpbHRlckNhbGxiYWNrIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRBaWRsRmlsdGVyRXZlbnQodmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgdHVuZXJFdmVudCkgewotICAgIGlmIChldmVudHMuZW1wdHkoKSAmJiAhZXZlbnRzRXh0LmVtcHR5KCkpIHsKLSAgICAgICAgYXV0byBldmVudEV4dCA9IGV2ZW50c0V4dFswXTsKLSAgICAgICAgc3dpdGNoIChldmVudEV4dC5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9uaXRvckV2ZW50OiB7Ci0gICAgICAgICAgICAgICAgZ2V0TW9uaXRvckV2ZW50KGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzdGFydElkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0UmVzdGFydEV2ZW50KGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWV2ZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8gZXZlbnQgPSBldmVudHNbMF07Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1lZGlhOiB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVkaWFFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICAgICAgZ2V0U2VjdGlvbkV2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBlczogewotICAgICAgICAgICAgICAgIGdldFBlc0V2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzUmVjb3JkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0VHNSZWNvcmRFdmVudChldmVudHMsIGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1tdHBSZWNvcmQ6IHsKLSAgICAgICAgICAgICAgICBnZXRNbXRwUmVjb3JkRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkb3dubG9hZDogewotICAgICAgICAgICAgICAgIGdldERvd25sb2FkRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXBQYXlsb2FkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0SXBQYXlsb2FkRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dGVtaTogewotICAgICAgICAgICAgICAgIGdldFRlbWlFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtT3JpZ2luYWxDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlclN0YXR1cyhzdGF0aWNfY2FzdDxEZW11eEZpbHRlclN0YXR1cz4oc3RhdHVzKSk7CiAgICAgfQogfQogCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TWVkaWFFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlck1lZGlhRXZlbnQgbWVkaWFFdmVudCA9IGUubWVkaWEoKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJNZWRpYUV2ZW50IHR1bmVyTWVkaWE7Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG1UdW5lckZpbHRlckNhbGxiYWNrOworICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gaW5fY2I7Cit9CiAKLSAgICAgICAgdHVuZXJNZWRpYS5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihtZWRpYUV2ZW50LnN0cmVhbUlkKTsKLSAgICAgICAgdHVuZXJNZWRpYS5pc1B0c1ByZXNlbnQgPSBtZWRpYUV2ZW50LmlzUHRzUHJlc2VudDsKLSAgICAgICAgdHVuZXJNZWRpYS5wdHMgPSBzdGF0aWNfY2FzdDxsb25nPihtZWRpYUV2ZW50LnB0cyk7Ci0gICAgICAgIHR1bmVyTWVkaWEuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4obWVkaWFFdmVudC5kYXRhTGVuZ3RoKTsKLSAgICAgICAgdHVuZXJNZWRpYS5vZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KG1lZGlhRXZlbnQub2Zmc2V0KTsKLSAgICAgICAgdHVuZXJNZWRpYS5pc1NlY3VyZU1lbW9yeSA9IG1lZGlhRXZlbnQuaXNTZWN1cmVNZW1vcnk7Ci0gICAgICAgIHR1bmVyTWVkaWEuYXZEYXRhSWQgPSBzdGF0aWNfY2FzdDxsb25nPihtZWRpYUV2ZW50LmF2RGF0YUlkKTsKLSAgICAgICAgdHVuZXJNZWRpYS5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludD4obWVkaWFFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7Ci0gICAgICAgIHR1bmVyTWVkaWEuaXNQZXNQcml2YXRlRGF0YSA9IG1lZGlhRXZlbnQuaXNQZXNQcml2YXRlRGF0YTsKLQotICAgICAgICBpZiAobWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQotICAgICAgICAgICAgICAgIERlbXV4RmlsdGVyTWVkaWFFdmVudDo6RXh0cmFNZXRhRGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjphdWRpbykgewotICAgICAgICAgICAgdHVuZXJNZWRpYS5pc0F1ZGlvRXh0cmFNZXRhRGF0YSA9IHRydWU7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmF1ZGlvID0gewotICAgICAgICAgICAgICAgIC5hZEZhZGUgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRGYWRlKSwKLSAgICAgICAgICAgICAgICAuYWRQYW4gPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRQYW4pLAotICAgICAgICAgICAgICAgIC52ZXJzaW9uVGV4dFRhZyA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS52ZXJzaW9uVGV4dFRhZyksCi0gICAgICAgICAgICAgICAgLmFkR2FpbkNlbnRlciA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5DZW50ZXIpLAotICAgICAgICAgICAgICAgIC5hZEdhaW5Gcm9udCA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5Gcm9udCksCi0gICAgICAgICAgICAgICAgLmFkR2FpblN1cnJvdW5kID0gc3RhdGljX2Nhc3Q8aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpblN1cnJvdW5kKSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmlzQXVkaW9FeHRyYU1ldGFEYXRhID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVkaWFFdmVudC5hdk1lbW9yeS5nZXROYXRpdmVIYW5kbGUoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmF2TWVtb3J5ID0gZHVwVG9BaWRsKG1lZGlhRXZlbnQuYXZNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50OjptZWRpYT4obW92ZSh0dW5lck1lZGlhKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyICYmIG1PcmlnaW5hbENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBtT3JpZ2luYWxDYWxsYmFjazsKKyAgICAgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBudWxscHRyOwogICAgIH0KIH0KIAotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFNlY3Rpb25FdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlclNlY3Rpb25FdmVudCBzZWN0aW9uRXZlbnQgPSBlLnNlY3Rpb24oKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQgdHVuZXJTZWN0aW9uOwotCi0gICAgICAgIHR1bmVyU2VjdGlvbi50YWJsZUlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC50YWJsZUlkKTsKLSAgICAgICAgdHVuZXJTZWN0aW9uLnZlcnNpb24gPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oc2VjdGlvbkV2ZW50LnZlcnNpb24pOwotICAgICAgICB0dW5lclNlY3Rpb24uc2VjdGlvbk51bSA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihzZWN0aW9uRXZlbnQuc2VjdGlvbk51bSk7Ci0gICAgICAgIHR1bmVyU2VjdGlvbi5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoKTsKLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnNlY3Rpb24+KG1vdmUodHVuZXJTZWN0aW9uKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQordm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmRldGFjaENhbGxiYWNrcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBudWxscHRyOworICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gbnVsbHB0cjsKIH0KIAotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFBlc0V2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyUGVzRXZlbnQgcGVzRXZlbnQgPSBlLnBlcygpOwotICAgICAgICBUdW5lckZpbHRlclBlc0V2ZW50IHR1bmVyUGVzOwotCi0gICAgICAgIHR1bmVyUGVzLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHBlc0V2ZW50LnN0cmVhbUlkKTsKLSAgICAgICAgdHVuZXJQZXMuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihwZXNFdmVudC5kYXRhTGVuZ3RoKTsKLSAgICAgICAgdHVuZXJQZXMubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KHBlc0V2ZW50Lm1wdVNlcXVlbmNlTnVtYmVyKTsKLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnBlcz4obW92ZSh0dW5lclBlcykpOwotICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotICAgIH0KLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFRzUmVjb3JkRXZlbnQodmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50IHR1bmVyVHNSZWNvcmQ7Ci0gICAgICAgIERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudCB0c1JlY29yZEV2ZW50ID0gZXZlbnRzW2ldLnRzUmVjb3JkKCk7Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJTY0luZGV4TWFzayBzY0luZGV4TWFzazsKLSAgICAgICAgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpCi0gICAgICAgICAgICAgICAgPT0gRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzYykgewotICAgICAgICAgICAgc2NJbmRleE1hc2suc2V0PFR1bmVyRmlsdGVyU2NJbmRleE1hc2s6OnNjPigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLnNjKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLmdldERpc2NyaW1pbmF0b3IoKQotICAgICAgICAgICAgICAgID09IERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDo6U2NJbmRleE1hc2s6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NIZXZjKSB7Ci0gICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLnNjSGV2YygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHNSZWNvcmRFdmVudC5waWQuZ2V0RGlzY3JpbWluYXRvcigpID09IERlbXV4UGlkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRQaWQpIHsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQucGlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHRzUmVjb3JkRXZlbnQucGlkLnRQaWQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0dW5lclRzUmVjb3JkLnBpZCA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihDb25zdGFudDo6SU5WQUxJRF9UU19QSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHVuZXJUc1JlY29yZC5zY0luZGV4TWFzayA9IHNjSW5kZXhNYXNrOwotICAgICAgICB0dW5lclRzUmVjb3JkLnRzSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50Pih0c1JlY29yZEV2ZW50LnRzSW5kZXhNYXNrKTsKLSAgICAgICAgdHVuZXJUc1JlY29yZC5ieXRlTnVtYmVyID0gc3RhdGljX2Nhc3Q8bG9uZz4odHNSZWNvcmRFdmVudC5ieXRlTnVtYmVyKTsKLQotICAgICAgICBpZiAoZXZlbnRzRXh0LnNpemUoKSA+IGkgJiYgZXZlbnRzRXh0W2ldLmdldERpc2NyaW1pbmF0b3IoKSA9PQotICAgICAgICAgICAgICAgICAgICBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c1JlY29yZCkgewotICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5pc0V4dGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4oZXZlbnRzRXh0W2ldLnRzUmVjb3JkKCkucHRzKTsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQuZmlyc3RNYkluU2xpY2UgPSBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFtpXS50c1JlY29yZCgpLmZpcnN0TWJJblNsaWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQuaXNFeHRlbmRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50Ojp0c1JlY29yZD4obW92ZSh0dW5lclRzUmVjb3JkKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TW10cFJlY29yZEV2ZW50KHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50IHR1bmVyTW10cFJlY29yZDsKLSAgICAgICAgRGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgbW10cFJlY29yZEV2ZW50ID0gZXZlbnRzW2ldLm1tdHBSZWNvcmQoKTsKLQotICAgICAgICB0dW5lck1tdHBSZWNvcmQuc2NIZXZjSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50PihtbXRwUmVjb3JkRXZlbnQuc2NIZXZjSW5kZXhNYXNrKTsKLSAgICAgICAgdHVuZXJNbXRwUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxsb25nPihtbXRwUmVjb3JkRXZlbnQuYnl0ZU51bWJlcik7Ci0KLSAgICAgICAgaWYgKGV2ZW50c0V4dC5zaXplKCkgPiBpICYmIGV2ZW50c0V4dFtpXS5nZXREaXNjcmltaW5hdG9yKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW10cFJlY29yZCkgewotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLmlzRXh0ZW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLnB0cyA9IHN0YXRpY19jYXN0PGxvbmc+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkucHRzKTsKLSAgICAgICAgICAgIHR1bmVyTW10cFJlY29yZC5tcHVTZXF1ZW5jZU51bWJlciA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5tcHVTZXF1ZW5jZU51bWJlcik7Ci0gICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQuZmlyc3RNYkluU2xpY2UgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkuZmlyc3RNYkluU2xpY2UpOwotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLnRzSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLnRzSW5kZXhNYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR1bmVyTW10cFJlY29yZC5pc0V4dGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6Om1tdHBSZWNvcmQ+KG1vdmUodHVuZXJNbXRwUmVjb3JkKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0RG93bmxvYWRFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWRFdmVudCA9IGUuZG93bmxvYWQoKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50IHR1bmVyRG93bmxvYWQ7Ci0KLSAgICAgICAgdHVuZXJEb3dubG9hZC5pdGVtSWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRvd25sb2FkRXZlbnQuaXRlbUlkKTsKLSAgICAgICAgdHVuZXJEb3dubG9hZC5pdGVtRnJhZ21lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5pdGVtRnJhZ21lbnRJbmRleCk7Ci0gICAgICAgIHR1bmVyRG93bmxvYWQubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KGRvd25sb2FkRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOwotICAgICAgICB0dW5lckRvd25sb2FkLmxhc3RJdGVtRnJhZ21lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5sYXN0SXRlbUZyYWdtZW50SW5kZXgpOwotICAgICAgICB0dW5lckRvd25sb2FkLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oZG93bmxvYWRFdmVudC5kYXRhTGVuZ3RoKTsKLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OmRvd25sb2FkPihtb3ZlKHR1bmVyRG93bmxvYWQpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRJcFBheWxvYWRFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50IGlwUGF5bG9hZEV2ZW50ID0gZS5pcFBheWxvYWQoKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudCB0dW5lcklwUGF5bG9hZDsKLQotICAgICAgICB0dW5lcklwUGF5bG9hZC5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KGlwUGF5bG9hZEV2ZW50LmRhdGFMZW5ndGgpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6aXBQYXlsb2FkPihtb3ZlKHR1bmVySXBQYXlsb2FkKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0VGVtaUV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyVGVtaUV2ZW50IHRlbWlFdmVudCA9IGUudGVtaSgpOwotICAgICAgICBUdW5lckZpbHRlclRlbWlFdmVudCB0dW5lclRlbWk7Ci0KLSAgICAgICAgdHVuZXJUZW1pLnB0cyA9IHN0YXRpY19jYXN0PGxvbmc+KHRlbWlFdmVudC5wdHMpOwotICAgICAgICB0dW5lclRlbWkuZGVzY3JUYWcgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHRlbWlFdmVudC5kZXNjclRhZyk7Ci0gICAgICAgIHZlY3Rvcjx1aW50OF90PiBkZXNjckRhdGEgPSB0ZW1pRXZlbnQuZGVzY3JEYXRhOwotICAgICAgICB0dW5lclRlbWkuZGVzY3JEYXRhLnJlc2l6ZShkZXNjckRhdGEuc2l6ZSgpKTsKLSAgICAgICAgY29weShkZXNjckRhdGEuYmVnaW4oKSwgZGVzY3JEYXRhLmVuZCgpLCB0dW5lclRlbWkuZGVzY3JEYXRhLmJlZ2luKCkpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6dGVtaT4obW92ZSh0dW5lclRlbWkpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNb25pdG9yRXZlbnQoCi0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKLSAgICBEZW11eEZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yRXZlbnQgPSBldmVudHNFeHRbMF0ubW9uaXRvckV2ZW50KCk7Ci0gICAgVHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQgdHVuZXJNb25pdG9yOwotCi0gICAgc3dpdGNoIChtb25pdG9yRXZlbnQuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NyYW1ibGluZ1N0YXR1czogewotICAgICAgICAgICAgdHVuZXJNb25pdG9yLnNldDxUdW5lckZpbHRlck1vbml0b3JFdmVudDo6c2NyYW1ibGluZ1N0YXR1cz4oCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obW9uaXRvckV2ZW50LnNjcmFtYmxpbmdTdGF0dXMoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1vbml0b3JFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpjaWQ6IHsKLSAgICAgICAgICAgIHR1bmVyTW9uaXRvci5zZXQ8VHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQ6OmNpZD4oc3RhdGljX2Nhc3Q8aW50Pihtb25pdG9yRXZlbnQuY2lkKCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6Om1vbml0b3I+KG1vdmUodHVuZXJNb25pdG9yKSk7Ci0gICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFJlc3RhcnRFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50OjpzdGFydElkPihzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFswXS5zdGFydElkKCkpKTsKLSAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotfQorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuaAppbmRleCBmZjQ3MjhjLi45M2Q4ODk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmgKQEAgLTE3LDE3NiArMTcsMTA4IEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRklMVEVSX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9BdlN0cmVhbVR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQm5GaWx0ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckV2ZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJUeXBlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0ZpbHRlckRlbGF5SGludC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRmlsdGVyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJGaWx0ZXIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRmlsdGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZpbHRlckNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGZtcS9Db252ZXJ0TVFEZXNjcmlwdG9ycy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkF2U3RyZWFtVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6Qm5GaWx0ZXJDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RmlsdGVyRGVsYXlIaW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRmlsdGVyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJEZW11eElwQWRkcmVzczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlckRvd25sb2FkRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyTWVkaWFFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclBlc0V2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNjSW5kZXhNYXNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNlY3Rpb25FdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclRlbWlFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEFscEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckF2U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRG93bmxvYWRFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1lZGlhRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJQZXNFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZWN0aW9uRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUZW1pRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhJcEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFBpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZpbHRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6QXZTdHJlYW1UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlckV2ZW50RXh0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlck1vbml0b3JFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50RXh0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwogCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLXVzaW5nIE1RRGVzYyA9IE1RRGVzY3JpcHRvclN5bmM8dWludDhfdD47CiB1c2luZyBBaWRsTVFEZXNjID0gTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKIAotY29uc3Qgc3RhdGljIGludCBJUF9WNF9MRU5HVEggPSA0OwotY29uc3Qgc3RhdGljIGludCBJUF9WNl9MRU5HVEggPSAxNjsKLQogY2xhc3MgVHVuZXJGaWx0ZXIgOiBwdWJsaWMgQm5UdW5lckZpbHRlciB7CiAKIHB1YmxpYzoKLSAgICBUdW5lckZpbHRlcihzcDxJRmlsdGVyPiBmaWx0ZXIsIGludCBtYWluVHlwZSwgaW50IHN1YlR5cCk7Ci0gICAgdmlydHVhbCB+VHVuZXJGaWx0ZXIoKTsKLSAgICBTdGF0dXMgZ2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0SWQ2NEJpdChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlKGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlTW9uaXRvckV2ZW50KGludCBtb25pdG9yRXZlbnRUeXBlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlSXBGaWx0ZXJDb250ZXh0SWQoaW50IGNpZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbnQgYXZTdHJlYW1UeXBlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0QXZTaGFyZWRIYW5kbGVJbmZvKFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgcmVsZWFzZUF2SGFuZGxlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlJiBoYW5kbGUsCi0gICAgICAgICAgICBpbnQ2NF90IGF2RGF0YUlkKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0RGF0YVNvdXJjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwotICAgIHNwPElGaWx0ZXI+IGdldEhhbEZpbHRlcigpOworICAgIGNsYXNzIEZpbHRlckNhbGxiYWNrIDogcHVibGljIEJuRmlsdGVyQ2FsbGJhY2sgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIHR1bmVyRmlsdGVyQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyRmlsdGVyQ2FsbGJhY2sodHVuZXJGaWx0ZXJDYWxsYmFjayksIG1PcmlnaW5hbENhbGxiYWNrKG51bGxwdHIpe307CiAKLSAgICBzdHJ1Y3QgRmlsdGVyQ2FsbGJhY2sgOiBwdWJsaWMgSUZpbHRlckNhbGxiYWNrIHsKLSAgICAgICAgRmlsdGVyQ2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiB0dW5lckZpbHRlckNhbGxiYWNrKQotICAgICAgICAgICAgICAgIDogbVR1bmVyRmlsdGVyQ2FsbGJhY2sodHVuZXJGaWx0ZXJDYWxsYmFjaykge307CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRmlsdGVyRXZlbnQoY29uc3QgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBldmVudHMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyRXZlbnQoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpOwotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50XzFfMShjb25zdCBEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCwKLSAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50RXh0JiBmaWx0ZXJFdmVudEV4dCk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyU3RhdHVzKERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cyk7CisgICAgICAgIHZvaWQgc2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisgICAgICAgIHZvaWQgYXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKTsKKyAgICAgICAgdm9pZCBkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgICAgICB2b2lkIGRldGFjaENhbGxiYWNrcygpOwogCi0gICAgICAgIHZvaWQgZ2V0QWlkbEZpbHRlckV2ZW50KHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiB0dW5lckV2ZW50KTsKLQotICAgICAgICB2b2lkIGdldE1lZGlhRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldFNlY3Rpb25FdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0UGVzRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldFRzUmVjb3JkRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0TW10cFJlY29yZEV2ZW50KAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldERvd25sb2FkRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldElwUGF5bG9hZEV2ZW50KAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLSAgICAgICAgdm9pZCBnZXRUZW1pRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldE1vbml0b3JFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLSAgICAgICAgdm9pZCBnZXRSZXN0YXJ0RXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0KLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICBwcml2YXRlOgorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4gbU9yaWdpbmFsQ2FsbGJhY2s7CisgICAgICAgIE11dGV4IG1DYWxsYmFja0xvY2s7CiAgICAgfTsKIAorICAgIFR1bmVyRmlsdGVyKHNoYXJlZF9wdHI8SUZpbHRlcj4gZmlsdGVyLCBzaGFyZWRfcHRyPEZpbHRlckNhbGxiYWNrPiBjYiwgRGVtdXhGaWx0ZXJUeXBlIHR5cGUpOworICAgIHZpcnR1YWwgflR1bmVyRmlsdGVyKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmUoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQzMl90IGluX21vbml0b3JFdmVudFR5cGVzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQzMl90IGluX2NpZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlQXZTdHJlYW1UeXBlKGNvbnN0IEF2U3RyZWFtVHlwZSYgaW5fYXZTdHJlYW1UeXBlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRBdlNoYXJlZEhhbmRsZShOYXRpdmVIYW5kbGUqIG91dF9hdk1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbGVhc2VBdkhhbmRsZShjb25zdCBOYXRpdmVIYW5kbGUmIGluX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbl9hdkRhdGFJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdG9wKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGFjcXVpcmVTaGFyZWRGaWx0ZXJUb2tlbihzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZnJlZVNoYXJlZEZpbHRlclRva2VuKGNvbnN0IHN0cmluZyYgaW5fZmlsdGVyVG9rZW4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZpbHRlclR5cGUoRGVtdXhGaWx0ZXJUeXBlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldERlbGF5SGludChjb25zdCBGaWx0ZXJEZWxheUhpbnQmIGluX2hpbnQpIG92ZXJyaWRlOworCisgICAgYm9vbCBpc1NoYXJlZEZpbHRlckFsbG93ZWQoaW50MzJfdCBwaWQpOworICAgIHZvaWQgYXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGdldEhhbEZpbHRlcigpOworCiBwcml2YXRlOgotICAgIERlbXV4RmlsdGVyQXZTZXR0aW5ncyBnZXRBdlNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBnZXRTZWN0aW9uU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIGdldFBlc0RhdGFTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBnZXRSZWNvcmRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgRGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzIGdldERvd25sb2FkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotCi0gICAgYm9vbCBpc0F1ZGlvRmlsdGVyKCk7Ci0gICAgYm9vbCBpc1ZpZGVvRmlsdGVyKCk7Ci0gICAgYm9vbCBnZXRIaWRsQXZTdHJlYW1UeXBlKGludCBhdlN0cmVhbVR5cGUsIEF2U3RyZWFtVHlwZSYgdHlwZSk7Ci0KLSAgICB2b2lkIGdldEhpZGxUc1NldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbE1tdHBTZXR0aW5ncygKLSAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICB2b2lkIGdldEhpZGxJcFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbFRsdlNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbEFscFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotCi0gICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGdldElwVjRBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcik7Ci0gICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNl9MRU5HVEg+IGdldElwVjZBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcik7Ci0KLSAgICBzcDxJRmlsdGVyPiBtRmlsdGVyOwotICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZpbHRlcj4gbUZpbHRlcl8xXzE7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyPiBtRmlsdGVyOwogICAgIGludDMyX3QgbUlkOwogICAgIGludDY0X3QgbUlkNjRCaXQ7Ci0gICAgaW50IG1NYWluVHlwZTsKLSAgICBpbnQgbVN1YlR5cGU7CisgICAgRGVtdXhGaWx0ZXJUeXBlIG1UeXBlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU2hhcmVkOworICAgIGludDMyX3QgbUNsaWVudFBpZDsKKyAgICBzaGFyZWRfcHRyPEZpbHRlckNhbGxiYWNrPiBtRmlsdGVyQ2FsbGJhY2s7CisgICAgTXV0ZXggbUxvY2s7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcAppbmRleCA3NGI1NTE5Li41MTE2MzA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMDgxICsxNCwyMDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJGcm9udGVuZCIKIAogI2luY2x1ZGUgIlR1bmVyRnJvbnRlbmQuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKwogI2luY2x1ZGUgIlR1bmVyTG5iLmgiCiAKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2NNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQ29kZVJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNEZW1vZE91dHB1dEZvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY0FubmV4OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNPdXRlckZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1BpbG90OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNSb2xsb2ZmOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzU3RhbmRhcmQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1ZjbU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0Q29kZXJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEhpZXJhcmNoeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0UGxwTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFN0YW5kYXJkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElubmVyRmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM0NvZGVyYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzUm9sbG9mZjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric0NvZGVyYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1JvbGxvZmY7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidEJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidENvZGVyYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kTW9kdWxhdGlvblN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFN0YXR1c1R5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRBbmFsb2dBZnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJjQmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJCYW5kd2lkdGg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkNvZGVSYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJHdWFyZEludGVydmFsOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZic1NjYW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEd1YXJkSW50ZXJ2YWw7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRSb2xsT2ZmOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLVR1bmVyRnJvbnRlbmQ6OlR1bmVyRnJvbnRlbmQoc3A8SUZyb250ZW5kPiBmcm9udGVuZCwgaW50IGlkKSB7CitUdW5lckZyb250ZW5kOjpUdW5lckZyb250ZW5kKHNoYXJlZF9wdHI8SUZyb250ZW5kPiBmcm9udGVuZCwgaW50IGlkKSB7CiAgICAgbUZyb250ZW5kID0gZnJvbnRlbmQ7Ci0gICAgbUZyb250ZW5kXzFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kOjpjYXN0RnJvbShtRnJvbnRlbmQpOwogICAgIG1JZCA9IGlkOwogfQogCiBUdW5lckZyb250ZW5kOjp+VHVuZXJGcm9udGVuZCgpIHsKLSAgICBtRnJvbnRlbmQgPSBOVUxMOwotICAgIG1Gcm9udGVuZF8xXzEgPSBOVUxMOworICAgIG1Gcm9udGVuZCA9IG51bGxwdHI7CiAgICAgbUlkID0gLTE7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRDYWxsYmFjaygKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldENhbGxiYWNrKAogICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiB0dW5lckZyb250ZW5kQ2FsbGJhY2spIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIGlmICh0dW5lckZyb250ZW5kQ2FsbGJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgaWYgKHR1bmVyRnJvbnRlbmRDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIHNwPElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0gbmV3IEZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKTsKLSAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zZXRDYWxsYmFjayhmcm9udGVuZENhbGxiYWNrKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICBzaGFyZWRfcHRyPElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEZyb250ZW5kQ2FsbGJhY2s+KHR1bmVyRnJvbnRlbmRDYWxsYmFjayk7CisgICAgcmV0dXJuIG1Gcm9udGVuZC0+c2V0Q2FsbGJhY2soZnJvbnRlbmRDYWxsYmFjayk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjp0dW5lKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnR1bmUoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzID0gZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MpOwotICAgIGlmIChzZXR0aW5ncy5pc0V4dGVuZGVkKSB7Ci0gICAgICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICAgICAgfQotICAgICAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChzZXR0aW5ncyk7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnR1bmVfMV8xKGZyb250ZW5kU2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3NFeHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZC0+dHVuZShmcm9udGVuZFNldHRpbmdzKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT50dW5lKHNldHRpbmdzKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BUdW5lKCkgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6c3RvcFR1bmUoKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zdG9wVHVuZSgpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnN0b3BUdW5lKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzY2FuKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBmcm9udGVuZFNjYW5UeXBlKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpzY2FuKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5UeXBlIGZyb250ZW5kU2NhblR5cGUpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzID0gZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MpOwotICAgIGlmIChzZXR0aW5ncy5pc0V4dGVuZGVkKSB7Ci0gICAgICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICAgICAgfQotICAgICAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChzZXR0aW5ncyk7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnNjYW5fMV8xKGZyb250ZW5kU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRTY2FuVHlwZT4oZnJvbnRlbmRTY2FuVHlwZSksIGZyb250ZW5kU2V0dGluZ3NFeHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZC0+c2NhbigKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLCBzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgcmV0dXJuIG1Gcm9udGVuZC0+c2NhbihzZXR0aW5ncywgZnJvbnRlbmRTY2FuVHlwZSk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzdG9wU2NhbigpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BTY2FuKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c3RvcFNjYW4oKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5zdG9wU2NhbigpOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6c2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgbG5iKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldExuYihzdGF0aWNfY2FzdDxUdW5lckxuYio+KGxuYi5nZXQoKSktPmdldElkKCkpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgaWYgKGxuYiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5zZXRMbmIoc3RhdGljX2Nhc3Q8VHVuZXJMbmIqPihsbmIuZ2V0KCkpLT5nZXRJZCgpKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldExuYShib29sIGJFbmFibGUpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBjaUNhbUlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldExuYShiRW5hYmxlKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5saW5rQ2lDYW0oY2lDYW1JZCwgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50IGNpQ2FtSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0QoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgaW50IGx0c0lkOwotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgbUZyb250ZW5kXzFfMS0+bGlua0NpQ2FtKHN0YXRpY19jYXN0PHVpbnQzMl90PihjaUNhbUlkKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgaWQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSByOwotICAgICAgICAgICAgICAgIGx0c0lkID0gaWQ7Ci0gICAgICAgICAgICB9KTsKLQotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSBsdHNJZDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci19Ci0KLVN0YXR1cyBUdW5lckZyb250ZW5kOjp1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50IGNpQ2FtSWQpIHsKLSAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmRfMV8xLT51bmxpbmtDaUNhbShjaUNhbUlkKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLX0KLQotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmNsb3NlKCkgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6dW5saW5rQ2lDYW1Ub0Zyb250ZW5kKGludDMyX3QgY2lDYW1JZCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+Y2xvc2UoKTsKLSAgICBtRnJvbnRlbmQgPSBOVUxMOwotICAgIG1Gcm9udGVuZF8xXzEgPSBOVUxMOwotCi0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnVubGlua0NpQ2FtKGNpQ2FtSWQpOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCi0gICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpjbG9zZSgpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXM7Ci0gICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiBzdGF0dXM7Ci0gICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZT4gdHlwZXM7Ci0gICAgZm9yIChhdXRvIHMgOiBzdGF0dXNUeXBlcykgewotICAgICAgICB0eXBlcy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRTdGF0dXNUeXBlPihzKSk7Ci0gICAgfQorICAgIGF1dG8gcmVzID0gbUZyb250ZW5kLT5jbG9zZSgpOworICAgIG1Gcm9udGVuZCA9IG51bGxwdHI7CiAKLSAgICBtRnJvbnRlbmQtPmdldFN0YXR1cyh0eXBlcywgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxGcm9udGVuZFN0YXR1cz4mIHMpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgc3RhdHVzID0gczsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotCi0gICAgZ2V0QWlkbEZyb250ZW5kU3RhdHVzKHN0YXR1cywgKl9haWRsX3JldHVybik7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gcmVzOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0U3RhdHVzRXh0ZW5kZWRfMV8xKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCi0gICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldFN0YXR1cyhjb25zdCB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzOwotICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4gc3RhdHVzOwotICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzE+IHR5cGVzOwotICAgIGZvciAoYXV0byBzIDogc3RhdHVzVHlwZXMpIHsKLSAgICAgICAgdHlwZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4ocykpOwotICAgIH0KLQotICAgIG1Gcm9udGVuZF8xXzEtPmdldFN0YXR1c0V4dDFfMSh0eXBlcywgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIHMpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgc3RhdHVzID0gczsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotCi0gICAgZ2V0QWlkbEZyb250ZW5kU3RhdHVzRXh0KHN0YXR1cywgKl9haWRsX3JldHVybik7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5nZXRTdGF0dXMoaW5fc3RhdHVzVHlwZXMsIF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRGcm9udGVuZElkKGludCogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRGcm9udGVuZElkKGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldEhhcmR3YXJlSW5mbyhzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZyb250ZW5kLT5nZXRIYXJkd2FyZUluZm8oX2FpZGxfcmV0dXJuKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6cmVtb3ZlT3V0cHV0UGlkKGludDMyX3QgaW5fcGlkKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZyb250ZW5kLT5yZW1vdmVPdXRwdXRQaWQoaW5fcGlkKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZT4mIGluX3N0YXR1c1R5cGVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1JlYWRpbmVzcz4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1Gcm9udGVuZC0+Z2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoaW5fc3RhdHVzVHlwZXMsIF9haWRsX3JldHVybik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLyBGcm9udGVuZENhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVJldHVybjx2b2lkPiBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKSB7Ci0gICAgQUxPR0QoIkZyb250ZW5kQ2FsbGJhY2s6Om9uRXZlbnQsIHR5cGU9JWQiLCBmcm9udGVuZEV2ZW50VHlwZSk7Ci0gICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25FdmVudCgoaW50KWZyb250ZW5kRXZlbnRUeXBlKTsKLSAgICByZXR1cm4gVm9pZCgpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25FdmVudChGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSkgeworICAgIEFMT0dWKCJGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50LCB0eXBlPSVkIiwgZnJvbnRlbmRFdmVudFR5cGUpOworICAgIGlmIChtVHVuZXJGcm9udGVuZENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25FdmVudChmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgfQorICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlKAorOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSgKICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSkgewotICAgIEFMT0dEKCJGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7Ci0gICAgVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIHNjYW5NZXNzYWdlOwotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkxPQ0tFRDogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNMb2NrZWQ+KG1lc3NhZ2UuaXNMb2NrZWQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpFTkQ6IHsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzRW5kPihtZXNzYWdlLmlzRW5kKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UFJPR1JFU1NfUEVSQ0VOVDogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6cHJvZ3Jlc3NQZXJjZW50PihtZXNzYWdlLnByb2dyZXNzUGVyY2VudCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkZSRVFVRU5DWTogewotICAgICAgICAgICAgYXV0byBmID0gbWVzc2FnZS5mcmVxdWVuY2llcygpOwotICAgICAgICAgICAgdmVjdG9yPGludD4gZnJlcXVlbmNpZXMoYmVnaW4oZiksIGVuZChmKSk7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpmcmVxdWVuY2llcz4oZnJlcXVlbmNpZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1lNQk9MX1JBVEU6IHsKLSAgICAgICAgICAgIGF1dG8gcyA9IG1lc3NhZ2Uuc3ltYm9sUmF0ZXMoKTsKLSAgICAgICAgICAgIHZlY3RvcjxpbnQ+IHN5bWJvbFJhdGVzKGJlZ2luKHMpLCBlbmQocykpOwotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6c3ltYm9sUmF0ZXM+KHN5bWJvbFJhdGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkhJRVJBUkNIWTogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aGllcmFyY2h5PigoaW50KW1lc3NhZ2UuaGllcmFyY2h5KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6QU5BTE9HX1RZUEU6IHsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmFuYWxvZ1R5cGU+KChpbnQpbWVzc2FnZS5hbmFsb2dUeXBlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UExQX0lEUzogewotICAgICAgICAgICAgYXV0byBwID0gbWVzc2FnZS5wbHBJZHMoKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBwbHBJZHMoYmVnaW4ocCksIGVuZChwKSk7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpwbHBJZHM+KHBscElkcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpHUk9VUF9JRFM6IHsKLSAgICAgICAgICAgIGF1dG8gZyA9IG1lc3NhZ2UuZ3JvdXBJZHMoKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBncm91cElkcyhiZWdpbihnKSwgZW5kKGcpKTsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6Omdyb3VwSWRzPihncm91cElkcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpJTlBVVF9TVFJFQU1fSURTOiB7Ci0gICAgICAgICAgICBhdXRvIGkgPSBtZXNzYWdlLmlucHV0U3RyZWFtSWRzKCk7Ci0gICAgICAgICAgICB2ZWN0b3I8Y2hhcjE2X3Q+IHN0cmVhbUlkcyhiZWdpbihpKSwgZW5kKGkpKTsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlucHV0U3RyZWFtSWRzPihzdHJlYW1JZHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1RBTkRBUkQ6IHsKLSAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkIHN0ZCA9IG1lc3NhZ2Uuc3RkKCk7Ci0gICAgICAgICAgICBpbnQgc3RhbmRhcmQ7Ci0gICAgICAgICAgICBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzU3RkKSB7Ci0gICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc1N0ZCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09Ci0gICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRTdGQpIHsKLSAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IChpbnQpIHN0ZC50U3RkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZC5nZXREaXNjcmltaW5hdG9yKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lmU3RkKSB7Ci0gICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc2lmU3RkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpzdGQ+KHN0YW5kYXJkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFUU0MzX1BMUF9JTkZPOiB7Ci0gICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiBwbHBJbmZvcyA9IG1lc3NhZ2UuYXRzYzNQbHBJbmZvcygpOwotICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiB0dW5lclBscEluZm9zOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHBJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9IHBscEluZm9zW2ldOwotICAgICAgICAgICAgICAgIGludDhfdCBwbHBJZCA9IChpbnQ4X3QpIGluZm8ucGxwSWQ7Ci0gICAgICAgICAgICAgICAgYm9vbCBsbHMgPSAoYm9vbCkgaW5mby5iTGxzRmxhZzsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbyBwbHBJbmZvewotICAgICAgICAgICAgICAgICAgICAucGxwSWQgPSBwbHBJZCwKLSAgICAgICAgICAgICAgICAgICAgLmxsc0ZsYWcgPSBsbHMsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0dW5lclBscEluZm9zLnB1c2hfYmFjayhwbHBJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmF0c2MzUGxwSW5mb3M+KHR1bmVyUGxwSW5mb3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgIEFMT0dWKCJGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7CisgICAgaWYgKG1UdW5lckZyb250ZW5kQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5NZXNzYWdlKHR5cGUsIG1lc3NhZ2UpOwogICAgIH0KLSAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5NZXNzYWdlKChpbnQpdHlwZSwgc2Nhbk1lc3NhZ2UpOwotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyRnJvbnRlbmQ6OkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2VFeHQxXzEoCi0gICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xIHR5cGUsIGNvbnN0IEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEmIG1lc3NhZ2UpIHsKLSAgICBBTE9HRCgib25TY2FuTWVzc2FnZUV4dDFfMTo6b25TY2FuTWVzc2FnZSwgdHlwZT0lZCIsIHR5cGUpOwotICAgIFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZSBzY2FuTWVzc2FnZTsKLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpNT0RVTEFUSU9OOiB7Ci0gICAgICAgICAgICBGcm9udGVuZE1vZHVsYXRpb24gbSA9IG1lc3NhZ2UubW9kdWxhdGlvbigpOwotICAgICAgICAgICAgaW50IG1vZHVsYXRpb247Ci0gICAgICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uZHZiYygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5kdmJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmR2YnMoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmlzZGJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uaXNkYnMzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5pc2RidCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5hdHNjKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5hdHNjMygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5kdG1iKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6bW9kdWxhdGlvbj4obW9kdWxhdGlvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpEVkJDX0FOTkVYOiB7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjphbm5leD4oKGludCltZXNzYWdlLmFubmV4KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTo6SElHSF9QUklPUklUWTogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNIaWdoUHJpb3JpdHk+KG1lc3NhZ2UuaXNIaWdoUHJpb3JpdHkoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2UoKGludCl0eXBlLCBzY2FuTWVzc2FnZSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vIFR1bmVyRnJvbnRlbmQgSGVscGVyIE1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBUdW5lckZyb250ZW5kOjpnZXRBaWRsRnJvbnRlbmRTdGF0dXMoCi0gICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4mIGhpZGxTdGF0dXMsIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cykgewotICAgIGZvciAoRnJvbnRlbmRTdGF0dXMgcyA6IGhpZGxTdGF0dXMpIHsKLSAgICAgICAgVHVuZXJGcm9udGVuZFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNEZW1vZExvY2tlZDogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNEZW1vZExvY2tlZD4ocy5pc0RlbW9kTG9ja2VkKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNucjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6c25yPigoaW50KXMuc25yKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmJlcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmVyPigoaW50KXMuYmVyKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBlcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cGVyPigoaW50KXMucGVyKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnByZUJlcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cHJlQmVyPigoaW50KXMucHJlQmVyKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNpZ25hbFF1YWxpdHk6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnNpZ25hbFF1YWxpdHk+KChpbnQpcy5zaWduYWxRdWFsaXR5KCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNpZ25hbFN0cmVuZ3RoOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzaWduYWxTdHJlbmd0aD4oKGludClzLnNpZ25hbFN0cmVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN5bWJvbFJhdGU6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnN5bWJvbFJhdGU+KChpbnQpcy5zeW1ib2xSYXRlKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlubmVyRmVjOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbm5lckZlYz4oKGxvbmcpcy5pbm5lckZlYygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptb2R1bGF0aW9uOiB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzLm1vZHVsYXRpb24oKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5kdmJjKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmR2YnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmlzZGJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb24+KChpbnQpcy5tb2R1bGF0aW9uKCkuaXNkYnMzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5pc2RidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmludmVyc2lvbjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW52ZXJzaW9uPigoaW50KXMuaW52ZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmxuYlZvbHRhZ2U6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmxuYlZvbHRhZ2U+KChpbnQpcy5sbmJWb2x0YWdlKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBscElkOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpwbHBJZD4oKGludDhfdClzLnBscElkKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzRVdCUzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNFV0JTPihzLmlzRVdCUygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjphZ2M6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmFnYz4oKGludDhfdClzLmFnYygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xuYU9uOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc0xuYU9uPihzLmlzTG5hT24oKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNMYXllckVycm9yOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGJvb2w+IGUocy5pc0xheWVyRXJyb3IoKS5iZWdpbigpLCBzLmlzTGF5ZXJFcnJvcigpLmVuZCgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzTGF5ZXJFcnJvcj4oZSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6bWVyOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptZXI+KChpbnQpcy5tZXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZnJlcU9mZnNldDogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6ZnJlcU9mZnNldD4oKGludClzLmZyZXFPZmZzZXQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aGllcmFyY2h5OiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpoaWVyYXJjaHk+KChpbnQpcy5oaWVyYXJjaHkoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNSZkxvY2tlZDogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNSZkxvY2tlZD4ocy5pc1JmTG9ja2VkKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBscEluZm86IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbz4gaW5mbzsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IHMucGxwSW5mbygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8ucHVzaF9iYWNrKHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IChpbnQ4X3QpaS5wbHBJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5pc0xvY2tlZCA9IGkuaXNMb2NrZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAudWVjID0gKGludClpLnVlYywKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cGxwSW5mbz4oaW5mbyk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBUdW5lckZyb250ZW5kOjpnZXRBaWRsRnJvbnRlbmRTdGF0dXNFeHQoCi0gICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIGhpZGxTdGF0dXMsIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cykgewotICAgIGZvciAoRnJvbnRlbmRTdGF0dXNFeHQxXzEgcyA6IGhpZGxTdGF0dXMpIHsKLSAgICAgICAgVHVuZXJGcm9udGVuZFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9kdWxhdGlvbnM6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiBhaWRsTW9kOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBtIDogcy5tb2R1bGF0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmR2YmMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5kdmJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uZHZidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5pc2RicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uaXNkYnMzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uYXRzYygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5hdHNjMygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmR0bWIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9ucz4oYWlkbE1vZCk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmVyczogewotICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGIocy5iZXJzKCkuYmVnaW4oKSwgcy5iZXJzKCkuZW5kKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmVycz4oYik7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y29kZVJhdGVzOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGludDY0X3Q+IGNvZGVSYXRlczsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gYyA6IHMuY29kZVJhdGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZVJhdGVzLnB1c2hfYmFjaygobG9uZyljKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpjb2RlUmF0ZXM+KGNvZGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmFuZHdpZHRoOiB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzLmJhbmR3aWR0aCgpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5hdHNjMygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmR2YmMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5kdmJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPigoaW50KXMuYmFuZHdpZHRoKCkuZHRtYigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppbnRlcnZhbDogewotICAgICAgICAgICAgICAgIHN3aXRjaCAocy5pbnRlcnZhbCgpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbnRlcnZhbD4oKGludClzLmludGVydmFsKCkuZHZidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW50ZXJ2YWw+KChpbnQpcy5pbnRlcnZhbCgpLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludGVydmFsPigoaW50KXMuaW50ZXJ2YWwoKS5kdG1iKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRyYW5zbWlzc2lvbk1vZGU6IHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHMudHJhbnNtaXNzaW9uTW9kZSgpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdmJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzLnRyYW5zbWlzc2lvbk1vZGUoKS5pc2RidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdG1iKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnVlYzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6dWVjPigoaW50KXMudWVjKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN5c3RlbUlkOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzeXN0ZW1JZD4oKGNoYXIxNl90KXMuc3lzdGVtSWQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW50ZXJsZWF2aW5nOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGludD4gYWlkbEludGVyOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBpIDogcy5pbnRlcmxlYXZpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbEludGVyLnB1c2hfYmFjaygoaW50KWkuYXRzYzMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsSW50ZXIucHVzaF9iYWNrKChpbnQpaS5kdmJjKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbEludGVyLnB1c2hfYmFjaygoaW50KWkuZHRtYigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludGVybGVhdmluZz4oYWlkbEludGVyKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidFNlZ21lbnQ6IHsKLSAgICAgICAgICAgICAgICBhdXRvIHNlZyA9IHMuaXNkYnRTZWdtZW50KCk7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGkoc2VnLmJlZ2luKCksIHNlZy5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc2RidFNlZ21lbnQ+KGkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzRGF0YVJhdGU6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiB0cyhzLnRzRGF0YVJhdGUoKS5iZWdpbigpLCBzLnRzRGF0YVJhdGUoKS5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0c0RhdGFSYXRlPih0cyk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6cm9sbE9mZjogewotICAgICAgICAgICAgICAgIHN3aXRjaCAocy5yb2xsT2ZmKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRSb2xsT2ZmOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KChpbnQpcy5yb2xsT2ZmKCkuZHZicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cm9sbE9mZj4oKGludClzLnJvbGxPZmYoKS5pc2RicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KChpbnQpcy5yb2xsT2ZmKCkuaXNkYnMzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTWlzbzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNNaXNvPihzLmlzTWlzbygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xpbmVhcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNMaW5lYXI+KHMuaXNMaW5lYXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNTaG9ydEZyYW1lczogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNTaG9ydEZyYW1lcz4ocy5pc1Nob3J0RnJhbWVzKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWhpZGxfdmVjPEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4gVHVuZXJGcm9udGVuZDo6Z2V0QXRzYzNQbHBTZXR0aW5ncygKLSAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgaW50IGxlbiA9IHNldHRpbmdzLnBscFNldHRpbmdzLnNpemUoKTsKLSAgICBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IHBscHMgPSBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+KGxlbik7Ci0gICAgLy8gcGFyc2UgUExQIHNldHRpbmdzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICB1aW50OF90IHBscElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ucGxwSWQpOwotICAgICAgICBGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiBtb2R1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbj4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ubW9kdWxhdGlvbik7Ci0gICAgICAgIEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGUgaW50ZXJsZWF2ZU1vZGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uaW50ZXJsZWF2ZU1vZGUpOwotICAgICAgICBGcm9udGVuZEF0c2MzQ29kZVJhdGUgY29kZVJhdGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNDb2RlUmF0ZT4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uY29kZVJhdGUpOwotICAgICAgICBGcm9udGVuZEF0c2MzRmVjIGZlYyA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0ZlYz4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uZmVjKTsKLSAgICAgICAgRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIGZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncyB7Ci0gICAgICAgICAgICAgICAgLnBscElkID0gcGxwSWQsCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uLAotICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9IGludGVybGVhdmVNb2RlLAotICAgICAgICAgICAgICAgIC5jb2RlUmF0ZSA9IGNvZGVSYXRlLAotICAgICAgICAgICAgICAgIC5mZWMgPSBmZWMsCi0gICAgICAgIH07Ci0gICAgICAgIHBscHNbaV0gPSBmcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci0gICAgfQotICAgIHJldHVybiBwbHBzOwotfQotCi1Gcm9udGVuZER2YnNDb2RlUmF0ZSBUdW5lckZyb250ZW5kOjpnZXREdmJzQ29kZVJhdGUoY29uc3QgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpIHsKLSAgICBGcm9udGVuZElubmVyRmVjIGlubmVyRmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJbm5lckZlYz4oY29kZVJhdGUuZmVjKTsKLSAgICBib29sIGlzTGluZWFyID0gY29kZVJhdGUuaXNMaW5lYXI7Ci0gICAgYm9vbCBpc1Nob3J0RnJhbWVzID0gY29kZVJhdGUuaXNTaG9ydEZyYW1lczsKLSAgICB1aW50MzJfdCBiaXRzUGVyMTAwMFN5bWJvbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2RlUmF0ZS5iaXRzUGVyMTAwMFN5bWJvbCk7Ci0gICAgRnJvbnRlbmREdmJzQ29kZVJhdGUgY29kZXJhdGUgewotICAgICAgICAgICAgLmZlYyA9IGlubmVyRmVjLAotICAgICAgICAgICAgLmlzTGluZWFyID0gaXNMaW5lYXIsCi0gICAgICAgICAgICAuaXNTaG9ydEZyYW1lcyA9IGlzU2hvcnRGcmFtZXMsCi0gICAgICAgICAgICAuYml0c1BlcjEwMDBTeW1ib2wgPSBiaXRzUGVyMTAwMFN5bWJvbCwKLSAgICB9OwotICAgIHJldHVybiBjb2RlcmF0ZTsKLX0KLQotRnJvbnRlbmRTZXR0aW5ncyBUdW5lckZyb250ZW5kOjpnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncykgewotICAgIGF1dG8gc2V0dGluZ3MgPSBhaWRsU2V0dGluZ3Muc2V0dGluZ3M7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzOwotCi0gICAgc3dpdGNoIChzZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphbmFsb2c6IHsKLSAgICAgICAgICAgIGF1dG8gYW5hbG9nID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphbmFsb2c+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmFuYWxvZyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhbmFsb2cuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nVHlwZT4oYW5hbG9nLnNpZ25hbFR5cGUpLAotICAgICAgICAgICAgICAgIC5zaWZTdGFuZGFyZCA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nU2lmU3RhbmRhcmQ+KGFuYWxvZy5zaWZTdGFuZGFyZCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmF0c2M6IHsKLSAgICAgICAgICAgIGF1dG8gYXRzYyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YXRzYz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuYXRzYyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhdHNjLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2NNb2R1bGF0aW9uPihhdHNjLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphdHNjMzogewotICAgICAgICAgICAgYXV0byBhdHNjMyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YXRzYzM+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmF0c2MzKHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MzLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNCYW5kd2lkdGg+KGF0c2MzLmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgLmRlbW9kT3V0cHV0Rm9ybWF0ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0PigKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0c2MzLmRlbW9kT3V0cHV0Rm9ybWF0KSwKLSAgICAgICAgICAgICAgICAucGxwU2V0dGluZ3MgPSBnZXRBdHNjM1BscFNldHRpbmdzKGF0c2MzKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6Y2FibGU6IHsKLSAgICAgICAgICAgIGF1dG8gZHZiYyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6Y2FibGU+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YmMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4oZHZiYy5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuZmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJbm5lckZlYz4oZHZiYy5pbm5lckZlYyksCi0gICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5zeW1ib2xSYXRlKSwKLSAgICAgICAgICAgICAgICAub3V0ZXJGZWMgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNPdXRlckZlYz4oZHZiYy5vdXRlckZlYyksCi0gICAgICAgICAgICAgICAgLmFubmV4ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQW5uZXg+KGR2YmMuYW5uZXgpLAotICAgICAgICAgICAgICAgIC5zcGVjdHJhbEludmVyc2lvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uPigKLSAgICAgICAgICAgICAgICAgICAgICAgIGR2YmMuc3BlY3RyYWxJbnZlcnNpb24pLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJzOiB7Ci0gICAgICAgICAgICBhdXRvIGR2YnMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnM+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YnMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzTW9kdWxhdGlvbj4oZHZicy5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBnZXREdmJzQ29kZVJhdGUoZHZicy5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5zeW1ib2xSYXRlKSwKLSAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1JvbGxvZmY+KGR2YnMucm9sbG9mZiksCi0gICAgICAgICAgICAgICAgLnBpbG90ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzUGlsb3Q+KGR2YnMucGlsb3QpLAotICAgICAgICAgICAgICAgIC5pbnB1dFN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuaW5wdXRTdHJlYW1JZCksCi0gICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzU3RhbmRhcmQ+KGR2YnMuc3RhbmRhcmQpLAotICAgICAgICAgICAgICAgIC52Y21Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzVmNtTW9kZT4oZHZicy52Y20pLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJ0OiB7Ci0gICAgICAgICAgICBhdXRvIGR2YnQgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnQ+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YnQoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZidC5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICBkdmJ0LnRyYW5zbWlzc2lvbk1vZGUpLAotICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRCYW5kd2lkdGg+KGR2YnQuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAuY29uc3RlbGxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KGR2YnQuY29uc3RlbGxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmhpZXJhcmNoeSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEhpZXJhcmNoeT4oZHZidC5oaWVyYXJjaHkpLAotICAgICAgICAgICAgICAgIC5ocENvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29kZXJhdGU+KGR2YnQuaHBDb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLmxwQ29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5scENvZGVSYXRlKSwKLSAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw+KGR2YnQuZ3VhcmRJbnRlcnZhbCksCi0gICAgICAgICAgICAgICAgLmlzSGlnaFByaW9yaXR5ID0gZHZidC5pc0hpZ2hQcmlvcml0eSwKLSAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRTdGFuZGFyZD4oZHZidC5zdGFuZGFyZCksCi0gICAgICAgICAgICAgICAgLmlzTWlzbyA9IGR2YnQuaXNNaXNvLAotICAgICAgICAgICAgICAgIC5wbHBNb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0UGxwTW9kZT4oZHZidC5wbHBNb2RlKSwKLSAgICAgICAgICAgICAgICAucGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkdmJ0LnBscElkKSwKLSAgICAgICAgICAgICAgICAucGxwR3JvdXBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGR2YnQucGxwR3JvdXBJZCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJzOiB7Ci0gICAgICAgICAgICBhdXRvIGlzZGJzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2Ricz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuaXNkYnMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMuc3RyZWFtSWQpLAotICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlPihpc2Ricy5zdHJlYW1JZFR5cGUpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric01vZHVsYXRpb24+KGlzZGJzLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNDb2RlcmF0ZT4oaXNkYnMuY29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzLnN5bWJvbFJhdGUpLAotICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1JvbGxvZmY+KGlzZGJzLnJvbGxvZmYpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RiczM6IHsKLSAgICAgICAgICAgIGF1dG8gaXNkYnMzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RiczM+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmlzZGJzMyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMzLnN0cmVhbUlkKSwKLSAgICAgICAgICAgICAgICAuc3RyZWFtSWRUeXBlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oaXNkYnMzLnN0cmVhbUlkVHlwZSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM01vZHVsYXRpb24+KGlzZGJzMy5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM0NvZGVyYXRlPihpc2RiczMuY29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5zeW1ib2xSYXRlKSwKLSAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzUm9sbG9mZj4oaXNkYnMzLnJvbGxvZmYpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RidDogewotICAgICAgICAgICAgYXV0byBpc2RidCA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnQ+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmlzZGJ0KHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4oaXNkYnQubW9kdWxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRCYW5kd2lkdGg+KGlzZGJ0LmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgLm1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kZT4oaXNkYnQubW9kZSksCi0gICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidENvZGVyYXRlPihpc2RidC5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbD4oaXNkYnQuZ3VhcmRJbnRlcnZhbCksCi0gICAgICAgICAgICAgICAgLnNlcnZpY2VBcmVhSWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnQuc2VydmljZUFyZWFJZCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnJvbnRlbmRTZXR0aW5nczsKLX0KLQotRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBUdW5lckZyb250ZW5kOjpnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dCgKLSAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpIHsKLSAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHR7Ci0gICAgICAgIC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWlkbFNldHRpbmdzLmVuZEZyZXF1ZW5jeSksCi0gICAgICAgIC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihhaWRsU2V0dGluZ3MuaW52ZXJzaW9uKSwKLSAgICB9OwotCi0gICAgYXV0byBzZXR0aW5ncyA9IGFpZGxTZXR0aW5ncy5zZXR0aW5nczsKLSAgICBzd2l0Y2ggKHNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmFuYWxvZzogewotICAgICAgICAgICAgYXV0byBhbmFsb2cgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmFuYWxvZz4oKTsKLSAgICAgICAgICAgIGlmIChhbmFsb2cuaXNFeHRlbmRlZCkgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5hbmFsb2coewotICAgICAgICAgICAgICAgICAgICAuYWZ0RmxhZyA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nQWZ0RmxhZz4oYW5hbG9nLmFmdEZsYWcpLAotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpjYWJsZTogewotICAgICAgICAgICAgYXV0byBkdmJjID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpjYWJsZT4oKTsKLSAgICAgICAgICAgIGlmIChkdmJjLmlzRXh0ZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZiYyh7Ci0gICAgICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kQ2FibGVUaW1lSW50ZXJsZWF2ZU1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2YmMuaW50ZXJsZWF2ZU1vZGUpLAotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQmFuZHdpZHRoPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmJjLmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnM6IHsKLSAgICAgICAgICAgIGF1dG8gZHZicyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZicz4oKTsKLSAgICAgICAgICAgIGlmIChkdmJzLmlzRXh0ZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZicyh7Ci0gICAgICAgICAgICAgICAgICAgIC5zY2FuVHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1NjYW5UeXBlPihkdmJzLnNjYW5UeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmlzRGlzZXFjUnhNZXNzYWdlID0gZHZicy5pc0Rpc2VxY1J4TWVzc2FnZSwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZidDogewotICAgICAgICAgICAgYXV0byBkdmJ0ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJ0PigpOwotICAgICAgICAgICAgaWYgKGR2YnQuaXNFeHRlbmRlZCkgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdmJ0KHsKLSAgICAgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZidC5jb25zdGVsbGF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZidC50cmFuc21pc3Npb25Nb2RlKSwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHRtYjogewotICAgICAgICAgICAgYXV0byBkdG1iID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdG1iPigpOwotICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR0bWIoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHRtYi5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICBkdG1iLnRyYW5zbWlzc2lvbk1vZGUpLAotICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJCYW5kd2lkdGg+KGR0bWIuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYk1vZHVsYXRpb24+KGR0bWIubW9kdWxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmNvZGVSYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iQ29kZVJhdGU+KGR0bWIuY29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbD4oZHRtYi5ndWFyZEludGVydmFsKSwKLSAgICAgICAgICAgICAgICAuaW50ZXJsZWF2ZU1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU+KGR0bWIuaW50ZXJsZWF2ZU1vZGUpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyb250ZW5kU2V0dGluZ3NFeHQ7Ci19Cit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaAppbmRleCAyMmZkNTA5Li5kYTQ3MWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmgKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5oCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDk1ICsxNyw3OCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0JuRnJvbnRlbmRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRnJvbnRlbmQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZyb250ZW5kQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckZyb250ZW5kLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZyb250ZW5kLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZyb250ZW5kQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckZyb250ZW5kOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGcm9udGVuZENhbGxiYWNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJMbmI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTZXR0aW5nczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZFN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNDb2RlUmF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRFdmVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2Nhbk1lc3NhZ2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZyb250ZW5kOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRnJvbnRlbmRDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2V0dGluZ3NFeHQxXzE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzRXh0MV8xOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpCbkZyb250ZW5kQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRXZlbnRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5NZXNzYWdlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzUmVhZGluZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1c1R5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUZyb250ZW5kQ2FsbGJhY2s7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAogY2xhc3MgVHVuZXJGcm9udGVuZCA6IHB1YmxpYyBCblR1bmVyRnJvbnRlbmQgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJGcm9udGVuZChzcDxJRnJvbnRlbmQ+IGZyb250ZW5kLCBpbnQgaWQpOworICAgIFR1bmVyRnJvbnRlbmQoc2hhcmVkX3B0cjxJRnJvbnRlbmQ+IGZyb250ZW5kLCBpbnQgaWQpOwogICAgIHZpcnR1YWwgflR1bmVyRnJvbnRlbmQoKTsKLSAgICBTdGF0dXMgc2V0Q2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiB0dW5lckZyb250ZW5kQ2FsbGJhY2spIG92ZXJyaWRlOwotICAgIFN0YXR1cyB0dW5lKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzdG9wVHVuZSgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzY2FuKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBmcm9udGVuZFNjYW5UeXBlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RvcFNjYW4oKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgbG5iKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TG5hKGJvb2wgYkVuYWJsZSkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGxpbmtDaUNhbVRvRnJvbnRlbmQoaW50IGNpQ2FtSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQgY2lDYW1JZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFN0YXR1cyhjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHN0YXR1c1R5cGVzLAotICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRTdGF0dXNFeHRlbmRlZF8xXzEoY29uc3QgdmVjdG9yPGludDMyX3Q+JiBzdGF0dXNUeXBlcywKLSAgICAgICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RnJvbnRlbmRJZChpbnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBzdHJ1Y3QgRnJvbnRlbmRDYWxsYmFjayA6IHB1YmxpYyBJRnJvbnRlbmRDYWxsYmFjayB7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiBpbl90dW5lckZyb250ZW5kQ2FsbGJhY2spIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHR1bmUoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3BUdW5lKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2Nhbihjb25zdCBGcm9udGVuZFNldHRpbmdzJiBpbl9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2NhblR5cGUgaW5fZnJvbnRlbmRTY2FuVHlwZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcFNjYW4oKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBpbl9sbmIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBpbl9jaUNhbUlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGluX2NpQ2FtSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SGFyZHdhcmVJbmZvKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZU91dHB1dFBpZChpbnQzMl90IGluX3BpZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzUmVhZGluZXNzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIHN0cnVjdCBGcm9udGVuZENhbGxiYWNrIDogcHVibGljIEJuRnJvbnRlbmRDYWxsYmFjayB7CiAgICAgICAgIEZyb250ZW5kQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiB0dW5lckZyb250ZW5kQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgOiBtVHVuZXJGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjaykge307CisgICAgICAgICAgICAgIDogbVR1bmVyRnJvbnRlbmRDYWxsYmFjayh0dW5lckZyb250ZW5kQ2FsbGJhY2spe307CiAKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FdmVudChGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2VFeHQxXzEoCi0gICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMSYgbWVzc2FnZSk7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRnJvbnRlbmRFdmVudFR5cGUgZnJvbnRlbmRFdmVudFR5cGUpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNjYW5NZXNzYWdlKEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiBtVHVuZXJGcm9udGVuZENhbGxiYWNrOwogICAgIH07CiAKIHByaXZhdGU6Ci0gICAgaGlkbF92ZWM8RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBnZXRBdHNjM1BscFNldHRpbmdzKAotICAgICAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICBGcm9udGVuZER2YnNDb2RlUmF0ZSBnZXREdmJzQ29kZVJhdGUoY29uc3QgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpOwotICAgIEZyb250ZW5kU2V0dGluZ3MgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3MoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpOwotICAgIEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3NFeHQoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0QWlkbEZyb250ZW5kU3RhdHVzKAotICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiYgaGlkbFN0YXR1cywgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKTsKLSAgICB2b2lkIGdldEFpZGxGcm9udGVuZFN0YXR1c0V4dCgKLSAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIGhpZGxTdGF0dXMsIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cyk7Ci0KICAgICBpbnQgbUlkOwotICAgIHNwPElGcm9udGVuZD4gbUZyb250ZW5kOwotICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kPiBtRnJvbnRlbmRfMV8xOworICAgIHNoYXJlZF9wdHI8SUZyb250ZW5kPiBtRnJvbnRlbmQ7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGUk9OVEVORF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2NzExMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvSVR1bmVyUmVzb3VyY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXJOYXRpdmUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6SVR1bmVyUmVzb3VyY2VNYW5hZ2VyOwordXNpbmcgOjphbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmludGVyZmFjZV9jYXN0OwordXNpbmcgOjphbmRyb2lkOjpJU2VydmljZU1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZTsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCisvLyBTeXN0ZW0gRmVhdHVyZSBkZWZpbmVkIGluIFBhY2thZ2VNYW5hZ2VyCitzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiBGRUFUVVJFX1RVTkVSKDo6YW5kcm9pZDo6U3RyaW5nMTYoImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIiKSk7CisKK2ludDMyX3QgVHVuZXJIZWxwZXI6OnNSZXNvdXJjZVJlcXVlc3RDb3VudCA9IDA7CisKK2Jvb2wgVHVuZXJIZWxwZXI6OmNoZWNrVHVuZXJGZWF0dXJlKCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1nciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcGFja2FnZU1ncjsKKyAgICBpZiAoc2VydmljZU1nci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VydmljZSBtYW5hZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc2VydmljZU1nci0+d2FpdEZvclNlcnZpY2UoU3RyaW5nMTYoInBhY2thZ2VfbmF0aXZlIikpOworICAgIHBhY2thZ2VNZ3IgPSBpbnRlcmZhY2VfY2FzdDxJUGFja2FnZU1hbmFnZXJOYXRpdmU+KGJpbmRlcik7CisgICAgaWYgKHBhY2thZ2VNZ3IgIT0gbnVsbHB0cikgeworICAgICAgICBib29sIGhhc0ZlYXR1cmUgPSBmYWxzZTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IHBhY2thZ2VNZ3ItPmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9UVU5FUiwgMCwgJmhhc0ZlYXR1cmUpOworICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaGFzU3lzdGVtRmVhdHVyZSBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKSB7CisgICAgICAgICAgICBBTE9HRCgiQ3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0dW5lciBmZWF1cmUuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiJXM6IENhbm5vdCBmaW5kIHBhY2thZ2UgbWFuYWdlci4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVE9ETzogdXBkYXRlIERlbXV4LCBEZXNjcmFtYmxlci4KK3ZvaWQgVHVuZXJIZWxwZXI6OnVwZGF0ZVR1bmVyUmVzb3VyY2VzKGNvbnN0IHZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4mIGZlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50MzJfdD4mIGxuYkhhbmRsZXMpIHsKKyAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX3dhaXRGb3JTZXJ2aWNlKCJ0dl90dW5lcl9yZXNvdXJjZV9tZ3IiKSk7CisgICAgc2hhcmVkX3B0cjxJVHVuZXJSZXNvdXJjZU1hbmFnZXI+IHR1bmVyUk0gPSBJVHVuZXJSZXNvdXJjZU1hbmFnZXI6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgICBpZiAodHVuZXJSTSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0dW5lclJNLT5zZXRGcm9udGVuZEluZm9MaXN0KGZlSW5mb3MpOworICAgIHR1bmVyUk0tPnNldExuYkluZm9MaXN0KGxuYkhhbmRsZXMpOworfQorCisvLyBUT0RPOiBjcmVhdGUgYSBtYXAgYmV0d2VlbiByZXNvdXJjZSBpZCBhbmQgaGFuZGxlcy4KK2ludCBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoaW50IHJlc291cmNlSGFuZGxlLCBpbnQgLyp0eXBlKi8pIHsKKyAgICByZXR1cm4gKHJlc291cmNlSGFuZGxlICYgMHgwMGZmMDAwMCkgPj4gMTY7Cit9CisKK2ludCBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoaW50IGlkLCBpbnQgcmVzb3VyY2VUeXBlKSB7CisgICAgLy8gVE9ETzogYnVpbGQgdXAgcmFuZG9tbHkgZ2VuZXJhdGVkIGlkIHRvIGhhbmRsZSBtYXBwaW5nCisgICAgcmV0dXJuIChyZXNvdXJjZVR5cGUgJiAweDAwMDAwMGZmKSA8PCAyNCB8IChpZCA8PCAxNikgfCAoc1Jlc291cmNlUmVxdWVzdENvdW50KysgJiAweGZmZmYpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWRmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkRWUkhFTFBFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJEVlJIRUxQRVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyRnJvbnRlbmRJbmZvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpUdW5lckZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6U3RyaW5nMTY7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl9VTktOT1dOID0gMDsKK2NvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMV8wID0gMSA8PCAxNjsKK2NvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMV8xID0gKDEgPDwgMTYpIHwgMTsKK2NvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMl8wID0gMiA8PCAxNjsKKworLy8gS2VlcCBzeW5jaW5nIHdpdGggU2hhcmVGaWx0ZXIuamF2YQorY29uc3Qgc3RhdGljIGludCBTVEFUVVNfSU5BQ0NFU1NJQkxFID0gMSA8PCA3OworCitjb25zdCBzdGF0aWMgU3RyaW5nMTYgc1NoYXJlZEZpbHRlclBlcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfVFZfU0hBUkVEX0ZJTFRFUiIpOworCit0eXBlZGVmIGVudW0geworICAgIEZST05URU5ELAorICAgIERFTVVYLAorICAgIERFU0NSQU1CTEVSLAorICAgIExOQgorfSBUdW5lclJlc291cmNlVHlwZTsKKworY2xhc3MgVHVuZXJIZWxwZXIgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGNoZWNrVHVuZXJGZWF0dXJlKCk7CisKKyAgICAvLyBUT0RPOiB1cGRhdGUgRGVtdXgsIERlc2NyYW1ibGVyLgorICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVR1bmVyUmVzb3VyY2VzKGNvbnN0IHZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4mIGZlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludDMyX3Q+JiBsbmJIYW5kbGVzKTsKKyAgICAvLyBUT0RPOiBjcmVhdGUgYSBtYXAgYmV0d2VlbiByZXNvdXJjZSBpZCBhbmQgaGFuZGxlcy4KKyAgICBzdGF0aWMgaW50IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGludCByZXNvdXJjZUhhbmRsZSwgaW50IHR5cGUpOworICAgIHN0YXRpYyBpbnQgZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoaW50IGlkLCBpbnQgcmVzb3VyY2VUeXBlKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgaW50MzJfdCBzUmVzb3VyY2VSZXF1ZXN0Q291bnQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSRFZSSEVMUEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmNwcAppbmRleCA3NzI0OGQ0Li4xZTE0M2MzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuY3BwCkBAIC0xOCwxMjMgKzE4LDExNiBAQAogCiAjaW5jbHVkZSAiVHVuZXJMbmIuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVG9uZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVm9sdGFnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JTG5iQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CiAKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUxuYkNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJMbmI6OlR1bmVyTG5iKHNwPElMbmI+IGxuYiwgaW50IGlkKSB7CitUdW5lckxuYjo6VHVuZXJMbmIoc2hhcmVkX3B0cjxJTG5iPiBsbmIsIGludCBpZCkgewogICAgIG1MbmIgPSBsbmI7CiAgICAgbUlkID0gaWQ7CiB9CiAKIFR1bmVyTG5iOjp+VHVuZXJMbmIoKSB7Ci0gICAgbUxuYiA9IE5VTEw7CisgICAgbUxuYiA9IG51bGxwdHI7CiAgICAgbUlkID0gLTE7CiB9CiAKLVN0YXR1cyBUdW5lckxuYjo6c2V0Q2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiB0dW5lckxuYkNhbGxiYWNrKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OnNldENhbGxiYWNrKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBpZiAodHVuZXJMbmJDYWxsYmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICBpZiAoaW5fdHVuZXJMbmJDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIHNwPElMbmJDYWxsYmFjaz4gbG5iQ2FsbGJhY2sgPSBuZXcgTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjayk7Ci0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldENhbGxiYWNrKGxuYkNhbGxiYWNrKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgc2hhcmVkX3B0cjxJTG5iQ2FsbGJhY2s+IGxuYkNhbGxiYWNrID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPExuYkNhbGxiYWNrPihpbl90dW5lckxuYkNhbGxiYWNrKTsKKyAgICByZXR1cm4gbUxuYi0+c2V0Q2FsbGJhY2sobG5iQ2FsbGJhY2spOwogfQogCi1TdGF0dXMgVHVuZXJMbmI6OnNldFZvbHRhZ2UoaW50IHZvbHRhZ2UpIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2V0Vm9sdGFnZShMbmJWb2x0YWdlIGluX3ZvbHRhZ2UpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldFZvbHRhZ2Uoc3RhdGljX2Nhc3Q8TG5iVm9sdGFnZT4odm9sdGFnZSkpOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUxuYi0+c2V0Vm9sdGFnZShpbl92b2x0YWdlKTsKIH0KIAotU3RhdHVzIFR1bmVyTG5iOjpzZXRUb25lKGludCB0b25lKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OnNldFRvbmUoTG5iVG9uZSBpbl90b25lKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRUb25lKHN0YXRpY19jYXN0PExuYlRvbmU+KHRvbmUpKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1MbmItPnNldFRvbmUoaW5fdG9uZSk7CiB9CiAKLVN0YXR1cyBUdW5lckxuYjo6c2V0U2F0ZWxsaXRlUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OnNldFNhdGVsbGl0ZVBvc2l0aW9uKExuYlBvc2l0aW9uIGluX3Bvc2l0aW9uKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRTYXRlbGxpdGVQb3NpdGlvbihzdGF0aWNfY2FzdDxMbmJQb3NpdGlvbj4ocG9zaXRpb24pKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1MbmItPnNldFNhdGVsbGl0ZVBvc2l0aW9uKGluX3Bvc2l0aW9uKTsKIH0KIAotU3RhdHVzIFR1bmVyTG5iOjpzZW5kRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9kaXNlcWNNZXNzYWdlKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZW5kRGlzZXFjTWVzc2FnZShkaXNlcWNNZXNzYWdlKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1MbmItPnNlbmREaXNlcWNNZXNzYWdlKGluX2Rpc2VxY01lc3NhZ2UpOwogfQogCi1TdGF0dXMgVHVuZXJMbmI6OmNsb3NlKCkgewotICAgIGlmIChtTG5iID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyTG5iOjpjbG9zZSgpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1MbmItPmNsb3NlKCk7Ci0gICAgbUxuYiA9IE5VTEw7CisgICAgYXV0byByZXMgPSBtTG5iLT5jbG9zZSgpOworICAgIG1MbmIgPSBudWxscHRyOwogCi0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLyBJTG5iQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotUmV0dXJuPHZvaWQ+IFR1bmVyTG5iOjpMbmJDYWxsYmFjazo6b25FdmVudChjb25zdCBMbmJFdmVudFR5cGUgbG5iRXZlbnRUeXBlKSB7Ci0gICAgaWYgKG1UdW5lckxuYkNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbVR1bmVyTG5iQ2FsbGJhY2stPm9uRXZlbnQoKGludClsbmJFdmVudFR5cGUpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OkxuYkNhbGxiYWNrOjpvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25FdmVudChsbmJFdmVudFR5cGUpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckxuYjo6TG5iQ2FsbGJhY2s6Om9uRGlzZXFjTWVzc2FnZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGlzZXFjTWVzc2FnZSkgewotICAgIGlmIChtVHVuZXJMbmJDYWxsYmFjayAhPSBOVUxMICYmIGRpc2VxY01lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICB2ZWN0b3I8dWludDhfdD4gbXNnKGJlZ2luKGRpc2VxY01lc3NhZ2UpLCBlbmQoZGlzZXFjTWVzc2FnZSkpOwotICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25EaXNlcWNNZXNzYWdlKG1zZyk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6TG5iQ2FsbGJhY2s6Om9uRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25EaXNlcWNNZXNzYWdlKGRpc2VxY01lc3NhZ2UpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmgKaW5kZXggNTAwZDA3Mi4uNzI5ODhhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5oCkBAIC0xNyw1NSArMTcsNjEgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkZMTkJfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRkxOQl9ICiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQm5MbmJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JTG5iLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJMbmIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JTG5iLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSUxuYkNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJMbmI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckxuYkNhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYkV2ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6Qm5MbmJDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUxuYjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iRXZlbnRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJQb3NpdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iVG9uZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iVm9sdGFnZTsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lckxuYiA6IHB1YmxpYyBCblR1bmVyTG5iIHsKIAogcHVibGljOgotICAgIFR1bmVyTG5iKHNwPElMbmI+IGxuYiwgaW50IGlkKTsKKyAgICBUdW5lckxuYihzaGFyZWRfcHRyPElMbmI+IGxuYiwgaW50IGlkKTsKICAgICB2aXJ0dWFsIH5UdW5lckxuYigpOwotICAgIFN0YXR1cyBzZXRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgdHVuZXJMbmJDYWxsYmFjaykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFZvbHRhZ2UoaW50IHZvbHRhZ2UpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRUb25lKGludCB0b25lKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW50IHBvc2l0aW9uKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldENhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmJDYWxsYmFjaz4mIGluX3R1bmVyTG5iQ2FsbGJhY2spIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFZvbHRhZ2UoTG5iVm9sdGFnZSBpbl92b2x0YWdlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRUb25lKExuYlRvbmUgaW5fdG9uZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0U2F0ZWxsaXRlUG9zaXRpb24oTG5iUG9zaXRpb24gaW5fcG9zaXRpb24pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNlbmREaXNlcWNNZXNzYWdlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgaW5fZGlzZXFjTWVzc2FnZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKIAogICAgIGludCBnZXRJZCgpIHsgcmV0dXJuIG1JZDsgfQogCi0gICAgc3RydWN0IExuYkNhbGxiYWNrIDogcHVibGljIElMbmJDYWxsYmFjayB7CisgICAgc3RydWN0IExuYkNhbGxiYWNrIDogcHVibGljIEJuTG5iQ2FsbGJhY2sgewogICAgICAgICBMbmJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiB0dW5lckxuYkNhbGxiYWNrKQotICAgICAgICAgICAgICAgIDogbVR1bmVyTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjaykge307CisgICAgICAgICAgICAgIDogbVR1bmVyTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjayl7fTsKIAotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpOwotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkRpc2VxY01lc3NhZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbkRpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKIAogICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiBtVHVuZXJMbmJDYWxsYmFjazsKICAgICB9OwogCiBwcml2YXRlOgogICAgIGludCBtSWQ7Ci0gICAgc3A8SUxuYj4gbUxuYjsKKyAgICBzaGFyZWRfcHRyPElMbmI+IG1MbmI7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGTE5CX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuY3BwCmluZGV4IDViNDEyOWEuLjQ4MzNhYWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDM2OSArMTQsMzQyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlR1bmVyU2VydmljZSIKIAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyTmF0aXZlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIlR1bmVyU2VydmljZS5oIgotI2luY2x1ZGUgIlR1bmVyRnJvbnRlbmQuaCIKLSNpbmNsdWRlICJUdW5lckxuYi5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZW11eC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZyb250ZW5kLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lMbmIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgIlR1bmVyRGVtdXguaCIKICNpbmNsdWRlICJUdW5lckRlc2NyYW1ibGVyLmgiCisjaW5jbHVkZSAiVHVuZXJGcm9udGVuZC5oIgorI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisjaW5jbHVkZSAiVHVuZXJMbmIuaCIKIAotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNYWluVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRnJvbnRlbmQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYklkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkNhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SURlbXV4OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6UGVybWlzc2lvbkNhY2hlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gVHVuZXJTZXJ2aWNlOjpzVHVuZXJTZXJ2aWNlID0gbnVsbHB0cjsKIAogVHVuZXJTZXJ2aWNlOjpUdW5lclNlcnZpY2UoKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWdyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcGFja2FnZU1ncjsKLSAgICBpZiAoc2VydmljZU1nci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VydmljZSBtYW5hZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc2VydmljZU1nci0+d2FpdEZvclNlcnZpY2UoU3RyaW5nMTYoInBhY2thZ2VfbmF0aXZlIikpOwotICAgICAgICBwYWNrYWdlTWdyID0gaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0ZlYXR1cmUgPSBmYWxzZTsKLSAgICBpZiAocGFja2FnZU1nciAhPSBudWxscHRyKSB7Ci0gICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IHBhY2thZ2VNZ3ItPmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9UVU5FUiwgMCwgJmhhc0ZlYXR1cmUpOwotICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogaGFzU3lzdGVtRmVhdHVyZSBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFoYXNGZWF0dXJlKSB7Ci0gICAgICAgICAgICBBTE9HRCgiQ3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0dW5lciBmZWF1cmUuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiJXM6IENhbm5vdCBmaW5kIHBhY2thZ2UgbWFuYWdlci4iLCBfX2Z1bmNfXyk7CisgICAgaWYgKCFUdW5lckhlbHBlcjo6Y2hlY2tUdW5lckZlYXR1cmUoKSkgeworICAgICAgICBBTE9HRCgiRGV2aWNlIGRvZXNuJ3QgaGF2ZSB0dW5lciBoYXJkd2FyZS4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoInR2X3R1bmVyX3Jlc291cmNlX21nciIpKTsKLSAgICBtVHVuZXJSZXNvdXJjZU1hbmFnZXIgPSBJVHVuZXJSZXNvdXJjZU1hbmFnZXI6OmZyb21CaW5kZXIoYmluZGVyKTsKICAgICB1cGRhdGVUdW5lclJlc291cmNlcygpOwogfQogCiBUdW5lclNlcnZpY2U6On5UdW5lclNlcnZpY2UoKSB7fQogCiBiaW5kZXJfc3RhdHVzX3QgVHVuZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKLSAgICBzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gc2VydmljZSA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclNlcnZpY2U+KCk7Ci0gICAgcmV0dXJuIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOworICAgIHNUdW5lclNlcnZpY2UgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclNlcnZpY2U+KCk7CisgICAgcmV0dXJuIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNUdW5lclNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOworfQorCitzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gVHVuZXJTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKSB7CisgICAgcmV0dXJuIHNUdW5lclNlcnZpY2U7CiB9CiAKIGJvb2wgVHVuZXJTZXJ2aWNlOjpoYXNJVHVuZXIoKSB7Ci0gICAgQUxPR0QoImhhc0lUdW5lciIpOworICAgIEFMT0dWKCJoYXNJVHVuZXIiKTsKICAgICBpZiAobVR1bmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIG1UdW5lciA9IElUdW5lcjo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJVHVuZXIgc2VydmljZSIpOworICAgIGNvbnN0IHN0cmluZyBzdGF0c1NlcnZpY2VOYW1lID0gc3RyaW5nKCkgKyBJVHVuZXI6OmRlc2NyaXB0b3IgKyAiL2RlZmF1bHQiOworICAgIGlmIChBU2VydmljZU1hbmFnZXJfaXNEZWNsYXJlZChzdGF0c1NlcnZpY2VOYW1lLmNfc3RyKCkpKSB7CisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2Uoc3RhdHNTZXJ2aWNlTmFtZS5jX3N0cigpKSk7CisgICAgICAgIG1UdW5lciA9IElUdW5lcjo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1UdW5lciA9IG51bGxwdHI7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFR1bmVyIEhBTCBTZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OXzFfMDsKLSAgICBtVHVuZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI6OmNhc3RGcm9tKG1UdW5lcik7Ci0gICAgaWYgKG1UdW5lcl8xXzEgIT0gbnVsbHB0cikgewotICAgICAgICBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fMV8xOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IElUdW5lcl8xXzEgc2VydmljZSIpOwotICAgIH0KKworICAgIG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl8yXzA7CisgICAgLy8gVE9ETzogRW5hYmxlIHRoaXMgYWZ0ZXIgVHVuZXIgSEFMIGlzIGZyb3plbi4KKyAgICAvLyBpZiAobVR1bmVyLT5nZXRJbnRlcmZhY2VWZXJzaW9uKCZtVHVuZXJWZXJzaW9uKS5pc09rKCkpIHsKKyAgICAvLyAgLy8gVHVuZXIgQUlETCBIQUwgdmVyc2lvbiAxIHdpbGwgYmUgVHVuZXIgSEFMIDIuMAorICAgIC8vICBtVHVuZXJWZXJzaW9uID0gKG1UdW5lclZlcnNpb24gKyAxKSA8PCAxNjsKKyAgICAvL30KKwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFR1bmVyU2VydmljZTo6aGFzSVR1bmVyXzFfMSgpIHsKLSAgICBBTE9HRCgiaGFzSVR1bmVyXzFfMSIpOwotICAgIGhhc0lUdW5lcigpOwotICAgIHJldHVybiAobVR1bmVyVmVyc2lvbiA9PSBUVU5FUl9IQUxfVkVSU0lPTl8xXzEpOwotfQotCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVtdXgoCi0gICAgICAgIGludCAvKiBkZW11eEhhbmRsZSAqLywgc3RkOjpzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR0QoIm9wZW5EZW11eCIpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVtdXgoaW50MzJfdCAvKiBpbl9kZW11eEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBBTE9HVigib3BlbkRlbXV4Iik7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpOT1RfSU5JVElBTElaRUQpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KLSAgICBSZXN1bHQgcmVzOwotICAgIHVpbnQzMl90IGlkOwotICAgIHNwPElEZW11eD4gZGVtdXhTcCA9IG51bGxwdHI7Ci0gICAgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4gdHVuZXJEZW11eCA9IG51bGxwdHI7Ci0gICAgbVR1bmVyLT5vcGVuRGVtdXgoWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkZW11eElkLCBjb25zdCBzcDxJRGVtdXg+JiBkZW11eCkgewotICAgICAgICBkZW11eFNwID0gZGVtdXg7Ci0gICAgICAgIGlkID0gZGVtdXhJZDsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgQUxPR0QoIm9wZW4gZGVtdXgsIGlkID0gJWQiLCBkZW11eElkKTsKLSAgICB9KTsKLSAgICBpZiAocmVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICB0dW5lckRlbXV4ID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZW11eD4oZGVtdXhTcCwgaWQpOwotICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHVuZXJEZW11eC0+cmVmPElUdW5lckRlbXV4PigpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHZlY3RvcjxpbnQzMl90PiBpZDsKKyAgICBzaGFyZWRfcHRyPElEZW11eD4gZGVtdXg7CisgICAgYXV0byBzdGF0dXMgPSBtVHVuZXItPm9wZW5EZW11eCgmaWQsICZkZW11eCk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRGVtdXg+KGRlbXV4LCBpZFswXSk7CiAgICAgfQogCi0gICAgQUxPR1coIm9wZW4gZGVtdXggZmFpbGVkLCByZXMgPSAlZCIsIHJlcyk7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldERlbXV4Q2FwcyhUdW5lckRlbXV4Q2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBBTE9HRCgiZ2V0RGVtdXhDYXBzIik7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldERlbXV4Q2FwcyhEZW11eENhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSB7CisgICAgQUxPR1YoImdldERlbXV4Q2FwcyIpOwogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEKSk7Ci0gICAgfQotICAgIFJlc3VsdCByZXM7Ci0gICAgRGVtdXhDYXBhYmlsaXRpZXMgY2FwczsKLSAgICBtVHVuZXItPmdldERlbXV4Q2FwcyhbJl0oUmVzdWx0IHIsIGNvbnN0IERlbXV4Q2FwYWJpbGl0aWVzJiBkZW11eENhcHMpIHsKLSAgICAgICAgY2FwcyA9IGRlbXV4Q2FwczsKLSAgICAgICAgcmVzID0gcjsKLSAgICB9KTsKLSAgICBpZiAocmVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gZ2V0QWlkbERlbXV4Q2FwcyhjYXBzKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIEFMT0dXKCJHZXQgZGVtdXggY2FwcyBmYWlsZWQsIHJlcyA9ICVkIiwgcmVzKTsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgcmV0dXJuIG1UdW5lci0+Z2V0RGVtdXhDYXBzKF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90PiogaWRzKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90PiogaWRzKSB7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpOT1RfSU5JVElBTElaRUQpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KLSAgICBoaWRsX3ZlYzxGcm9udGVuZElkPiBmZUlkczsKLSAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSWRzKGZlSWRzKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIGlkcy0+cmVzaXplKGZlSWRzLnNpemUoKSk7Ci0gICAgY29weShmZUlkcy5iZWdpbigpLCBmZUlkcy5lbmQoKSwgaWRzLT5iZWdpbigpKTsKIAotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1UdW5lci0+Z2V0RnJvbnRlbmRJZHMoaWRzKTsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaWQsIFR1bmVyRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaWQsIEZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewogICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CiAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBGcm9udGVuZEluZm8gaW5mbzsKLSAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSW5mbyhpZCwgaW5mbyk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgIFR1bmVyRnJvbnRlbmRJbmZvIHR1bmVySW5mbyA9IGNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oaW5mbyk7Ci0gICAgKl9haWRsX3JldHVybiA9IHR1bmVySW5mbzsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtVHVuZXItPmdldEZyb250ZW5kSW5mbyhpZCwgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKAotICAgICAgICBpbnQzMl90IGlkLCBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKCFoYXNJVHVuZXJfMV8xKCkpIHsKLSAgICAgICAgQUxPR0UoIklUdW5lcl8xXzEgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkZyb250ZW5kKGludDMyX3QgZnJvbnRlbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CiAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzOwotICAgIEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBkdG1iQ2FwczsKLSAgICBtVHVuZXJfMV8xLT5nZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoaWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyYgY2FwcykgewotICAgICAgICBkdG1iQ2FwcyA9IGNhcHM7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSwgRlJPTlRFTkQpOworICAgIHNoYXJlZF9wdHI8SUZyb250ZW5kPiBmcm9udGVuZDsKKyAgICBhdXRvIHN0YXR1cyA9IG1UdW5lci0+b3BlbkZyb250ZW5kQnlJZChpZCwgJmZyb250ZW5kKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGcm9udGVuZD4oZnJvbnRlbmQsIGlkKTsKICAgICB9CiAKLSAgICBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBhaWRsRHRtYkNhcHN7Ci0gICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gKGludClkdG1iQ2Fwcy50cmFuc21pc3Npb25Nb2RlQ2FwLAotICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludClkdG1iQ2Fwcy5iYW5kd2lkdGhDYXAsCi0gICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludClkdG1iQ2Fwcy5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWR0bWJDYXBzLmNvZGVSYXRlQ2FwLAotICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9IChpbnQpZHRtYkNhcHMuZ3VhcmRJbnRlcnZhbENhcCwKLSAgICAgICAgLmludGVybGVhdmVNb2RlQ2FwID0gKGludClkdG1iQ2Fwcy5pbnRlcmxlYXZlTW9kZUNhcCwKLSAgICB9OwotCi0gICAgKl9haWRsX3JldHVybiA9IGFpZGxEdG1iQ2FwczsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5Gcm9udGVuZCgKLSAgICAgICAgaW50MzJfdCBmcm9udGVuZEhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgewotICAgIGlmICghaGFzSVR1bmVyKCkpIHsKLSAgICAgICAgQUxPR0UoIklUdW5lciBzZXJ2aWNlIGlzIG5vdCBpbml0LiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SUZyb250ZW5kPiBmcm9udGVuZDsKLSAgICBpbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSwgRlJPTlRFTkQpOwotICAgIG1UdW5lci0+b3BlbkZyb250ZW5kQnlJZChpZCwgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElGcm9udGVuZD4mIGZlKSB7Ci0gICAgICAgIGZyb250ZW5kID0gZmU7Ci0gICAgICAgIHN0YXR1cyA9IHJlc3VsdDsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZyb250ZW5kPihmcm9udGVuZCwgaWQpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5MbmIoaW50IGxuYkhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkxuYihpbnQgbG5iSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgewogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKICAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElMbmI+IGxuYjsKLSAgICBpbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShsbmJIYW5kbGUsIExOQik7Ci0gICAgbVR1bmVyLT5vcGVuTG5iQnlJZChpZCwgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElMbmI+JiBsbmJTcCl7Ci0gICAgICAgIGxuYiA9IGxuYlNwOwotICAgICAgICBzdGF0dXMgPSByZXN1bHQ7Ci0gICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHNoYXJlZF9wdHI8SUxuYj4gbG5iOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShsbmJIYW5kbGUsIExOQik7CisgICAgYXV0byBzdGF0dXMgPSBtVHVuZXItPm9wZW5MbmJCeUlkKGlkLCAmbG5iKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJMbmI+KGxuYiwgaWQpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckxuYj4obG5iLCBpZCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuTG5iQnlOYW1lKGNvbnN0IHN0cmluZyYgbG5iTmFtZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGxuYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAoIWhhc0lUdW5lcigpKSB7CiAgICAgICAgIEFMT0dFKCJnZXQgSVR1bmVyIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgaW50IGxuYklkOwotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SUxuYj4gbG5iOwotICAgIG1UdW5lci0+b3BlbkxuYkJ5TmFtZShsbmJOYW1lLCBbJl0oUmVzdWx0IHIsIExuYklkIGlkLCBjb25zdCBzcDxJTG5iPiYgbG5iU3ApIHsKLSAgICAgICAgc3RhdHVzID0gcjsKLSAgICAgICAgbG5iID0gbG5iU3A7Ci0gICAgICAgIGxuYklkID0gKGludClpZDsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgdmVjdG9yPGludDMyX3Q+IGlkOworICAgIHNoYXJlZF9wdHI8SUxuYj4gbG5iOworICAgIGF1dG8gc3RhdHVzID0gbVR1bmVyLT5vcGVuTG5iQnlOYW1lKGxuYk5hbWUsICZpZCwgJmxuYik7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyTG5iPihsbmIsIGlkWzBdKTsKICAgICB9CiAKLSAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJMbmI+KGxuYiwgbG5iSWQpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCAvKmRlc2NyYW1ibGVySGFuZGxlKi8sCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkRlc2NyYW1ibGVyKGludDMyX3QgLypkZXNjcmFtYmxlckhhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgewogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKICAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXI7Ci0gICAgLy9pbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShkZXNjcmFtYmxlckhhbmRsZSwgREVTQ1JBTUJMRVIpOwotICAgIG1UdW5lci0+b3BlbkRlc2NyYW1ibGVyKFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURlc2NyYW1ibGVyPiYgZGVzY3JhbWJsZXJTcCkgewotICAgICAgICBzdGF0dXMgPSByOwotICAgICAgICBkZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyU3A7Ci0gICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHNoYXJlZF9wdHI8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKKyAgICAvLyBpbnQgaWQgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoZGVzY3JhbWJsZXJIYW5kbGUsIERFU0NSQU1CTEVSKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1UdW5lci0+b3BlbkRlc2NyYW1ibGVyKCZkZXNjcmFtYmxlcik7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRGVzY3JhbWJsZXI+KGRlc2NyYW1ibGVyKTsKICAgICB9CiAKLSAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZXNjcmFtYmxlcj4oZGVzY3JhbWJsZXIpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRUdW5lckhhbFZlcnNpb24oaW50KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBoYXNJVHVuZXIoKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbVR1bmVyVmVyc2lvbjsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlblNoYXJlZEZpbHRlcihjb25zdCBzdHJpbmcmIGluX2ZpbHRlclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzU2hhcmVkRmlsdGVyUGVybWlzc2lvbikpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19UVl9TSEFSRURfRklMVEVSIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKyAgICBpZiAobVNoYXJlZEZpbHRlcnMuZmluZChpbl9maWx0ZXJUb2tlbikgPT0gbVNoYXJlZEZpbHRlcnMuZW5kKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJmYWlsIHRvIGZpbmQgJXMiLCBpbl9maWx0ZXJUb2tlbi5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgc2hhcmVkX3B0cjxUdW5lckZpbHRlcj4gZmlsdGVyID0gbVNoYXJlZEZpbHRlcnMuYXQoaW5fZmlsdGVyVG9rZW4pOworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoIWZpbHRlci0+aXNTaGFyZWRGaWx0ZXJBbGxvd2VkKHBpZCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJzaGFyZWQgZmlsdGVyICVzIGlzIG9wZW5lZCBpbiB0aGUgc2FtZSBwcm9jZXNzIiwgaW5fZmlsdGVyVG9rZW4uY19zdHIoKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIGZpbHRlci0+YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soaW5fY2IpOworCisgICAgKl9haWRsX3JldHVybiA9IGZpbHRlcjsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6c2V0TG5hKGJvb2wgYkVuYWJsZSkgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbVR1bmVyLT5zZXRMbmEoYkVuYWJsZSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6c2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoRnJvbnRlbmRUeXBlIGluX2Zyb250ZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbl9tYXhOdW1iZXIpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dEKCJnZXQgSVR1bmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1UdW5lci0+c2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoaW5fZnJvbnRlbmRUeXBlLCBpbl9tYXhOdW1iZXIpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSBpbl9mcm9udGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbVR1bmVyLT5nZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhpbl9mcm9udGVuZFR5cGUsIF9haWRsX3JldHVybik7Cit9CisKK3N0cmluZyBUdW5lclNlcnZpY2U6OmFkZEZpbHRlclRvU2hhcmVkKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKworICAgIC8vIFVzZSBzaGFyZWRGaWx0ZXIgYWRkcmVzcyBhcyB0b2tlbi4KKyAgICBzdHJpbmcgdG9rZW4gPSB0b19zdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oc2hhcmVkRmlsdGVyLmdldCgpKSk7CisgICAgbVNoYXJlZEZpbHRlcnNbdG9rZW5dID0gc2hhcmVkRmlsdGVyOworICAgIHJldHVybiB0b2tlbjsKK30KKwordm9pZCBUdW5lclNlcnZpY2U6OnJlbW92ZVNoYXJlZEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPFR1bmVyRmlsdGVyPiYgc2hhcmVkRmlsdGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TaGFyZWRGaWx0ZXJzTG9jayk7CisKKyAgICAvLyBVc2Ugc2hhcmVkRmlsdGVyIGFkZHJlc3MgYXMgdG9rZW4uCisgICAgbVNoYXJlZEZpbHRlcnMuZXJhc2UodG9fc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KHNoYXJlZEZpbHRlci5nZXQoKSkpKTsKIH0KIAogdm9pZCBUdW5lclNlcnZpY2U6OnVwZGF0ZVR1bmVyUmVzb3VyY2VzKCkgewotICAgIGlmICghaGFzSVR1bmVyKCkgfHwgbVR1bmVyUmVzb3VyY2VNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gdXBkYXRlVHVuZXJSZXNvdXJjZXMiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHVwZGF0ZUZyb250ZW5kUmVzb3VyY2VzKCk7Ci0gICAgdXBkYXRlTG5iUmVzb3VyY2VzKCk7Ci0gICAgLy8gVE9ETzogdXBkYXRlIERlbXV4LCBEZXNjcmFtYmxlci4KKyAgICBUdW5lckhlbHBlcjo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoZ2V0VFJNRnJvbnRlbmRJbmZvcygpLCBnZXRUUk1MbmJIYW5kbGVzKCkpOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRUdW5lckhhbFZlcnNpb24oaW50KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBoYXNJVHVuZXIoKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gbVR1bmVyVmVyc2lvbjsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi12b2lkIFR1bmVyU2VydmljZTo6dXBkYXRlRnJvbnRlbmRSZXNvdXJjZXMoKSB7Ci0gICAgaGlkbF92ZWM8RnJvbnRlbmRJZD4gaWRzOwotICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJZHMoaWRzKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm47Ci0gICAgfQordmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiBUdW5lclNlcnZpY2U6OmdldFRSTUZyb250ZW5kSW5mb3MoKSB7CiAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiBpbmZvczsKKyAgICB2ZWN0b3I8aW50MzJfdD4gaWRzOworICAgIGF1dG8gc3RhdHVzID0gbVR1bmVyLT5nZXRGcm9udGVuZElkcygmaWRzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGluZm9zOworICAgIH0KKwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEZyb250ZW5kSW5mbyBmcm9udGVuZEluZm87Ci0gICAgICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJbmZvKChpbnQpaWRzW2ldLCBmcm9udGVuZEluZm8pOwotICAgICAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICBhdXRvIHJlcyA9IG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGlkc1tpXSwgJmZyb250ZW5kSW5mbyk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgVHVuZXJGcm9udGVuZEluZm8gdHVuZXJGcm9udGVuZEluZm97Ci0gICAgICAgICAgICAuaGFuZGxlID0gZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoKGludClpZHNbaV0sIEZST05URU5EKSwKLSAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8aW50Pihmcm9udGVuZEluZm8udHlwZSksCi0gICAgICAgICAgICAuZXhjbHVzaXZlR3JvdXBJZCA9IHN0YXRpY19jYXN0PGludD4oZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQpLAorICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoKGludClpZHNbaV0sIEZST05URU5EKSwKKyAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PGludD4oZnJvbnRlbmRJbmZvLnR5cGUpLAorICAgICAgICAgICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQsCiAgICAgICAgIH07CiAgICAgICAgIGluZm9zLnB1c2hfYmFjayh0dW5lckZyb250ZW5kSW5mbyk7CiAgICAgfQotICAgIG1UdW5lclJlc291cmNlTWFuYWdlci0+c2V0RnJvbnRlbmRJbmZvTGlzdChpbmZvcyk7CisKKyAgICByZXR1cm4gaW5mb3M7CiB9CiAKLXZvaWQgVHVuZXJTZXJ2aWNlOjp1cGRhdGVMbmJSZXNvdXJjZXMoKSB7Ci0gICAgdmVjdG9yPGludD4gaGFuZGxlcyA9IGdldExuYkhhbmRsZXMoKTsKLSAgICBpZiAoaGFuZGxlcy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1UdW5lclJlc291cmNlTWFuYWdlci0+c2V0TG5iSW5mb0xpc3QoaGFuZGxlcyk7Ci19Ci0KLXZlY3RvcjxpbnQ+IFR1bmVyU2VydmljZTo6Z2V0TG5iSGFuZGxlcygpIHsKLSAgICB2ZWN0b3I8aW50PiBsbmJIYW5kbGVzOwotICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgewotICAgICAgICBSZXN1bHQgcmVzOwotICAgICAgICB2ZWN0b3I8TG5iSWQ+IGxuYklkczsKLSAgICAgICAgbVR1bmVyLT5nZXRMbmJJZHMoWyZdKFJlc3VsdCByLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8TG5iSWQ+JiBpZHMpIHsKLSAgICAgICAgICAgIGxuYklkcyA9IGlkczsKLSAgICAgICAgICAgIHJlcyA9IHI7Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUyB8fCBsbmJJZHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgfSBlbHNlIHsKK3ZlY3RvcjxpbnQzMl90PiBUdW5lclNlcnZpY2U6OmdldFRSTUxuYkhhbmRsZXMoKSB7CisgICAgdmVjdG9yPGludDMyX3Q+IGxuYkhhbmRsZXM7CisgICAgaWYgKG1UdW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIHZlY3RvcjxpbnQzMl90PiBsbmJJZHM7CisgICAgICAgIGF1dG8gcmVzID0gbVR1bmVyLT5nZXRMbmJJZHMoJmxuYklkcyk7CisgICAgICAgIGlmIChyZXMuaXNPaygpKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxuYklkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGxuYkhhbmRsZXMucHVzaF9iYWNrKGdldFJlc291cmNlSGFuZGxlRnJvbUlkKChpbnQpbG5iSWRzW2ldLCBMTkIpKTsKKyAgICAgICAgICAgICAgICBsbmJIYW5kbGVzLnB1c2hfYmFjayhUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQobG5iSWRzW2ldLCBMTkIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4NCwxODYgKzM1Nyw4IEBACiAgICAgcmV0dXJuIGxuYkhhbmRsZXM7CiB9CiAKLVJlc3VsdCBUdW5lclNlcnZpY2U6OmdldEhpZGxGcm9udGVuZElkcyhoaWRsX3ZlYzxGcm9udGVuZElkPiYgaWRzKSB7Ci0gICAgaWYgKG1UdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICB9Ci0gICAgUmVzdWx0IHJlczsKLSAgICBtVHVuZXItPmdldEZyb250ZW5kSWRzKFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RnJvbnRlbmRJZD4mIGZyb250ZW5kSWRzKSB7Ci0gICAgICAgIGlkcyA9IGZyb250ZW5kSWRzOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIHJldHVybiByZXM7Ci19Ci0KLVJlc3VsdCBUdW5lclNlcnZpY2U6OmdldEhpZGxGcm9udGVuZEluZm8oaW50IGlkLCBGcm9udGVuZEluZm8mIGluZm8pIHsKLSAgICBpZiAobVR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIH0KLSAgICBSZXN1bHQgcmVzOwotICAgIG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGlkLCBbJl0oUmVzdWx0IHIsIGNvbnN0IEZyb250ZW5kSW5mbyYgZmVJbmZvKSB7Ci0gICAgICAgIGluZm8gPSBmZUluZm87Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotVHVuZXJEZW11eENhcGFiaWxpdGllcyBUdW5lclNlcnZpY2U6OmdldEFpZGxEZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMgY2FwcykgewotICAgIFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMgYWlkbENhcHN7Ci0gICAgICAgIC5udW1EZW11eCA9IChpbnQpY2Fwcy5udW1EZW11eCwKLSAgICAgICAgLm51bVJlY29yZCA9IChpbnQpY2Fwcy5udW1SZWNvcmQsCi0gICAgICAgIC5udW1QbGF5YmFjayA9IChpbnQpY2Fwcy5udW1QbGF5YmFjaywKLSAgICAgICAgLm51bVRzRmlsdGVyID0gKGludCljYXBzLm51bVRzRmlsdGVyLAotICAgICAgICAubnVtU2VjdGlvbkZpbHRlciA9IChpbnQpY2Fwcy5udW1TZWN0aW9uRmlsdGVyLAotICAgICAgICAubnVtQXVkaW9GaWx0ZXIgPSAoaW50KWNhcHMubnVtQXVkaW9GaWx0ZXIsCi0gICAgICAgIC5udW1WaWRlb0ZpbHRlciA9IChpbnQpY2Fwcy5udW1WaWRlb0ZpbHRlciwKLSAgICAgICAgLm51bVBlc0ZpbHRlciA9IChpbnQpY2Fwcy5udW1QZXNGaWx0ZXIsCi0gICAgICAgIC5udW1QY3JGaWx0ZXIgPSAoaW50KWNhcHMubnVtUGNyRmlsdGVyLAotICAgICAgICAubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIgPSAoaW50KWNhcHMubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIsCi0gICAgICAgIC5maWx0ZXJDYXBzID0gKGludCljYXBzLmZpbHRlckNhcHMsCi0gICAgICAgIC5iVGltZUZpbHRlciA9IGNhcHMuYlRpbWVGaWx0ZXIsCi0gICAgfTsKLSAgICBhaWRsQ2Fwcy5saW5rQ2Fwcy5yZXNpemUoY2Fwcy5saW5rQ2Fwcy5zaXplKCkpOwotICAgIGNvcHkoY2Fwcy5saW5rQ2Fwcy5iZWdpbigpLCBjYXBzLmxpbmtDYXBzLmVuZCgpLCBhaWRsQ2Fwcy5saW5rQ2Fwcy5iZWdpbigpKTsKLSAgICByZXR1cm4gYWlkbENhcHM7Ci19Ci0KLVR1bmVyRnJvbnRlbmRJbmZvIFR1bmVyU2VydmljZTo6Y29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhGcm9udGVuZEluZm8gaGFsSW5mbykgewotICAgIFR1bmVyRnJvbnRlbmRJbmZvIGluZm97Ci0gICAgICAgIC50eXBlID0gKGludCloYWxJbmZvLnR5cGUsCi0gICAgICAgIC5taW5GcmVxdWVuY3kgPSAoaW50KWhhbEluZm8ubWluRnJlcXVlbmN5LAotICAgICAgICAubWF4RnJlcXVlbmN5ID0gKGludCloYWxJbmZvLm1heEZyZXF1ZW5jeSwKLSAgICAgICAgLm1pblN5bWJvbFJhdGUgPSAoaW50KWhhbEluZm8ubWluU3ltYm9sUmF0ZSwKLSAgICAgICAgLm1heFN5bWJvbFJhdGUgPSAoaW50KWhhbEluZm8ubWF4U3ltYm9sUmF0ZSwKLSAgICAgICAgLmFjcXVpcmVSYW5nZSA9IChpbnQpaGFsSW5mby5hY3F1aXJlUmFuZ2UsCi0gICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gKGludCloYWxJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQsCi0gICAgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbEluZm8uc3RhdHVzQ2Fwcy5zaXplKCk7IGkrKykgewotICAgICAgICBpbmZvLnN0YXR1c0NhcHMucHVzaF9iYWNrKChpbnQpaGFsSW5mby5zdGF0dXNDYXBzW2ldKTsKLSAgICB9Ci0KLSAgICBUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzIGNhcHM7Ci0gICAgc3dpdGNoIChoYWxJbmZvLnR5cGUpIHsKLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkFOQUxPRzogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YW5hbG9nQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIGFuYWxvZ0NhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC50eXBlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hbmFsb2dDYXBzKCkudHlwZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLnNpZlN0YW5kYXJkQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hbmFsb2dDYXBzKCkuc2lmU3RhbmRhcmRDYXAsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjphbmFsb2dDYXBzPihhbmFsb2dDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpBVFNDOiB7Ci0gICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcyBhdHNjQ2Fwc3sKLSAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2NDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmF0c2NDYXBzPihhdHNjQ2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6QVRTQzM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMgYXRzYzNDYXBzewotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5iYW5kd2lkdGhDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAudGltZUludGVybGVhdmVNb2RlQ2FwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLnRpbWVJbnRlcmxlYXZlTW9kZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5jb2RlUmF0ZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmRlbW9kT3V0cHV0Rm9ybWF0Q2FwCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZGVtb2RPdXRwdXRGb3JtYXRDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5mZWNDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmZlY0NhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmF0c2MzQ2Fwcz4oYXRzYzNDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpEVkJDOiB7Ci0gICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgY2FibGVDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50NjRfdCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLmZlY0NhcCwKLSAgICAgICAgICAgICAgICAgICAgLmFubmV4Q2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLmFubmV4Q2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6Y2FibGVDYXBzPihjYWJsZUNhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkRWQlM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnNDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzIGR2YnNDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAobG9uZyloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLmlubmVyZmVjQ2FwLAotICAgICAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuc3RhbmRhcmQsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJzQ2Fwcz4oZHZic0NhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkRWQlQ6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnRDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIGR2YnRDYXBzewotICAgICAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS50cmFuc21pc3Npb25Nb2RlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmJhbmR3aWR0aENhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuY29uc3RlbGxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvZGVyYXRlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuaGllcmFyY2h5Q2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmhpZXJhcmNoeUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuZ3VhcmRJbnRlcnZhbENhcCwKLSAgICAgICAgICAgICAgICAgICAgLmlzVDJTdXBwb3J0ZWQgPSAoYm9vbCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzVDJTdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgIC5pc01pc29TdXBwb3J0ZWQgPSAoYm9vbCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzTWlzb1N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmR2YnRDYXBzPihkdmJ0Q2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgaXNkYnNDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnNDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2Ric0NhcHMoKS5jb2RlcmF0ZUNhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJzQ2Fwcz4oaXNkYnNDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpJU0RCUzM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzM0NhcHMKLSAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyBpc2RiczNDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnMzQ2FwcygpLm1vZHVsYXRpb25DYXAsCi0gICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnMzQ2FwcygpLmNvZGVyYXRlQ2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnMzQ2Fwcz4oaXNkYnMzQ2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlQ6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0Q2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgaXNkYnRDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkubW9kZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuYmFuZHdpZHRoQ2FwLAotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5jb2RlcmF0ZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXAsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2RidENhcHM+KGlzZGJ0Q2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaW5mby5jYXBzID0gY2FwczsKLSAgICByZXR1cm4gaW5mbzsKLX0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaAppbmRleCBmOGUyZWU2Li43ZmMyYWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDE0MSArMTcsOTUgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSU0VSVklDRV9ICiAKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvSVR1bmVyUmVzb3VyY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRXZlbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSVR1bmVyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8Zm1xL0FpZGxNZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lcnJlc291cmNlbWFuYWdlci9UdW5lckZyb250ZW5kSW5mby5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpHcmFudG9yRGVzY3JpcHRvcjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJVHVuZXI7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJTZXJ2aWNlOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEZW11eDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyQ2FsbGJhY2s7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJMbmI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRGVtdXhDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSW5mbzsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6SVR1bmVyUmVzb3VyY2VNYW5hZ2VyOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpsb2dFcnJvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eENhcGFiaWxpdGllczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlc2NyYW1ibGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUdW5lcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwotCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6VHVuZXJGcm9udGVuZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fVU5LTk9XTiA9IDA7Ci1jb25zdCBzdGF0aWMgaW50IFRVTkVSX0hBTF9WRVJTSU9OXzFfMCA9IDEgPDwgMTY7Ci1jb25zdCBzdGF0aWMgaW50IFRVTkVSX0hBTF9WRVJTSU9OXzFfMSA9ICgxIDw8IDE2KSB8IDE7Ci0vLyBTeXN0ZW0gRmVhdHVyZSBkZWZpbmVkIGluIFBhY2thZ2VNYW5hZ2VyCi1zdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiBGRUFUVVJFX1RVTkVSKDo6YW5kcm9pZDo6U3RyaW5nMTYoImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIiKSk7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgRlJPTlRFTkQsCi0gICAgTE5CLAotICAgIERFTVVYLAotICAgIERFU0NSQU1CTEVSLAotfSBUdW5lclJlc291cmNlVHlwZTsKLQotc3RydWN0IEZpbHRlckNhbGxiYWNrIDogcHVibGljIElGaWx0ZXJDYWxsYmFjayB7Ci0gICAgfkZpbHRlckNhbGxiYWNrKCkge30KLSAgICBSZXR1cm48dm9pZD4gb25GaWx0ZXJFdmVudChjb25zdCBEZW11eEZpbHRlckV2ZW50JikgewotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLSAgICBSZXR1cm48dm9pZD4gb25GaWx0ZXJTdGF0dXMoY29uc3QgRGVtdXhGaWx0ZXJTdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci19OworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lclNlcnZpY2UgOiBwdWJsaWMgQm5UdW5lclNlcnZpY2UgewotICAgIHR5cGVkZWYgQWlkbE1lc3NhZ2VRdWV1ZTxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4gQWlkbE1lc3NhZ2VRdWV1ZTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBIaWRsTWVzc2FnZVF1ZXVlOwotICAgIHR5cGVkZWYgTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPiBBaWRsTVFEZXNjOwotCiBwdWJsaWM6CiAgICAgc3RhdGljIGNoYXIgY29uc3QgKmdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnR1bmVyIjsgfQogICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgaW5zdGFudGlhdGUoKTsKICAgICBUdW5lclNlcnZpY2UoKTsKICAgICB2aXJ0dWFsIH5UdW5lclNlcnZpY2UoKTsKIAotICAgIFN0YXR1cyBnZXRGcm9udGVuZElkcyh2ZWN0b3I8aW50MzJfdD4qIGlkcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldEZyb250ZW5kSW5mbyhpbnQzMl90IGlkLCBUdW5lckZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgaW50MzJfdCBpZCwgVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5Gcm9udGVuZCgKLSAgICAgICAgICAgIGludDMyX3QgZnJvbnRlbmRIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuTG5iKGludCBsbmJIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgb3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGxuYk5hbWUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgb3BlbkRlbXV4KGludDMyX3QgZGVtdXhIYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZW11eD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldERlbXV4Q2FwcyhUdW5lckRlbXV4Q2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCBkZXNjcmFtYmxlckhhbmRsZSwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFR1bmVySGFsVmVyc2lvbihpbnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBvdXRfaWRzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpbl9mcm9udGVuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5Gcm9udGVuZChpbnQzMl90IGluX2Zyb250ZW5kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuTG5iKGludDMyX3QgaW5fbG5iSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5MbmJCeU5hbWUoY29uc3Qgc3RyaW5nJiBpbl9sbmJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5EZW11eChpbnQzMl90IGluX2RlbXV4SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXREZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkRlc2NyYW1ibGVyKGludDMyX3QgaW5fZGVzY3JhbWJsZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFR1bmVySGFsVmVyc2lvbihpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5TaGFyZWRGaWx0ZXIoY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmEoYm9vbCBpbl9iRW5hYmxlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fbWF4TnVtYmVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICAvLyBUT0RPOiBjcmVhdGUgYSBtYXAgYmV0d2VlbiByZXNvdXJjZSBpZCBhbmQgaGFuZGxlcy4KLSAgICBzdGF0aWMgaW50IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGludCByZXNvdXJjZUhhbmRsZSwgaW50IC8qdHlwZSovKSB7Ci0gICAgICAgIHJldHVybiAocmVzb3VyY2VIYW5kbGUgJiAweDAwZmYwMDAwKSA+PiAxNjsKLSAgICB9CisgICAgc3RyaW5nIGFkZEZpbHRlclRvU2hhcmVkKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOworICAgIHZvaWQgcmVtb3ZlU2hhcmVkRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOwogCi0gICAgaW50IGdldFJlc291cmNlSGFuZGxlRnJvbUlkKGludCBpZCwgaW50IHJlc291cmNlVHlwZSkgewotICAgICAgICAvLyBUT0RPOiBidWlsZCB1cCByYW5kb21seSBnZW5lcmF0ZWQgaWQgdG8gaGFuZGxlIG1hcHBpbmcKLSAgICAgICAgcmV0dXJuIChyZXNvdXJjZVR5cGUgJiAweDAwMDAwMGZmKSA8PCAyNAotICAgICAgICAgICAgICAgIHwgKGlkIDw8IDE2KQotICAgICAgICAgICAgICAgIHwgKG1SZXNvdXJjZVJlcXVlc3RDb3VudCsrICYgMHhmZmZmKTsKLSAgICB9CisgICAgc3RhdGljIHNoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBnZXRUdW5lclNlcnZpY2UoKTsKIAogcHJpdmF0ZToKICAgICBib29sIGhhc0lUdW5lcigpOwotICAgIGJvb2wgaGFzSVR1bmVyXzFfMSgpOwogICAgIHZvaWQgdXBkYXRlVHVuZXJSZXNvdXJjZXMoKTsKKyAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGdldFRSTUZyb250ZW5kSW5mb3MoKTsKKyAgICB2ZWN0b3I8aW50MzJfdD4gZ2V0VFJNTG5iSGFuZGxlcygpOwogCi0gICAgdm9pZCB1cGRhdGVGcm9udGVuZFJlc291cmNlcygpOwotICAgIHZvaWQgdXBkYXRlTG5iUmVzb3VyY2VzKCk7Ci0gICAgUmVzdWx0IGdldEhpZGxGcm9udGVuZElkcyhoaWRsX3ZlYzxGcm9udGVuZElkPiYgaWRzKTsKLSAgICBSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSW5mbyhpbnQgaWQsIEZyb250ZW5kSW5mbyYgaW5mbyk7Ci0gICAgdmVjdG9yPGludD4gZ2V0TG5iSGFuZGxlcygpOwotCi0gICAgVHVuZXJEZW11eENhcGFiaWxpdGllcyBnZXRBaWRsRGVtdXhDYXBzKERlbXV4Q2FwYWJpbGl0aWVzIGNhcHMpOwotICAgIFR1bmVyRnJvbnRlbmRJbmZvIGNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oRnJvbnRlbmRJbmZvIGhhbEluZm8pOwotCi0gICAgc3A8SVR1bmVyPiBtVHVuZXI7Ci0gICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI+IG1UdW5lcl8xXzE7Ci0KLSAgICBzaGFyZWRfcHRyPElUdW5lclJlc291cmNlTWFuYWdlcj4gbVR1bmVyUmVzb3VyY2VNYW5hZ2VyOwotICAgIGludCBtUmVzb3VyY2VSZXF1ZXN0Q291bnQgPSAwOwotCisgICAgc2hhcmVkX3B0cjxJVHVuZXI+IG1UdW5lcjsKICAgICBpbnQgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OX1VOS05PV047CisgICAgTXV0ZXggbVNoYXJlZEZpbHRlcnNMb2NrOworICAgIG1hcDxzdHJpbmcsIHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+PiBtU2hhcmVkRmlsdGVyczsKKworICAgIHN0YXRpYyBzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gc1R1bmVyU2VydmljZTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5jcHAKaW5kZXggZWE5ZGEzMC4uNzNjZDZiNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuY3BwCkBAIC0xOCw5NyArMTgsOTEgQEAKIAogI2luY2x1ZGUgIlR1bmVyVGltZUZpbHRlci5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6Q29uc3RhbnQ2NEJpdDsKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQ29uc3RhbnQ2NEJpdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpDb25zdGFudDY0Qml0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJUaW1lRmlsdGVyOjpUdW5lclRpbWVGaWx0ZXIoc3A8SVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpIHsKK1R1bmVyVGltZUZpbHRlcjo6VHVuZXJUaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpIHsKICAgICBtVGltZUZpbHRlciA9IHRpbWVGaWx0ZXI7CiB9CiAKIFR1bmVyVGltZUZpbHRlcjo6flR1bmVyVGltZUZpbHRlcigpIHsKLSAgICBtVGltZUZpbHRlciA9IE5VTEw7CisgICAgbVRpbWVGaWx0ZXIgPSBudWxscHRyOwogfQogCi1TdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPnNldFRpbWVTdGFtcCh0aW1lU3RhbXApOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbVRpbWVGaWx0ZXItPnNldFRpbWVTdGFtcCh0aW1lU3RhbXApOwogfQogCi1TdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpjbGVhclRpbWVTdGFtcCgpIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpjbGVhclRpbWVTdGFtcCgpIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPmNsZWFyVGltZVN0YW1wKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtVGltZUZpbHRlci0+Y2xlYXJUaW1lU3RhbXAoKTsKIH0KIAotU3RhdHVzIFR1bmVyVGltZUZpbHRlcjo6Z2V0U291cmNlVGltZShpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOwogICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIG1UaW1lRmlsdGVyLT5nZXRTb3VyY2VUaW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKLSAgICAgICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gdDsKLSAgICAgICAgICAgIH0pOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgYXV0byBzdGF0dXMgPSBtVGltZUZpbHRlci0+Z2V0U291cmNlVGltZShfYWlkbF9yZXR1cm4pOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgbVRpbWVGaWx0ZXItPmdldFRpbWVTdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHQ7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgIGF1dG8gc3RhdHVzID0gbVRpbWVGaWx0ZXItPmdldFRpbWVTdGFtcChfYWlkbF9yZXR1cm4pOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsb3NlKCkgewotICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsb3NlKCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKLSAgICBtVGltZUZpbHRlciA9IE5VTEw7CisgICAgYXV0byBzdGF0dXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKKyAgICBtVGltZUZpbHRlciA9IG51bGxwdHI7CiAKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oCmluZGV4IGQ2NzUzMTkuLjMxYTQ3Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oCkBAIC0xNywzOCArMTcsNDAgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkZUSU1FRklMVEVSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkZUSU1FRklMVEVSX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JVGltZUZpbHRlci5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyVGltZUZpbHRlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUaW1lRmlsdGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lclRpbWVGaWx0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUaW1lRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJVGltZUZpbHRlcjsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lclRpbWVGaWx0ZXIgOiBwdWJsaWMgQm5UdW5lclRpbWVGaWx0ZXIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJUaW1lRmlsdGVyKHNwPElUaW1lRmlsdGVyPiB0aW1lRmlsdGVyKTsKKyAgICBUdW5lclRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVGltZUZpbHRlcj4gdGltZUZpbHRlcik7CiAgICAgdmlydHVhbCB+VHVuZXJUaW1lRmlsdGVyKCk7Ci0gICAgU3RhdHVzIHNldFRpbWVTdGFtcChpbnQ2NF90IHRpbWVTdGFtcCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsZWFyVGltZVN0YW1wKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFNvdXJjZVRpbWUoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0VGltZVN0YW1wKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRUaW1lU3RhbXAoaW50NjRfdCBpbl90aW1lU3RhbXApIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsZWFyVGltZVN0YW1wKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U291cmNlVGltZShpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgc3A8SVRpbWVGaWx0ZXI+IG1UaW1lRmlsdGVyOworICAgIHNoYXJlZF9wdHI8SVRpbWVGaWx0ZXI+IG1UaW1lRmlsdGVyOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSRlRJTUVGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di9PV05FUlMKaW5kZXggMGNlYjhlOC4uYmY5ZmUzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUworKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvT1dORVJTCkBAIC0xLDIgKzEsMiBAQAotbmNoYWxrb0Bnb29nbGUuY29tCitoZ2NoZW5AZ29vZ2xlLmNvbQogcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlbXV4LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbAppbmRleCA3M2IwMGFlLi5mYTMyNmIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbApAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4RmlsdGVyVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkR2clR5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEdnI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEdnJDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKQEAgLTM2LDEwICszOCwxNSBAQAogICAgIHZvaWQgc2V0RnJvbnRlbmREYXRhU291cmNlKGluIElUdW5lckZyb250ZW5kIGZyb250ZW5kKTsKIAogICAgIC8qKgorICAgICAqIFNldCBhIGZyb250ZW5kIHJlc291cmNlIGJ5IElEIGFzIGRhdGEgaW5wdXQgb2YgdGhlIGRlbXV4CisgICAgICovCisgICAgdm9pZCBzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGluIGludCBmcm9udGVuZElkKTsKKworICAgIC8qKgogICAgICAqIE9wZW4gYSBuZXcgZmlsdGVyIGluIHRoZSBkZW11eAogICAgICAqLwotICAgIElUdW5lckZpbHRlciBvcGVuRmlsdGVyKAotICAgICAgICBpbiBpbnQgbWFpblR5cGUsIGluIGludCBzdWJ0eXBlLCBpbiBpbnQgYnVmZmVyU2l6ZSwgaW4gSVR1bmVyRmlsdGVyQ2FsbGJhY2sgY2IpOworICAgIElUdW5lckZpbHRlciBvcGVuRmlsdGVyKGluIERlbXV4RmlsdGVyVHlwZSB0eXBlLCBpbiBpbnQgYnVmZmVyU2l6ZSwKKyAgICAgICAgaW4gSVR1bmVyRmlsdGVyQ2FsbGJhY2sgY2IpOwogCiAgICAgLyoqCiAgICAgICogT3BlbiB0aW1lIGZpbHRlciBvZiB0aGUgZGVtdXguCkBAIC01OSw3ICs2Niw3IEBACiAgICAgLyoqCiAgICAgICogT3BlbiBhIERWUiAoRGlnaXRhbCBWaWRlbyBSZWNvcmQpIGluc3RhbmNlIGluIHRoZSBkZW11eC4KICAgICAgKi8KLSAgICBJVHVuZXJEdnIgb3BlbkR2cihpbiBpbnQgZHZiVHlwZSwgaW4gaW50IGJ1ZmZlclNpemUsIGluIElUdW5lckR2ckNhbGxiYWNrIGNiKTsKKyAgICBJVHVuZXJEdnIgb3BlbkR2cihpbiBEdnJUeXBlIGR2YlR5cGUsIGluIGludCBidWZmZXJTaXplLCBpbiBJVHVuZXJEdnJDYWxsYmFjayBjYik7CiAKICAgICAvKioKICAgICAgKiBDb25uZWN0IENvbmRpdGlvbmFsIEFjY2VzcyBNb2R1bGVzIChDQU0pIHRocm91Z2ggQ29tbW9uIEludGVyZmFjZSAoQ0kpLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlc2NyYW1ibGVyLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbAppbmRleCA3MzcwZWVlLi4zOWQxOTNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbApAQCAtMTYsOSArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4UGlkOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRGVtdXg7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4UGlkOwogCiAvKioKICAqIFR1bmVyIERlbXV4IGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KQEAgLTM5LDEyICszOSwxMiBAQAogICAgIC8qKgogICAgICAqIEFkZCBwYWNrZXRzJyBQSUQgdG8gdGhlIGRlc2NyYW1ibGVyIGZvciBkZXNjcmFtYmxpbmcuCiAgICAgICovCi0gICAgdm9pZCBhZGRQaWQoaW4gVHVuZXJEZW11eFBpZCBwaWQsIGluIElUdW5lckZpbHRlciBvcHRpb25hbFNvdXJjZUZpbHRlcik7CisgICAgdm9pZCBhZGRQaWQoaW4gRGVtdXhQaWQgcGlkLCBpbiBJVHVuZXJGaWx0ZXIgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpOwogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIHBhY2tldHMnIFBJRCBmcm9tIHRoZSBkZXNjcmFtYmxlci4KICAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVBpZChpbiBUdW5lckRlbXV4UGlkIHBpZCwgaW4gSVR1bmVyRmlsdGVyIG9wdGlvbmFsU291cmNlRmlsdGVyKTsKKyAgICB2b2lkIHJlbW92ZVBpZChpbiBEZW11eFBpZCBwaWQsIGluIElUdW5lckZpbHRlciBvcHRpb25hbFNvdXJjZUZpbHRlcik7CiAKICAgICAvKioKICAgICAgKiBDbG9zZSBhIG5ldyBpbnRlcmZhY2Ugb2YgSVR1bmVyRGVzY3JhbWJsZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyLmFpZGwKaW5kZXggOGYxNjAxYi4uMmMwMWM0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ci5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnIuYWlkbApAQCAtMTgsOCArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLk1RRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuU3luY2hyb25pemVkUmVhZFdyaXRlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRHZyU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckR2clNldHRpbmdzOwogCiAvKioKICAqIFR1bmVyIER2ciBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC0zNSw3ICszNSw3IEBACiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRoZSBEVlIuCiAgICAgICovCi0gICAgdm9pZCBjb25maWd1cmUoaW4gVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncyk7CisgICAgdm9pZCBjb25maWd1cmUoaW4gRHZyU2V0dGluZ3Mgc2V0dGluZ3MpOwogCiAgICAgLyoqCiAgICAgICogQXR0YWNoIG9uZSBmaWx0ZXIgdG8gRFZSIGludGVyZmFjZSBmb3IgcmVjb3JkaW5nLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ckNhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbAppbmRleCBlMjM0ZmU1Li4zMDQzZDI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbApAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLlBsYXliYWNrU3RhdHVzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuUmVjb3JkU3RhdHVzOworCiAvKioKICAqIFR1bmVyRHZyQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZHZyIHJlbGF0ZWQgY2FsbGJhY2tzLgogICoKQEAgLTI1LDEwICsyOCwxMCBAQAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IGEgbmV3IHN0YXR1cyBvZiB0aGUgZGVtdXgncyByZWNvcmQuCiAgICAgICovCi0gICAgdm9pZCBvblJlY29yZFN0YXR1cyhpbiBpbnQgc3RhdHVzKTsKKyAgICB2b2lkIG9uUmVjb3JkU3RhdHVzKGluIFJlY29yZFN0YXR1cyBzdGF0dXMpOwogCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgYSBuZXcgc3RhdHVzIG9mIHRoZSBkZW11eCdzIHBsYXliYWNrLgogICAgICAqLwotICAgIHZvaWQgb25QbGF5YmFja1N0YXR1cyhpbiBpbnQgc3RhdHVzKTsKKyAgICB2b2lkIG9uUGxheWJhY2tTdGF0dXMoaW4gUGxheWJhY2tTdGF0dXMgc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXIuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXIuYWlkbAppbmRleCAxMGQ0YzNiLi5kYzQwZjAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlci5haWRsCkBAIC0xOSw4ICsxOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5NUURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLlN5bmNocm9uaXplZFJlYWRXcml0ZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5OYXRpdmVIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm87CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5EZW11eEZpbHRlclNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuQXZTdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRmlsdGVyRGVsYXlIaW50OwogCiAvKioKICAqIFR1bmVyIEZpbHRlciBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC00NiwxMiArNDksMTIgQEAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgdGhlIGZpbHRlci4KICAgICAgKi8KLSAgICB2b2lkIGNvbmZpZ3VyZShpbiBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24gY29uZmlnKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShpbiBEZW11eEZpbHRlclNldHRpbmdzIHNldHRpbmdzKTsKIAogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZSB0aGUgbW9uaXRvciBldmVudCBvZiB0aGUgRmlsdGVyLgogICAgICAqLwotICAgIHZvaWQgY29uZmlndXJlTW9uaXRvckV2ZW50KGluIGludCBtb25pdG9yRXZlbnRUeXBlKTsKKyAgICB2b2lkIGNvbmZpZ3VyZU1vbml0b3JFdmVudChpbiBpbnQgbW9uaXRvckV2ZW50VHlwZXMpOwogCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRoZSBjb250ZXh0IGlkIG9mIHRoZSBJUCBGaWx0ZXIuCkBAIC02MSwxMiArNjQsMTIgQEAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgdGhlIHN0cmVhbSB0eXBlIG9mIHRoZSBtZWRpYSBGaWx0ZXIuCiAgICAgICovCi0gICAgdm9pZCBjb25maWd1cmVBdlN0cmVhbVR5cGUoaW4gaW50IGF2U3RyZWFtVHlwZSk7CisgICAgdm9pZCBjb25maWd1cmVBdlN0cmVhbVR5cGUoaW4gQXZTdHJlYW1UeXBlIGF2U3RyZWFtVHlwZSk7CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGEvdiBzaGFyZWQgbWVtb3J5IGhhbmRsZQogICAgICAqLwotICAgIFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyBnZXRBdlNoYXJlZEhhbmRsZUluZm8oKTsKKyAgICBsb25nIGdldEF2U2hhcmVkSGFuZGxlKG91dCBOYXRpdmVIYW5kbGUgYXZNZW1vcnkpOwogCiAgICAgLyoqCiAgICAgICogUmVsZWFzZSB0aGUgaGFuZGxlIHJlcG9ydGVkIGJ5IHRoZSBIQUwgZm9yIEFWIG1lbW9yeS4KQEAgLTk3LDQgKzEwMCwyOCBAQAogICAgICAqIENsb3NlIHRoZSBmaWx0ZXIuCiAgICAgICovCiAgICAgdm9pZCBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogQWNxdWlyZSBhIG5ldyBTaGFyZWRGaWx0ZXIgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgdG9rZW4gb2YgdGhlIG5ld2x5IGNyZWF0ZWQgU2hhcmVkRmlsdGVyIGluc3RhbmNlLgorICAgICAqLworICAgIFN0cmluZyBhY3F1aXJlU2hhcmVkRmlsdGVyVG9rZW4oKTsKKworICAgIC8qKgorICAgICAqIEZyZWUgYSBTaGFyZWRGaWx0ZXIgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyVG9rZW4gdGhlIFNoYXJlZEZpbHRlciB0b2tlbiB3aWxsIGJlIHJlbGVhc2VkLgorICAgICAqIEByZXR1cm4gYSB0b2tlbiBvZiB0aGUgbmV3bHkgY3JlYXRlZCBTaGFyZWRGaWx0ZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgdm9pZCBmcmVlU2hhcmVkRmlsdGVyVG9rZW4oaW4gU3RyaW5nIGZpbHRlclRva2VuKTsKKworICAgIC8qKgorICAgICAqIEdldCBmaWx0ZXIgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmlsdGVyIHR5cGUuCisgICAgICovCisgICAgRGVtdXhGaWx0ZXJUeXBlIGdldEZpbHRlclR5cGUoKTsKKworICAgIHZvaWQgc2V0RGVsYXlIaW50KGluIEZpbHRlckRlbGF5SGludCBoaW50KTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXJDYWxsYmFjay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwKaW5kZXggZTdhNTJhNy4uNmM1MzA0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwKQEAgLTE2LDcgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlckV2ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4RmlsdGVyU3RhdHVzOwogCiAvKioKICAqIFR1bmVyRmlsdGVyQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZmlsdGVyIHJlbGF0ZWQgY2FsbGJhY2tzLgpAQCAtMjcsMTAgKzI4LDEwIEBACiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgYSBuZXcgc3RhdHVzIG9mIGEgZmlsdGVyLgogICAgICAqLwotICAgIHZvaWQgb25GaWx0ZXJTdGF0dXMoaW50IHN0YXR1cyk7CisgICAgdm9pZCBvbkZpbHRlclN0YXR1cyhpbiBEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpOwogCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgdGhhdCBhIG5ldyBmaWx0ZXIgZXZlbnQgaGFwcGVuZWQuCiAgICAgICovCi0gICAgdm9pZCBvbkZpbHRlckV2ZW50KGluIFR1bmVyRmlsdGVyRXZlbnRbXSBmaWx0ZXJFdmVudCk7CisgICAgdm9pZCBvbkZpbHRlckV2ZW50KGluIERlbXV4RmlsdGVyRXZlbnRbXSBldmVudHMpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbAppbmRleCBlZjAyNTVhLi4wNDkzZjA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxMCArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwogCitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFNjYW5UeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kU3RhdHVzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFN0YXR1c1R5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGcm9udGVuZENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyTG5iOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFN0YXR1czsKIAogLyoqCiAgKiBUdW5lciBGcm9udGVuZCBpbnRlcmZhY2UgaGFuZGxlcyBmcm9udGVuZCByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC0zOSw3ICs0Miw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc2V0dGluZ3MgdGhlIHNldHRpbmdzIHRvIHR1bmUgd2l0aC4KICAgICAgKi8KLSAgICB2b2lkIHR1bmUoaW4gVHVuZXJGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzKTsKKyAgICB2b2lkIHR1bmUoaW4gRnJvbnRlbmRTZXR0aW5ncyBzZXR0aW5ncyk7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHRoZSBwcmV2aW91cyB0dW5pbmcuCkBAIC01Miw3ICs1NSw3IEBACiAgICAgICogQHBhcmFtIHNldHRpbmdzIHRoZSBzZXR0aW5ncyB0byBzY2FuIHdpdGguCiAgICAgICogQHBhcmFtIGZyb250ZW5kU2NhblR5cGUgc2NhbiB3aXRoIGdpdmVuIHR5cGUuCiAgICAgICovCi0gICAgdm9pZCBzY2FuKGluIFR1bmVyRnJvbnRlbmRTZXR0aW5ncyBzZXR0aW5ncywgaW4gaW50IGZyb250ZW5kU2NhblR5cGUpOworICAgIHZvaWQgc2NhbihpbiBGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzLCBpbiBGcm9udGVuZFNjYW5UeXBlIGZyb250ZW5kU2NhblR5cGUpOwogCiAgICAgLyoqCiAgICAgICogU3RvcCB0aGUgcHJldmlvdXMgc2Nhbm5pbmcuCkBAIC02NywxMyArNzAsNiBAQAogICAgIHZvaWQgc2V0TG5iKGluIElUdW5lckxuYiBsbmIpOwogCiAgICAgLyoqCi0gICAgICogRW5hYmxlIG9yIERpc2FibGUgTG93IE5vaXNlIEFtcGxpZmllciAoTE5BKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiRW5hYmxlIGVuYWJsZSBMbmEgb3Igbm90LgotICAgICAqLwotICAgIHZvaWQgc2V0TG5hKGluIGJvb2xlYW4gYkVuYWJsZSk7Ci0KLSAgICAvKioKICAgICAgKiBMaW5rIEZyb250ZW5kIHRvIHRoZSBjaWNhbSB3aXRoIGdpdmVuIGlkLgogICAgICAqCiAgICAgICogQHJldHVybiBsdHMgaWQKQEAgLTkzLDE1ICs4OSwyNSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YXR1c2VzIG9mIHRoZSBmcm9udGVuZC4KICAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kU3RhdHVzW10gZ2V0U3RhdHVzKGluIGludFtdIHN0YXR1c1R5cGVzKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDEuMSBleHRlbmRlZCBzdGF0dXNlcyBvZiB0aGUgZnJvbnRlbmQuCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZFN0YXR1c1tdIGdldFN0YXR1c0V4dGVuZGVkXzFfMShpbiBpbnRbXSBzdGF0dXNUeXBlcyk7CisgICAgRnJvbnRlbmRTdGF0dXNbXSBnZXRTdGF0dXMoaW4gRnJvbnRlbmRTdGF0dXNUeXBlW10gc3RhdHVzVHlwZXMpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaWQgb2YgdGhlIGZyb250ZW5kLgogICAgICAqLwogICAgIGludCBnZXRGcm9udGVuZElkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGhhcmR3YXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcm9udGVuZC4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0SGFyZHdhcmVJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgb3V0IHVubmVjZXNzYXJ5IFBJRCBmcm9tIGZyb250ZW5kIG91dHB1dC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZU91dHB1dFBpZChpbnQgcGlkKTsKKworICAgIC8qKgorICAgICAqIEdldHMgRnJvbnRlbmRTdGF0dXPigJkgcmVhZGluZXNzIHN0YXR1c2VzIGZvciBnaXZlbiBzdGF0dXMgdHlwZXMuCisgICAgICovCisgICAgRnJvbnRlbmRTdGF0dXNSZWFkaW5lc3NbXSBnZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcyhpbiBGcm9udGVuZFN0YXR1c1R5cGVbXSBzdGF0dXNUeXBlcyk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kQ2FsbGJhY2suYWlkbAppbmRleCBjOTJmNWVlLi5kMGFiMTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsNyArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kRXZlbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTY2FuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwogCiAvKioKICAqIFR1bmVyRnJvbnRlbmRDYWxsYmFjayBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciBmcm9udGVuZCByZWxhdGVkIGNhbGxiYWNrcy4KQEAgLTI0LDEzICsyNiwxNCBAQAogICoge0BoaWRlfQogICovCiBpbnRlcmZhY2UgSVR1bmVyRnJvbnRlbmRDYWxsYmFjayB7Ci0gICAgICAgIC8qKgorICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZXZlbnQgaGFwcGVuZWQgb24gdGhlIGZyb250ZW5kLgogICAgICAqLwotICAgIHZvaWQgb25FdmVudChpbiBpbnQgZnJvbnRlbmRFdmVudFR5cGUpOworICAgIHZvaWQgb25FdmVudChpbiBGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSk7CiAKICAgICAvKioKICAgICAgKiBub3RpZnkgdGhlIGNsaWVudCBvZiBzY2FuIG1lc3NhZ2VzLgogICAgICAqLwotICAgIHZvaWQgb25TY2FuTWVzc2FnZShpbiBpbnQgbWVzc2FnZVR5cGUsIGluIFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZSBtZXNzYWdlKTsKKyAgICB2b2lkIG9uU2Nhbk1lc3NhZ2UoaW4gRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgIGluIEZyb250ZW5kU2Nhbk1lc3NhZ2UgbWVzc2FnZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwKaW5kZXggZDYyMTQ1ZS4uNzlmMDc2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYi5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmIuYWlkbApAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkxuYlBvc2l0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuTG5iVG9uZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkxuYlZvbHRhZ2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmJDYWxsYmFjazsKIAogLyoqCkBAIC0zMiwxNyArMzUsMTcgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGxuYidzIHBvd2VyIHZvbHRhZ2UuCiAgICAgICovCi0gICAgdm9pZCBzZXRWb2x0YWdlKGluIGludCB2b2x0YWdlKTsKKyAgICB2b2lkIHNldFZvbHRhZ2UoaW4gTG5iVm9sdGFnZSB2b2x0YWdlKTsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgbG5iJ3MgdG9uZSBtb2RlLgogICAgICAqLwotICAgIHZvaWQgc2V0VG9uZShpbiBpbnQgdG9uZSk7CisgICAgdm9pZCBzZXRUb25lKGluIExuYlRvbmUgdG9uZSk7CiAKICAgICAvKioKICAgICAgKiBTZWxlY3QgdGhlIGxuYidzIHBvc2l0aW9uLgogICAgICAqLwotICAgIHZvaWQgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW4gaW50IHBvc2l0aW9uKTsKKyAgICB2b2lkIHNldFNhdGVsbGl0ZVBvc2l0aW9uKGluIExuYlBvc2l0aW9uIHBvc2l0aW9uKTsKIAogICAgIC8qKgogICAgICAqIFNlbmRzIERpU0VxQyAoRGlnaXRhbCBTYXRlbGxpdGUgRXF1aXBtZW50IENvbnRyb2wpIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCmluZGV4IDExNzM1MmYuLjJiNmViNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuTG5iRXZlbnRUeXBlOworCiAvKioKICAqIFR1bmVMbmJDYWxsYmFjayBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciBsbmIgcmVsYXRlZCBjYWxsYmFja3MuCiAgKgpAQCAtMjUsNyArMjcsNyBAQAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZXZlbnQgaGFwcGVuZWQgb24gdGhlIExuYi4KICAgICAgKi8KLSAgICB2b2lkIG9uRXZlbnQoaW4gaW50IGxuYkV2ZW50VHlwZSk7CisgICAgdm9pZCBvbkV2ZW50KGluIExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpOwogCiAgICAgLyoqCiAgICAgICogbm90aWZ5IHRoZSBjbGllbnQgb2YgbmV3IERpU0VxQyBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJTZXJ2aWNlLmFpZGwKaW5kZXggNzU1YjE1Mi4uYjgwODRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyU2VydmljZS5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTYgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5NUURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLlN5bmNocm9uaXplZFJlYWRXcml0ZTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuVW5zeW5jaHJvbml6ZWRXcml0ZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4Q2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRJbmZvOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRUeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRGVtdXg7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEZXNjcmFtYmxlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlckNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRnJvbnRlbmQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4Q2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSW5mbzsKIAogLyoqCiAgKiBUdW5lclNlcnZpY2UgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgcmVsYXRlZCBvcGVyYXRpb25zLgpAQCAtMzMsOCArMzIsOCBAQAogICoge0BoaWRlfQogICovCiAvL0BWaW50ZlN0YWJpbGl0eQorQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJvdXQtYXJyYXkifSkKIGludGVyZmFjZSBJVHVuZXJTZXJ2aWNlIHsKLQogICAgIC8qKgogICAgICAqIEdldHMgZnJvbnRlbmQgSURzLgogICAgICAqLwpAQCAtNDMsMTUgKzQyLDEwIEBACiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGZyb250ZW5kJ3MgaW5mb3JtYXRpb24uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbnRlbmRIYW5kbGUgdGhlIGhhbmRsZSBvZiB0aGUgZnJvbnRlbmQgZ3JhbnRlZCBieSBUUk0uCisgICAgICogQHBhcmFtIGZyb250ZW5kSWQgdGhlIElEIG9mIHRoZSBmcm9udGVuZC4KICAgICAgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgZnJvbnRlbmQuCiAgICAgICovCi0gICAgVHVuZXJGcm9udGVuZEluZm8gZ2V0RnJvbnRlbmRJbmZvKGluIGludCBmcm9udGVuZEhhbmRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgRHRtYiBGcm9udGVuZCBDYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZ2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKGluIGludCBpZCk7CisgICAgRnJvbnRlbmRJbmZvIGdldEZyb250ZW5kSW5mbyhpbiBpbnQgZnJvbnRlbmRJZCk7CiAKICAgICAvKioKICAgICAgKiBPcGVuIGEgVHVuZXIgRnJvbnRlbmQgaW50ZXJmYWNlLgpAQCAtODcsNyArODEsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVtdXjigJlzIGNhcGFiaWxpdGllcy4KICAgICAgKi8KLSAgICBUdW5lckRlbXV4Q2FwYWJpbGl0aWVzIGdldERlbXV4Q2FwcygpOworICAgIERlbXV4Q2FwYWJpbGl0aWVzIGdldERlbXV4Q2FwcygpOwogCiAgICAgLyogT3BlbiBhIG5ldyBpbnRlcmZhY2Ugb2YgSVR1bmVyRGVzY3JhbWJsZXIgZ2l2ZW4gYSBkZXNjcmFtYmxlckhhbmRsZS4KICAgICAgKgpAQCAtMTAyLDQgKzk2LDM4IEBACiAgICAgICogdmFsdWUgaXMgdW5rbm93biB2ZXJzaW9uIDAuCiAgICAgICovCiAgICAgaW50IGdldFR1bmVySGFsVmVyc2lvbigpOworCisgICAgLyoqCisgICAgICogT3BlbiBhIG5ldyBTaGFyZWRGaWx0ZXIgaW5zdGFuY2Ugb2YgSVR1bmVyRmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlclRva2VuIHRoZSBTaGFyZWRGaWx0ZXIgdG9rZW4gY3JlYXRlZCBieSBJVHVuZXJGaWx0ZXIuCisgICAgICogQHBhcmFtIGNiIHRoZSBJVHVuZXJGaWx0ZXJDYWxsYmFjayB1c2VkIHRvIHJlY2VpdmUgY2FsbGJhY2sgZXZlbnRzCisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgSVR1bmVyRmlsdGVyIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBJVHVuZXJGaWx0ZXIgb3BlblNoYXJlZEZpbHRlcihpbiBTdHJpbmcgZmlsdGVyVG9rZW4sIGluIElUdW5lckZpbHRlckNhbGxiYWNrIGNiKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBEaXNhYmxlIExvdyBOb2lzZSBBbXBsaWZpZXIgKExOQSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYkVuYWJsZSBlbmFibGUgTG5hIG9yIG5vdC4KKyAgICAgKi8KKyAgICB2b2lkIHNldExuYShpbiBib29sZWFuIGJFbmFibGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIHVzYWJsZSBmcm9udGVuZHMgbnVtYmVyIG9mIGEgZ2l2ZW4gZnJvbnRlbmQgdHlwZS4gSXQncyB1c2VkIGJ5IGNsaWVudAorICAgICAqIHRvIGVuYWJsZSBvciBkaXNhYmxlIGZyb250ZW5kcyB3aGVuIGNhYmxlIGNvbm5lY3Rpb24gc3RhdHVzIGlzIGNoYW5nZWQgYnkgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9udGVuZFR5cGUgdGhlIGZyb250ZW5kIHR5cGUgd2hpY2ggdGhlIG1heGltdW0gdXNhYmxlIG51bWJlciB3aWxsIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gbWF4TnVtYmVyIHRoZSBuZXcgbWF4aW11bSB1c2FibGUgbnVtYmVyLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoaW4gRnJvbnRlbmRUeXBlIGZyb250ZW5kVHlwZSwgaW4gaW50IG1heE51bWJlcik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1heGltdW0gdXNhYmxlIGZyb250ZW5kcyBudW1iZXIgb2YgYSBnaXZlbiBmcm9udGVuZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGZyb250ZW5kVHlwZSB0aGUgZnJvbnRlbmQgdHlwZSB3aGljaCB0aGUgbWF4aW11bSB1c2FibGUgbnVtYmVyIHdpbGwgYmUgcXVlcmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdXNhYmxlIG51bWJlciBvZiB0aGUgcXVlcmllZCBmcm9udGVuZCB0eXBlLgorICAgICAqLworICAgIGludCBnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhpbiBGcm9udGVuZFR5cGUgZnJvbnRlbmRUeXBlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckF1ZGlvRXh0cmFNZXRhRGF0YS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXVkaW9FeHRyYU1ldGFEYXRhLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzM3NGEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXVkaW9FeHRyYU1ldGFEYXRhLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEV4dHJhIE1ldGEgRGF0YSBmcm9tIEFEIChBdWRpbyBEZXNjcmlwdG9yKSBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0IFYyLjEuMS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJBdWRpb0V4dHJhTWV0YURhdGEgewotICAgIGJ5dGUgYWRGYWRlOwotCi0gICAgYnl0ZSBhZFBhbjsKLQotICAgIGJ5dGUgdmVyc2lvblRleHRUYWc7Ci0KLSAgICBieXRlIGFkR2FpbkNlbnRlcjsKLQotICAgIGJ5dGUgYWRHYWluRnJvbnQ7Ci0KLSAgICBieXRlIGFkR2FpblN1cnJvdW5kOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4Q2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYWIxNTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogVHVuZXIgRGVtdXggY2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJEZW11eENhcGFiaWxpdGllcyB7Ci0gICAgaW50IG51bURlbXV4OwotCi0gICAgaW50IG51bVJlY29yZDsKLQotICAgIGludCBudW1QbGF5YmFjazsKLQotICAgIGludCBudW1Uc0ZpbHRlcjsKLQotICAgIGludCBudW1TZWN0aW9uRmlsdGVyOwotCi0gICAgaW50IG51bUF1ZGlvRmlsdGVyOwotCi0gICAgaW50IG51bVZpZGVvRmlsdGVyOwotCi0gICAgaW50IG51bVBlc0ZpbHRlcjsKLQotICAgIGludCBudW1QY3JGaWx0ZXI7Ci0KLSAgICBpbnQgbnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXI7Ci0KLSAgICBpbnQgZmlsdGVyQ2FwczsKLQotICAgIGludFtdIGxpbmtDYXBzOwotCi0gICAgYm9vbGVhbiBiVGltZUZpbHRlcjsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eElwQWRkcmVzcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVmNDA0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERlbXV4IGlwIGFkZHJlc3MgY29uZmlndXJlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckRlbXV4SXBBZGRyZXNzIHsKLSAgICBib29sZWFuIGlzSXBWNjsKLQotICAgIGJ5dGVbXSBhZGRyOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ0Mzg4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRGVtdXhJcEFkZHJlc3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhbiBJcCBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncyB7Ci0gICAgVHVuZXJEZW11eElwQWRkcmVzcyBzcmNJcEFkZHJlc3M7Ci0KLSAgICBUdW5lckRlbXV4SXBBZGRyZXNzIGRzdElwQWRkcmVzczsKLQotICAgIGNoYXIgc3JjUG9ydDsKLQotICAgIGNoYXIgZHN0UG9ydDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eFBpZC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjIzOGI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERlbXV4IFBJRCBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckRlbXV4UGlkIHsKLSAgICBjaGFyIHRQaWQ7Ci0KLSAgICBjaGFyIG1tdHBQaWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEdnJTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRHZyU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNGQ3NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEdnJTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBEdnIgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckR2clNldHRpbmdzIHsKLSAgICBpbnQgc3RhdHVzTWFzazsKLQotICAgIGludCBsb3dUaHJlc2hvbGQ7Ci0KLSAgICBpbnQgaGlnaFRocmVzaG9sZDsKLQotICAgIGludCBkYXRhRm9ybWF0OwotCi0gICAgaW50IHBhY2tldFNpemU7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWUzYWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGFuIEFMUCBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbiB7Ci0gICAgYnl0ZSBwYWNrZXRUeXBlOwotCi0gICAgYnl0ZSBsZW5ndGhUeXBlOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckF2U2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckF2U2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmODhmMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBdlNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYSBWaWRlbyBhbmQgQXVkaW8uCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyQXZTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogdHJ1ZSBpZiB0aGUgZmlsdGVyIG91dHB1dCBnb2VzIHRvIGRlY29kZXIgZGlyZWN0bHkgaW4gcGFzcyB0aHJvdWdoIG1vZGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Bhc3N0aHJvdWdoOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQ29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQ29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjZmQxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckNvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEZpbHRlciBjb25maWd1cmF0aW9uLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uIHsKLSAgICBUdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbiB0czsKLQotICAgIFR1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24gbW10cDsKLQotICAgIFR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uIGlwOwotCi0gICAgVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uIHRsdjsKLQotICAgIFR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbiBhbHA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzFkZDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRG93bmxvYWRFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIERvd25sb2FkIGRhdGEuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyRG93bmxvYWRFdmVudCB7Ci0gICAgaW50IGl0ZW1JZDsKLQotICAgIC8qKgotICAgICAqIE1QVSBzZXF1ZW5jZSBudW1iZXIgb2YgZmlsdGVyZWQgZGF0YSAob25seSBmb3IgTU1UUCkKLSAgICAgKi8KLSAgICBpbnQgbXB1U2VxdWVuY2VOdW1iZXI7Ci0KLSAgICBpbnQgaXRlbUZyYWdtZW50SW5kZXg7Ci0KLSAgICBpbnQgbGFzdEl0ZW1GcmFnbWVudEluZGV4OwotCi0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIGRhdGFMZW5ndGg7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxN2E1ZmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGRvd25sb2FkaW5nLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MgewotICAgIGludCBkb3dubG9hZElkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDU1MTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyRG93bmxvYWRFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1lZGlhRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJQZXNFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJUZW1pRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQ7Ci0KLS8qKgotICogRmlsdGVyIGV2ZW50cy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRmlsdGVyRXZlbnQgewotICAgIFR1bmVyRmlsdGVyTWVkaWFFdmVudCBtZWRpYTsKLQotICAgIFR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50IHNlY3Rpb247Ci0KLSAgICBUdW5lckZpbHRlclBlc0V2ZW50IHBlczsKLQotICAgIFR1bmVyRmlsdGVyVHNSZWNvcmRFdmVudCB0c1JlY29yZDsKLQotICAgIFR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50IG1tdHBSZWNvcmQ7Ci0KLSAgICBUdW5lckZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWQ7Ci0KLSAgICBUdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50IGlwUGF5bG9hZDsKLQotICAgIFR1bmVyRmlsdGVyVGVtaUV2ZW50IHRlbWk7Ci0KLSAgICBUdW5lckZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yOwotCi0gICAgaW50IHN0YXJ0SWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRkODg5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgaXAgZmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbiB7Ci0gICAgVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzIGlwQWRkcjsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgZmlsdGVyU2V0dGluZ3M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViZGE5My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIElQIHBheWxvYWQgZGF0YS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudCB7Ci0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGlwIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIGRhdGFMZW5ndGg7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNZWRpYUV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNZWRpYUV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGJjZTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTWVkaWFFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLk5hdGl2ZUhhbmRsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgQXVkaW8gb3IgVmlkZW8gRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlck1lZGlhRXZlbnQgewotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICAvKioKLSAgICAgKiB0cnVlIGlmIFBUUyBpcyBwcmVzZW50IGluIFBFUyBoZWFkZXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1B0c1ByZXNlbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gVGltZSBTdGFtcCBmb3IgYXVkaW8gb3IgdmlkZW8gZnJhbWUuIEl0IGJhc2VkIG9uIDkwS0h6IGhhcwotICAgICAqIHRoZSBzYW1lIGZvcm1hdCBhcyBQVFMgKFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKS4KLSAgICAgKi8KLSAgICBsb25nIHB0czsKLQotICAgIC8qKgotICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBhdWRpbyBvciB2aWRlbyBmcmFtZQotICAgICAqLwotICAgIGludCBkYXRhTGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBvZmZzZXQgaW4gdGhlIG1lbW9yeSBibG9jayB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUKLSAgICAgKiAgTWVkaWFFdmVudHMuCi0gICAgICovCi0gICAgaW50IG9mZnNldDsKLQotICAgIC8qKgotICAgICAqIEEgaGFuZGxlIGFzc29jaWF0ZWQgdG8gdGhlIG1lbW9yeSB3aGVyZSBhdWRpbyBvciB2aWRlbyBkYXRhIHN0YXlzLgotICAgICAqLwotICAgIE5hdGl2ZUhhbmRsZSBhdk1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGF2TWVtb3J5IGlzIGluIHNlY3VyZSBhcmVhLCBhbmQgaXNuJ3QgbWFwcGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1NlY3VyZU1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIEFuIElkIGlzIHVzZWQgYnkgSEFMIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgQVYgZGF0YS4KLSAgICAgKiBGb3Igc2VjdXJlIGF1ZGlvLCBpdCdzIHRoZSBhdWRpbyBoYW5kbGUgdXNlZCBieSBBdWRpbyBUcmFjay4KLSAgICAgKi8KLSAgICBsb25nIGF2RGF0YUlkOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhIChvbmx5IGZvciBNTVRQKQotICAgICAqLwotICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKLQotICAgIGJvb2xlYW4gaXNQZXNQcml2YXRlRGF0YTsKLQotICAgIC8qKgotICAgICAqIElmIFR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhIGZpZWxkIGlzIHZhbGlkIG9yIG5vdAotICAgICAqLwotICAgIGJvb2xlYW4gaXNBdWRpb0V4dHJhTWV0YURhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHZhbGlkIHdoZW4gaXNBdWRpb0V4dHJhTWV0YURhdGEgaXMgdHJ1ZQotICAgICAqLwotICAgIFR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhIGF1ZGlvOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmNhOGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2V0dGluZ3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhbiBtbXRwIGZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbiB7Ci0gICAgY2hhciBtbXRwUGlkOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODcxY2YuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgYW4gTU1UUCBSZWNvcmQgRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudCB7Ci0gICAgaW50IHNjSGV2Y0luZGV4TWFzazsKLQotICAgIC8qKgotICAgICAqIEJ5dGUgbnVtYmVyIGZyb20gYmVnaW5uaW5nIG9mIHRoZSBmaWx0ZXIncyBvdXRwdXQKLSAgICAgKi8KLSAgICBsb25nIGJ5dGVOdW1iZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgY3VycmVudCBldmVudCBjb250YWlucyBleHRlbmRlZCBpbmZvcm1hdGlvbiBvciBub3QKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAoUFRTKSBmb3IgdGhlIGF1ZGlvIG9yIHZpZGVvIGZyYW1lLiBJdCBpcyBiYXNlZCBvbiA5MEtIegotICAgICAqIGFuZCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBQVFMgaW4gSVNPL0lFQyAxMzgxOC0xLgotICAgICAqLwotICAgIGxvbmcgcHRzOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgZmlsdGVyZWQgZGF0YS4gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIE1NVFAuCi0gICAgICovCi0gICAgaW50IG1wdVNlcXVlbmNlTnVtYmVyOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIGluIHRoZSBzbGljZSBkZWZpbmVkIGluIElUVS1UIFJlYy4gSC4yNjQuCi0gICAgICovCi0gICAgaW50IGZpcnN0TWJJblNsaWNlOwotCi0gICAgLyoqCi0gICAgICogVFMgaW5kZXggbWFzay4KLSAgICAgKi8KLSAgICBpbnQgdHNJbmRleE1hc2s7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1vbml0b3JFdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFiNWU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1vbml0b3JFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgbW9uaXRvciBldmVudHMuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZpbHRlck1vbml0b3JFdmVudCB7Ci0gICAgLyoqCi0gICAgICogTmV3IHNjcmFtYmxpbmcgc3RhdHVzLgotICAgICAqLwotICAgIGludCBzY3JhbWJsaW5nU3RhdHVzOwotCi0gICAgLyoqCi0gICAgICogTmV3IGNpZCBmb3IgdGhlIElQIGZpbHRlci4KLSAgICAgKi8KLSAgICBpbnQgY2lkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyZjMxNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBQZXMgRGF0YS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MgewotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICBib29sZWFuIGlzUmF3OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclBlc0V2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWVjYzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBQRVMgRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclBlc0V2ZW50IHsKLSAgICBjaGFyIHN0cmVhbUlkOwotCi0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIFBFUyBkYXRhCi0gICAgICovCi0gICAgY2hhciBkYXRhTGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgaW50IG1wdVNlcXVlbmNlTnVtYmVyOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclJlY29yZFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmU2MjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2NJbmRleE1hc2s7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciByZWNvcmRpbmcuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MgewotICAgIGludCB0c0luZGV4TWFzazsKLQotICAgIGludCBzY0luZGV4VHlwZTsKLQotICAgIFR1bmVyRmlsdGVyU2NJbmRleE1hc2sgc2NJbmRleE1hc2s7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTY0luZGV4TWFzay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2NJbmRleE1hc2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzN2ZjZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTY0luZGV4TWFzay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgU0MgSW5kZXggTWFzawotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGaWx0ZXJTY0luZGV4TWFzayB7Ci0gICAgaW50IHNjOwotCi0gICAgaW50IHNjSGV2YzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQml0cy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDRmODQyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEJpdHMgc2V0dGluZ3Mgb2YgYSBzZWN0aW9uIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTZWN0aW9uQml0cyB7Ci0gICAgYnl0ZVtdIGZpbHRlcjsKLQotICAgIGJ5dGVbXSBtYXNrOwotCi0gICAgYnl0ZVtdIG1vZGU7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYWFiZTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uQml0czsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbzsKLQotLyoqCi0gKiBTZWN0aW9uIGZpbHRlciBjb25kaXRpb24gc2V0dGluZ3MuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24gewotICAgIFR1bmVyRmlsdGVyU2VjdGlvbkJpdHMgc2VjdGlvbkJpdHM7Ci0KLSAgICBUdW5lckZpbHRlclNlY3Rpb25UYWJsZUluZm8gdGFibGVJbmZvOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyMDkyNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBTZWN0aW9uIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQgewotICAgIC8qKgotICAgICAqIFRhYmxlIElEIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIHRhYmxlSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBWZXJzaW9uIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgY2hhciB2ZXJzaW9uOwotCi0gICAgLyoqCi0gICAgICogU2VjdGlvbiBudW1iZXIgb2YgZmlsdGVyZWQgZGF0YQotICAgICAqLwotICAgIGNoYXIgc2VjdGlvbk51bTsKLQotICAgIC8qKgotICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgY2hhciBkYXRhTGVuZ3RoOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxMjliNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgc2VjdGlvbiBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzIHsKLSAgICBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24gY29uZGl0aW9uOwotCi0gICAgYm9vbGVhbiBpc0NoZWNrQ3JjOwotCi0gICAgYm9vbGVhbiBpc1JlcGVhdDsKLQotICAgIGJvb2xlYW4gaXNSYXc7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzhjOWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBUYWJsZSBpbmZvIHNldHRpbmdzIG9mIGEgc2VjdGlvbiBGaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbyB7Ci0gICAgY2hhciB0YWJsZUlkOwotCi0gICAgY2hhciB2ZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2VhYTUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyQXZTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRmlsdGVyU2V0dGluZ3MgewotICAgIGJvb2xlYW4gbm90aGluZzsKLQotICAgIFR1bmVyRmlsdGVyQXZTZXR0aW5ncyBhdjsKLQotICAgIFR1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzIHNlY3Rpb247Ci0KLSAgICBUdW5lckZpbHRlclBlc0RhdGFTZXR0aW5ncyBwZXNEYXRhOwotCi0gICAgVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncyByZWNvcmQ7Ci0KLSAgICBUdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MgZG93bmxvYWQ7Ci0KLSAgICBib29sZWFuIGlzUGFzc3Rocm91Z2g7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMmRmYzMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLk5hdGl2ZUhhbmRsZTsKLQotLyoqCi0gKiBGaWx0ZXIgU2hhcmVkIEhhbmRsZSBJbmZvcm1hdGlvbi4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvIHsKLSAgICBOYXRpdmVIYW5kbGUgaGFuZGxlOwotICAgIGxvbmcgc2l6ZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUZW1pRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRlbWlFdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRlOTkzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRlbWlFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIFRpbWVkIEV4dGVybmFsIE1lZGlhIEluZm9ybWF0aW9uIChURU1JKSBkYXRhLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclRlbWlFdmVudCB7Ci0gICAgLyoqCi0gICAgICogUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAgZm9yIGF1ZGlvIG9yIHZpZGVvIGZyYW1lLiBJdCBiYXNlZCBvbiA5MEtIeiBoYXMKLSAgICAgKiB0aGUgc2FtZSBmb3JtYXQgYXMgUFRTIChQcmVzZW50YXRpb24gVGltZSBTdGFtcCkgaW4gSVNPL0lFQyAxMzgxOC0xLgotICAgICAqLwotICAgIGxvbmcgcHRzOwotCi0gICAgLyoqCi0gICAgICogVEVNSSBEZXNjcmlwdG9yIFRhZwotICAgICAqLwotICAgIGJ5dGUgZGVzY3JUYWc7Ci0KLSAgICAvKioKLSAgICAgKiBURU1JIERlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBieXRlW10gZGVzY3JEYXRhOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjIzN2I0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRsdkNvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2V0dGluZ3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhIHRsdiBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbiB7Ci0gICAgYnl0ZSBwYWNrZXRUeXBlOwotCi0gICAgYm9vbGVhbiBpc0NvbXByZXNzZWRJcFBhY2tldDsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgZmlsdGVyU2V0dGluZ3M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUc0NvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM4NmU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgVFMgZmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbiB7Ci0gICAgY2hhciB0cGlkOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyYTc0OS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNjSW5kZXhNYXNrOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgVFMgUmVjb3JkIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50IHsKLSAgICBjaGFyIHBpZDsKLQotICAgIGludCB0c0luZGV4TWFzazsKLQotICAgIC8qKgotICAgICAqIEluZGV4ZXMgb2YgcmVjb3JkIG91dHB1dAotICAgICAqLwotICAgIFR1bmVyRmlsdGVyU2NJbmRleE1hc2sgc2NJbmRleE1hc2s7Ci0KLSAgICAvKioKLSAgICAgKiBCeXRlIG51bWJlciBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsdGVyJ3Mgb3V0cHV0Ci0gICAgICovCi0gICAgbG9uZyBieXRlTnVtYmVyOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgZXZlbnQgY29udGFpbnMgZXh0ZW5kZWQgaW5mb3JtYXRpb24gb3Igbm90Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc0V4dGVuZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKFBUUykgZm9yIHRoZSBhdWRpbyBvciB2aWRlbyBmcmFtZS4gSXQgaXMgYmFzZWQgb24gOTBLSHoKLSAgICAgKiBhbmQgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgUFRTIGluIElTTy9JRUMgMTM4MTgtMS4KLSAgICAgKi8KLSAgICBsb25nIHB0czsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UgZGVmaW5lZCBpbiBJVFUtVCBSZWMuIEguMjY0LgotICAgICAqLwotICAgIGludCBmaXJzdE1iSW5TbGljZTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJmMDRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFuYWxvZyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIHsKLQkvKioKLSAgICAgKiBTaWduYWwgVHlwZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IHR5cGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCBJbnRlcmNoYW5nZSBGb3JtYXQgKFNJRikgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBzaWZTdGFuZGFyZENhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjZDhjOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFuYWxvZyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgc2lnbmFsVHlwZTsKLQotICAgIC8qKgotICAgICAqIFN0YW5kYXJkIEludGVyY2hhbmdlIEZvcm1hdCAoU0lGKSBzZXR0aW5nCi0gICAgICovCi0gICAgaW50IHNpZlN0YW5kYXJkOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICBpbnQgYWZ0RmxhZzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5YmU3Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFUU0MzIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lSW50ZXJsZWF2ZU1vZGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCB0aW1lSW50ZXJsZWF2ZU1vZGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlUmF0ZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvZGVSYXRlQ2FwOwotCi0gICAgLyoqCi0gICAgICogRkVDIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgZmVjQ2FwOwotCi0gICAgLyoqCi0gICAgICogRGVtb2R1bGF0b3IgT3V0cHV0IEZvcm1hdCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGRlbW9kT3V0cHV0Rm9ybWF0Q2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5ZTFmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgUGh5c2ljYWwgTGF5ZXIgUGlwZSBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIHsKLSAgICBpbnQgcGxwSWQ7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZTsKLQotICAgIGludCBjb2RlUmF0ZTsKLQotICAgIC8qKgotICAgICAqIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiBUeXBlLgotICAgICAqLwotICAgIGludCBmZWM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZiOGM3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICAvKioKLSAgICAgKiBCYW5kd2lkdGggb2YgdHVuaW5nIGJhbmQuCi0gICAgICovCi0gICAgaW50IGJhbmR3aWR0aDsKLQotICAgIGludCBkZW1vZE91dHB1dEZvcm1hdDsKLQotICAgIFR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzW10gcGxwU2V0dGluZ3M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZjMmZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBVFNDIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhOGMwNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBdHNjIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MGM2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIENhYmxlKERWQkMpIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGxvbmcgY29kZVJhdGVDYXA7IC8vIGlubmVyIEZFQyB3aWxsIGNvbnZlcmdlIHRvIGNvZGVSYXRlCi0KLSAgICAvKioKLSAgICAgKiBBbm5leCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGFubmV4Q2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliY2YyOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQ2FibGUgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIC8qKgotICAgICAqIElubmVyIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiB0eXBlIGFzIHNwZWNpZmllZCBpbiBFVFNJIEVOIDMwMCA0NjggVjEuMTUuMQotICAgICAqIGFuZCBFVFNJIEVOIDMwMiAzMDctMiBWMS4xLjEuCi0gICAgICovCi0gICAgbG9uZyBpbm5lckZlYzsKLQotICAgIC8qKgotICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAotICAgICAqLwotICAgIGludCBzeW1ib2xSYXRlOwotCi0gICAgLyoqCi0gICAgICogT3V0ZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIChGRUMpIFR5cGUuCi0gICAgICovCi0gICAgaW50IG91dGVyRmVjOwotCi0gICAgaW50IGFubmV4OwotCi0gICAgLyoqCi0gICAgICogU3BlY3RyYWwgSW52ZXJzaW9uIFR5cGUuCi0gICAgICovCi0gICAgaW50IHNwZWN0cmFsSW52ZXJzaW9uOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICBpbnQgaW50ZXJsZWF2ZU1vZGU7Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjMxZjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzOwotCi0vKioKLSAqIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICogVXNlIGEgZ3JvdXAgb2YgdmVjdG9ycyBhcyB0aGUgd29ya2Fyb3VuZCBmb3IgVW5pb24gc3RydWN0dXJlIHRoYXQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZAotICogaW4gQUlETCBjdXJyZW50bHkuCi0gKgotICogQ2xpZW50IG1heSB1c2UgRnJvbnRlbmRJbmZvLnR5cGUgYXMgdGhlIGRpc2NyaW1pbmFyIHRvIGNoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHZlY3Rvci4gSWYKLSAqIHRoZSB2ZWN0b3IgaXMgbm90IG51bGwsIGl0IGNvbnRhaW5zIHZhbGlkIHZhbHVlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogQW5hbG9nIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMgYW5hbG9nQ2FwczsKLQotICAgIC8qKgotICAgICAqIEFUU0MgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMgYXRzY0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBBVFNDMyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMgYXRzYzNDYXBzOwotCi0gICAgLyoqCi0gICAgICogQ2FibGUgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzIGNhYmxlQ2FwczsKLQotICAgIC8qKgotICAgICAqIERWQlMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgZHZic0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBEVkJUIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIGR2YnRDYXBzOwotCi0gICAgLyoqCi0gICAgICogSVNEQi1TIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcyBpc2Ric0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBJU0RCLVMzIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMgaXNkYnMzQ2FwczsKLQotICAgIC8qKgotICAgICAqIElTREItVCBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgaXNkYnRDYXBzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlNDkzMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRFRNQiBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyB7Ci0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGVDYXA7Ci0KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICBpbnQgY29kZVJhdGVDYXA7Ci0KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbENhcDsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZUNhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU3ZmY5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERUTUIgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHRtYlNldHRpbmdzIHsKLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGU7Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDMyMmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERWQlMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgewotICAgIC8qKgotICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2R1bGF0aW9uQ2FwOwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBsb25nIGNvZGVSYXRlQ2FwOyAgLy8gaW5uZXIgRkVDIHdpbGwgY29udmVyZ2UgdG8gY29kZVJhdGUKLQotICAgIC8qKgotICAgICAqIFN1YiBzdGFuZGFyZHMgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBzdGFuZGFyZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWI3ZGUzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIER2YnMgRnJvbnRlbmQgQ29kZVJhdGUgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlIHsKLSAgICAvKioKLSAgICAgKiBJbm5lciBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24gdHlwZSBhcyBzcGVjaWZpZWQgaW4gRVRTSSBFTiAzMDAgNDY4IFYxLjE1LjEKLSAgICAgKiBhbmQgRVRTSSBFTiAzMDIgMzA3LTIgVjEuMS4xLgotICAgICAqLwotICAgIGxvbmcgZmVjOwotCi0gICAgYm9vbGVhbiBpc0xpbmVhcjsKLQotICAgIC8qKgotICAgICAqIHRydWUgaWYgZW5hYmxlIHNob3J0IGZyYW1lCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Nob3J0RnJhbWVzOwotCi0gICAgLyoqCi0gICAgICogYml0cyBudW1iZXIgaW4gMTAwMCBzeW1ib2wuIDAgaWYgdXNlIHRoZSBkZWZhdWx0LgotICAgICAqLwotICAgIGludCBiaXRzUGVyMTAwMFN5bWJvbDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic1NldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNlNGI5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOwotCi0vKioKLSAqIER2YnMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCBtb2R1bGF0aW9uOwotCi0gICAgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlUmF0ZTsKLQotICAgIGludCBzeW1ib2xSYXRlOwotCi0gICAgLyoqCi0gICAgICogUm9sbCBvZmYgdHlwZS4KLSAgICAgKi8KLSAgICBpbnQgcm9sbG9mZjsKLQotICAgIC8qKgotICAgICAqIFBpbG90IG1vZGUuCi0gICAgICovCi0gICAgaW50IHBpbG90OwotCi0gICAgaW50IGlucHV0U3RyZWFtSWQ7Ci0KLSAgICBpbnQgc3RhbmRhcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBWY20gbW9kZS4KLSAgICAgKi8KLSAgICBpbnQgdmNtOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICBpbnQgc2NhblR5cGU7Ci0KLSAgICBib29sZWFuIGlzRGlzZXFjUnhNZXNzYWdlOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmMTZkZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRFZCVCBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogVHJhbnNtaXNzaW9uIE1vZGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCB0cmFuc21pc3Npb25Nb2RlQ2FwOwotCi0gICAgLyoqCi0gICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RlbGxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvbnN0ZWxsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLQotICAgIC8qKgotICAgICAqIEhpZXJhcmNoeSBUeXBlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgaGllcmFyY2h5Q2FwOwotCi0gICAgLyoqCi0gICAgICogR3VhcmQgSW50ZXJ2YWwgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBndWFyZEludGVydmFsQ2FwOwotCi0gICAgLyoqCi0gICAgICogVDIgU3VwcG9ydCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc1QyU3VwcG9ydGVkOwotCi0gICAgLyoqCi0gICAgICogTWlzbyBTdXBwb3J0IGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBib29sZWFuIGlzTWlzb1N1cHBvcnRlZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM5NDJhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIER2YnQgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZidFNldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCB0cmFuc21pc3Npb25Nb2RlOwotCi0gICAgaW50IGJhbmR3aWR0aDsKLQotICAgIGludCBjb25zdGVsbGF0aW9uOwotCi0gICAgaW50IGhpZXJhcmNoeTsKLQotICAgIC8qKgotICAgICAqIENvZGUgUmF0ZSBmb3IgSGlnaCBQcmlvcml0eSBsZXZlbAotICAgICAqLwotICAgIGludCBocENvZGVSYXRlOwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGZvciBMb3cgUHJpb3JpdHkgbGV2ZWwKLSAgICAgKi8KLSAgICBpbnQgbHBDb2RlUmF0ZTsKLQotICAgIGludCBndWFyZEludGVydmFsOwotCi0gICAgYm9vbGVhbiBpc0hpZ2hQcmlvcml0eTsKLQotICAgIGludCBzdGFuZGFyZDsKLQotICAgIGJvb2xlYW4gaXNNaXNvOwotCi0gICAgLyoqCi0gICAgICogUGh5c2ljYWwgTGF5ZXIgUGlwZSAoUExQKSBtb2RlCi0gICAgICovCi0gICAgaW50IHBscE1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBQaHlzaWNhbCBMYXllciBQaXBlIChQTFApIElkCi0gICAgICovCi0gICAgaW50IHBscElkOwotCi0gICAgLyoqCi0gICAgICogUGh5c2ljYWwgTGF5ZXIgUGlwZSAoUExQKSBHcm91cCBJZAotICAgICAqLwotICAgIGludCBwbHBHcm91cElkOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNjZDU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhcGFiaWxpdGllczsKLQotLyoqCi0gKiBGcm9udGVuZEluZm8gaW50ZXJmYWNlIHRoYXQgY2FycmllcyB0dW5lciBmcm9udGVuZCBpbmZvcm1hdGlvbi4KLSAqCi0gKiA8cD5UaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBUdW5lclJlc291cmNlTWFuYWdlciBhbmQgcGFzcyBGcm9udGVuZAotICogaW5mb3JtYXRpb24gZnJvbSBIQUwgdG8gdGhlIGNsaWVudCBzaWRlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSW5mbyB7Ci0gICAgLyoqCi0gICAgICogRnJvbnRlbmQgSGFuZGxlCi0gICAgICovCi0gICAgaW50IGhhbmRsZTsKLQotICAgIC8qKgotICAgICAqIEZyb250ZW5kIFR5cGUKLSAgICAgKi8KLSAgICBpbnQgdHlwZTsKLQotICAgIC8qKgotICAgICAqIE1pbmltdW0gRnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IG1pbkZyZXF1ZW5jeTsKLQotICAgIC8qKgotICAgICAqIE1heGltdW0gRnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IG1heEZyZXF1ZW5jeTsKLQotICAgIC8qKgotICAgICAqIE1pbmltdW0gc3ltYm9scyBwZXIgc2Vjb25kCi0gICAgICovCi0gICAgaW50IG1pblN5bWJvbFJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBNYXhpbXVtIHN5bWJvbHMgcGVyIHNlY29uZAotICAgICAqLwotICAgIGludCBtYXhTeW1ib2xSYXRlOwotCi0gICAgLyoqCi0gICAgICogUmFuZ2UgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgYWNxdWlyZVJhbmdlOwotCi0gICAgLyoqCi0gICAgICogRnJvbnRlbmRzIGFyZSBhc3NpZ25lZCB3aXRoIHRoZSBzYW1lIGV4Y2x1c2l2ZUdyb3VwSWQgaWYgdGhleSBjYW4ndAotICAgICAqIGZ1bmN0aW9uIGF0IHNhbWUgdGltZS4gRm9yIGluc3RhbmNlLCB0aGV5IHNoYXJlIHNhbWUgaGFyZHdhcmUgbW9kdWxlLgotICAgICAqLwotICAgIGludCBleGNsdXNpdmVHcm91cElkOwotCi0gICAgLyoqCi0gICAgICogQSBsaXN0IG9mIHN1cHBvcnRlZCBzdGF0dXMgdHlwZXMgd2hpY2ggY2xpZW50IGNhbiBpbnF1aXJ5Ci0gICAgICovCi0gICAgaW50W10gc3RhdHVzQ2FwczsKLQotICAgIC8qKgotICAgICAqIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRkNjdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElTREItUzMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExMWZkNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElzZGJzMyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBjaGFyIHN0cmVhbUlkOwotCi0gICAgaW50IHN0cmVhbUlkVHlwZTsKLQotICAgIGludCBtb2R1bGF0aW9uOwotCi0gICAgaW50IGNvZGVSYXRlOwotCi0gICAgLyoqCi0gICAgICogU3ltYm9scyBwZXIgc2Vjb25kCi0gICAgICovCi0gICAgaW50IHN5bWJvbFJhdGU7Ci0KLSAgICBpbnQgcm9sbG9mZjsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkZmRmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElTREItUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgewotICAgIC8qKgotICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2R1bGF0aW9uQ2FwOwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgY29kZVJhdGVDYXA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY5ZjRhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBJc2RicyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICBpbnQgc3RyZWFtSWRUeXBlOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBTeW1ib2xzIHBlciBzZWNvbmQKLSAgICAgKi8KLSAgICBpbnQgc3ltYm9sUmF0ZTsKLQotICAgIGludCByb2xsb2ZmOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI5NWQ4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogSVNEQi1UIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogSVNEQi1UIE1vZGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2RlQ2FwOwotCi0gICAgLyoqCi0gICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLQotICAgIC8qKgotICAgICAqIEd1YXJkIEludGVydmFsIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbENhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MWYzYTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElzZGJ0IEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MgewotICAgIC8qKgotICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgaW50IG1vZGU7Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKLQotICAgIGludCBzZXJ2aWNlQXJlYUlkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZmNiYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgUGh5c2ljYWwgTGF5ZXIgUGlwZSBJbmZvLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbyB7Ci0gICAgYnl0ZSBwbHBJZDsKLQotICAgIGJvb2xlYW4gbGxzRmxhZzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMWNhMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbzsKLQotLyoqCi0gKiBUdW5lciBGcm9udGVuZCBTY2FuIE1lc3NhZ2UgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIHsKLSAgICBib29sZWFuIGlzTG9ja2VkOwotCi0gICAgYm9vbGVhbiBpc0VuZDsKLQotICAgIGJ5dGUgcHJvZ3Jlc3NQZXJjZW50OwotCi0gICAgaW50W10gZnJlcXVlbmNpZXM7Ci0KLSAgICBpbnRbXSBzeW1ib2xSYXRlczsKLQotICAgIGludCBoaWVyYXJjaHk7Ci0KLSAgICBpbnQgYW5hbG9nVHlwZTsKLQotICAgIGJ5dGVbXSBwbHBJZHM7Ci0KLSAgICBieXRlW10gZ3JvdXBJZHM7Ci0KLSAgICBjaGFyW10gaW5wdXRTdHJlYW1JZHM7Ci0KLSAgICBpbnQgc3RkOwotCi0gICAgVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm9bXSBhdHNjM1BscEluZm9zOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgYW5uZXg7Ci0KLSAgICBib29sZWFuIGlzSGlnaFByaW9yaXR5OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE1ZjNlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOwotCi0vKioKLSAqIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZFNldHRpbmdzIHsKLSAgICBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncyBzZXR0aW5nczsKLQotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLQotICAgIGludCBlbmRGcmVxdWVuY3k7Ci0KLSAgICBpbnQgaW52ZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiM2MwMWIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvOwotCi0vKioKLSAqIFR1bmVyIEZyb250ZW5kIFN0YXR1cyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZyb250ZW5kU3RhdHVzIHsKLSAgICAvKioKLSAgICAgKiBMb2NrIHN0YXR1cyBmb3IgRGVtb2QgaW4gVHJ1ZS9GYWxzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVtb2RMb2NrZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBTTlIgdmFsdWUgbWVhc3VyZWQgYnkgMC4wMDEgZEIuCi0gICAgICovCi0gICAgaW50IHNucjsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3IgYml0cyBwZXIgMSBiaWxsaW9uIGJpdHMuCi0gICAgICovCi0gICAgaW50IGJlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3IgcGFja2FnZXMgcGVyIDEgYmlsbGlvbiBwYWNrYWdlcy4KLSAgICAgKi8KLSAgICBpbnQgcGVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBlcnJvciBiaXRzIHBlciAxIGJpbGxpb24gYml0cyBiZWZvcmUgRkVDLgotICAgICAqLwotICAgIGludCBwcmVCZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTaWduYWwgUXVhbGl0eSBpbiBwZXJjZW50LgotICAgICAqLwotICAgIGludCBzaWduYWxRdWFsaXR5OwotCi0gICAgLyoqCi0gICAgICogU2lnbmFsIFN0cmVuZ3RoIG1lYXN1cmVkIGJ5IDAuMDAxIGRCbS4KLSAgICAgKi8KLSAgICBpbnQgc2lnbmFsU3RyZW5ndGg7Ci0KLSAgICAvKioKLSAgICAgKiBTeW1ib2xzIHBlciBzZWNvbmQKLSAgICAgKi8KLSAgICBpbnQgc3ltYm9sUmF0ZTsKLQotICAgIGxvbmcgaW5uZXJGZWM7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlCi0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgaW52ZXJzaW9uOwotCi0gICAgaW50IGxuYlZvbHRhZ2U7Ci0KLSAgICBieXRlIHBscElkOwotCi0gICAgYm9vbGVhbiBpc0VXQlM7Ci0KLSAgICAvKioKLSAgICAgKiBBR0MgdmFsdWUgaXMgbm9ybWFsaXplZCBmcm9tIDAgdG8gMjU1LgotICAgICAqLwotICAgIGJ5dGUgYWdjOwotCi0gICAgYm9vbGVhbiBpc0xuYU9uOwotCi0gICAgYm9vbGVhbltdIGlzTGF5ZXJFcnJvcjsKLQotICAgIC8qKgotICAgICAqIE1FUiB2YWx1ZSBtZWFzdXJlZCBieSAwLjAwMSBkQgotICAgICAqLwotICAgIGludCBtZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVxdWVuY3kgZGlmZmVyZW5jZSBpbiBIZXJ0ei4KLSAgICAgKi8KLSAgICBpbnQgZnJlcU9mZnNldDsKLQotICAgIGludCBoaWVyYXJjaHk7Ci0KLSAgICBib29sZWFuIGlzUmZMb2NrZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2YgUExQIHN0YXR1cyBmb3IgdHVuZWQgUExQcyBmb3IgQVRTQzMgZnJvbnRlbmQuCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mb1tdIHBscEluZm87Ci0KLSAgICAvLyAxLjEgRXh0ZW5zaW9uIFN0YXJ0aW5nCi0KLSAgICAvKioKLSAgICAgKiBFeHRlbmRlZCBtb2R1bGF0aW9uIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnRbXSBtb2R1bGF0aW9uczsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGJpdCBlcnJvciByYXRpbyBzdGF0dXMuCi0gICAgICovCi0gICAgaW50W10gYmVyczsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGNvZGUgcmF0ZSBzdGF0dXMuCi0gICAgICovCi0gICAgbG9uZ1tdIGNvZGVSYXRlczsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGJhbmR3aWR0aCBzdGF0dXMuIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUuCi0gICAgICovCi0gICAgaW50IGJhbmR3aWR0aDsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGd1YXJkIGludGVydmFsIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnQgaW50ZXJ2YWw7Ci0KLSAgICAvKioKLSAgICAgKiBFeHRlbmRlZCB0cmFuc21pc3Npb24gbW9kZSBzdGF0dXMuIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUuCi0gICAgICovCi0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBVbmNvcnJlY3RhYmxlIEVycm9yIENvdW50cyBvZiB0aGUgZnJvbnRlbmQncyBQaHlzaWNhbCBMYXllciBQaXBlIChQTFApCi0gICAgICogc2luY2UgdGhlIGxhc3QgdHVuZSBvcGVyYXRpb24uCi0gICAgICovCi0gICAgaW50IHVlYzsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IERWQi1UMiBzeXN0ZW0gaWQgc3RhdHVzLgotICAgICAqLwotICAgIGNoYXIgc3lzdGVtSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBGcm9udGVuZCBJbnRlcmxlYXZpbmcgTW9kZXMuIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUuCi0gICAgICovCi0gICAgaW50W10gaW50ZXJsZWF2aW5nOwotCi0gICAgLyoqCi0gICAgICogU2VnbWVudHMgaW4gSVNEQi1UIFNwZWNpZmljYXRpb24gb2YgYWxsIHRoZSBjaGFubmVscy4KLSAgICAgKi8KLSAgICBieXRlW10gaXNkYnRTZWdtZW50OwotCi0gICAgLyoqCi0gICAgICogVHJhbnNwb3J0IFN0cmVhbSBEYXRhIFJhdGUgaW4gQlBTIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwuCi0gICAgICovCi0gICAgaW50W10gdHNEYXRhUmF0ZTsKLQotICAgIC8qKgotICAgICAqIFJvbGwgT2ZmIFR5cGUgc3RhdHVzIG9mIHRoZSBmcm9udGVuZC4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnQgcm9sbE9mZjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBmcm9udGVuZCBjdXJyZW50bHkgc3VwcG9ydHMgTUlTTyBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc01pc287Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZnJvbnRlbmQgY29kZSByYXRlIGlzIGxpbmVhciBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0xpbmVhcjsKLQotICAgIC8qKgotICAgICAqIElmIHNob3J0IGZyYW1lcyBhcmUgZW5hYmxlZCBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Nob3J0RnJhbWVzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTZjMzQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgUGh5c2ljYWwgTGF5ZXIgUGlwZSBJbmZvIGluIEZyb250ZW5kIHN0YXR1cy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbyB7Ci0gICAgLyoqCi0gICAgICogUExQIElkIHZhbHVlLgotICAgICAqLwotICAgIGJ5dGUgcGxwSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBEZW1vZCBMb2NrL1VubG9jayBzdGF0dXMgb2YgdGhpcyBwYXJ0aWN1bGFyIFBMUC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTG9ja2VkOwotCi0gICAgLyoqCi0gICAgICogVW5jb3JyZWN0YWJsZSBFcnJvciBDb3VudHMgKFVFQykgb2YgdGhpcyBwYXJ0aWN1bGFyIFBMUCBzaW5jZSBsYXN0IHR1bmUgb3BlcmF0aW9uLgotICAgICAqLwotICAgIGludCB1ZWM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzYyYzJhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnNTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzOwotCi0vKioKLSAqIEZyb250ZW5kIFNldHRpbmdzIFVuaW9uIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzIHsKLSAgICBUdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MgYW5hbG9nOwotCi0gICAgVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncyBhdHNjOwotCi0gICAgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MgYXRzYzM7Ci0KLSAgICBUdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncyBjYWJsZTsKLQotICAgIFR1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MgZHZiczsKLQotICAgIFR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MgZHZidDsKLQotICAgIFR1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzIGlzZGJzOwotCi0gICAgVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzIGlzZGJzMzsKLQotICAgIFR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzIGlzZGJ0OwotCi0gICAgVHVuZXJGcm9udGVuZER0bWJTZXR0aW5ncyBkdG1iOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZW11eC5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE1MWQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZW11eC5jcHAKQEAgLTAsMCArMSwyNzggQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbERlbXV4IgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRGVtdXguaCIKKworI2luY2x1ZGUgIlR1bmVySGlkbER2ci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbFRpbWVGaWx0ZXIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclN1YlR5cGU7CisKK3VzaW5nIEhpZGxEZW11eEFscEZpbHRlclR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1haW5UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwordXNpbmcgSGlkbERlbXV4RmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4SXBGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxEZW11eE1tdHBGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4VGx2RmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4VHNGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxEdnJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJUeXBlOwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbERlbXV4OjpUdW5lckhpZGxEZW11eChzcDxJRGVtdXg+IGRlbXV4LCBpbnQgaWQpIHsKKyAgICBtRGVtdXggPSBkZW11eDsKKyAgICBtRGVtdXhJZCA9IGlkOworfQorCitUdW5lckhpZGxEZW11eDo6flR1bmVySGlkbERlbXV4KCkgeworICAgIG1EZW11eCA9IG51bGxwdHI7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBpbl9mcm9udGVuZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGludCBmcm9udGVuZElkOworICAgIGluX2Zyb250ZW5kLT5nZXRGcm9udGVuZElkKCZmcm9udGVuZElkKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZW11eC0+c2V0RnJvbnRlbmREYXRhU291cmNlKGZyb250ZW5kSWQpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6c2V0RnJvbnRlbmREYXRhU291cmNlQnlJZChpbnQgZnJvbnRlbmRJZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbERlbXV4RmlsdGVyTWFpblR5cGUgbWFpblR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhGaWx0ZXJNYWluVHlwZT4oaW5fdHlwZS5tYWluVHlwZSk7CisgICAgSGlkbERlbXV4RmlsdGVyVHlwZSBmaWx0ZXJUeXBleworICAgICAgICAgICAgLm1haW5UeXBlID0gbWFpblR5cGUsCisgICAgfTsKKworICAgIHN3aXRjaCAobWFpblR5cGUpIHsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1haW5UeXBlOjpUUzoKKyAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRzRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxIaWRsRGVtdXhUc0ZpbHRlclR5cGU+KAorICAgICAgICAgICAgICAgIGluX3R5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjpUYWc6OnRzRmlsdGVyVHlwZT4oKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQOgorICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUubW10cEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8SGlkbERlbXV4TW10cEZpbHRlclR5cGU+KAorICAgICAgICAgICAgICAgIGluX3R5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjpUYWc6Om1tdHBGaWx0ZXJUeXBlPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6OklQOgorICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUuaXBGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PEhpZGxEZW11eElwRmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6aXBGaWx0ZXJUeXBlPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6OlRMVjoKKyAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRsdkZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8SGlkbERlbXV4VGx2RmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6dGx2RmlsdGVyVHlwZT4oKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1haW5UeXBlOjpBTFA6CisgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5hbHBGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PEhpZGxEZW11eEFscEZpbHRlclR5cGU+KAorICAgICAgICAgICAgICAgIGluX3R5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjpUYWc6OmFscEZpbHRlclR5cGU+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJRmlsdGVyPiBmaWx0ZXJTcDsKKyAgICBzcDxUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrPiBmaWx0ZXJDYiA9IG5ldyBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrKGluX2NiKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGaWx0ZXJDYWxsYmFjaz4gY2JTcCA9IGZpbHRlckNiOworICAgIG1EZW11eC0+b3BlbkZpbHRlcihmaWx0ZXJUeXBlLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5fYnVmZmVyU2l6ZSksIGNiU3AsCisgICAgICAgICAgICAgICAgICAgICAgIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IHNwPEhpZGxJRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTcCA9IGZpbHRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRmlsdGVyPihmaWx0ZXJTcCwgZmlsdGVyQ2IsIGluX3R5cGUpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6Om9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBzcDxIaWRsSVRpbWVGaWx0ZXI+IGZpbHRlclNwOworICAgIG1EZW11eC0+b3BlblRpbWVGaWx0ZXIoWyZdKEhpZGxSZXN1bHQgciwgY29uc3Qgc3A8SGlkbElUaW1lRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgICAgIGZpbHRlclNwID0gZmlsdGVyOworICAgICAgICBzdGF0dXMgPSByOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsVGltZUZpbHRlcj4oZmlsdGVyU3ApOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OmdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiB0dW5lckZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBhdlN5bmNId0lkOworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIHNwPEhpZGxJRmlsdGVyPiBoYWxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPih0dW5lckZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIG1EZW11eC0+Z2V0QXZTeW5jSHdJZChoYWxGaWx0ZXIsIFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGlkKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGF2U3luY0h3SWQgPSBpZDsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IChpbnQpYXZTeW5jSHdJZDsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpnZXRBdlN5bmNUaW1lKGludDMyX3QgYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHVpbnQ2NF90IHRpbWU7CisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgbURlbXV4LT5nZXRBdlN5bmNUaW1lKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdlN5bmNId0lkKSwgWyZdKEhpZGxSZXN1bHQgciwgdWludDY0X3QgdHMpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgdGltZSA9IHRzOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpdGltZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpvcGVuRHZyKER2clR5cGUgaW5fZHZiVHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgc3A8SGlkbElEdnJDYWxsYmFjaz4gY2FsbGJhY2sgPSBuZXcgVHVuZXJIaWRsRHZyOjpEdnJDYWxsYmFjayhpbl9jYik7CisgICAgc3A8SGlkbElEdnI+IGhpZGxEdnI7CisgICAgbURlbXV4LT5vcGVuRHZyKHN0YXRpY19jYXN0PEhpZGxEdnJUeXBlPihpbl9kdmJUeXBlKSwgaW5fYnVmZmVyU2l6ZSwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IHNwPEhpZGxJRHZyPiYgZHZyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsRHZyID0gZHZyOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRHZyPihoaWRsRHZyLCBpbl9kdmJUeXBlKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4Ojpjb25uZWN0Q2lDYW0oaW50MzJfdCBjaUNhbUlkKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5jb25uZWN0Q2lDYW0oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNpQ2FtSWQpKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OmRpc2Nvbm5lY3RDaUNhbSgpIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVtdXgtPmRpc2Nvbm5lY3RDaUNhbSgpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6Y2xvc2UoKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5jbG9zZSgpOworICAgIG1EZW11eCA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNWRhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVtdXguaApAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETERFTVVYX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExERU1VWF9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckRlbXV4Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbElEZW11eCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlbXV4OworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbERlbXV4IDogcHVibGljIEJuVHVuZXJEZW11eCB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRGVtdXgoc3A8SGlkbElEZW11eD4gZGVtdXgsIGludCBkZW11eElkKTsKKyAgICB2aXJ0dWFsIH5UdW5lckhpZGxEZW11eCgpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGluX2Zyb250ZW5kKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGludCBmcm9udGVuZElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX3R1bmVyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRBdlN5bmNUaW1lKGludDMyX3QgaW5fYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRHZyKER2clR5cGUgaW5fZHZiVHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbm5lY3RDaUNhbShpbnQzMl90IGluX2NpQ2FtSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRpc2Nvbm5lY3RDaUNhbSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgZ2V0SWQoKSB7IHJldHVybiBtRGVtdXhJZDsgfQorCitwcml2YXRlOgorICAgIHNwPEhpZGxJRGVtdXg+IG1EZW11eDsKKyAgICBpbnQgbURlbXV4SWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETERFTVVYX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVzY3JhbWJsZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4Y2Q5YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVzY3JhbWJsZXIuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUdW5lckhpZGxEZXNjcmFtYmxlciIKKworI2luY2x1ZGUgIlR1bmVySGlkbERlc2NyYW1ibGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisKKyNpbmNsdWRlICJUdW5lckhpZGxEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbERlc2NyYW1ibGVyOjpUdW5lckhpZGxEZXNjcmFtYmxlcihzcDxIaWRsSURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcikgeworICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOworfQorCitUdW5lckhpZGxEZXNjcmFtYmxlcjo6flR1bmVySGlkbERlc2NyYW1ibGVyKCkgeworICAgIG1EZXNjcmFtYmxlciA9IG51bGxwdHI7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlc2NyYW1ibGVyOjpzZXREZW11eFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGluX3R1bmVyRGVtdXgpIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5zZXREZW11eFNvdXJjZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFR1bmVySGlkbERlbXV4Kj4oaW5fdHVuZXJEZW11eC5nZXQoKSktPmdldElkKCkpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZXNjcmFtYmxlcjo6c2V0S2V5VG9rZW4oY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlUb2tlbikgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldEtleVRva2VuKGluX2tleVRva2VuKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVzY3JhbWJsZXI6OmFkZFBpZCgKKyAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGaWx0ZXI+IGhhbEZpbHRlciA9CisgICAgICAgICAgICAoaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRmlsdGVyKj4oaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+YWRkUGlkKGdldEhpZGxEZW11eFBpZChpbl9waWQpLCBoYWxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZXNjcmFtYmxlcjo6cmVtb3ZlUGlkKAorICAgICAgICBjb25zdCBEZW11eFBpZCYgaW5fcGlkLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX29wdGlvbmFsU291cmNlRmlsdGVyKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVzY3JhbWJsZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBzcDxIaWRsSUZpbHRlcj4gaGFsRmlsdGVyID0KKyAgICAgICAgICAgIChpbl9vcHRpb25hbFNvdXJjZUZpbHRlciA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihpbl9vcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5yZW1vdmVQaWQoZ2V0SGlkbERlbXV4UGlkKGluX3BpZCksIGhhbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlc2NyYW1ibGVyOjpjbG9zZSgpIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+Y2xvc2UoKTsKKyAgICBtRGVzY3JhbWJsZXIgPSBudWxscHRyOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKK0hpZGxEZW11eFBpZCBUdW5lckhpZGxEZXNjcmFtYmxlcjo6Z2V0SGlkbERlbXV4UGlkKGNvbnN0IERlbXV4UGlkJiBwaWQpIHsKKyAgICBIaWRsRGVtdXhQaWQgaGlkbFBpZDsKKyAgICBzd2l0Y2ggKHBpZC5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhQaWQ6OnRQaWQ6IHsKKyAgICAgICAgaGlkbFBpZC50UGlkKCh1aW50MTZfdClwaWQuZ2V0PERlbXV4UGlkOjpUYWc6OnRQaWQ+KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFBpZDo6bW10cFBpZDogeworICAgICAgICBoaWRsUGlkLm1tdHBQaWQoKHVpbnQxNl90KXBpZC5nZXQ8RGVtdXhQaWQ6OlRhZzo6bW10cFBpZD4oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhpZGxQaWQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5oIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTQ5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlc2NyYW1ibGVyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExERVNDUkFNQkxFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMREVTQ1JBTUJMRVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFBpZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCit1c2luZyBIaWRsRGVtdXhQaWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwordXNpbmcgSGlkbElEZXNjcmFtYmxlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlc2NyYW1ibGVyOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbERlc2NyYW1ibGVyIDogcHVibGljIEJuVHVuZXJEZXNjcmFtYmxlciB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRGVzY3JhbWJsZXIoc3A8SGlkbElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXIpOworICAgIHZpcnR1YWwgflR1bmVySGlkbERlc2NyYW1ibGVyKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+JiBpbl90dW5lckRlbXV4KSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRLZXlUb2tlbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5VG9rZW4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGFkZFBpZCgKKyAgICAgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZVBpZCgKKyAgICAgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgSGlkbERlbXV4UGlkIGdldEhpZGxEZW11eFBpZChjb25zdCBEZW11eFBpZCYgcGlkKTsKKworICAgIHNwPEhpZGxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMREVTQ1JBTUJMRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEdnIuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEdnIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5jcHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbER2ciIKKworI2luY2x1ZGUgIlR1bmVySGlkbER2ci5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RhdGFGb3JtYXQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUGxheWJhY2tTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVjb3JkU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPGZtcS9Db252ZXJ0TVFEZXNjcmlwdG9ycy5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRhdGFGb3JtYXQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlBsYXliYWNrU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZWNvcmRTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6dW5zYWZlSGlkbFRvQWlkbE1RRGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7CisKK3VzaW5nIEhpZGxEYXRhRm9ybWF0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEYXRhRm9ybWF0OwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgTVFEZXNjID0gTVFEZXNjcmlwdG9yU3luYzx1aW50OF90PjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxEdnI6OlR1bmVySGlkbER2cihzcDxIaWRsSUR2cj4gZHZyLCBEdnJUeXBlIHR5cGUpIHsKKyAgICBtRHZyID0gZHZyOworICAgIG1UeXBlID0gdHlwZTsKK30KKworVHVuZXJIaWRsRHZyOjp+VHVuZXJIaWRsRHZyKCkgeworICAgIG1EdnIgPSBudWxscHRyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgTVFEZXNjIGR2ck1RRGVzYzsKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRHZyLT5nZXRRdWV1ZURlc2MoWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgTVFEZXNjJiBkZXNjKSB7CisgICAgICAgIGR2ck1RRGVzYyA9IGRlc2M7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIEFpZGxNUURlc2MgYWlkbE1RRGVzYzsKKyAgICB1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yPHVpbnQ4X3QsIGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPihkdnJNUURlc2MsICZhaWRsTVFEZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShhaWRsTVFEZXNjKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6Y29uZmlndXJlKGNvbnN0IER2clNldHRpbmdzJiBpbl9zZXR0aW5ncykgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmNvbmZpZ3VyZShnZXRIaWRsRHZyU2V0dGluZ3MoaW5fc2V0dGluZ3MpKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjphdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKGluX2ZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJRmlsdGVyPiBoaWRsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRmlsdGVyKj4oaW5fZmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgaWYgKGhpZGxGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmF0dGFjaEZpbHRlcihoaWRsRmlsdGVyKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKGluX2ZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJRmlsdGVyPiBoYWxGaWx0ZXIgPSAoc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRmlsdGVyKj4oaW5fZmlsdGVyLmdldCgpKSktPmdldEhhbEZpbHRlcigpOworICAgIGlmIChoYWxGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmRldGFjaEZpbHRlcihoYWxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OnN0YXJ0KCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPnN0YXJ0KCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6c3RvcCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRHZyLT5zdG9wKCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6Zmx1c2goKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUR2ci0+Zmx1c2goKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpjbG9zZSgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRHZyLT5jbG9zZSgpOworICAgIG1EdnIgPSBudWxscHRyOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKK0hpZGxEdnJTZXR0aW5ncyBUdW5lckhpZGxEdnI6OmdldEhpZGxEdnJTZXR0aW5ncyhjb25zdCBEdnJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRHZyU2V0dGluZ3MgczsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgY2FzZSBEdnJUeXBlOjpQTEFZQkFDSzogeworICAgICAgICBzLnBsYXliYWNrKHsKKyAgICAgICAgICAgICAgICAuc3RhdHVzTWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnBsYXliYWNrPigpLnN0YXR1c01hc2spLAorICAgICAgICAgICAgICAgIC5sb3dUaHJlc2hvbGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cGxheWJhY2s+KCkubG93VGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuaGlnaFRocmVzaG9sZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpwbGF5YmFjaz4oKS5oaWdoVGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuZGF0YUZvcm1hdCA9IHN0YXRpY19jYXN0PEhpZGxEYXRhRm9ybWF0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cGxheWJhY2s+KCkuZGF0YUZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBhY2tldFNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpwbGF5YmFjaz4oKS5wYWNrZXRTaXplKSwKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBjYXNlIER2clR5cGU6OlJFQ09SRDogeworICAgICAgICBzLnJlY29yZCh7CisgICAgICAgICAgICAgICAgLnN0YXR1c01hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5zdGF0dXNNYXNrKSwKKyAgICAgICAgICAgICAgICAubG93VGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5sb3dUaHJlc2hvbGQpLAorICAgICAgICAgICAgICAgIC5oaWdoVGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5oaWdoVGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuZGF0YUZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRGF0YUZvcm1hdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpyZWNvcmQ+KCkuZGF0YUZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBhY2tldFNpemUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5wYWNrZXRTaXplKSwKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBJRHZyQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1JldHVybjx2b2lkPiBUdW5lckhpZGxEdnI6OkR2ckNhbGxiYWNrOjpvblJlY29yZFN0YXR1cyhjb25zdCBIaWRsUmVjb3JkU3RhdHVzIHN0YXR1cykgeworICAgIGlmIChtVHVuZXJEdnJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckR2ckNhbGxiYWNrLT5vblJlY29yZFN0YXR1cyhzdGF0aWNfY2FzdDxSZWNvcmRTdGF0dXM+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJIaWRsRHZyOjpEdnJDYWxsYmFjazo6b25QbGF5YmFja1N0YXR1cyhjb25zdCBIaWRsUGxheWJhY2tTdGF0dXMgc3RhdHVzKSB7CisgICAgaWYgKG1UdW5lckR2ckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRHZyQ2FsbGJhY2stPm9uUGxheWJhY2tTdGF0dXMoc3RhdGljX2Nhc3Q8UGxheWJhY2tTdGF0dXM+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRHZyLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODBmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMRFZSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExEVlJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0R2clNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0R2clR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckR2ci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lEdnIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JRHZyQ2FsbGJhY2suaD4KKworI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RHZyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkR2clR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbER2clNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJTZXR0aW5nczsKK3VzaW5nIEhpZGxJRHZyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyOwordXNpbmcgSGlkbElEdnJDYWxsYmFjayA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2ckNhbGxiYWNrOwordXNpbmcgSGlkbFBsYXliYWNrU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpQbGF5YmFja1N0YXR1czsKK3VzaW5nIEhpZGxSZWNvcmRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlY29yZFN0YXR1czsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCit1c2luZyBBaWRsTVFEZXNjID0gTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKworY2xhc3MgVHVuZXJIaWRsRHZyIDogcHVibGljIEJuVHVuZXJEdnIgeworcHVibGljOgorICAgIFR1bmVySGlkbER2cihzcDxIaWRsSUR2cj4gZHZyLCBEdnJUeXBlIHR5cGUpOworICAgIH5UdW5lckhpZGxEdnIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBEdnJTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBzdHJ1Y3QgRHZyQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElEdnJDYWxsYmFjayB7CisgICAgICAgIER2ckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IHR1bmVyRHZyQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyRHZyQ2FsbGJhY2sodHVuZXJEdnJDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblJlY29yZFN0YXR1cyhjb25zdCBIaWRsUmVjb3JkU3RhdHVzIHN0YXR1cyk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uUGxheWJhY2tTdGF0dXMoY29uc3QgSGlkbFBsYXliYWNrU3RhdHVzIHN0YXR1cyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiBtVHVuZXJEdnJDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIEhpZGxEdnJTZXR0aW5ncyBnZXRIaWRsRHZyU2V0dGluZ3MoY29uc3QgRHZyU2V0dGluZ3MmIHNldHRpbmdzKTsKKworICAgIHNwPEhpZGxJRHZyPiBtRHZyOworICAgIER2clR5cGUgbVR5cGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETERWUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3NGE1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmNwcApAQCAtMCwwICsxLDEyODYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbEZpbHRlciIKKworI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0NvbnN0YW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4U2NJbmRleC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxmbXEvQ29udmVydE1RRGVzY3JpcHRvcnMuaD4KKworI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsU2VydmljZS5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkF1ZGlvRXh0cmFNZXRhRGF0YTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpDb25zdGFudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhBbHBGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhBbHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckRvd25sb2FkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyTWFpblR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyTWVkaWFFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNZWRpYUV2ZW50RXh0cmFNZXRhRGF0YTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyTW9uaXRvckV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclBlc0V2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNjSW5kZXhNYXNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNlY3Rpb25CaXRzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNlY3Rpb25FdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzQ29uZGl0aW9uVGFibGVJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclN1YlR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyVGVtaUV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4SXBBZGRyZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eElwQWRkcmVzc0lwQWRkcmVzczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhJcEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4TW10cEZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4UGlkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFNjSW5kZXg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4VGx2RmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4VGx2RmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhUc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhUc0ZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6U2NyYW1ibGluZ1N0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6ZHVwVG9BaWRsOwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6bWFrZUZyb21BaWRsOwordXNpbmcgOjphbmRyb2lkOjp1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CisKK3VzaW5nIEhpZGxEZW11eEFscExlbmd0aFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwTGVuZ3RoVHlwZTsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1haW5UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwordXNpbmcgSGlkbERlbXV4SXBBZGRyZXNzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwQWRkcmVzczsKK3VzaW5nIEhpZGxEZW11eE1tdHBGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4TW10cFBpZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwUGlkOwordXNpbmcgSGlkbERlbXV4UmVjb3JkU2NJbmRleFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UmVjb3JkU2NJbmRleFR5cGU7Cit1c2luZyBIaWRsRGVtdXhTdHJlYW1JZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhTdHJlYW1JZDsKK3VzaW5nIEhpZGxEZW11eFRzRmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclR5cGU7Cit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Cit1c2luZyBIaWRsQXVkaW9TdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBIaWRsQ29uc3RhbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkNvbnN0YW50OwordXNpbmcgSGlkbFZpZGVvU3RyZWFtVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6VmlkZW9TdHJlYW1UeXBlOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbEZpbHRlcjo6VHVuZXJIaWRsRmlsdGVyKHNwPEhpZGxJRmlsdGVyPiBmaWx0ZXIsIHNwPEZpbHRlckNhbGxiYWNrPiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbXV4RmlsdGVyVHlwZSB0eXBlKQorICAgICAgOiBtRmlsdGVyKGZpbHRlciksCisgICAgICAgIG1UeXBlKHR5cGUpLAorICAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICAgIG1TaGFyZWQoZmFsc2UpLAorICAgICAgICBtQ2xpZW50UGlkKC0xKSwKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrKGNiKSB7CisgICAgbUZpbHRlcl8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXI6OmNhc3RGcm9tKGZpbHRlcik7Cit9CisKK1R1bmVySGlkbEZpbHRlcjo6flR1bmVySGlkbEZpbHRlcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1GaWx0ZXIgPSBudWxscHRyOworICAgIG1GaWx0ZXJfMV8xID0gbnVsbHB0cjsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgTVFEZXNjIGZpbHRlck1RRGVzYzsKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyLT5nZXRRdWV1ZURlc2MoWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgTVFEZXNjJiBkZXNjKSB7CisgICAgICAgIGZpbHRlck1RRGVzYyA9IGRlc2M7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIEFpZGxNUURlc2MgYWlkbE1RRGVzYzsKKyAgICB1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yPHVpbnQ4X3QsIGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPihmaWx0ZXJNUURlc2MsICZhaWRsTVFEZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShhaWRsTVFEZXNjKTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1GaWx0ZXItPmdldElkKFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGZpbHRlcklkKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIG1JZCA9IGZpbHRlcklkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IG1JZDsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyXzFfMS0+Z2V0SWQ2NEJpdChbJl0oSGlkbFJlc3VsdCByLCB1aW50NjRfdCBmaWx0ZXJJZCkgeworICAgICAgICByZXMgPSByOworICAgICAgICBtSWQ2NEJpdCA9IGZpbHRlcklkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IG1JZDY0Qml0OworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBpbl9zZXR0aW5ncykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc3dpdGNoIChpbl9zZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6dHM6IHsKKyAgICAgICAgZ2V0SGlkbFRzU2V0dGluZ3MoaW5fc2V0dGluZ3MsIHNldHRpbmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6bW10cDogeworICAgICAgICBnZXRIaWRsTW10cFNldHRpbmdzKGluX3NldHRpbmdzLCBzZXR0aW5ncyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4RmlsdGVyU2V0dGluZ3M6OmlwOiB7CisgICAgICAgIGdldEhpZGxJcFNldHRpbmdzKGluX3NldHRpbmdzLCBzZXR0aW5ncyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4RmlsdGVyU2V0dGluZ3M6OnRsdjogeworICAgICAgICBnZXRIaWRsVGx2U2V0dGluZ3MoaW5fc2V0dGluZ3MsIHNldHRpbmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6YWxwOiB7CisgICAgICAgIGdldEhpZGxBbHBTZXR0aW5ncyhpbl9zZXR0aW5ncywgc2V0dGluZ3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRmlsdGVyLT5jb25maWd1cmUoc2V0dGluZ3MpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Y29uZmlndXJlTW9uaXRvckV2ZW50KGludDMyX3QgbW9uaXRvckV2ZW50VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVNb25pdG9yRXZlbnQobW9uaXRvckV2ZW50VHlwZSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQzMl90IGNpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVJcENpZChjaWQpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Y29uZmlndXJlQXZTdHJlYW1UeXBlKGNvbnN0IEF2U3RyZWFtVHlwZSYgaW5fYXZTdHJlYW1UeXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxBdlN0cmVhbVR5cGUgdHlwZTsKKyAgICBpZiAoIWdldEhpZGxBdlN0cmVhbVR5cGUoaW5fYXZTdHJlYW1UeXBlLCB0eXBlKSkgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVBdlN0cmVhbVR5cGUodHlwZSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKGZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGaWx0ZXI+IGhpZGxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihmaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnNldERhdGFTb3VyY2UoaGlkbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRBdlNoYXJlZEhhbmRsZShOYXRpdmVIYW5kbGUqIG91dF9hdk1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1GaWx0ZXJfMV8xLT5nZXRBdlNoYXJlZEhhbmRsZShbJl0oSGlkbFJlc3VsdCByLCBoaWRsX2hhbmRsZSBhdk1lbW9yeSwgdWludDY0X3QgYXZNZW1TaXplKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAgICAgKm91dF9hdk1lbW9yeSA9IGR1cFRvQWlkbChhdk1lbW9yeSk7CisgICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oYXZNZW1TaXplKTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpyZWxlYXNlQXZIYW5kbGUoY29uc3QgTmF0aXZlSGFuZGxlJiBpbl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2F2RGF0YUlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBoaWRsX2hhbmRsZSBoYW5kbGU7CisgICAgaGFuZGxlLnNldFRvKG1ha2VGcm9tQWlkbChpbl9oYW5kbGUpLCB0cnVlKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnJlbGVhc2VBdkhhbmRsZShoYW5kbGUsIGluX2F2RGF0YUlkKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KKyAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCisgICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgorICAgIG1GaWx0ZXItPmdldElkKFsmXShIaWRsUmVzdWx0IC8qIHIgKi8sIHVpbnQzMl90IC8qIGZpbHRlcklkKi8pe30pOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RvcCgpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpmbHVzaCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgaW4gd3JvbmcgcHJvY2VzcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmZsdXNoKCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpjbG9zZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhTVEFUVVNfSU5BQ0NFU1NJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+cmVtb3ZlU2hhcmVkRmlsdGVyKHRoaXMtPnJlZjxUdW5lckhpZGxGaWx0ZXI+KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2FsbGluZyBmcm9tIHNoYXJlZCBwcm9jZXNzLCBkbyBub3QgcmVhbGx5IGNsb3NlIHRoaXMgZmlsdGVyLgorICAgICAgICAgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5kZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaENhbGxiYWNrcygpOworICAgIH0KKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNsb3NlKCk7CisgICAgbUZpbHRlciA9IG51bGxwdHI7CisgICAgbUZpbHRlcl8xXzEgPSBudWxscHRyOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNoYXJlZCA9IGZhbHNlOworICAgIG1DbGllbnRQaWQgPSAtMTsKKworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6YWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQgfHwgbVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0QoImNyZWF0ZSBTaGFyZWRGaWx0ZXIgaW4gd3Jvbmcgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgbUNsaWVudFBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIHN0cmluZyB0b2tlbiA9CisgICAgICAgICAgICBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+YWRkRmlsdGVyVG9TaGFyZWQodGhpcy0+cmVmPFR1bmVySGlkbEZpbHRlcj4oKSk7CisgICAgX2FpZGxfcmV0dXJuLT5hc3NpZ24odG9rZW4pOworICAgIG1TaGFyZWQgPSB0cnVlOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmZyZWVTaGFyZWRGaWx0ZXJUb2tlbihjb25zdCBzdHJpbmcmIC8qIGluX2ZpbHRlclRva2VuICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKCFtU2hhcmVkKSB7CisgICAgICAgIC8vIFRoZSBmaWx0ZXIgaXMgbm90IHNoYXJlZCBvciB0aGUgc2hhcmVkIGZpbHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5zZW5kU2hhcmVkRmlsdGVyU3RhdHVzKFNUQVRVU19JTkFDQ0VTU0lCTEUpOworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgfQorCisgICAgVHVuZXJIaWRsU2VydmljZTo6Z2V0VHVuZXJTZXJ2aWNlKCktPnJlbW92ZVNoYXJlZEZpbHRlcih0aGlzLT5yZWY8VHVuZXJIaWRsRmlsdGVyPigpKTsKKyAgICBtU2hhcmVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Z2V0RmlsdGVyVHlwZShEZW11eEZpbHRlclR5cGUqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gbVR5cGU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnNldERlbGF5SGludChjb25zdCBGaWx0ZXJEZWxheUhpbnQmKSB7CisgICAgLy8gc2V0RGVsYXlIaW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gSElETCBIQUwKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Cit9CisKK2Jvb2wgVHVuZXJIaWRsRmlsdGVyOjppc1NoYXJlZEZpbHRlckFsbG93ZWQoaW50IGNhbGxpbmdQaWQpIHsKKyAgICByZXR1cm4gbVNoYXJlZCAmJiBtQ2xpZW50UGlkICE9IGNhbGxpbmdQaWQ7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjphdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpIHsKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5hdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhpbl9jYik7CisgICAgfQorfQorCitzcDxIaWRsSUZpbHRlcj4gVHVuZXJIaWRsRmlsdGVyOjpnZXRIYWxGaWx0ZXIoKSB7CisgICAgcmV0dXJuIG1GaWx0ZXI7Cit9CisKK2Jvb2wgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsQXZTdHJlYW1UeXBlKGNvbnN0IEF2U3RyZWFtVHlwZSBhdlN0cmVhbVR5cGUsIEhpZGxBdlN0cmVhbVR5cGUmIHR5cGUpIHsKKyAgICBpZiAoaXNBdWRpb0ZpbHRlcigpKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBhdWRpbyA9IGF2U3RyZWFtVHlwZS5nZXQ8QXZTdHJlYW1UeXBlOjphdWRpbz4oKTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxBdWRpb1N0cmVhbVR5cGU6OkRSQSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0eXBlLmF1ZGlvKHN0YXRpY19jYXN0PEhpZGxBdWRpb1N0cmVhbVR5cGU+KGF1ZGlvKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChpc1ZpZGVvRmlsdGVyKCkpIHsKKyAgICAgICAgdHlwZS52aWRlbyhzdGF0aWNfY2FzdDxIaWRsVmlkZW9TdHJlYW1UeXBlPihhdlN0cmVhbVR5cGUuZ2V0PEF2U3RyZWFtVHlwZTo6dmlkZW8+KCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFR1bmVySGlkbEZpbHRlcjo6aXNBdWRpb0ZpbHRlcigpIHsKKyAgICByZXR1cm4gKG1UeXBlLm1haW5UeXBlID09IERlbXV4RmlsdGVyTWFpblR5cGU6OlRTICYmCisgICAgICAgICAgICBtVHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OnRzRmlsdGVyVHlwZT4oKSA9PSBEZW11eFRzRmlsdGVyVHlwZTo6QVVESU8pIHx8CisgICAgICAgICAgIChtVHlwZS5tYWluVHlwZSA9PSBEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQICYmCisgICAgICAgICAgICBtVHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6Om1tdHBGaWx0ZXJUeXBlPigpID09IERlbXV4TW10cEZpbHRlclR5cGU6OkFVRElPKTsKK30KKworYm9vbCBUdW5lckhpZGxGaWx0ZXI6OmlzVmlkZW9GaWx0ZXIoKSB7CisgICAgcmV0dXJuIChtVHlwZS5tYWluVHlwZSA9PSBEZW11eEZpbHRlck1haW5UeXBlOjpUUyAmJgorICAgICAgICAgICAgbVR5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjp0c0ZpbHRlclR5cGU+KCkgPT0gRGVtdXhUc0ZpbHRlclR5cGU6OlZJREVPKSB8fAorICAgICAgICAgICAobVR5cGUubWFpblR5cGUgPT0gRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUCAmJgorICAgICAgICAgICAgbVR5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjptbXRwRmlsdGVyVHlwZT4oKSA9PSBEZW11eE1tdHBGaWx0ZXJUeXBlOjpWSURFTyk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsVHNTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhUc0ZpbHRlclNldHRpbmdzJiB0c0NvbmYgPSBzZXR0aW5ncy5nZXQ8RGVtdXhGaWx0ZXJTZXR0aW5nczo6dHM+KCk7CisgICAgSGlkbERlbXV4VHNGaWx0ZXJTZXR0aW5ncyB0c3sKKyAgICAgICAgICAgIC50cGlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRzQ29uZi50cGlkKSwKKyAgICB9OworCisgICAgc3dpdGNoICh0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjphdjogeworICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5hdihnZXRIaWRsQXZTZXR0aW5ncygKKyAgICAgICAgICAgICAgICB0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjphdj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdHNDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YTogeworICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldEhpZGxQZXNEYXRhU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdHNDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YT4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cmVjb3JkOiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLnJlY29yZChnZXRIaWRsUmVjb3JkU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdHNDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cmVjb3JkPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGhpZGxTZXR0aW5ncy50cyh0cyk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsTW10cFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncykgeworICAgIGNvbnN0IERlbXV4TW10cEZpbHRlclNldHRpbmdzJiBtbXRwQ29uZiA9IHNldHRpbmdzLmdldDxEZW11eEZpbHRlclNldHRpbmdzOjptbXRwPigpOworICAgIEhpZGxEZW11eE1tdHBGaWx0ZXJTZXR0aW5ncyBtbXRweworICAgICAgICAgICAgLm1tdHBQaWQgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhNbXRwUGlkPihtbXRwQ29uZi5tbXRwUGlkKSwKKyAgICB9OworCisgICAgc3dpdGNoIChtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YXY6IHsKKyAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5hdihnZXRIaWRsQXZTZXR0aW5ncygKKyAgICAgICAgICAgICAgICBtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YXY+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0SGlkbFNlY3Rpb25TZXR0aW5ncygKKyAgICAgICAgICAgICAgICBtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpwZXNEYXRhOiB7CisgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucGVzRGF0YShnZXRIaWRsUGVzRGF0YVNldHRpbmdzKAorICAgICAgICAgICAgICAgIG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnJlY29yZDogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLnJlY29yZChnZXRIaWRsUmVjb3JkU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgbW10cENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnJlY29yZD4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpkb3dubG9hZDogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLmRvd25sb2FkKGdldEhpZGxEb3dubG9hZFNldHRpbmdzKAorICAgICAgICAgICAgICAgIG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpkb3dubG9hZD4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGhpZGxTZXR0aW5ncy5tbXRwKG1tdHApOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbElwU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncykgeworICAgIGNvbnN0IERlbXV4SXBGaWx0ZXJTZXR0aW5ncyYgaXBDb25mID0gc2V0dGluZ3MuZ2V0PERlbXV4RmlsdGVyU2V0dGluZ3M6OmlwPigpOworICAgIEhpZGxEZW11eElwQWRkcmVzcyBpcEFkZHJ7CisgICAgICAgICAgICAuc3JjUG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLnNyY1BvcnQpLAorICAgICAgICAgICAgLmRzdFBvcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXBDb25mLmlwQWRkci5kc3RQb3J0KSwKKyAgICB9OworCisgICAgaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MuZ2V0VGFnKCkgPT0gRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY2CisgICAgICAgICAgICA/IGlwQWRkci5zcmNJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKQorICAgICAgICAgICAgOiBpcEFkZHIuc3JjSXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuc3JjSXBBZGRyZXNzKSk7CisgICAgaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MuZ2V0VGFnKCkgPT0gRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY2CisgICAgICAgICAgICA/IGlwQWRkci5kc3RJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKQorICAgICAgICAgICAgOiBpcEFkZHIuZHN0SXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuZHN0SXBBZGRyZXNzKSk7CisKKyAgICBIaWRsRGVtdXhJcEZpbHRlclNldHRpbmdzIGlwOworICAgIGlwLmlwQWRkciA9IGlwQWRkcjsKKworICAgIHN3aXRjaCAoaXBDb25mLmZpbHRlclNldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgaXBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YlBhc3N0aHJvdWdoOiB7CisgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLmJQYXNzdGhyb3VnaCgKKyAgICAgICAgICAgICAgICBpcENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4SXBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpiUGFzc3Rocm91Z2g+KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBoaWRsU2V0dGluZ3MuaXAoaXApOworfQorCitoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gVHVuZXJIaWRsRmlsdGVyOjpnZXRJcFY2QWRkcmVzcygKKyAgICAgICAgY29uc3QgRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3MmIGFkZHIpIHsKKyAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gaXA7CisgICAgaWYgKGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2Nj4oKS5zaXplKCkgIT0gSVBfVjZfTEVOR1RIKSB7CisgICAgICAgIHJldHVybiBpcDsKKyAgICB9CisgICAgY29weShhZGRyLmdldDxEZW11eElwQWRkcmVzc0lwQWRkcmVzczo6djY+KCkuYmVnaW4oKSwKKyAgICAgICAgIGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2Nj4oKS5lbmQoKSwgaXAuZGF0YSgpKTsKKyAgICByZXR1cm4gaXA7Cit9CisKK2hpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBUdW5lckhpZGxGaWx0ZXI6OmdldElwVjRBZGRyZXNzKAorICAgICAgICBjb25zdCBEZW11eElwQWRkcmVzc0lwQWRkcmVzcyYgYWRkcikgeworICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBpcDsKKyAgICBpZiAoYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY0PigpLnNpemUoKSAhPSBJUF9WNF9MRU5HVEgpIHsKKyAgICAgICAgcmV0dXJuIGlwOworICAgIH0KKyAgICBjb3B5KGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2ND4oKS5iZWdpbigpLAorICAgICAgICAgYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY0PigpLmVuZCgpLCBpcC5kYXRhKCkpOworICAgIHJldHVybiBpcDsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxUbHZTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncykgeworICAgIGNvbnN0IERlbXV4VGx2RmlsdGVyU2V0dGluZ3MmIHRsdkNvbmYgPSBzZXR0aW5ncy5nZXQ8RGVtdXhGaWx0ZXJTZXR0aW5nczo6dGx2PigpOworICAgIEhpZGxEZW11eFRsdkZpbHRlclNldHRpbmdzIHRsdnsKKyAgICAgICAgICAgIC5wYWNrZXRUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odGx2Q29uZi5wYWNrZXRUeXBlKSwKKyAgICAgICAgICAgIC5pc0NvbXByZXNzZWRJcFBhY2tldCA9IHRsdkNvbmYuaXNDb21wcmVzc2VkSXBQYWNrZXQsCisgICAgfTsKKworICAgIHN3aXRjaCAodGx2Q29uZi5maWx0ZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdGx2Q29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4VGx2RmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YlBhc3N0aHJvdWdoOiB7CisgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5iUGFzc3Rocm91Z2goCisgICAgICAgICAgICAgICAgdGx2Q29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpiUGFzc3Rocm91Z2g+KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaGlkbFNldHRpbmdzLnRsdih0bHYpOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbEFscFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyYgYWxwQ29uZiA9IHNldHRpbmdzLmdldDxEZW11eEZpbHRlclNldHRpbmdzOjphbHA+KCk7CisgICAgSGlkbERlbXV4QWxwRmlsdGVyU2V0dGluZ3MgYWxweworICAgICAgICAgICAgLnBhY2tldFR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihhbHBDb25mLnBhY2tldFR5cGUpLAorICAgICAgICAgICAgLmxlbmd0aFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhBbHBMZW5ndGhUeXBlPihhbHBDb25mLmxlbmd0aFR5cGUpLAorICAgIH07CisKKyAgICBzd2l0Y2ggKGFscENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4QWxwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICBhbHAuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRIaWRsU2VjdGlvblNldHRpbmdzKAorICAgICAgICAgICAgICAgIGFscENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4QWxwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBhbHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaGlkbFNldHRpbmdzLmFscChhbHApOworfQorCitIaWRsRGVtdXhGaWx0ZXJBdlNldHRpbmdzIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbEF2U2V0dGluZ3MoCisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyQXZTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJBdlNldHRpbmdzIGF2eworICAgICAgICAgICAgLmlzUGFzc3Rocm91Z2ggPSBzZXR0aW5ncy5pc1Bhc3N0aHJvdWdoLAorICAgIH07CisgICAgcmV0dXJuIGF2OworfQorCitIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsU2VjdGlvblNldHRpbmdzKAorICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3Mgc2VjdGlvbnsKKyAgICAgICAgICAgIC5pc0NoZWNrQ3JjID0gc2V0dGluZ3MuaXNDaGVja0NyYywKKyAgICAgICAgICAgIC5pc1JlcGVhdCA9IHNldHRpbmdzLmlzUmVwZWF0LAorICAgICAgICAgICAgLmlzUmF3ID0gc2V0dGluZ3MuaXNSYXcsCisgICAgfTsKKworICAgIHN3aXRjaCAoc2V0dGluZ3MuY29uZGl0aW9uLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvbjo6c2VjdGlvbkJpdHM6IHsKKyAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJTZWN0aW9uQml0cyYgc2VjdGlvbkJpdHMgPQorICAgICAgICAgICAgICAgIHNldHRpbmdzLmNvbmRpdGlvbi5nZXQ8RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb246OnNlY3Rpb25CaXRzPigpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gZmlsdGVyKHNlY3Rpb25CaXRzLmZpbHRlci5iZWdpbigpLCBzZWN0aW9uQml0cy5maWx0ZXIuZW5kKCkpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gbWFzayhzZWN0aW9uQml0cy5tYXNrLmJlZ2luKCksIHNlY3Rpb25CaXRzLm1hc2suZW5kKCkpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gbW9kZShzZWN0aW9uQml0cy5tb2RlLmJlZ2luKCksIHNlY3Rpb25CaXRzLm1vZGUuZW5kKCkpOworICAgICAgICBzZWN0aW9uLmNvbmRpdGlvbi5zZWN0aW9uQml0cyh7CisgICAgICAgICAgICAgICAgLmZpbHRlciA9IGZpbHRlciwKKyAgICAgICAgICAgICAgICAubWFzayA9IG1hc2ssCisgICAgICAgICAgICAgICAgLm1vZGUgPSBtb2RlLAorICAgICAgICB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb246OnRhYmxlSW5mbzogeworICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvblRhYmxlSW5mbyYgdGFibGVJbmZvID0KKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5jb25kaXRpb24uZ2V0PERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzQ29uZGl0aW9uOjp0YWJsZUluZm8+KCk7CisgICAgICAgIHNlY3Rpb24uY29uZGl0aW9uLnRhYmxlSW5mbyh7CisgICAgICAgICAgICAgICAgLnRhYmxlSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odGFibGVJbmZvLnRhYmxlSWQpLAorICAgICAgICAgICAgICAgIC52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRhYmxlSW5mby52ZXJzaW9uKSwKKyAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlY3Rpb247Cit9CisKK0hpZGxEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxQZXNEYXRhU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEhpZGxEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBwZXN7CisgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhTdHJlYW1JZD4oc2V0dGluZ3Muc3RyZWFtSWQpLAorICAgICAgICAgICAgLmlzUmF3ID0gc2V0dGluZ3MuaXNSYXcsCisgICAgfTsKKyAgICByZXR1cm4gcGVzOworfQorCitIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxSZWNvcmRTZXR0aW5ncygKKyAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyByZWNvcmR7CisgICAgICAgICAgICAudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MudHNJbmRleE1hc2spLAorICAgIH07CisKKyAgICBzd2l0Y2ggKHNldHRpbmdzLnNjSW5kZXhNYXNrLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0luZGV4OiB7CisgICAgICAgIHJlY29yZC5zY0luZGV4VHlwZSA9IHN0YXRpY19jYXN0PEhpZGxEZW11eFJlY29yZFNjSW5kZXhUeXBlPihzZXR0aW5ncy5zY0luZGV4VHlwZSk7CisgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zYygKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3Muc2NJbmRleE1hc2suZ2V0PERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OnNjSW5kZXg+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NBdmM6IHsKKyAgICAgICAgcmVjb3JkLnNjSW5kZXhUeXBlID0gSGlkbERlbXV4UmVjb3JkU2NJbmRleFR5cGU6OlNDOworICAgICAgICB1aW50MzJfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLnNjSW5kZXhNYXNrLmdldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0F2Yz4oKSk7CisgICAgICAgIC8vIEhJREwgSEFMIHN0YXJ0aW5nIGZyb20gMSA8PCA0OyBBSURMIHN0YXJ0aW5nIGZyb20gMSA8PCAwLgorICAgICAgICBpbmRleCA9IGluZGV4IDw8IDQ7CisgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zYyhpbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OnNjSGV2YzogeworICAgICAgICByZWNvcmQuc2NJbmRleFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhSZWNvcmRTY0luZGV4VHlwZT4oc2V0dGluZ3Muc2NJbmRleFR5cGUpOworICAgICAgICByZWNvcmQuc2NJbmRleE1hc2suc2NIZXZjKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5zY0luZGV4TWFzay5nZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlY29yZDsKK30KKworSGlkbERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxEb3dubG9hZFNldHRpbmdzKAorICAgICAgICBjb25zdCBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBkb3dubG9hZHsKKyAgICAgICAgICAgIC5kb3dubG9hZElkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmRvd25sb2FkSWQpLAorICAgIH07CisgICAgcmV0dXJuIGRvd25sb2FkOworfQorCisvLy8vLy8vLy8vLy8vLy8gRmlsdGVyQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1JldHVybjx2b2lkPiBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhIaWRsRGVtdXhGaWx0ZXJTdGF0dXMgc3RhdHVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlclN0YXR1cyhzdGF0aWNfY2FzdDxEZW11eEZpbHRlclN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50KAorICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpIHsKKyAgICB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBlbXB0eUV2ZW50c0V4dDsKKyAgICBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dCBlbXB0eUZpbHRlckV2ZW50RXh0eworICAgICAgICAgICAgLmV2ZW50cyA9IGVtcHR5RXZlbnRzRXh0LAorICAgIH07CisgICAgb25GaWx0ZXJFdmVudF8xXzEoZmlsdGVyRXZlbnQsIGVtcHR5RmlsdGVyRXZlbnRFeHQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50XzFfMSgKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50LCBjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dCYgZmlsdGVyRXZlbnRFeHQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4gZXZlbnRzID0gZmlsdGVyRXZlbnQuZXZlbnRzOworICAgICAgICB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBldmVudHNFeHQgPSBmaWx0ZXJFdmVudEV4dC5ldmVudHM7CisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiB0dW5lckV2ZW50czsKKworICAgICAgICBnZXRBaWRsRmlsdGVyRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnRzKTsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyRXZlbnQodHVuZXJFdmVudHMpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OnNlbmRTaGFyZWRGaWx0ZXJTdGF0dXMoaW50MzJfdCBzdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIgJiYgbU9yaWdpbmFsQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJTdGF0dXMoc3RhdGljX2Nhc3Q8RGVtdXhGaWx0ZXJTdGF0dXM+KHN0YXR1cykpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjphdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIG1PcmlnaW5hbENhbGxiYWNrID0gbVR1bmVyRmlsdGVyQ2FsbGJhY2s7CisgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBpbl9jYjsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIgJiYgbU9yaWdpbmFsQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjayA9IG1PcmlnaW5hbENhbGxiYWNrOworICAgICAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmRldGFjaENhbGxiYWNrcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBudWxscHRyOworICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gbnVsbHB0cjsKK30KKworLy8vLy8vLy8vLy8vLy8vIEZpbHRlckNhbGxiYWNrIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldEFpZGxGaWx0ZXJFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBhaWRsRXZlbnRzKSB7CisgICAgaWYgKGV2ZW50cy5lbXB0eSgpICYmICFldmVudHNFeHQuZW1wdHkoKSkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50c0V4dFswXS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9uaXRvckV2ZW50OiB7CisgICAgICAgICAgICBnZXRNb25pdG9yRXZlbnQoZXZlbnRzRXh0LCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN0YXJ0SWQ6IHsKKyAgICAgICAgICAgIGdldFJlc3RhcnRFdmVudChldmVudHNFeHQsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZXZlbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgc3dpdGNoIChldmVudHNbMF0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1lZGlhOiB7CisgICAgICAgICAgICBnZXRNZWRpYUV2ZW50KGV2ZW50cywgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzZWN0aW9uOiB7CisgICAgICAgICAgICBnZXRTZWN0aW9uRXZlbnQoZXZlbnRzLCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBlczogeworICAgICAgICAgICAgZ2V0UGVzRXZlbnQoZXZlbnRzLCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzUmVjb3JkOiB7CisgICAgICAgICAgICBnZXRUc1JlY29yZEV2ZW50KGV2ZW50cywgZXZlbnRzRXh0LCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1tdHBSZWNvcmQ6IHsKKyAgICAgICAgICAgIGdldE1tdHBSZWNvcmRFdmVudChldmVudHMsIGV2ZW50c0V4dCwgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkb3dubG9hZDogeworICAgICAgICAgICAgZ2V0RG93bmxvYWRFdmVudChldmVudHMsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXBQYXlsb2FkOiB7CisgICAgICAgICAgICBnZXRJcFBheWxvYWRFdmVudChldmVudHMsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dGVtaTogeworICAgICAgICAgICAgZ2V0VGVtaUV2ZW50KGV2ZW50cywgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldE1lZGlhRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyTWVkaWFFdmVudCYgbWVkaWFFdmVudCA9IGV2ZW50c1tpXS5tZWRpYSgpOworICAgICAgICBEZW11eEZpbHRlck1lZGlhRXZlbnQgbWVkaWE7CisKKyAgICAgICAgbWVkaWEuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihtZWRpYUV2ZW50LnN0cmVhbUlkKTsKKyAgICAgICAgbWVkaWEuaXNQdHNQcmVzZW50ID0gbWVkaWFFdmVudC5pc1B0c1ByZXNlbnQ7CisgICAgICAgIG1lZGlhLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQucHRzKTsKKyAgICAgICAgbWVkaWEuaXNEdHNQcmVzZW50ID0gZmFsc2U7CisgICAgICAgIG1lZGlhLmR0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KC0xKTsKKyAgICAgICAgbWVkaWEuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQuZGF0YUxlbmd0aCk7CisgICAgICAgIG1lZGlhLm9mZnNldCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQub2Zmc2V0KTsKKyAgICAgICAgbWVkaWEuaXNTZWN1cmVNZW1vcnkgPSBtZWRpYUV2ZW50LmlzU2VjdXJlTWVtb3J5OworICAgICAgICBtZWRpYS5hdkRhdGFJZCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQuYXZEYXRhSWQpOworICAgICAgICBtZWRpYS5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1lZGlhRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOworICAgICAgICBtZWRpYS5pc1Blc1ByaXZhdGVEYXRhID0gbWVkaWFFdmVudC5pc1Blc1ByaXZhdGVEYXRhOworICAgICAgICBtZWRpYS5zY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NJbmRleD4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oRGVtdXhTY0luZGV4OjpVTkRFRklORUQpKTsKKworICAgICAgICBpZiAobWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyTWVkaWFFdmVudDo6RXh0cmFNZXRhRGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjphdWRpbykgeworICAgICAgICAgICAgQXVkaW9FeHRyYU1ldGFEYXRhIGF1ZGlvOworICAgICAgICAgICAgYXVkaW8uYWRGYWRlID0gc3RhdGljX2Nhc3Q8aW50OF90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEZhZGUpOworICAgICAgICAgICAgYXVkaW8uYWRQYW4gPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkUGFuKTsKKyAgICAgICAgICAgIGF1ZGlvLnZlcnNpb25UZXh0VGFnID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MTZfdD4obWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkudmVyc2lvblRleHRUYWcpOworICAgICAgICAgICAgYXVkaW8uYWRHYWluQ2VudGVyID0gc3RhdGljX2Nhc3Q8aW50OF90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5DZW50ZXIpOworICAgICAgICAgICAgYXVkaW8uYWRHYWluRnJvbnQgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpbkZyb250KTsKKyAgICAgICAgICAgIGF1ZGlvLmFkR2FpblN1cnJvdW5kID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5TdXJyb3VuZCk7CisgICAgICAgICAgICBtZWRpYS5leHRyYU1ldGFEYXRhLnNldDxEZW11eEZpbHRlck1lZGlhRXZlbnRFeHRyYU1ldGFEYXRhOjphdWRpbz4oYXVkaW8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVkaWEuZXh0cmFNZXRhRGF0YS5zZXQ8RGVtdXhGaWx0ZXJNZWRpYUV2ZW50RXh0cmFNZXRhRGF0YTo6bm9pbml0Pih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZWRpYUV2ZW50LmF2TWVtb3J5LmdldE5hdGl2ZUhhbmRsZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lZGlhLmF2TWVtb3J5ID0gZHVwVG9BaWRsKG1lZGlhRXZlbnQuYXZNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6Om1lZGlhPihtb3ZlKG1lZGlhKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRTZWN0aW9uRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyU2VjdGlvbkV2ZW50JiBzZWN0aW9uRXZlbnQgPSBldmVudHNbaV0uc2VjdGlvbigpOworICAgICAgICBEZW11eEZpbHRlclNlY3Rpb25FdmVudCBzZWN0aW9uOworCisgICAgICAgIHNlY3Rpb24udGFibGVJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHNlY3Rpb25FdmVudC50YWJsZUlkKTsKKyAgICAgICAgc2VjdGlvbi52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2VjdGlvbkV2ZW50LnZlcnNpb24pOworICAgICAgICBzZWN0aW9uLnNlY3Rpb25OdW0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzZWN0aW9uRXZlbnQuc2VjdGlvbk51bSk7CisgICAgICAgIHNlY3Rpb24uZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6c2VjdGlvbj4obW92ZShzZWN0aW9uKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRQZXNFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlclBlc0V2ZW50JiBwZXNFdmVudCA9IGV2ZW50c1tpXS5wZXMoKTsKKyAgICAgICAgRGVtdXhGaWx0ZXJQZXNFdmVudCBwZXM7CisKKyAgICAgICAgcGVzLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGVzRXZlbnQuc3RyZWFtSWQpOworICAgICAgICBwZXMuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBlc0V2ZW50LmRhdGFMZW5ndGgpOworICAgICAgICBwZXMubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihwZXNFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OnBlcz4obW92ZShwZXMpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFRzUmVjb3JkRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50IHRzUmVjb3JkOworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50JiB0c1JlY29yZEV2ZW50ID0gZXZlbnRzW2ldLnRzUmVjb3JkKCk7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJTY0luZGV4TWFzayBzY0luZGV4TWFzazsKKyAgICAgICAgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzYykgeworICAgICAgICAgICAgaW50MzJfdCBoaWRsU2NJbmRleCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suc2MoKSk7CisgICAgICAgICAgICBpZiAoaGlkbFNjSW5kZXggPD0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oRGVtdXhTY0luZGV4OjpTRVFVRU5DRSkpIHsKKyAgICAgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NJbmRleD4oaGlkbFNjSW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBISURMIEhBTCBzdGFydGluZyBmcm9tIDEgPDwgNDsgQUlETCBzdGFydGluZyBmcm9tIDEgPDwgMC4KKyAgICAgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NBdmM+KGhpZGxTY0luZGV4ID4+IDQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDo6U2NJbmRleE1hc2s6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NIZXZjKSB7CisgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5zY0hldmMoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRzUmVjb3JkRXZlbnQucGlkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBIaWRsRGVtdXhQaWQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dFBpZCkgeworICAgICAgICAgICAgRGVtdXhQaWQgcGlkOworICAgICAgICAgICAgcGlkLnNldDxEZW11eFBpZDo6dFBpZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC5waWQudFBpZCgpKSk7CisgICAgICAgICAgICB0c1JlY29yZC5waWQgPSBwaWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZW11eFBpZCBwaWQ7CisgICAgICAgICAgICBwaWQuc2V0PERlbXV4UGlkOjp0UGlkPihzdGF0aWNfY2FzdDxpbnQzMl90PihDb25zdGFudDo6SU5WQUxJRF9UU19QSUQpKTsKKyAgICAgICAgICAgIHRzUmVjb3JkLnBpZCA9IHBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHRzUmVjb3JkLnNjSW5kZXhNYXNrID0gc2NJbmRleE1hc2s7CisgICAgICAgIHRzUmVjb3JkLnRzSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC50c0luZGV4TWFzayk7CisgICAgICAgIHRzUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0c1JlY29yZEV2ZW50LmJ5dGVOdW1iZXIpOworCisgICAgICAgIGlmIChldmVudHNFeHQuc2l6ZSgpID4gaSAmJgorICAgICAgICAgICAgZXZlbnRzRXh0W2ldLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHNSZWNvcmQpIHsKKyAgICAgICAgICAgIHRzUmVjb3JkLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGV2ZW50c0V4dFtpXS50c1JlY29yZCgpLnB0cyk7CisgICAgICAgICAgICB0c1JlY29yZC5maXJzdE1iSW5TbGljZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGV2ZW50c0V4dFtpXS50c1JlY29yZCgpLmZpcnN0TWJJblNsaWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbXV4RmlsdGVyRXZlbnQgZmlsdGVyRXZlbnQ7CisgICAgICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50Ojp0c1JlY29yZD4obW92ZSh0c1JlY29yZCkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TW10cFJlY29yZEV2ZW50KAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIERlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50IG1tdHBSZWNvcmQ7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCYgbW10cFJlY29yZEV2ZW50ID0gZXZlbnRzW2ldLm1tdHBSZWNvcmQoKTsKKworICAgICAgICBtbXRwUmVjb3JkLnNjSGV2Y0luZGV4TWFzayA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1tdHBSZWNvcmRFdmVudC5zY0hldmNJbmRleE1hc2spOworICAgICAgICBtbXRwUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihtbXRwUmVjb3JkRXZlbnQuYnl0ZU51bWJlcik7CisKKyAgICAgICAgaWYgKGV2ZW50c0V4dC5zaXplKCkgPiBpICYmCisgICAgICAgICAgICBldmVudHNFeHRbaV0uZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptbXRwUmVjb3JkKSB7CisgICAgICAgICAgICBtbXRwUmVjb3JkLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkucHRzKTsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQubXB1U2VxdWVuY2VOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLm1wdVNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQuZmlyc3RNYkluU2xpY2UgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLmZpcnN0TWJJblNsaWNlKTsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLnRzSW5kZXhNYXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbXV4RmlsdGVyRXZlbnQgZmlsdGVyRXZlbnQ7CisgICAgICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50OjptbXRwUmVjb3JkPihtb3ZlKG1tdHBSZWNvcmQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldERvd25sb2FkRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRFdmVudCYgZG93bmxvYWRFdmVudCA9IGV2ZW50c1tpXS5kb3dubG9hZCgpOworICAgICAgICBEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWQ7CisKKyAgICAgICAgZG93bmxvYWQuaXRlbUlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5pdGVtSWQpOworICAgICAgICBkb3dubG9hZC5kb3dubG9hZElkID0gLTE7CisgICAgICAgIGRvd25sb2FkLml0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5pdGVtRnJhZ21lbnRJbmRleCk7CisgICAgICAgIGRvd25sb2FkLm1wdVNlcXVlbmNlTnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7CisgICAgICAgIGRvd25sb2FkLmxhc3RJdGVtRnJhZ21lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGRvd25sb2FkRXZlbnQubGFzdEl0ZW1GcmFnbWVudEluZGV4KTsKKyAgICAgICAgZG93bmxvYWQuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGRvd25sb2FkRXZlbnQuZGF0YUxlbmd0aCk7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OmRvd25sb2FkPihtb3ZlKGRvd25sb2FkKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRJcFBheWxvYWRFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJJcFBheWxvYWRFdmVudCYgaXBQYXlsb2FkRXZlbnQgPSBldmVudHNbaV0uaXBQYXlsb2FkKCk7CisgICAgICAgIERlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQgaXBQYXlsb2FkOworCisgICAgICAgIGlwUGF5bG9hZC5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaXBQYXlsb2FkRXZlbnQuZGF0YUxlbmd0aCk7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OmlwUGF5bG9hZD4obW92ZShpcFBheWxvYWQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFRlbWlFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJUZW1pRXZlbnQmIHRlbWlFdmVudCA9IGV2ZW50c1tpXS50ZW1pKCk7CisgICAgICAgIERlbXV4RmlsdGVyVGVtaUV2ZW50IHRlbWk7CisKKyAgICAgICAgdGVtaS5wdHMgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0ZW1pRXZlbnQucHRzKTsKKyAgICAgICAgdGVtaS5kZXNjclRhZyA9IHN0YXRpY19jYXN0PGludDhfdD4odGVtaUV2ZW50LmRlc2NyVGFnKTsKKyAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGRlc2NyRGF0YSA9IHRlbWlFdmVudC5kZXNjckRhdGE7CisgICAgICAgIHRlbWkuZGVzY3JEYXRhLnJlc2l6ZShkZXNjckRhdGEuc2l6ZSgpKTsKKyAgICAgICAgY29weShkZXNjckRhdGEuYmVnaW4oKSwgZGVzY3JEYXRhLmVuZCgpLCB0ZW1pLmRlc2NyRGF0YS5iZWdpbigpKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6dGVtaT4obW92ZSh0ZW1pKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNb25pdG9yRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgSGlkbERlbXV4RmlsdGVyTW9uaXRvckV2ZW50IG1vbml0b3JFdmVudCA9IGV2ZW50c0V4dFswXS5tb25pdG9yRXZlbnQoKTsKKyAgICBEZW11eEZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yOworCisgICAgc3dpdGNoIChtb25pdG9yRXZlbnQuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NyYW1ibGluZ1N0YXR1czogeworICAgICAgICBtb25pdG9yLnNldDxEZW11eEZpbHRlck1vbml0b3JFdmVudDo6c2NyYW1ibGluZ1N0YXR1cz4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2NyYW1ibGluZ1N0YXR1cz4obW9uaXRvckV2ZW50LnNjcmFtYmxpbmdTdGF0dXMoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y2lkOiB7CisgICAgICAgIG1vbml0b3Iuc2V0PERlbXV4RmlsdGVyTW9uaXRvckV2ZW50OjpjaWQ+KHN0YXRpY19jYXN0PGludDMyX3Q+KG1vbml0b3JFdmVudC5jaWQoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6bW9uaXRvckV2ZW50Pihtb3ZlKG1vbml0b3IpKTsKKyAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRSZXN0YXJ0RXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6c3RhcnRJZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4oZXZlbnRzRXh0WzBdLnN0YXJ0SWQoKSkpOworICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzdhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5oCkBAIC0wLDAgKzEsMjQxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETEZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMRklMVEVSX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9BdlN0cmVhbVR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJBdlNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckV2ZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclN0YXR1cy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckZpbHRlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRmlsdGVyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8bWFwPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpBdlN0cmVhbVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGaWx0ZXJEZWxheUhpbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlckNhbGxiYWNrOwordXNpbmcgOjphbmRyb2lkOjpNdXRleDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIDo6c3RkOjpzdHJpbmc7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOworCit1c2luZyBIaWRsQXZTdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdlN0cmVhbVR5cGU7Cit1c2luZyBIaWRsRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhBbHBGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckF2U2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRG93bmxvYWRFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJNZWRpYUV2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1lZGlhRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclBlc0V2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0V2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3MgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2VjdGlvbkV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclRlbWlFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUZW1pRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhJcEZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4VGx2RmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VGx2RmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhUc0ZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhQaWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwordXNpbmcgSGlkbElGaWx0ZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGaWx0ZXI7Cit1c2luZyBIaWRsRHZTdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdlN0cmVhbVR5cGU7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RGVtdXhGaWx0ZXJFdmVudEV4dDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1vbml0b3JFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50RXh0ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnRFeHQ7Cit1c2luZyBIaWRsSUZpbHRlckNhbGxiYWNrID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyQ2FsbGJhY2s7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKwordXNpbmcgTVFEZXNjID0gTVFEZXNjcmlwdG9yU3luYzx1aW50OF90PjsKK3VzaW5nIEFpZGxNUURlc2MgPSBNUURlc2NyaXB0b3I8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCitjb25zdCBzdGF0aWMgaW50IElQX1Y0X0xFTkdUSCA9IDQ7Citjb25zdCBzdGF0aWMgaW50IElQX1Y2X0xFTkdUSCA9IDE2OworCitjbGFzcyBUdW5lckhpZGxGaWx0ZXIgOiBwdWJsaWMgQm5UdW5lckZpbHRlciB7CitwdWJsaWM6CisgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElGaWx0ZXJDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICBGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiB0dW5lckZpbHRlckNhbGxiYWNrKQorICAgICAgICAgICAgICA6IG1UdW5lckZpbHRlckNhbGxiYWNrKHR1bmVyRmlsdGVyQ2FsbGJhY2spe307CisKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GaWx0ZXJFdmVudChjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50XzFfMShjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlckV2ZW50RXh0JiBmaWx0ZXJFdmVudEV4dCk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyU3RhdHVzKEhpZGxEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpOworCisgICAgICAgIHZvaWQgc2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisgICAgICAgIHZvaWQgYXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKTsKKyAgICAgICAgdm9pZCBkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgICAgICB2b2lkIGRldGFjaENhbGxiYWNrcygpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBnZXRBaWRsRmlsdGVyRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBhaWRsRXZlbnRzKTsKKworICAgICAgICB2b2lkIGdldE1lZGlhRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRTZWN0aW9uRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFBlc0V2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFRzUmVjb3JkRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0TW10cFJlY29yZEV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXREb3dubG9hZEV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0SXBQYXlsb2FkRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0VGVtaUV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRNb25pdG9yRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFJlc3RhcnRFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4gbU9yaWdpbmFsQ2FsbGJhY2s7CisgICAgICAgIE11dGV4IG1DYWxsYmFja0xvY2s7CisgICAgfTsKKworICAgIFR1bmVySGlkbEZpbHRlcihzcDxIaWRsSUZpbHRlcj4gZmlsdGVyLCBzcDxGaWx0ZXJDYWxsYmFjaz4gY2IsIERlbXV4RmlsdGVyVHlwZSB0eXBlKTsKKyAgICB2aXJ0dWFsIH5UdW5lckhpZGxGaWx0ZXIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SWQ2NEJpdChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlTW9uaXRvckV2ZW50KGludDMyX3QgaW5fbW9uaXRvckV2ZW50VHlwZXMpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludDMyX3QgaW5fY2lkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmVBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlJiBpbl9hdlN0cmVhbVR5cGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEF2U2hhcmVkSGFuZGxlKE5hdGl2ZUhhbmRsZSogb3V0X2F2TWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVsZWFzZUF2SGFuZGxlKGNvbnN0IE5hdGl2ZUhhbmRsZSYgaW5faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2F2RGF0YUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmcmVlU2hhcmVkRmlsdGVyVG9rZW4oY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RmlsdGVyVHlwZShEZW11eEZpbHRlclR5cGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RGVsYXlIaW50KGNvbnN0IEZpbHRlckRlbGF5SGludCYgaW5faGludCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzU2hhcmVkRmlsdGVyQWxsb3dlZChpbnQzMl90IHBpZCk7CisgICAgdm9pZCBhdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpOworICAgIHNwPEhpZGxJRmlsdGVyPiBnZXRIYWxGaWx0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzQXVkaW9GaWx0ZXIoKTsKKyAgICBib29sIGlzVmlkZW9GaWx0ZXIoKTsKKworICAgIEhpZGxEZW11eEZpbHRlckF2U2V0dGluZ3MgZ2V0SGlkbEF2U2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJBdlNldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgSGlkbERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzIGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIEhpZGxEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBnZXRIaWRsUGVzRGF0YVNldHRpbmdzKAorICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBnZXRIaWRsUmVjb3JkU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIEhpZGxEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgZ2V0SGlkbERvd25sb2FkU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBib29sIGdldEhpZGxBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlIGF2U3RyZWFtVHlwZSwgSGlkbEF2U3RyZWFtVHlwZSYgdHlwZSk7CisgICAgdm9pZCBnZXRIaWRsVHNTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbE1tdHBTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncyk7CisgICAgdm9pZCBnZXRIaWRsSXBTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbFRsdlNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbEFscFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworCisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGdldElwVjRBZGRyZXNzKGNvbnN0IERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzJiBhZGRyKTsKKyAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gZ2V0SXBWNkFkZHJlc3MoY29uc3QgRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3MmIGFkZHIpOworCisgICAgc3A8SGlkbElGaWx0ZXI+IG1GaWx0ZXI7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyPiBtRmlsdGVyXzFfMTsKKyAgICBpbnQzMl90IG1JZDsKKyAgICBpbnQ2NF90IG1JZDY0Qml0OworICAgIERlbXV4RmlsdGVyVHlwZSBtVHlwZTsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNoYXJlZDsKKyAgICBpbnQzMl90IG1DbGllbnRQaWQ7CisgICAgc3A8RmlsdGVyQ2FsbGJhY2s+IG1GaWx0ZXJDYWxsYmFjazsKKyAgICBNdXRleCBtTG9jazsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMRklMVEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGcm9udGVuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NTdmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuY3BwCkBAIC0wLDAgKzEsMTIyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsRnJvbnRlbmQiCisKKyNpbmNsdWRlICJUdW5lckhpZGxGcm9udGVuZC5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorCisjaW5jbHVkZSAiVHVuZXJIaWRsTG5iLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsU2VydmljZS5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nU2lmU3RhbmRhcmQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM0JhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM0NvZGVSYXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzRmVjOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzY01vZHVsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzY1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEJhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdG1iQmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJHdWFyZEludGVydmFsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNBbm5leDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJjQmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzUm9sbG9mZjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZic1N0YW5kYXJkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnRCYW5kd2lkdGg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidEhpZXJhcmNoeTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidFN0YW5kYXJkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW5uZXJGZWM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RiczNSb2xsb2ZmOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzM1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2Ric1JvbGxvZmY7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidEJhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidENvZGVyYXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidE1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFJvbGxPZmY7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbyA9CisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm87Cit1c2luZyBIaWRsRnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZDsKK3VzaW5nIEhpZGxGcm9udGVuZEFuYWxvZ1R5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQW5hbG9nVHlwZTsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2NNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2NNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kQXRzYzNCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0NvZGVSYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQ29kZVJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzRGVtb2RPdXRwdXRGb3JtYXQ7Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0ZlYyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0ZlYzsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNBbm5leCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjQW5uZXg7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJjTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjTW9kdWxhdGlvbjsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNPdXRlckZlYyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjT3V0ZXJGZWM7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb24gPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHZic01vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzUGlsb3QgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1BpbG90OwordXNpbmcgSGlkbEZyb250ZW5kRHZic1JvbGxvZmYgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1JvbGxvZmY7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1NldHRpbmdzOwordXNpbmcgSGlkbEZyb250ZW5kRHZic1N0YW5kYXJkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTdGFuZGFyZDsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNWY21Nb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNWY21Nb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHZidEJhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0QmFuZHdpZHRoOwordXNpbmcgSGlkbEZyb250ZW5kRHZidENvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRDb2RlcmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWwgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0SGllcmFyY2h5ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRIaWVyYXJjaHk7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0UGxwTW9kZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0UGxwTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0U3RhbmRhcmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFN0YW5kYXJkOwordXNpbmcgSGlkbEZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGUgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJbm5lckZlYyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJbm5lckZlYzsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzM0NvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM0NvZGVyYXRlOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzUm9sbG9mZiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNSb2xsb2ZmOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzU2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2Ric0NvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzQ29kZXJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2Ric01vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnNSb2xsb2ZmID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzUm9sbG9mZjsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnRCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidENvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0Q29kZXJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWwgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnRNb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0TW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidFNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5BdHNjM1BscEluZm87Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuVHlwZTsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c1R5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU3RhdHVzVHlwZTsKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIEhpZGxGcm9udGVuZEFuYWxvZ0FmdEZsYWcgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kQW5hbG9nQWZ0RmxhZzsKK3VzaW5nIEhpZGxGcm9udGVuZEJhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZiY0JhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkJhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJDb2RlUmF0ZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ29kZVJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbDsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGUgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzU2NhblR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZic1NjYW5UeXBlOwordXNpbmcgSGlkbEZyb250ZW5kR3VhcmRJbnRlcnZhbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRHdWFyZEludGVydmFsOwordXNpbmcgSGlkbEZyb250ZW5kSW50ZXJsZWF2ZU1vZGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZE1vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRSb2xsT2ZmID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFJvbGxPZmY7Cit1c2luZyBIaWRsRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbiA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbjsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMTsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxGcm9udGVuZDo6VHVuZXJIaWRsRnJvbnRlbmQoc3A8SGlkbElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCkgeworICAgIG1Gcm9udGVuZCA9IGZyb250ZW5kOworICAgIG1Gcm9udGVuZF8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGcm9udGVuZDo6Y2FzdEZyb20obUZyb250ZW5kKTsKKyAgICBtSWQgPSBpZDsKK30KKworVHVuZXJIaWRsRnJvbnRlbmQ6On5UdW5lckhpZGxGcm9udGVuZCgpIHsKKyAgICBtRnJvbnRlbmQgPSBudWxscHRyOworICAgIG1Gcm9udGVuZF8xXzEgPSBudWxscHRyOworICAgIG1JZCA9IC0xOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c2V0Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIHR1bmVyRnJvbnRlbmRDYWxsYmFjaykgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKHR1bmVyRnJvbnRlbmRDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJRnJvbnRlbmRDYWxsYmFjaz4gZnJvbnRlbmRDYWxsYmFjayA9IG5ldyBGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjayk7CisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldENhbGxiYWNrKGZyb250ZW5kQ2FsbGJhY2spOworICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjp0dW5lKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBIaWRsRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzOworICAgIEhpZGxGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQ7CisgICAgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3NFeHQpOworICAgIGlmIChtRnJvbnRlbmRfMV8xICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+dHVuZV8xXzEoZnJvbnRlbmRTZXR0aW5ncywgZnJvbnRlbmRTZXR0aW5nc0V4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT50dW5lKGZyb250ZW5kU2V0dGluZ3MpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c3RvcFR1bmUoKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c3RvcFR1bmUoKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c2Nhbihjb25zdCBGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2NhblR5cGUgZnJvbnRlbmRTY2FuVHlwZSkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgSGlkbEZyb250ZW5kU2V0dGluZ3MgZnJvbnRlbmRTZXR0aW5nczsKKyAgICBIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBmcm9udGVuZFNldHRpbmdzRXh0OworICAgIGdldEhpZGxGcm9udGVuZFNldHRpbmdzKHNldHRpbmdzLCBmcm9udGVuZFNldHRpbmdzLCBmcm9udGVuZFNldHRpbmdzRXh0KTsKKyAgICBpZiAobUZyb250ZW5kXzFfMSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnNjYW5fMV8xKGZyb250ZW5kU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT5zY2FuKGZyb250ZW5kU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTY2FuVHlwZT4oZnJvbnRlbmRTY2FuVHlwZSkpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c3RvcFNjYW4oKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c3RvcFNjYW4oKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgbG5iKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldExuYihzdGF0aWNfY2FzdDxUdW5lckhpZGxMbmIqPihsbmIuZ2V0KCkpLT5nZXRJZCgpKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6bGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGNpQ2FtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaW50IGx0c0lkOworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIG1Gcm9udGVuZF8xXzEtPmxpbmtDaUNhbShzdGF0aWNfY2FzdDx1aW50MzJfdD4oY2lDYW1JZCksIFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGlkKSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgIGx0c0lkID0gaWQ7CisgICAgfSk7CisKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGx0c0lkOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjp1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBjaUNhbUlkKSB7CisgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+dW5saW5rQ2lDYW0oY2lDYW1JZCk7CisgICAgaWYgKHN0YXR1cyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmNsb3NlKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgVHVuZXJIaWRsU2VydmljZTo6Z2V0VHVuZXJTZXJ2aWNlKCktPnJlbW92ZUZyb250ZW5kKHRoaXMtPnJlZjxUdW5lckhpZGxGcm9udGVuZD4oKSk7CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+Y2xvc2UoKTsKKyAgICBtRnJvbnRlbmQgPSBudWxscHRyOworICAgIG1Gcm9udGVuZF8xXzEgPSBudWxscHRyOworCisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldFN0YXR1cyhjb25zdCB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1cz4gc3RhdHVzOworICAgIHZlY3RvcjxIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE+IHN0YXR1c0V4dDsKKyAgICB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzVHlwZT4gdHlwZXM7CisgICAgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzE+IHR5cGVzRXh0OworICAgIGZvciAoYXV0byBzIDogaW5fc3RhdHVzVHlwZXMpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KHMpIDw9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsRnJvbnRlbmRTdGF0dXNUeXBlOjpBVFNDM19QTFBfSU5GTykpIHsKKyAgICAgICAgICAgIHR5cGVzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTdGF0dXNUeXBlPihzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0eXBlc0V4dC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4ocykpOworICAgICAgICB9CisgICAgfQorCisgICAgbUZyb250ZW5kLT5nZXRTdGF0dXModHlwZXMsIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxGcm9udGVuZFN0YXR1cz4mIHNzKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGZvciAoYXV0byBzIDogc3MpIHsKKyAgICAgICAgICAgIHN0YXR1cy5wdXNoX2JhY2socyk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgaWYgKG1Gcm9udGVuZF8xXzEgIT0gbnVsbHB0cikgeworICAgICAgICBtRnJvbnRlbmRfMV8xLT5nZXRTdGF0dXNFeHQxXzEoCisgICAgICAgICAgICAgICAgdHlwZXNFeHQsIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIHNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBzIDogc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0V4dC5wdXNoX2JhY2socyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdldEFpZGxGcm9udGVuZFN0YXR1cyhzdGF0dXMsIHN0YXR1c0V4dCwgKl9haWRsX3JldHVybik7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6Z2V0RnJvbnRlbmRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbUlkOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEhhcmR3YXJlSW5mbyhzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jbGVhcigpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6cmVtb3ZlT3V0cHV0UGlkKGludDMyX3QgLyogaW5fcGlkICovKSB7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpnZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgLyogaW5fc3RhdHVzVHlwZXMgKi8sCisgICAgICAgIHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzUmVhZGluZXNzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jbGVhcigpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworfQorCit2b2lkIFR1bmVySGlkbEZyb250ZW5kOjpzZXRMbmEoYm9vbCBiRW5hYmxlKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRnJvbnRlbmQtPnNldExuYShiRW5hYmxlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vIEZyb250ZW5kQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1JldHVybjx2b2lkPiBUdW5lckhpZGxGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25FdmVudChIaWRsRnJvbnRlbmRFdmVudFR5cGUgZnJvbnRlbmRFdmVudFR5cGUpIHsKKyAgICBBTE9HVigiRnJvbnRlbmRDYWxsYmFjazo6b25FdmVudCwgdHlwZT0lZCIsIGZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkV2ZW50KHN0YXRpY19jYXN0PEZyb250ZW5kRXZlbnRUeXBlPihmcm9udGVuZEV2ZW50VHlwZSkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSgKKyAgICAgICAgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsIGNvbnN0IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKSB7CisgICAgQUxPR1YoIkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2UsIHR5cGU9JWQiLCB0eXBlKTsKKyAgICBGcm9udGVuZFNjYW5NZXNzYWdlIHNjYW5NZXNzYWdlOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpMT0NLRUQ6IHsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzTG9ja2VkPihtZXNzYWdlLmlzTG9ja2VkKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkVORDogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNFbmQ+KG1lc3NhZ2UuaXNFbmQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UFJPR1JFU1NfUEVSQ0VOVDogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6cHJvZ3Jlc3NQZXJjZW50PihtZXNzYWdlLnByb2dyZXNzUGVyY2VudCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpGUkVRVUVOQ1k6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQzMl90PiYgZiA9IG1lc3NhZ2UuZnJlcXVlbmNpZXMoKTsKKyAgICAgICAgdmVjdG9yPGludDY0X3Q+IGxmKGJlZ2luKGYpLCBlbmQoZikpOworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6ZnJlcXVlbmNpZXM+KGxmKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpTWU1CT0xfUkFURTogeworICAgICAgICBjb25zdCB2ZWN0b3I8dWludDMyX3Q+JiBzID0gbWVzc2FnZS5zeW1ib2xSYXRlcygpOworICAgICAgICB2ZWN0b3I8aW50MzJfdD4gc3ltYm9sUmF0ZXMoYmVnaW4ocyksIGVuZChzKSk7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpzeW1ib2xSYXRlcz4oc3ltYm9sUmF0ZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkhJRVJBUkNIWTogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aGllcmFyY2h5PigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRIaWVyYXJjaHk+KG1lc3NhZ2UuaGllcmFyY2h5KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpBTkFMT0dfVFlQRTogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6YW5hbG9nVHlwZT4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dUeXBlPihtZXNzYWdlLmFuYWxvZ1R5cGUoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OlBMUF9JRFM6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBwID0gbWVzc2FnZS5wbHBJZHMoKTsKKyAgICAgICAgdmVjdG9yPGludDMyX3Q+IHBscElkcyhiZWdpbihwKSwgZW5kKHApKTsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OnBscElkcz4ocGxwSWRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpHUk9VUF9JRFM6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBnID0gbWVzc2FnZS5ncm91cElkcygpOworICAgICAgICB2ZWN0b3I8aW50MzJfdD4gZ3JvdXBJZHMoYmVnaW4oZyksIGVuZChnKSk7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpncm91cElkcz4oZ3JvdXBJZHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OklOUFVUX1NUUkVBTV9JRFM6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQxNl90PiYgaSA9IG1lc3NhZ2UuaW5wdXRTdHJlYW1JZHMoKTsKKyAgICAgICAgdmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkcyhiZWdpbihpKSwgZW5kKGkpKTsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlucHV0U3RyZWFtSWRzPihzdHJlYW1JZHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OlNUQU5EQVJEOiB7CisgICAgICAgIGNvbnN0IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZCYgc3RkID0gbWVzc2FnZS5zdGQoKTsKKyAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkIHN0YW5kYXJkOworICAgICAgICBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c1N0ZCkgeworICAgICAgICAgICAgc3RhbmRhcmQuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2VTdGFuZGFyZDo6c1N0ZD4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1N0YW5kYXJkPihzdGQuc1N0ZCgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0U3RkKSB7CisgICAgICAgICAgICBzdGFuZGFyZC5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkOjp0U3RkPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0U3RhbmRhcmQ+KHN0ZC50U3RkKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNpZlN0ZCkgeworICAgICAgICAgICAgc3RhbmRhcmQuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2VTdGFuZGFyZDo6c2lmU3RkPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZD4oc3RkLnNpZlN0ZCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OnN0ZD4oc3RhbmRhcmQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFUU0MzX1BMUF9JTkZPOiB7CisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiYgcGxwSW5mb3MgPSBtZXNzYWdlLmF0c2MzUGxwSW5mb3MoKTsKKyAgICAgICAgdmVjdG9yPEZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbz4gdHVuZXJQbHBJbmZvczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHBJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvIHBscEluZm97CisgICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBscEluZm9zW2ldLnBscElkKSwKKyAgICAgICAgICAgICAgICAgICAgLmJMbHNGbGFnID0gcGxwSW5mb3NbaV0uYkxsc0ZsYWcsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHVuZXJQbHBJbmZvcy5wdXNoX2JhY2socGxwSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmF0c2MzUGxwSW5mb3M+KHR1bmVyUGxwSW5mb3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2Uoc3RhdGljX2Nhc3Q8RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU+KHR5cGUpLCBzY2FuTWVzc2FnZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlRXh0MV8xKAorICAgICAgICBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgdHlwZSwgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEmIG1lc3NhZ2UpIHsKKyAgICBBTE9HVigib25TY2FuTWVzc2FnZUV4dDFfMTo6b25TY2FuTWVzc2FnZSwgdHlwZT0lZCIsIHR5cGUpOworICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2Ugc2Nhbk1lc3NhZ2U7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6Ok1PRFVMQVRJT046IHsKKyAgICAgICAgSGlkbEZyb250ZW5kTW9kdWxhdGlvbiBtID0gbWVzc2FnZS5tb2R1bGF0aW9uKCk7CisgICAgICAgIEZyb250ZW5kTW9kdWxhdGlvbiBtb2R1bGF0aW9uOworICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR2YmM+KHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY01vZHVsYXRpb24+KG0uZHZiYygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDogeworICAgICAgICAgICAgbW9kdWxhdGlvbi5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uOjpkdmJ0PigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4obS5kdmJ0KCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR2YnM+KHN0YXRpY19jYXN0PEZyb250ZW5kRHZic01vZHVsYXRpb24+KG0uZHZicygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6aXNkYnM+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4obS5pc2RicygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmlzZGJzMz4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4obS5pc2RiczMoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZHVsYXRpb24+KG0uaXNkYnQoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2M6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6YXRzYz4oc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjTW9kdWxhdGlvbj4obS5hdHNjKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzogeworICAgICAgICAgICAgbW9kdWxhdGlvbi5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uOjphdHNjMz4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNNb2R1bGF0aW9uPihtLmF0c2MzKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR0bWI+KHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYk1vZHVsYXRpb24+KG0uZHRtYigpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjptb2R1bGF0aW9uPihtb2R1bGF0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpEVkJDX0FOTkVYOiB7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjphbm5leD4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQW5uZXg+KG1lc3NhZ2UuYW5uZXgoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6OkhJR0hfUFJJT1JJVFk6IHsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzSGlnaFByaW9yaXR5PihtZXNzYWdlLmlzSGlnaFByaW9yaXR5KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2Uoc3RhdGljX2Nhc3Q8RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU+KHR5cGUpLCBzY2FuTWVzc2FnZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vIFR1bmVySGlkbEZyb250ZW5kIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIFR1bmVySGlkbEZyb250ZW5kOjpnZXRBaWRsRnJvbnRlbmRTdGF0dXMoY29uc3QgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1cz4mIGhpZGxTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIGhpZGxTdGF0dXNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cykgeworICAgIGZvciAoSGlkbEZyb250ZW5kU3RhdHVzIHMgOiBoaWRsU3RhdHVzKSB7CisgICAgICAgIEZyb250ZW5kU3RhdHVzIHN0YXR1czsKKyAgICAgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0RlbW9kTG9ja2VkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0RlbW9kTG9ja2VkPihzLmlzRGVtb2RMb2NrZWQoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c25yOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpzbnI+KChpbnQpcy5zbnIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmVyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpiZXI+KChpbnQpcy5iZXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGVyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwZXI+KChpbnQpcy5wZXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cHJlQmVyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwcmVCZXI+KChpbnQpcy5wcmVCZXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lnbmFsUXVhbGl0eTogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6c2lnbmFsUXVhbGl0eT4oKGludClzLnNpZ25hbFF1YWxpdHkoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lnbmFsU3RyZW5ndGg6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnNpZ25hbFN0cmVuZ3RoPigoaW50KXMuc2lnbmFsU3RyZW5ndGgoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3ltYm9sUmF0ZTogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6c3ltYm9sUmF0ZT4oKGludClzLnN5bWJvbFJhdGUoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW5uZXJGZWM6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmlubmVyRmVjPihzdGF0aWNfY2FzdDxGcm9udGVuZElubmVyRmVjPihzLmlubmVyRmVjKCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptb2R1bGF0aW9uOiB7CisgICAgICAgICAgICBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXMgbW9kdWxhdGlvblN0YXR1czsKKyAgICAgICAgICAgIHN3aXRjaCAocy5tb2R1bGF0aW9uKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmR2YmM+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuZHZiYygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiczoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmR2YnM+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuZHZicygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6CisgICAgICAgICAgICAgICAgbW9kdWxhdGlvblN0YXR1cy5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjppc2Ricz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuaXNkYnMoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmlzZGJzMz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM01vZHVsYXRpb24+KHMubW9kdWxhdGlvbigpLmlzZGJzMygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgbW9kdWxhdGlvblN0YXR1cy5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjppc2RidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuaXNkYnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvblN0YXR1cz4obW9kdWxhdGlvblN0YXR1cyk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW52ZXJzaW9uOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppbnZlcnNpb24+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihzLmludmVyc2lvbigpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6bG5iVm9sdGFnZTogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bG5iVm9sdGFnZT4oc3RhdGljX2Nhc3Q8TG5iVm9sdGFnZT4ocy5sbmJWb2x0YWdlKCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwbHBJZDogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6cGxwSWQ+KChpbnQzMl90KXMucGxwSWQoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNFV0JTOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0VXQlM+KHMuaXNFV0JTKCkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmFnYzogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6YWdjPigoaW50MzJfdClzLmFnYygpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xuYU9uOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0xuYU9uPihzLmlzTG5hT24oKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNMYXllckVycm9yOiB7CisgICAgICAgICAgICB2ZWN0b3I8Ym9vbD4gZShzLmlzTGF5ZXJFcnJvcigpLmJlZ2luKCksIHMuaXNMYXllckVycm9yKCkuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNMYXllckVycm9yPihlKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptZXI6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6Om1lcj4oc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy5tZXIoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZyZXFPZmZzZXQ6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmZyZXFPZmZzZXQ+KHN0YXRpY19jYXN0PGludDY0X3Q+KHMuZnJlcU9mZnNldCgpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aGllcmFyY2h5OiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpoaWVyYXJjaHk+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRIaWVyYXJjaHk+KHMuaGllcmFyY2h5KCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc1JmTG9ja2VkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc1JmTG9ja2VkPihzLmlzUmZMb2NrZWQoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGxwSW5mbzogeworICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvPiBpbmZvOworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBzLnBscEluZm8oKSkgeworICAgICAgICAgICAgICAgIGluZm8ucHVzaF9iYWNrKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkucGxwSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgLmlzTG9ja2VkID0gaS5pc0xvY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC51ZWMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpLnVlYyksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwbHBJbmZvPihpbmZvKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzEgcyA6IGhpZGxTdGF0dXNFeHQpIHsKKyAgICAgICAgRnJvbnRlbmRTdGF0dXMgc3RhdHVzOworICAgICAgICBzd2l0Y2ggKHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1vZHVsYXRpb25zOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRNb2R1bGF0aW9uPiBhaWRsTW9kOworICAgICAgICAgICAgZm9yIChhdXRvIG0gOiBzLm1vZHVsYXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY01vZHVsYXRpb24+KG0uZHZiYygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNNb2R1bGF0aW9uPihtLmR2YnMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4obS5kdmJ0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4obS5pc2RicygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4obS5pc2RiczMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uPihtLmlzZGJ0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2M6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kQXRzY01vZHVsYXRpb24+KG0uYXRzYygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM01vZHVsYXRpb24+KG0uYXRzYzMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iTW9kdWxhdGlvbj4obS5kdG1iKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbnM+KGFpZGxNb2QpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmJlcnM6IHsKKyAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGIocy5iZXJzKCkuYmVnaW4oKSwgcy5iZXJzKCkuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6YmVycz4oYik7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y29kZVJhdGVzOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRJbm5lckZlYz4gY29kZVJhdGVzOworICAgICAgICAgICAgZm9yIChhdXRvIGMgOiBzLmNvZGVSYXRlcygpKSB7CisgICAgICAgICAgICAgICAgY29kZVJhdGVzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZElubmVyRmVjPihjKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpjb2RlUmF0ZXM+KGNvZGVSYXRlcyk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmFuZHdpZHRoOiB7CisgICAgICAgICAgICBGcm9udGVuZEJhbmR3aWR0aCBiYW5kd2lkdGg7CisgICAgICAgICAgICBzd2l0Y2ggKHMuYmFuZHdpZHRoKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICBiYW5kd2lkdGguc2V0PEZyb250ZW5kQmFuZHdpZHRoOjphdHNjMz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzQmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmF0c2MzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoLnNldDxGcm9udGVuZEJhbmR3aWR0aDo6ZHZiYz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNCYW5kd2lkdGg+KHMuYmFuZHdpZHRoKCkuZHZiYygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgIGJhbmR3aWR0aC5zZXQ8RnJvbnRlbmRCYW5kd2lkdGg6OmR2YnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0QmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmR2YnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoLnNldDxGcm9udGVuZEJhbmR3aWR0aDo6aXNkYnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidEJhbmR3aWR0aD4ocy5iYW5kd2lkdGgoKS5pc2RidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgIGJhbmR3aWR0aC5zZXQ8RnJvbnRlbmRCYW5kd2lkdGg6OmR0bWI+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iQmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmR0bWIoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPihiYW5kd2lkdGgpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmludGVydmFsOiB7CisgICAgICAgICAgICBGcm9udGVuZEd1YXJkSW50ZXJ2YWwgaW50ZXJ2YWw7CisgICAgICAgICAgICBzd2l0Y2ggKHMuaW50ZXJ2YWwoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgIGludGVydmFsLnNldDxGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmR2YnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbD4ocy5pbnRlcnZhbCgpLmR2YnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgorICAgICAgICAgICAgICAgIGludGVydmFsLnNldDxGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsPihzLmludGVydmFsKCkuaXNkYnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwuc2V0PEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6ZHRtYj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJHdWFyZEludGVydmFsPihzLmludGVydmFsKCkuZHRtYigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppbnRlcnZhbD4oaW50ZXJ2YWwpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRyYW5zbWlzc2lvbk1vZGU6IHsKKyAgICAgICAgICAgIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZSB0cmFuc21pc3Npb25Nb2RlOworICAgICAgICAgICAgc3dpdGNoIChzLnRyYW5zbWlzc2lvbk1vZGUoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbk1vZGUuc2V0PEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6ZHZidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPihzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdmJ0KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICB0cmFuc21pc3Npb25Nb2RlLnNldDxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2RlPihzLnRyYW5zbWlzc2lvbk1vZGUoKS5pc2RidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICB0cmFuc21pc3Npb25Nb2RlLnNldDxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmR0bWI+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZT4ocy50cmFuc21pc3Npb25Nb2RlKCkuZHRtYigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPih0cmFuc21pc3Npb25Nb2RlKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp1ZWM6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnVlYz4oc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy51ZWMoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN5c3RlbUlkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpzeXN0ZW1JZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy5zeXN0ZW1JZCgpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW50ZXJsZWF2aW5nOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZT4gYWlkbEludGVyOworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBzLmludGVybGVhdmluZygpKSB7CisgICAgICAgICAgICAgICAgRnJvbnRlbmRJbnRlcmxlYXZlTW9kZSBsZWF2ZU1vZGU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6CisgICAgICAgICAgICAgICAgICAgIGxlYXZlTW9kZS5zZXQ8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6YXRzYzM+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KGkuYXRzYzMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgIGxlYXZlTW9kZS5zZXQ8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6ZHZiYz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZT4oaS5kdmJjKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgICAgICBsZWF2ZU1vZGUuc2V0PEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmR0bWI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZT4oaS5kdG1iKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFpZGxJbnRlci5wdXNoX2JhY2sobGVhdmVNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmludGVybGVhdmluZz4oYWlkbEludGVyKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidFNlZ21lbnQ6IHsKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgc2VnID0gcy5pc2RidFNlZ21lbnQoKTsKKyAgICAgICAgICAgIHZlY3RvcjxpbnQzMl90PiBpKHNlZy5iZWdpbigpLCBzZWcuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNkYnRTZWdtZW50PihpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c0RhdGFSYXRlOiB7CisgICAgICAgICAgICB2ZWN0b3I8aW50MzJfdD4gdHMocy50c0RhdGFSYXRlKCkuYmVnaW4oKSwgcy50c0RhdGFSYXRlKCkuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6dHNEYXRhUmF0ZT4odHMpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnJvbGxPZmY6IHsKKyAgICAgICAgICAgIEZyb250ZW5kUm9sbE9mZiByb2xsT2ZmOworICAgICAgICAgICAgc3dpdGNoIChzLnJvbGxPZmYoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgIHJvbGxPZmYuc2V0PEZyb250ZW5kUm9sbE9mZjo6ZHZicz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNSb2xsb2ZmPihzLnJvbGxPZmYoKS5kdmJzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKKyAgICAgICAgICAgICAgICByb2xsT2ZmLnNldDxGcm9udGVuZFJvbGxPZmY6OmlzZGJzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNSb2xsb2ZmPihzLnJvbGxPZmYoKS5pc2RicygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFJvbGxPZmY6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgorICAgICAgICAgICAgICAgIHJvbGxPZmYuc2V0PEZyb250ZW5kUm9sbE9mZjo6aXNkYnMzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzUm9sbG9mZj4ocy5yb2xsT2ZmKCkuaXNkYnMzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KHJvbGxPZmYpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTWlzbzogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNNaXNvPihzLmlzTWlzbygpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xpbmVhcjogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNMaW5lYXI+KHMuaXNMaW5lYXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNTaG9ydEZyYW1lczogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNTaG9ydEZyYW1lcz4ocy5pc1Nob3J0RnJhbWVzKCkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2hpZGxfdmVjPEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IFR1bmVySGlkbEZyb250ZW5kOjpnZXRBdHNjM1BscFNldHRpbmdzKAorICAgICAgICBjb25zdCBGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgaW50IGxlbiA9IHNldHRpbmdzLnBscFNldHRpbmdzLnNpemUoKTsKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBwbHBzID0gaGlkbF92ZWM8SGlkbEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4obGVuKTsKKyAgICAvLyBwYXJzZSBQTFAgc2V0dGluZ3MKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgcGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5wbHBJZCk7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiBtb2R1bGF0aW9uID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM01vZHVsYXRpb24+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLm1vZHVsYXRpb24pOworICAgICAgICBIaWRsRnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZSBpbnRlcmxlYXZlTW9kZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uaW50ZXJsZWF2ZU1vZGUpOworICAgICAgICBIaWRsRnJvbnRlbmRBdHNjM0NvZGVSYXRlIGNvZGVSYXRlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM0NvZGVSYXRlPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5jb2RlUmF0ZSk7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzRmVjIGZlYyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzRmVjPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5mZWMpOworICAgICAgICBIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIGZyb250ZW5kQXRzYzNQbHBTZXR0aW5nc3sKKyAgICAgICAgICAgICAgICAucGxwSWQgPSBwbHBJZCwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IG1vZHVsYXRpb24sCisgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0gaW50ZXJsZWF2ZU1vZGUsCisgICAgICAgICAgICAgICAgLmNvZGVSYXRlID0gY29kZVJhdGUsCisgICAgICAgICAgICAgICAgLmZlYyA9IGZlYywKKyAgICAgICAgfTsKKyAgICAgICAgcGxwc1tpXSA9IGZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKKyAgICB9CisgICAgcmV0dXJuIHBscHM7Cit9CisKK0hpZGxGcm9udGVuZER2YnNDb2RlUmF0ZSBUdW5lckhpZGxGcm9udGVuZDo6Z2V0RHZic0NvZGVSYXRlKGNvbnN0IEZyb250ZW5kRHZic0NvZGVSYXRlJiBjb2RlUmF0ZSkgeworICAgIEhpZGxGcm9udGVuZElubmVyRmVjIGlubmVyRmVjID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSW5uZXJGZWM+KGNvZGVSYXRlLmZlYyk7CisgICAgYm9vbCBpc0xpbmVhciA9IGNvZGVSYXRlLmlzTGluZWFyOworICAgIGJvb2wgaXNTaG9ydEZyYW1lcyA9IGNvZGVSYXRlLmlzU2hvcnRGcmFtZXM7CisgICAgdWludDMyX3QgYml0c1BlcjEwMDBTeW1ib2wgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29kZVJhdGUuYml0c1BlcjEwMDBTeW1ib2wpOworICAgIEhpZGxGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlcmF0ZXsKKyAgICAgICAgICAgIC5mZWMgPSBpbm5lckZlYywKKyAgICAgICAgICAgIC5pc0xpbmVhciA9IGlzTGluZWFyLAorICAgICAgICAgICAgLmlzU2hvcnRGcmFtZXMgPSBpc1Nob3J0RnJhbWVzLAorICAgICAgICAgICAgLmJpdHNQZXIxMDAwU3ltYm9sID0gYml0c1BlcjEwMDBTeW1ib2wsCisgICAgfTsKKyAgICByZXR1cm4gY29kZXJhdGU7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEhpZGxGcm9udGVuZFNldHRpbmdzKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxGcm9udGVuZFNldHRpbmdzRXh0MV8xJiBzZXR0aW5nc0V4dCkgeworICAgIHN3aXRjaCAoYWlkbFNldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjphbmFsb2c6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRBbmFsb2dTZXR0aW5ncyYgYW5hbG9nID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjphbmFsb2c+KCk7CisgICAgICAgIHNldHRpbmdzLmFuYWxvZyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhbmFsb2cuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEFuYWxvZ1R5cGU+KGFuYWxvZy50eXBlKSwKKyAgICAgICAgICAgICAgICAuc2lmU3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZD4oYW5hbG9nLnNpZlN0YW5kYXJkKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQuYW5hbG9nKHsKKyAgICAgICAgICAgICAgICAuYWZ0RmxhZyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEFuYWxvZ0FmdEZsYWc+KGFuYWxvZy5hZnRGbGFnKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhbmFsb2cuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGFuYWxvZy5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjphdHNjOiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kQXRzY1NldHRpbmdzJiBhdHNjID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjphdHNjPigpOworICAgICAgICBzZXR0aW5ncy5hdHNjKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2NNb2R1bGF0aW9uPihhdHNjLm1vZHVsYXRpb24pLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGF0c2MuaW52ZXJzaW9uKTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRnJvbnRlbmRTZXR0aW5nczo6YXRzYzM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRBdHNjM1NldHRpbmdzJiBhdHNjMyA9IGFpZGxTZXR0aW5ncy5nZXQ8RnJvbnRlbmRTZXR0aW5nczo6YXRzYzM+KCk7CisgICAgICAgIHNldHRpbmdzLmF0c2MzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MzLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzQmFuZHdpZHRoPihhdHNjMy5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0PihhdHNjMy5kZW1vZE91dHB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBscFNldHRpbmdzID0gZ2V0QXRzYzNQbHBTZXR0aW5ncyhhdHNjMyksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYzMuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGF0c2MzLmludmVyc2lvbik7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmR2YmM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmREdmJjU2V0dGluZ3MmIGR2YmMgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmR2YmM+KCk7CisgICAgICAgIHNldHRpbmdzLmR2YmMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZiY01vZHVsYXRpb24+KGR2YmMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmZlYyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElubmVyRmVjPihkdmJjLmZlYyksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAub3V0ZXJGZWMgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJjT3V0ZXJGZWM+KGR2YmMub3V0ZXJGZWMpLAorICAgICAgICAgICAgICAgIC5hbm5leCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YmNBbm5leD4oZHZiYy5hbm5leCksCisgICAgICAgICAgICAgICAgLnNwZWN0cmFsSW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uPihkdmJjLmludmVyc2lvbiksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YmMoeworICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZT4oZHZiYy5pbnRlcmxlYXZlTW9kZSksCisgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YmNCYW5kd2lkdGg+KGR2YmMuYmFuZHdpZHRoKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJjLmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihkdmJjLmludmVyc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmR2YnM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmREdmJzU2V0dGluZ3MmIGR2YnMgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmR2YnM+KCk7CisgICAgICAgIHNldHRpbmdzLmR2YnMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZic01vZHVsYXRpb24+KGR2YnMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gZ2V0RHZic0NvZGVSYXRlKGR2YnMuY29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzUm9sbG9mZj4oZHZicy5yb2xsb2ZmKSwKKyAgICAgICAgICAgICAgICAucGlsb3QgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzUGlsb3Q+KGR2YnMucGlsb3QpLAorICAgICAgICAgICAgICAgIC5pbnB1dFN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuaW5wdXRTdHJlYW1JZCksCisgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZic1N0YW5kYXJkPihkdmJzLnN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgICAudmNtTW9kZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnNWY21Nb2RlPihkdmJzLnZjbU1vZGUpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdmJzKHsKKyAgICAgICAgICAgICAgICAuc2NhblR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzU2NhblR5cGU+KGR2YnMuc2NhblR5cGUpLAorICAgICAgICAgICAgICAgIC5pc0Rpc2VxY1J4TWVzc2FnZSA9IGR2YnMuaXNEaXNlcWNSeE1lc3NhZ2UsCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oZHZicy5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjpkdmJ0OiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kRHZidFNldHRpbmdzJiBkdmJ0ID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjpkdmJ0PigpOworICAgICAgICBzZXR0aW5ncy5kdmJ0KHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnQuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZT4oZHZidC50cmFuc21pc3Npb25Nb2RlKSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidEJhbmR3aWR0aD4oZHZidC5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KGR2YnQuY29uc3RlbGxhdGlvbiksCisgICAgICAgICAgICAgICAgLmhpZXJhcmNoeSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRIaWVyYXJjaHk+KGR2YnQuaGllcmFyY2h5KSwKKyAgICAgICAgICAgICAgICAuaHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5ocENvZGVyYXRlKSwKKyAgICAgICAgICAgICAgICAubHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5scENvZGVyYXRlKSwKKyAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRHdWFyZEludGVydmFsPihkdmJ0Lmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5pc0hpZ2hQcmlvcml0eSA9IGR2YnQuaXNIaWdoUHJpb3JpdHksCisgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidFN0YW5kYXJkPihkdmJ0LnN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgICAuaXNNaXNvID0gZHZidC5pc01pc28sCisgICAgICAgICAgICAgICAgLnBscE1vZGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0UGxwTW9kZT4oZHZidC5wbHBNb2RlKSwKKyAgICAgICAgICAgICAgICAucGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkdmJ0LnBscElkKSwKKyAgICAgICAgICAgICAgICAucGxwR3JvdXBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGR2YnQucGxwR3JvdXBJZCksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YnQoeworICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0gc3RhdGljX2Nhc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgZHZidC5jb25zdGVsbGF0aW9uKSwKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9IHN0YXRpY19jYXN0PAorICAgICAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2YnQudHJhbnNtaXNzaW9uTW9kZSksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZidC5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oZHZidC5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjppc2RiczogeworICAgICAgICBjb25zdCBGcm9udGVuZElzZGJzU2V0dGluZ3MmIGlzZGJzID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjppc2Ricz4oKTsKKyAgICAgICAgc2V0dGluZ3MuaXNkYnMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMuc3RyZWFtSWQpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oaXNkYnMuc3RyZWFtSWRUeXBlKSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4oaXNkYnMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNDb2RlcmF0ZT4oaXNkYnMuY29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzLnN5bWJvbFJhdGUpLAorICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNSb2xsb2ZmPihpc2Ricy5yb2xsb2ZmKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2Ricy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjppc2RiczM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRJc2RiczNTZXR0aW5ncyYgaXNkYnMzID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjppc2RiczM+KCk7CisgICAgICAgIHNldHRpbmdzLmlzZGJzMyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMzLnN0cmVhbUlkKSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWRUeXBlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNTdHJlYW1JZFR5cGU+KGlzZGJzMy5zdHJlYW1JZFR5cGUpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4oaXNkYnMzLm1vZHVsYXRpb24pLAorICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzM0NvZGVyYXRlPihpc2RiczMuY29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzM1JvbGxvZmY+KGlzZGJzMy5yb2xsb2ZmKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRnJvbnRlbmRTZXR0aW5nczo6aXNkYnQ6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRJc2RidFNldHRpbmdzJiBpc2RidCA9IGFpZGxTZXR0aW5ncy5nZXQ8RnJvbnRlbmRTZXR0aW5nczo6aXNkYnQ+KCk7CisgICAgICAgIEhpZGxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbiBtb2R1bGF0aW9uID0gSGlkbEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOjpVTkRFRklORUQ7CisgICAgICAgIEhpZGxGcm9udGVuZElzZGJ0Q29kZXJhdGUgY29kZXJhdGUgPSBIaWRsRnJvbnRlbmRJc2RidENvZGVyYXRlOjpVTkRFRklORUQ7CisgICAgICAgIGlmIChpc2RidC5sYXllclNldHRpbmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RidE1vZHVsYXRpb24+KGlzZGJ0LmxheWVyU2V0dGluZ3NbMF0ubW9kdWxhdGlvbik7CisgICAgICAgICAgICBjb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0Q29kZXJhdGU+KGlzZGJ0LmxheWVyU2V0dGluZ3NbMF0uY29kZXJhdGUpOworICAgICAgICB9CisgICAgICAgIHNldHRpbmdzLmlzZGJ0KHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RidEJhbmR3aWR0aD4oaXNkYnQuYmFuZHdpZHRoKSwKKyAgICAgICAgICAgICAgICAubW9kZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0TW9kZT4oaXNkYnQubW9kZSksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gY29kZXJhdGUsCisgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWw+KGlzZGJ0Lmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5zZXJ2aWNlQXJlYUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LnNlcnZpY2VBcmVhSWQpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihpc2RidC5pbnZlcnNpb24pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjpkdG1iOiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kRHRtYlNldHRpbmdzJiBkdG1iID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjpkdG1iPigpOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR0bWIoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHRtYi5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJUcmFuc21pc3Npb25Nb2RlPihkdG1iLnRyYW5zbWlzc2lvbk1vZGUpLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iQmFuZHdpZHRoPihkdG1iLmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iTW9kdWxhdGlvbj4oZHRtYi5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuY29kZVJhdGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iQ29kZVJhdGU+KGR0bWIuY29kZVJhdGUpLAorICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHRtYkd1YXJkSW50ZXJ2YWw+KGR0bWIuZ3VhcmRJbnRlcnZhbCksCisgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU+KGR0bWIuaW50ZXJsZWF2ZU1vZGUpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR0bWIuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGR0bWIuaW52ZXJzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZyb250ZW5kLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZyb250ZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ODY1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuaApAQCAtMCwwICsxLDEyOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGUk9OVEVORF9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMRlJPTlRFTkRfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGcm9udGVuZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGcm9udGVuZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnNDb2RlUmF0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRFdmVudFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2Nhbk1lc3NhZ2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5UeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIDo6c3RkOjp2ZWN0b3I7CisKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNDb2RlUmF0ZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzQ29kZVJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRFdmVudFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRXZlbnRUeXBlOwordXNpbmcgSGlkbEZyb250ZW5kSWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuTWVzc2FnZTsKK3VzaW5nIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU7Cit1c2luZyBIaWRsRnJvbnRlbmRTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTdGF0dXM7Cit1c2luZyBIaWRsSUZyb250ZW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRnJvbnRlbmQ7Cit1c2luZyBIaWRsSUZyb250ZW5kQ2FsbGJhY2sgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGcm9udGVuZENhbGxiYWNrOwordXNpbmcgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzE7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOwordXNpbmcgSGlkbEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2V0dGluZ3NFeHQxXzE7Cit1c2luZyBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzRXh0MV8xOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbEZyb250ZW5kIDogcHVibGljIEJuVHVuZXJGcm9udGVuZCB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRnJvbnRlbmQoc3A8SGlkbElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCk7CisgICAgdmlydHVhbCB+VHVuZXJIaWRsRnJvbnRlbmQoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldENhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiYgaW5fdHVuZXJGcm9udGVuZENhbGxiYWNrKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB0dW5lKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIGluX3NldHRpbmdzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdG9wVHVuZSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNjYW4oY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgaW5fc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5UeXBlIGluX2Zyb250ZW5kU2NhblR5cGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3BTY2FuKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgaW5fbG5iKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBsaW5rQ2lDYW1Ub0Zyb250ZW5kKGludDMyX3QgaW5fY2lDYW1JZCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBpbl9jaUNhbUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFN0YXR1cyhjb25zdCB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEhhcmR3YXJlSW5mbyhzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZW1vdmVPdXRwdXRQaWQoaW50MzJfdCBpbl9waWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZyb250ZW5kU3RhdHVzUmVhZGluZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1JlYWRpbmVzcz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldExuYShib29sIGluX2JFbmFibGUpOworCisgICAgc3RydWN0IEZyb250ZW5kQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElGcm9udGVuZENhbGxiYWNrIHsKKyAgICAgICAgRnJvbnRlbmRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IHR1bmVyRnJvbnRlbmRDYWxsYmFjaykKKyAgICAgICAgICAgICAgOiBtVHVuZXJGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KEhpZGxGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2UoSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2UmIG1lc3NhZ2UpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblNjYW5NZXNzYWdlRXh0MV8xKEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlRXh0MV8xJiBtZXNzYWdlKTsKKworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IG1UdW5lckZyb250ZW5kQ2FsbGJhY2s7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBnZXRBdHNjM1BscFNldHRpbmdzKAorICAgICAgICAgICAgY29uc3QgRnJvbnRlbmRBdHNjM1NldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgSGlkbEZyb250ZW5kRHZic0NvZGVSYXRlIGdldER2YnNDb2RlUmF0ZShjb25zdCBGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpOworICAgIHZvaWQgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3MoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgYWlkbFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2V0dGluZ3NFeHQxXzEmIHNldHRpbmdzRXh0KTsKKyAgICB2b2lkIGdldEFpZGxGcm9udGVuZFN0YXR1cyhjb25zdCB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzPiYgaGlkbFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgaGlkbFN0YXR1c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKTsKKworICAgIGludCBtSWQ7CisgICAgc3A8SGlkbElGcm9udGVuZD4gbUZyb250ZW5kOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kPiBtRnJvbnRlbmRfMV8xOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGUk9OVEVORF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlMjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsTG5iIgorCisjaW5jbHVkZSAiVHVuZXJIaWRsTG5iLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwordXNpbmcgSGlkbExuYlBvc2l0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJQb3NpdGlvbjsKK3VzaW5nIEhpZGxMbmJUb25lID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJUb25lOwordXNpbmcgSGlkbExuYlZvbHRhZ2UgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYlZvbHRhZ2U7Cit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworVHVuZXJIaWRsTG5iOjpUdW5lckhpZGxMbmIoc3A8SGlkbElMbmI+IGxuYiwgaW50IGlkKSB7CisgICAgbUxuYiA9IGxuYjsKKyAgICBtSWQgPSBpZDsKK30KKworVHVuZXJIaWRsTG5iOjp+VHVuZXJIaWRsTG5iKCkgeworICAgIG1MbmIgPSBudWxscHRyOworICAgIG1JZCA9IC0xOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldENhbGxiYWNrKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoaW5fdHVuZXJMbmJDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJTG5iQ2FsbGJhY2s+IGxuYkNhbGxiYWNrID0gbmV3IExuYkNhbGxiYWNrKGluX3R1bmVyTG5iQ2FsbGJhY2spOworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0Q2FsbGJhY2sobG5iQ2FsbGJhY2spOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldFZvbHRhZ2UoTG5iVm9sdGFnZSBpbl92b2x0YWdlKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0Vm9sdGFnZShzdGF0aWNfY2FzdDxIaWRsTG5iVm9sdGFnZT4oaW5fdm9sdGFnZSkpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldFRvbmUoTG5iVG9uZSBpbl90b25lKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0VG9uZShzdGF0aWNfY2FzdDxIaWRsTG5iVG9uZT4oaW5fdG9uZSkpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldFNhdGVsbGl0ZVBvc2l0aW9uKExuYlBvc2l0aW9uIGluX3Bvc2l0aW9uKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0U2F0ZWxsaXRlUG9zaXRpb24oc3RhdGljX2Nhc3Q8SGlkbExuYlBvc2l0aW9uPihpbl9wb3NpdGlvbikpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNlbmREaXNlcWNNZXNzYWdlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgaW5fZGlzZXFjTWVzc2FnZSkgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNlbmREaXNlcWNNZXNzYWdlKGluX2Rpc2VxY01lc3NhZ2UpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OmNsb3NlKCkgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1MbmItPmNsb3NlKCk7CisgICAgbUxuYiA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworLy8vLy8vLy8vLy8vLy8vIElMbmJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbExuYjo6TG5iQ2FsbGJhY2s6Om9uRXZlbnQoY29uc3QgSGlkbExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25FdmVudChzdGF0aWNfY2FzdDxMbmJFdmVudFR5cGU+KGxuYkV2ZW50VHlwZSkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJIaWRsTG5iOjpMbmJDYWxsYmFjazo6b25EaXNlcWNNZXNzYWdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSB7CisgICAgaWYgKG1UdW5lckxuYkNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IG1zZyhiZWdpbihkaXNlcWNNZXNzYWdlKSwgZW5kKGRpc2VxY01lc3NhZ2UpKTsKKyAgICAgICAgbVR1bmVyTG5iQ2FsbGJhY2stPm9uRGlzZXFjTWVzc2FnZShtc2cpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2Y4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5oCkBAIC0wLDAgKzEsODMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMTE5CX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExMTkJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lMbmIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckxuYi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lMbmIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JTG5iQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJFdmVudFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkxuYlBvc2l0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJUb25lOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJWb2x0YWdlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbElMbmIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmI7Cit1c2luZyBIaWRsSUxuYkNhbGxiYWNrID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iQ2FsbGJhY2s7Cit1c2luZyBIaWRsTG5iRXZlbnRUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJFdmVudFR5cGU7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsTG5iIDogcHVibGljIEJuVHVuZXJMbmIgeworcHVibGljOgorICAgIFR1bmVySGlkbExuYihzcDxIaWRsSUxuYj4gbG5iLCBpbnQgaWQpOworICAgIHZpcnR1YWwgflR1bmVySGlkbExuYigpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Vm9sdGFnZShMbmJWb2x0YWdlIGluX3ZvbHRhZ2UpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFRvbmUoTG5iVG9uZSBpbl90b25lKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRTYXRlbGxpdGVQb3NpdGlvbihMbmJQb3NpdGlvbiBpbl9wb3NpdGlvbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9kaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgaW50IGdldElkKCkgeyByZXR1cm4gbUlkOyB9CisKKyAgICBzdHJ1Y3QgTG5iQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElMbmJDYWxsYmFjayB7CisgICAgICAgIExuYkNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IHR1bmVyTG5iQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KGNvbnN0IEhpZGxMbmJFdmVudFR5cGUgbG5iRXZlbnRUeXBlKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25EaXNlcWNNZXNzYWdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKTsKKworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiBtVHVuZXJMbmJDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIGludCBtSWQ7CisgICAgc3A8SGlkbElMbmI+IG1MbmI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETExOQl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFNlcnZpY2UuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU1ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDcxMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbFNlcnZpY2UiCisKKyNpbmNsdWRlICJUdW5lckhpZGxTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRnJvbnRlbmRJc2RidFRpbWVJbnRlcmxlYXZlTW9kZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVySGlkbERlc2NyYW1ibGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRnJvbnRlbmQuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxMbmIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZic0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidFRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXJyZXNvdXJjZW1hbmFnZXI6OlR1bmVyRnJvbnRlbmRJbmZvOwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6UGVybWlzc2lvbkNhY2hlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK3VzaW5nIEhpZGxGcm9udGVuZElkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwordXNpbmcgSGlkbExuYklkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJJZDsKK3VzaW5nIEhpZGxGcm9udGVuZFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kVHlwZTsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitzaGFyZWRfcHRyPFR1bmVySGlkbFNlcnZpY2U+IFR1bmVySGlkbFNlcnZpY2U6OnNUdW5lclNlcnZpY2UgPSBudWxscHRyOworCitUdW5lckhpZGxTZXJ2aWNlOjpUdW5lckhpZGxTZXJ2aWNlKCkgeworICAgIGlmICghVHVuZXJIZWxwZXI6OmNoZWNrVHVuZXJGZWF0dXJlKCkpIHsKKyAgICAgICAgQUxPR0QoIkRldmljZSBkb2Vzbid0IGhhdmUgdHVuZXIgaGFyZHdhcmUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1cGRhdGVUdW5lclJlc291cmNlcygpOworfQorCitUdW5lckhpZGxTZXJ2aWNlOjp+VHVuZXJIaWRsU2VydmljZSgpIHsKKyAgICBtT3BlbmVkRnJvbnRlbmRzLmNsZWFyKCk7CisgICAgbUxuYVN0YXR1cyA9IC0xOworfQorCitiaW5kZXJfc3RhdHVzX3QgVHVuZXJIaWRsU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CisgICAgaWYgKEhpZGxJVHVuZXI6OmdldFNlcnZpY2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZ2V0IElUdW5lciBISURMIEhBTCIpOworICAgICAgICByZXR1cm4gU1RBVFVTX05BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHNUdW5lclNlcnZpY2UgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxTZXJ2aWNlPigpOworICAgIHJldHVybiBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShzVHVuZXJTZXJ2aWNlLT5hc0JpbmRlcigpLmdldCgpLCBnZXRTZXJ2aWNlTmFtZSgpKTsKK30KKworc2hhcmVkX3B0cjxUdW5lckhpZGxTZXJ2aWNlPiBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKSB7CisgICAgcmV0dXJuIHNUdW5lclNlcnZpY2U7Cit9CisKK2Jvb2wgVHVuZXJIaWRsU2VydmljZTo6aGFzSVR1bmVyKCkgeworICAgIEFMT0dWKCJoYXNJVHVuZXIiKTsKKyAgICBpZiAobVR1bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbVR1bmVyID0gSGlkbElUdW5lcjo6Z2V0U2VydmljZSgpOworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJVHVuZXIgc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl8xXzA7CisKKyAgICBtVHVuZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI6OmNhc3RGcm9tKG1UdW5lcik7CisgICAgaWYgKG1UdW5lcl8xXzEgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fMV8xOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZ2V0IElUdW5lcl8xXzEgc2VydmljZSIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFR1bmVySGlkbFNlcnZpY2U6Omhhc0lUdW5lcl8xXzEoKSB7CisgICAgQUxPR1YoImhhc0lUdW5lcl8xXzEiKTsKKyAgICBoYXNJVHVuZXIoKTsKKyAgICByZXR1cm4gKG1UdW5lclZlcnNpb24gPT0gVFVORVJfSEFMX1ZFUlNJT05fMV8xKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlbkRlbXV4KGludDMyX3QgLyogaW5fZGVtdXhIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4qIF9haWRsX3JldHVybikgeworICAgIEFMT0dWKCJvcGVuRGVtdXgiKTsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICB1aW50MzJfdCBpZDsKKyAgICBzcDxJRGVtdXg+IGRlbXV4U3AgPSBudWxscHRyOworICAgIG1UdW5lci0+b3BlbkRlbXV4KFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGRlbXV4SWQsIGNvbnN0IHNwPElEZW11eD4mIGRlbXV4KSB7CisgICAgICAgIGRlbXV4U3AgPSBkZW11eDsKKyAgICAgICAgaWQgPSBkZW11eElkOworICAgICAgICByZXMgPSByOworICAgICAgICBBTE9HRCgib3BlbiBkZW11eCwgaWQgPSAlZCIsIGRlbXV4SWQpOworICAgIH0pOworICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRGVtdXg+KGRlbXV4U3AsIGlkKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIEFMT0dXKCJvcGVuIGRlbXV4IGZhaWxlZCwgcmVzID0gJWQiLCByZXMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpnZXREZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgeworICAgIEFMT0dWKCJnZXREZW11eENhcHMiKTsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBIaWRsRGVtdXhDYXBhYmlsaXRpZXMgY2FwczsKKyAgICBtVHVuZXItPmdldERlbXV4Q2FwcyhbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBIaWRsRGVtdXhDYXBhYmlsaXRpZXMmIGRlbXV4Q2FwcykgeworICAgICAgICBjYXBzID0gZGVtdXhDYXBzOworICAgICAgICByZXMgPSByOworICAgIH0pOworICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZ2V0QWlkbERlbXV4Q2FwcyhjYXBzKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIEFMT0dXKCJHZXQgZGVtdXggY2FwcyBmYWlsZWQsIHJlcyA9ICVkIiwgcmVzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBpZHMpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRJZD4gZmVJZHM7CisgICAgSGlkbFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJZHMoZmVJZHMpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgaWRzLT5yZXNpemUoZmVJZHMuc2l6ZSgpKTsKKyAgICBjb3B5KGZlSWRzLmJlZ2luKCksIGZlSWRzLmVuZCgpLCBpZHMtPmJlZ2luKCkpOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpZCwgRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxGcm9udGVuZEluZm8gaW5mbzsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IGdldEhpZGxGcm9udGVuZEluZm8oaWQsIGluZm8pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzIGR0bWJDYXBzOworICAgIGlmIChzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRUeXBlPihpbmZvLnR5cGUpID09IEhpZGxGcm9udGVuZFR5cGU6OkRUTUIpIHsKKyAgICAgICAgaWYgKCFoYXNJVHVuZXJfMV8xKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJVHVuZXJfMV8xIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICB9CisKKyAgICAgICAgbVR1bmVyXzFfMS0+Z2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgICAgIGlkLCBbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBjYXBzKSB7CisgICAgICAgICAgICAgICAgICAgIGR0bWJDYXBzID0gY2FwczsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSBnZXRBaWRsRnJvbnRlbmRJbmZvKGluZm8sIGR0bWJDYXBzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5Gcm9udGVuZChpbnQzMl90IGZyb250ZW5kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJRnJvbnRlbmQ+IGZyb250ZW5kOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSwgRlJPTlRFTkQpOworICAgIG1UdW5lci0+b3BlbkZyb250ZW5kQnlJZChpZCwgWyZdKEhpZGxSZXN1bHQgcmVzdWx0LCBjb25zdCBzcDxIaWRsSUZyb250ZW5kPiYgZmUpIHsKKyAgICAgICAgZnJvbnRlbmQgPSBmZTsKKyAgICAgICAgc3RhdHVzID0gcmVzdWx0OworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPFR1bmVySGlkbEZyb250ZW5kPiB0dW5lckZyb250ZW5kID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVySGlkbEZyb250ZW5kPihmcm9udGVuZCwgaWQpOworICAgIGlmIChtTG5hU3RhdHVzICE9IC0xKSB7CisgICAgICAgIHR1bmVyRnJvbnRlbmQtPnNldExuYShtTG5hU3RhdHVzID09IDEpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtT3BlbmVkRnJvbnRlbmRzTG9jayk7CisgICAgICAgIG1PcGVuZWRGcm9udGVuZHMuaW5zZXJ0KHR1bmVyRnJvbnRlbmQpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gdHVuZXJGcm9udGVuZDsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5MbmIoaW50IGxuYkhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dEKCJnZXQgSVR1bmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElMbmI+IGxuYjsKKyAgICBpbnQgaWQgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUobG5iSGFuZGxlLCBMTkIpOworICAgIG1UdW5lci0+b3BlbkxuYkJ5SWQoaWQsIFsmXShIaWRsUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SGlkbElMbmI+JiBsbmJTcCkgeworICAgICAgICBsbmIgPSBsbmJTcDsKKyAgICAgICAgc3RhdHVzID0gcmVzdWx0OworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsTG5iPihsbmIsIGlkKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5MbmJCeU5hbWUoY29uc3Qgc3RyaW5nJiBsbmJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpbnQgbG5iSWQ7CisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElMbmI+IGxuYjsKKyAgICBtVHVuZXItPm9wZW5MbmJCeU5hbWUobG5iTmFtZSwgWyZdKEhpZGxSZXN1bHQgciwgSGlkbExuYklkIGlkLCBjb25zdCBzcDxIaWRsSUxuYj4mIGxuYlNwKSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgIGxuYiA9IGxuYlNwOworICAgICAgICBsbmJJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKTsKKyAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVySGlkbExuYj4obG5iLCBsbmJJZCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpvcGVuRGVzY3JhbWJsZXIoCisgICAgICAgIGludDMyX3QgLypkZXNjcmFtYmxlckhhbmRsZSovLCBzaGFyZWRfcHRyPElUdW5lckRlc2NyYW1ibGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyOworICAgIC8vaW50IGlkID0gVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSWRGcm9tSGFuZGxlKGRlc2NyYW1ibGVySGFuZGxlLCBERVNDUkFNQkxFUik7CisgICAgbVR1bmVyLT5vcGVuRGVzY3JhbWJsZXIoWyZdKEhpZGxSZXN1bHQgciwgY29uc3Qgc3A8SGlkbElEZXNjcmFtYmxlcj4mIGRlc2NyYW1ibGVyU3ApIHsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgZGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlclNwOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRGVzY3JhbWJsZXI+KGRlc2NyYW1ibGVyKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6OmdldFR1bmVySGFsVmVyc2lvbihpbnQqIF9haWRsX3JldHVybikgeworICAgIGhhc0lUdW5lcigpOworICAgICpfYWlkbF9yZXR1cm4gPSBtVHVuZXJWZXJzaW9uOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlblNoYXJlZEZpbHRlcigKKyAgICAgICAgY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbiwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzU2hhcmVkRmlsdGVyUGVybWlzc2lvbikpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19UVl9TSEFSRURfRklMVEVSIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKyAgICBpZiAobVNoYXJlZEZpbHRlcnMuZmluZChpbl9maWx0ZXJUb2tlbikgPT0gbVNoYXJlZEZpbHRlcnMuZW5kKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJmYWlsIHRvIGZpbmQgJXMiLCBpbl9maWx0ZXJUb2tlbi5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+IGZpbHRlciA9IG1TaGFyZWRGaWx0ZXJzLmF0KGluX2ZpbHRlclRva2VuKTsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKCFmaWx0ZXItPmlzU2hhcmVkRmlsdGVyQWxsb3dlZChwaWQpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICBBTE9HRCgic2hhcmVkIGZpbHRlciAlcyBpcyBvcGVuZWQgaW4gdGhlIHNhbWUgcHJvY2VzcyIsIGluX2ZpbHRlclRva2VuLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBmaWx0ZXItPmF0dGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKGluX2NiKTsKKworICAgICpfYWlkbF9yZXR1cm4gPSBmaWx0ZXI7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpzZXRMbmEoYm9vbCBiRW5hYmxlKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIG1MbmFTdGF0dXMgPSBiRW5hYmxlID8gMSA6IDA7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtT3BlbmVkRnJvbnRlbmRzTG9jayk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1PcGVuZWRGcm9udGVuZHMuYmVnaW4oKTsgaXQgIT0gbU9wZW5lZEZyb250ZW5kcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgKCppdCktPnNldExuYShtTG5hU3RhdHVzID09IDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgLyogaW5fZnJvbnRlbmRUeXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9tYXhOdW1iZXIgKi8pIHsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoRnJvbnRlbmRUeXBlIC8qIGluX2Zyb250ZW5kVHlwZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSAtMTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKK30KKworc3RyaW5nIFR1bmVySGlkbFNlcnZpY2U6OmFkZEZpbHRlclRvU2hhcmVkKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRmlsdGVyPiYgc2hhcmVkRmlsdGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TaGFyZWRGaWx0ZXJzTG9jayk7CisKKyAgICAvLyBVc2Ugc2hhcmVkRmlsdGVyIGFkZHJlc3MgYXMgdG9rZW4uCisgICAgc3RyaW5nIHRva2VuID0gdG9fc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KHNoYXJlZEZpbHRlci5nZXQoKSkpOworICAgIG1TaGFyZWRGaWx0ZXJzW3Rva2VuXSA9IHNoYXJlZEZpbHRlcjsKKworICAgIHJldHVybiB0b2tlbjsKK30KKwordm9pZCBUdW5lckhpZGxTZXJ2aWNlOjpyZW1vdmVTaGFyZWRGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKworICAgIC8vIFVzZSBzaGFyZWRGaWx0ZXIgYWRkcmVzcyBhcyB0b2tlbi4KKyAgICBtU2hhcmVkRmlsdGVycy5lcmFzZSh0b19zdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oc2hhcmVkRmlsdGVyLmdldCgpKSkpOworfQorCit2b2lkIFR1bmVySGlkbFNlcnZpY2U6OnJlbW92ZUZyb250ZW5kKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRnJvbnRlbmQ+JiBmcm9udGVuZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtT3BlbmVkRnJvbnRlbmRzTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU9wZW5lZEZyb250ZW5kcy5iZWdpbigpOyBpdCAhPSBtT3BlbmVkRnJvbnRlbmRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdC0+Z2V0KCkgPT0gZnJvbnRlbmQuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1PcGVuZWRGcm9udGVuZHMuZXJhc2UoaXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsU2VydmljZTo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZVR1bmVyUmVzb3VyY2VzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBUdW5lckhlbHBlcjo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoZ2V0VFJNRnJvbnRlbmRJbmZvcygpLCBnZXRUUk1MbmJIYW5kbGVzKCkpOworfQorCit2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IFR1bmVySGlkbFNlcnZpY2U6OmdldFRSTUZyb250ZW5kSW5mb3MoKSB7CisgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiBpbmZvczsKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRJZD4gaWRzOworICAgIEhpZGxSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSWRzKGlkcyk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBpbmZvczsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5zaXplKCk7IGkrKykgeworICAgICAgICBIaWRsRnJvbnRlbmRJbmZvIGZyb250ZW5kSW5mbzsKKyAgICAgICAgSGlkbFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJbmZvKHN0YXRpY19jYXN0PGludDMyX3Q+KGlkc1tpXSksIGZyb250ZW5kSW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVHVuZXJGcm9udGVuZEluZm8gdHVuZXJGcm9udGVuZEluZm97CisgICAgICAgICAgICAgICAgLmhhbmRsZSA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChzdGF0aWNfY2FzdDxpbnQzMl90PihpZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTlRFTkQpLAorICAgICAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJvbnRlbmRJbmZvLnR5cGUpLAorICAgICAgICAgICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQpLAorICAgICAgICB9OworICAgICAgICBpbmZvcy5wdXNoX2JhY2sodHVuZXJGcm9udGVuZEluZm8pOworICAgIH0KKworICAgIHJldHVybiBpbmZvczsKK30KKwordmVjdG9yPGludDMyX3Q+IFR1bmVySGlkbFNlcnZpY2U6OmdldFRSTUxuYkhhbmRsZXMoKSB7CisgICAgdmVjdG9yPGludDMyX3Q+IGxuYkhhbmRsZXM7CisgICAgaWYgKG1UdW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIEhpZGxSZXN1bHQgcmVzOworICAgICAgICB2ZWN0b3I8SGlkbExuYklkPiBsbmJJZHM7CisgICAgICAgIG1UdW5lci0+Z2V0TG5iSWRzKFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxMbmJJZD4mIGlkcykgeworICAgICAgICAgICAgbG5iSWRzID0gaWRzOworICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgfSk7CisgICAgICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUyAmJiBsbmJJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsbmJJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsbmJIYW5kbGVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChzdGF0aWNfY2FzdDxpbnQzMl90PihsbmJJZHNbaV0pLCBMTkIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsbmJIYW5kbGVzOworfQorCitIaWRsUmVzdWx0IFR1bmVySGlkbFNlcnZpY2U6OmdldEhpZGxGcm9udGVuZElkcyhoaWRsX3ZlYzxIaWRsRnJvbnRlbmRJZD4mIGlkcykgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSGlkbFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIH0KKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtVHVuZXItPmdldEZyb250ZW5kSWRzKFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiYgZnJvbnRlbmRJZHMpIHsKKyAgICAgICAgaWRzID0gZnJvbnRlbmRJZHM7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworSGlkbFJlc3VsdCBUdW5lckhpZGxTZXJ2aWNlOjpnZXRIaWRsRnJvbnRlbmRJbmZvKGNvbnN0IGludCBpZCwgSGlkbEZyb250ZW5kSW5mbyYgaW5mbykgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSGlkbFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIH0KKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtVHVuZXItPmdldEZyb250ZW5kSW5mbyhpZCwgWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgSGlkbEZyb250ZW5kSW5mbyYgZmVJbmZvKSB7CisgICAgICAgIGluZm8gPSBmZUluZm87CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworRGVtdXhDYXBhYmlsaXRpZXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0QWlkbERlbXV4Q2Fwcyhjb25zdCBIaWRsRGVtdXhDYXBhYmlsaXRpZXMmIGNhcHMpIHsKKyAgICBEZW11eENhcGFiaWxpdGllcyBhaWRsQ2Fwc3sKKyAgICAgICAgICAgIC5udW1EZW11eCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtRGVtdXgpLAorICAgICAgICAgICAgLm51bVJlY29yZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUmVjb3JkKSwKKyAgICAgICAgICAgIC5udW1QbGF5YmFjayA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUGxheWJhY2spLAorICAgICAgICAgICAgLm51bVRzRmlsdGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1Uc0ZpbHRlciksCisgICAgICAgICAgICAubnVtU2VjdGlvbkZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtU2VjdGlvbkZpbHRlciksCisgICAgICAgICAgICAubnVtQXVkaW9GaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBzLm51bUF1ZGlvRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1WaWRlb0ZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtVmlkZW9GaWx0ZXIpLAorICAgICAgICAgICAgLm51bVBlc0ZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUGVzRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1QY3JGaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBzLm51bVBjckZpbHRlciksCisgICAgICAgICAgICAubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihjYXBzLm51bUJ5dGVzSW5TZWN0aW9uRmlsdGVyKSwKKyAgICAgICAgICAgIC5maWx0ZXJDYXBzID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5maWx0ZXJDYXBzKSwKKyAgICAgICAgICAgIC5iVGltZUZpbHRlciA9IGNhcHMuYlRpbWVGaWx0ZXIsCisgICAgfTsKKyAgICBhaWRsQ2Fwcy5saW5rQ2Fwcy5yZXNpemUoY2Fwcy5saW5rQ2Fwcy5zaXplKCkpOworICAgIGNvcHkoY2Fwcy5saW5rQ2Fwcy5iZWdpbigpLCBjYXBzLmxpbmtDYXBzLmVuZCgpLCBhaWRsQ2Fwcy5saW5rQ2Fwcy5iZWdpbigpKTsKKyAgICByZXR1cm4gYWlkbENhcHM7Cit9CisKK0Zyb250ZW5kSW5mbyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRBaWRsRnJvbnRlbmRJbmZvKAorICAgICAgICBjb25zdCBIaWRsRnJvbnRlbmRJbmZvJiBoYWxJbmZvLCBjb25zdCBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBoYWxEdG1iQ2FwcykgeworICAgIEZyb250ZW5kSW5mbyBpbmZveworICAgICAgICAgICAgLnR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZFR5cGU+KGhhbEluZm8udHlwZSksCisgICAgICAgICAgICAubWluRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGFsSW5mby5taW5GcmVxdWVuY3kpLAorICAgICAgICAgICAgLm1heEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGhhbEluZm8ubWF4RnJlcXVlbmN5KSwKKyAgICAgICAgICAgIC5taW5TeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5taW5TeW1ib2xSYXRlKSwKKyAgICAgICAgICAgIC5tYXhTeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5tYXhTeW1ib2xSYXRlKSwKKyAgICAgICAgICAgIC5hY3F1aXJlUmFuZ2UgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihoYWxJbmZvLmFjcXVpcmVSYW5nZSksCisgICAgICAgICAgICAuZXhjbHVzaXZlR3JvdXBJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZXhjbHVzaXZlR3JvdXBJZCksCisgICAgfTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbEluZm8uc3RhdHVzQ2Fwcy5zaXplKCk7IGkrKykgeworICAgICAgICBpbmZvLnN0YXR1c0NhcHMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kU3RhdHVzVHlwZT4oaGFsSW5mby5zdGF0dXNDYXBzW2ldKSk7CisgICAgfQorCisgICAgRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKKyAgICBzd2l0Y2ggKGhhbEluZm8udHlwZSkgeworICAgIGNhc2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU6OkFOQUxPRzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YW5hbG9nQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcyBhbmFsb2dDYXBzeworICAgICAgICAgICAgICAgICAgICAudHlwZUNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmFuYWxvZ0NhcHMoKS50eXBlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLnNpZlN0YW5kYXJkQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hbmFsb2dDYXBzKCkuc2lmU3RhbmRhcmRDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjphbmFsb2dDYXBzPihhbmFsb2dDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6QVRTQzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzY0NhcHMgPT0KKyAgICAgICAgICAgIGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIGF0c2NDYXBzeworICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzY0NhcHMoKS5tb2R1bGF0aW9uQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6YXRzY0NhcHM+KGF0c2NDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6QVRTQzM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzIGF0c2MzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuYmFuZHdpZHRoQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAudGltZUludGVybGVhdmVNb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkudGltZUludGVybGVhdmVNb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5jb2RlUmF0ZUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdENhcCA9IHN0YXRpY19jYXN0PGludDhfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZGVtb2RPdXRwdXRGb3JtYXRDYXApLAorICAgICAgICAgICAgICAgICAgICAuZmVjQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZmVjQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6YXRzYzNDYXBzPihhdHNjM0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpEVkJDOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZER2YmNDYXBhYmlsaXRpZXMgZHZiY0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuZmVjQ2FwID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5mZWNDYXApLAorICAgICAgICAgICAgICAgICAgICAuYW5uZXhDYXAgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkuYW5uZXhDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJjQ2Fwcz4oZHZiY0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpEVkJTOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgZHZic0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuaW5uZXJmZWNDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuaW5uZXJmZWNDYXApLAorICAgICAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuc3RhbmRhcmQpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJzQ2Fwcz4oZHZic0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpEVkJUOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0Q2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMgZHZidENhcHN7CisgICAgICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS50cmFuc21pc3Npb25Nb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5iYW5kd2lkdGhDYXApLAorICAgICAgICAgICAgICAgICAgICAuY29uc3RlbGxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5jb25zdGVsbGF0aW9uQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVyYXRlQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvZGVyYXRlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmhpZXJhcmNoeUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5oaWVyYXJjaHlDYXApLAorICAgICAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5ndWFyZEludGVydmFsQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmlzVDJTdXBwb3J0ZWQgPSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzVDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgIC5pc01pc29TdXBwb3J0ZWQgPSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzTWlzb1N1cHBvcnRlZCwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6ZHZidENhcHM+KGR2YnRDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6SVNEQlM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzIGlzZGJzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZXJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLmNvZGVyYXRlQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnNDYXBzPihpc2Ric0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpJU0RCUzM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzM0NhcHMgPT0KKyAgICAgICAgICAgIGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMgaXNkYnMzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzM0NhcHMoKS5tb2R1bGF0aW9uQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVyYXRlQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RiczNDYXBzKCkuY29kZXJhdGVDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2RiczNDYXBzPihpc2RiczNDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6SVNEQlQ6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0Q2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzIGlzZGJ0Q2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5tb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuYmFuZHdpZHRoQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZXJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmNvZGVyYXRlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXApLAorICAgICAgICAgICAgICAgICAgICAudGltZUludGVybGVhdmVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEZyb250ZW5kSXNkYnRUaW1lSW50ZXJsZWF2ZU1vZGU6OlVOREVGSU5FRCksCisgICAgICAgICAgICAgICAgICAgIC5pc1NlZ21lbnRBdXRvID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIC5pc0Z1bGxTZWdtZW50ID0gZmFsc2UsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJ0Q2Fwcz4oaXNkYnRDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kVHlwZT4oaW5mby50eXBlKSA9PSBIaWRsRnJvbnRlbmRUeXBlOjpEVE1CKSB7CisgICAgICAgICAgICBGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZHRtYkNhcHN7CisgICAgICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsRHRtYkNhcHMudHJhbnNtaXNzaW9uTW9kZUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxEdG1iQ2Fwcy5iYW5kd2lkdGhDYXApLAorICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbER0bWJDYXBzLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxEdG1iQ2Fwcy5jb2RlUmF0ZUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsRHRtYkNhcHMuZ3VhcmRJbnRlcnZhbENhcCksCisgICAgICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZUNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbER0bWJDYXBzLmludGVybGVhdmVNb2RlQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6ZHRtYkNhcHM+KGR0bWJDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgaW5mby5mcm9udGVuZENhcHMgPSBjYXBzOworICAgIHJldHVybiBpbmZvOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsU2VydmljZS5oIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1MmQzNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsU2VydmljZS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExTRVJWSUNFX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckV2ZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyRnJvbnRlbmRJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSVR1bmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlICJUdW5lckhlbHBlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZyb250ZW5kLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEluZm87Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVtdXg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckRlc2NyYW1ibGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyTG5iOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpUdW5lckZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXg7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyA6OnN0ZDo6c3RyaW5nOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgSGlkbERlbXV4Q2FwYWJpbGl0aWVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eENhcGFiaWxpdGllczsKK3VzaW5nIEhpZGxGcm9udGVuZEluZm8gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSW5mbzsKK3VzaW5nIEhpZGxJVHVuZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUdW5lcjsKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIEhpZGxGcm9udGVuZElkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbFNlcnZpY2UgOiBwdWJsaWMgQm5UdW5lclNlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS50dW5lciI7IH0KKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IGluc3RhbnRpYXRlKCk7CisgICAgVHVuZXJIaWRsU2VydmljZSgpOworICAgIHZpcnR1YWwgflR1bmVySGlkbFNlcnZpY2UoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90Piogb3V0X2lkcykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaW5fZnJvbnRlbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRnJvbnRlbmQoaW50MzJfdCBpbl9mcm9udGVuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkxuYihpbnQzMl90IGluX2xuYkhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuTG5iQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9sbmJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5EZW11eChpbnQzMl90IGluX2RlbXV4SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXREZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkRlc2NyYW1ibGVyKGludDMyX3QgaW5fZGVzY3JhbWJsZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFR1bmVySGFsVmVyc2lvbihpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5TaGFyZWRGaWx0ZXIoY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmEoYm9vbCBpbl9iRW5hYmxlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fbWF4TnVtYmVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBzdHJpbmcgYWRkRmlsdGVyVG9TaGFyZWQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOworICAgIHZvaWQgcmVtb3ZlU2hhcmVkRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRmlsdGVyPiYgc2hhcmVkRmlsdGVyKTsKKyAgICB2b2lkIHJlbW92ZUZyb250ZW5kKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRnJvbnRlbmQ+JiBmcm9udGVuZCk7CisKKyAgICBzdGF0aWMgc2hhcmVkX3B0cjxUdW5lckhpZGxTZXJ2aWNlPiBnZXRUdW5lclNlcnZpY2UoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGhhc0lUdW5lcigpOworICAgIGJvb2wgaGFzSVR1bmVyXzFfMSgpOworICAgIHZvaWQgdXBkYXRlVHVuZXJSZXNvdXJjZXMoKTsKKyAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGdldFRSTUZyb250ZW5kSW5mb3MoKTsKKyAgICB2ZWN0b3I8aW50MzJfdD4gZ2V0VFJNTG5iSGFuZGxlcygpOworICAgIEhpZGxSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSWRzKGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiYgaWRzKTsKKyAgICBIaWRsUmVzdWx0IGdldEhpZGxGcm9udGVuZEluZm8oY29uc3QgaW50IGlkLCBIaWRsRnJvbnRlbmRJbmZvJiBpbmZvKTsKKyAgICBEZW11eENhcGFiaWxpdGllcyBnZXRBaWRsRGVtdXhDYXBzKGNvbnN0IEhpZGxEZW11eENhcGFiaWxpdGllcyYgY2Fwcyk7CisgICAgRnJvbnRlbmRJbmZvIGdldEFpZGxGcm9udGVuZEluZm8oY29uc3QgSGlkbEZyb250ZW5kSW5mbyYgaGFsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBkdG1iQ2Fwcyk7CisKKyAgICBzcDxIaWRsSVR1bmVyPiBtVHVuZXI7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI+IG1UdW5lcl8xXzE7CisgICAgaW50IG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl9VTktOT1dOOworICAgIE11dGV4IG1TaGFyZWRGaWx0ZXJzTG9jazsKKyAgICBtYXA8c3RyaW5nLCBzaGFyZWRfcHRyPFR1bmVySGlkbEZpbHRlcj4+IG1TaGFyZWRGaWx0ZXJzOworICAgIE11dGV4IG1PcGVuZWRGcm9udGVuZHNMb2NrOworICAgIHVub3JkZXJlZF9zZXQ8c2hhcmVkX3B0cjxUdW5lckhpZGxGcm9udGVuZD4+IG1PcGVuZWRGcm9udGVuZHM7CisgICAgaW50IG1MbmFTdGF0dXMgPSAtMTsKKworICAgIHN0YXRpYyBzaGFyZWRfcHRyPFR1bmVySGlkbFNlcnZpY2U+IHNUdW5lclNlcnZpY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETFNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxUaW1lRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MDZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbFRpbWVGaWx0ZXIiCisKKyNpbmNsdWRlICJUdW5lckhpZGxUaW1lRmlsdGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQ29uc3RhbnQ2NEJpdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpDb25zdGFudDY0Qml0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxUaW1lRmlsdGVyOjpUdW5lckhpZGxUaW1lRmlsdGVyKHNwPEhpZGxJVGltZUZpbHRlcj4gdGltZUZpbHRlcikgeworICAgIG1UaW1lRmlsdGVyID0gdGltZUZpbHRlcjsKK30KKworVHVuZXJIaWRsVGltZUZpbHRlcjo6flR1bmVySGlkbFRpbWVGaWx0ZXIoKSB7CisgICAgbVRpbWVGaWx0ZXIgPSBudWxscHRyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5zZXRUaW1lU3RhbXAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRpbWVTdGFtcCkpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpjbGVhclRpbWVTdGFtcCgpIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5jbGVhclRpbWVTdGFtcCgpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBtVGltZUZpbHRlci0+Z2V0U291cmNlVGltZShbJl0oSGlkbFJlc3VsdCByLCB1aW50NjRfdCB0KSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0KTsKKyAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KENvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVApOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIG1UaW1lRmlsdGVyLT5nZXRUaW1lU3RhbXAoWyZdKEhpZGxSZXN1bHQgciwgdWludDY0X3QgdCkgeworICAgICAgICBzdGF0dXMgPSByOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4odCk7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsVGltZUZpbHRlcjo6Y2xvc2UoKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklUaW1lRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKKyAgICBtVGltZUZpbHRlciA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFRpbWVGaWx0ZXIuaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjljNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFRpbWVGaWx0ZXIuaApAQCAtMCwwICsxLDU3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETFRJTUVGSUxURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSSElETFRJTUVGSUxURVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJUaW1lRmlsdGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVRpbWVGaWx0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIEhpZGxJVGltZUZpbHRlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVRpbWVGaWx0ZXI7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsVGltZUZpbHRlciA6IHB1YmxpYyBCblR1bmVyVGltZUZpbHRlciB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsVGltZUZpbHRlcihzcDxIaWRsSVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpOworICAgIHZpcnR1YWwgflR1bmVySGlkbFRpbWVGaWx0ZXIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFRpbWVTdGFtcChpbnQ2NF90IGluX3RpbWVTdGFtcCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xlYXJUaW1lU3RhbXAoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0VGltZVN0YW1wKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzcDxIaWRsSVRpbWVGaWx0ZXI+IG1UaW1lRmlsdGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkhJRExUSU1FRklMVEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL21haW5fdHVuZXJzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3R1bmVyL21haW5fdHVuZXJzZXJ2aWNlLmNwcAppbmRleCA1ODZhMGUyLi5hMDE0ZGVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9tYWluX3R1bmVyc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvbWFpbl90dW5lcnNlcnZpY2UuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMzAgKzE0LDMzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlR1bmVyU2VydmljZS5oIgorI2luY2x1ZGUgImhpZGwvVHVuZXJIaWRsU2VydmljZS5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVySGlkbFNlcnZpY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyU2VydmljZTsKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLWludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikgeworaW50IG1haW4oKSB7CiAgICAgQUxPR0QoIlR1bmVyIHNlcnZpY2Ugc3RhcnRpbmciKTsKIAotICAgIHN0cmNweShhcmd2WzBdLCAibWVkaWEudHVuZXIiKTsKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICBBTE9HRCgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogCi0gICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IFR1bmVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICAvLyBDaGVjayBsZWdhY3kgSElETCBIQUwgZmlyc3QuIElmIGl0J3Mgbm90IGV4aXN0ZWQsIHVzZSBBSURMIEhBTC4KKyAgICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gVHVuZXJIaWRsU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgewotICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGFkZCB0dW5lciBzZXJ2aWNlIGFzIEFJREwgaW50ZXJmYWNlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3RhdHVzID0gVHVuZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgICAgICBDSEVDSyhzdGF0dXMgPT0gU1RBVFVTX09LKTsKICAgICB9CiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOyAgLy8gc2hvdWxkIG5vdCByZWFjaGVkCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjIGIvc2VydmljZXMvdHVuZXIvbWVkaWF0dW5lci5yYwppbmRleCBmZDMwNjE4Li42YTNlMTk5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCisrKyBiL3NlcnZpY2VzL3R1bmVyL21lZGlhdHVuZXIucmMKQEAgLTIsNCArMiw3IEBACiAgICAgY2xhc3MgbWFpbgogICAgIGdyb3VwIG1lZGlhCiAgICAgaW9wcmlvIHJ0IDQKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IudHVuZXItaGFsLTEtMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci50dW5lci1oYWwtMS0xCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLnR1bmVyLWRlZmF1bHQKICAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2ggSGlnaFBlcmZvcm1hbmNlCg==